diff --git a/em-format/e-mail-formatter-attachment-bar.c b/em-format/e-mail-formatter-attachment-bar.c
index f32cf80..d3769ed 100644
--- a/em-format/e-mail-formatter-attachment-bar.c
+++ b/em-format/e-mail-formatter-attachment-bar.c
@@ -71,9 +71,8 @@ emfe_attachment_bar_format (EMailFormatterExtension *extension,
 
 static GtkWidget *
 emfe_attachment_bar_get_widget (EMailFormatterExtension *extension,
-                                EMailPartList *context,
-                                EMailPart *part,
-                                GHashTable *params)
+                                EMailFormatterContext *context,
+                                EMailPart *part)
 {
 	EAttachmentStore *store;
 	GtkWidget *widget;
diff --git a/em-format/e-mail-formatter-attachment.c b/em-format/e-mail-formatter-attachment.c
index 2a2f2c9..3972dbb 100644
--- a/em-format/e-mail-formatter-attachment.c
+++ b/em-format/e-mail-formatter-attachment.c
@@ -379,24 +379,27 @@ emfe_attachment_format (EMailFormatterExtension *extension,
 
 static GtkWidget *
 emfe_attachment_get_widget (EMailFormatterExtension *extension,
-                            EMailPartList *context,
-                            EMailPart *part,
-                            GHashTable *params)
+                            EMailFormatterContext *context,
+                            EMailPart *part)
 {
 	EAttachment *attachment;
 	EAttachmentStore *store;
 	EAttachmentView *view;
-	GtkWidget *widget;
+	EMailPartAttachment *empa;
+	CamelMimePart *mime_part;
+	GtkWidget *widget, *hbox;
+	gchar *description;
 	const gchar *part_id;
 
 	g_return_val_if_fail (E_IS_MAIL_PART_ATTACHMENT (part), NULL);
 
-	attachment = e_mail_part_attachment_ref_attachment (
-		E_MAIL_PART_ATTACHMENT (part));
+	empa = E_MAIL_PART_ATTACHMENT (part);
+
+	attachment = e_mail_part_attachment_ref_attachment (empa);
 
 	part_id = e_mail_part_get_id (part);
 
-	store = find_attachment_store (context, part);
+	store = find_attachment_store (context ? context->part_list : NULL, part);
 	widget = e_attachment_button_new ();
 	g_object_set_data_full (
 		G_OBJECT (widget),
@@ -415,7 +418,24 @@ emfe_attachment_get_widget (EMailFormatterExtension *extension,
 
 	g_object_unref (attachment);
 
-	return widget;
+	mime_part = e_mail_part_ref_mime_part (part);
+	description = e_mail_part_describe (mime_part, empa->snoop_mime_type);
+	g_object_unref (mime_part);
+
+	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+
+	gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
+
+	widget = gtk_label_new (description);
+	gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
+	gtk_widget_set_valign (widget, GTK_ALIGN_CENTER);
+	gtk_widget_show (widget);
+
+	g_free (description);
+
+	gtk_widget_show (hbox);
+
+	return hbox;
 }
 
 static void
diff --git a/em-format/e-mail-formatter-extension.c b/em-format/e-mail-formatter-extension.c
index 55b481b..b6baeb4 100644
--- a/em-format/e-mail-formatter-extension.c
+++ b/em-format/e-mail-formatter-extension.c
@@ -103,38 +103,30 @@ e_mail_formatter_extension_has_widget (EMailFormatterExtension *extension)
 /**
  * e_mail_formatter_extension_get_widget:
  * @extension: an #EMailFormatterExtension
+ * @context: an #EMailFormatterContext
  * @part: an #EMailPart
- * @params: a #GHashTable
  *
  * A virtual function reimplemented in some mail formatter extensions. The
- * function should construct a #GtkWidget for given @part. The @params hash
- * table can contain additional parameters listed in the &lt;object&gt; HTML
- * element that has requested the widget.
- *
- * When @bind_dom_func is not %NULL, the callee will set a callback function
- * which should be called when the webpage is completely rendered to setup
- * bindings between DOM events and the widget.
+ * function should construct a #GtkWidget for given @part.
  *
  * Returns: Returns a #GtkWidget or %NULL, when error occurs or given
- * @extension does not reimplement this method.
+ * @extension does not implement this method.
  */
 GtkWidget *
 e_mail_formatter_extension_get_widget (EMailFormatterExtension *extension,
-                                       EMailPartList *context,
-                                       EMailPart *part,
-                                       GHashTable *params)
+                                       EMailFormatterContext *context,
+                                       EMailPart *part)
 {
 	EMailFormatterExtensionClass *class;
 	GtkWidget *widget = NULL;
 
 	g_return_val_if_fail (E_IS_MAIL_FORMATTER_EXTENSION (extension), NULL);
 	g_return_val_if_fail (part != NULL, NULL);
-	g_return_val_if_fail (params != NULL, NULL);
 
 	class = E_MAIL_FORMATTER_EXTENSION_GET_CLASS (extension);
 
 	if (class->get_widget != NULL)
-		widget = class->get_widget (extension, context, part, params);
+		widget = class->get_widget (extension, context, part);
 
 	return widget;
 }
diff --git a/em-format/e-mail-formatter-extension.h b/em-format/e-mail-formatter-extension.h
index adfe98f..35dae5a 100644
--- a/em-format/e-mail-formatter-extension.h
+++ b/em-format/e-mail-formatter-extension.h
@@ -84,9 +84,8 @@ struct _EMailFormatterExtensionClass {
 					 GOutputStream *stream,
 					 GCancellable *cancellable);
 	GtkWidget *	(*get_widget)	(EMailFormatterExtension *extension,
-					 EMailPartList *context,
-					 EMailPart *part,
-					 GHashTable *params);
+					 EMailFormatterContext *context,
+					 EMailPart *part);
 };
 
 GType		e_mail_formatter_extension_get_type
@@ -102,9 +101,8 @@ gboolean	e_mail_formatter_extension_has_widget
 						(EMailFormatterExtension *extension);
 GtkWidget *	e_mail_formatter_extension_get_widget
 						(EMailFormatterExtension *extension,
-						 EMailPartList *context,
-						 EMailPart *part,
-						 GHashTable *params);
+						 EMailFormatterContext *context,
+						 EMailPart *part);
 
 G_END_DECLS
 
diff --git a/em-format/e-mail-formatter-secure-button.c b/em-format/e-mail-formatter-secure-button.c
index 0ed0ef4..e2748b1 100644
--- a/em-format/e-mail-formatter-secure-button.c
+++ b/em-format/e-mail-formatter-secure-button.c
@@ -444,9 +444,8 @@ secure_button_get_widget_for_validity (CamelCipherValidity *validity)
 
 static GtkWidget *
 emfe_secure_button_get_widget (EMailFormatterExtension *extension,
-                               EMailPartList *context,
-                               EMailPart *part,
-                               GHashTable *params)
+                               EMailFormatterContext *context,
+                               EMailPart *part)
 {
 	GtkWidget *grid;
 	GList *head, *link;
diff --git a/mail/Makefile.am b/mail/Makefile.am
index 06aa259..76793c7 100644
--- a/mail/Makefile.am
+++ b/mail/Makefile.am
@@ -109,6 +109,7 @@ mailinclude_HEADERS =					\
 	e-mail-tag-editor.h				\
 	e-mail-ui-session.h				\
 	e-mail-view.h					\
+	e-mail-web-view.h				\
 	em-composer-utils.h				\
 	em-config.h					\
 	em-event.h					\
@@ -190,6 +191,7 @@ libevolution_mail_la_SOURCES =				\
 	e-mail-tag-editor.c				\
 	e-mail-ui-session.c				\
 	e-mail-view.c					\
+	e-mail-web-view.c				\
 	em-composer-utils.c				\
 	em-config.c					\
 	em-event.c					\
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index 4718775..3964a0d 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -39,6 +39,7 @@
 #include "e-mail-notes.h"
 #include "e-mail-request.h"
 #include "e-mail-ui-session.h"
+#include "e-mail-web-view.h"
 #include "em-composer-utils.h"
 #include "em-utils.h"
 
@@ -72,6 +73,8 @@ struct _EMailDisplayPrivate {
 	GHashTable *skipped_remote_content_sites;
 
 	guint web_extension_headers_collapsed_signal_id;
+
+	GtkBin *alt_bin;
 };
 
 enum {
@@ -388,6 +391,41 @@ decide_policy_cb (WebKitWebView *web_view,
 	/* Let WebKit handle it. */
 	return FALSE;
 }
+
+static void
+mail_display_attachment_count_changed (EAttachmentStore *store,
+                                       GParamSpec *pspec,
+                                       GtkWidget *bar)
+{
+	g_return_if_fail (E_IS_ATTACHMENT_BAR (bar));
+	g_return_if_fail (E_IS_ATTACHMENT_STORE (store));
+
+	if (e_attachment_store_get_num_attachments (store) == 0) {
+		gtk_widget_hide (bar);
+	} else {
+		gtk_widget_show (bar);
+	}
+}
+
+typedef struct _NumAttachmentsData {
+	EAttachmentStore *store;
+	gulong handler_id;
+} NumAttachmentsData;
+
+static void
+attachment_bar_gone_cb (gpointer data,
+			GObject *gone_bar)
+{
+	NumAttachmentsData *nad = data;
+
+	printf ("%s: %p\n", __FUNCTION__, gone_bar);
+	if (nad) {
+		g_signal_handler_disconnect (nad->store, nad->handler_id);
+		g_object_unref (nad->store);
+		g_free (nad);
+	}
+}
+
 #if 0 /* FIXME WK2 */
 static void
 mail_display_resource_requested (WebKitWebView *web_view,
@@ -678,49 +716,6 @@ attachment_button_zoom_to_window_cb (GObject *object,
 	g_clear_object (&child);
 }
 
-static void
-mail_display_attachment_count_changed (EAttachmentStore *store,
-                                       GParamSpec *pspec,
-                                       GtkWidget *box)
-{
-	WebKitDOMHTMLElement *element;
-	GList *children;
-
-	children = gtk_container_get_children (GTK_CONTAINER (box));
-	g_return_if_fail (children && children->data);
-
-	element = g_object_get_data (children->data, "parent_element");
-	g_list_free (children);
-
-	g_return_if_fail (WEBKIT_DOM_IS_HTML_ELEMENT (element));
-
-	if (e_attachment_store_get_num_attachments (store) == 0) {
-		gtk_widget_hide (box);
-		webkit_dom_html_element_set_hidden (element, TRUE);
-	} else {
-		gtk_widget_show (box);
-		webkit_dom_html_element_set_hidden (element, FALSE);
-	}
-}
-
-typedef struct _NumAttachmentsData {
-	EAttachmentStore *store;
-	gulong handler_id;
-} NumAttachmentsData;
-
-static void
-attachment_bar_box_gone_cb (gpointer data,
-			    GObject *gone_box)
-{
-	NumAttachmentsData *nad = data;
-
-	if (nad) {
-		g_signal_handler_disconnect (nad->store, nad->handler_id);
-		g_object_unref (nad->store);
-		g_free (nad);
-	}
-}
-
 static GtkWidget *
 mail_display_plugin_widget_requested (WebKitWebView *web_view,
                                       gchar *mime_type,
@@ -787,7 +782,7 @@ mail_display_plugin_widget_requested (WebKitWebView *web_view,
 
 	/* Get the widget from formatter */
 	widget = e_mail_formatter_extension_get_widget (
-		extension, display->priv->part_list, part, param);
+		extension, display->priv->part_list!!!, part, param!!!);
 	d (
 		printf ("Created widget %s (%p) for part %s\n",
 			G_OBJECT_TYPE_NAME (widget), widget, part_id));
@@ -1756,9 +1751,10 @@ mail_display_process_uri_scheme_finished_cb (EMailDisplay *display,
 static void
 mail_display_cid_uri_scheme_appeared_cb (WebKitURISchemeRequest *request)
 {
-	EMailDisplay *display;
+	EMailDisplay *display = NULL;
 	EMailPartList *part_list;
 	EMailPart *part;
+	WebKitWebView *web_view;
 	GInputStream *stream;
 	const gchar *uri;
 	const gchar *mime_type;
@@ -1768,7 +1764,11 @@ mail_display_cid_uri_scheme_appeared_cb (WebKitURISchemeRequest *request)
 	CamelDataWrapper *dw;
 	CamelMimePart *mime_part;
 
-	display = E_MAIL_DISPLAY (webkit_uri_scheme_request_get_web_view (request));
+	web_view = webkit_uri_scheme_request_get_web_view (request);
+	if (E_IS_MAIL_DISPLAY (web_view))
+		display = E_MAIL_DISPLAY (web_view);
+	else if (E_IS_MAIL_WEB_VIEW (web_view))
+		display = e_mail_web_view_get_mail_display (E_MAIL_WEB_VIEW (web_view));
 
 	g_return_if_fail (E_IS_MAIL_DISPLAY (display));
 
@@ -2194,17 +2194,22 @@ static void
 mail_display_http_uri_scheme_appeared_cb (WebKitURISchemeRequest *request)
 {
 	EMailDisplay *display;
+	WebKitWebView *web_view;
 	GTask *task;
 	GCancellable *cancellable;
 
-	display = E_MAIL_DISPLAY (webkit_uri_scheme_request_get_web_view (request));
+	web_view = webkit_uri_scheme_request_get_web_view (request);
+	if (E_IS_MAIL_DISPLAY (web_view))
+		display = E_MAIL_DISPLAY (web_view);
+	else if (E_IS_MAIL_WEB_VIEW (web_view))
+		display = e_mail_web_view_get_mail_display (E_MAIL_WEB_VIEW (web_view));
 
 	g_return_if_fail (E_IS_MAIL_DISPLAY (display));
 
 	cancellable = g_cancellable_new ();
 
 	task = g_task_new (
-		display, cancellable,
+		web_view, cancellable,
 		(GAsyncReadyCallback) mail_display_process_uri_scheme_finished_cb,
 		request);
 
@@ -2230,13 +2235,20 @@ mail_display_process_mail_uri_scheme_request (GTask *task,
 	const gchar *default_charset, *charset;
 	SoupURI *soup_uri;
 	EMailFormatterContext context = { 0 };
-	EMailDisplay *display = E_MAIL_DISPLAY (source_object);
+	EMailDisplay *display = NULL;
 	WebKitURISchemeRequest *request = WEBKIT_URI_SCHEME_REQUEST (task_data);
 	GBytes *bytes;
 
 	uri = webkit_uri_scheme_request_get_uri (request);
 
-	part_list = display->priv->part_list;
+	if (E_IS_MAIL_DISPLAY (source_object))
+		display = E_MAIL_DISPLAY (source_object);
+	else if (E_IS_MAIL_WEB_VIEW (source_object))
+		display = e_mail_web_view_get_mail_display (E_MAIL_WEB_VIEW (source_object));
+	else
+		g_warn_if_reached ();
+
+	part_list = display ? display->priv->part_list : NULL;
 
 	if (camel_debug_start ("emformat:requests")) {
 		printf ("%s: found part-list %p for full_uri '%s'\n", G_STRFUNC, part_list, uri);
@@ -2478,11 +2490,16 @@ static void
 mail_display_mail_uri_scheme_appeared_cb (WebKitURISchemeRequest *request)
 {
 	EMailDisplay *display;
+	WebKitWebView *web_view;
 	GTask *task;
 	GCancellable *cancellable;
 	const gchar *uri;
 
-	display = E_MAIL_DISPLAY (webkit_uri_scheme_request_get_web_view (request));
+	web_view = webkit_uri_scheme_request_get_web_view (request);
+	if (E_IS_MAIL_DISPLAY (web_view))
+		display = E_MAIL_DISPLAY (web_view);
+	else if (E_IS_MAIL_WEB_VIEW (web_view))
+		display = e_mail_web_view_get_mail_display (E_MAIL_WEB_VIEW (web_view));
 
 	g_return_if_fail (E_IS_MAIL_DISPLAY (display));
 
@@ -2491,7 +2508,7 @@ mail_display_mail_uri_scheme_appeared_cb (WebKitURISchemeRequest *request)
 	uri = webkit_uri_scheme_request_get_uri (request);
 
 	task = g_task_new (
-		display, cancellable,
+		web_view, cancellable,
 		(GAsyncReadyCallback) mail_display_process_uri_scheme_finished_cb,
 		request);
 
@@ -2846,6 +2863,356 @@ e_mail_display_get_part_list (EMailDisplay *display)
 	return display->priv->part_list;
 }
 
+static void
+e_mail_display_fill_alt_bin (EMailDisplay *display)
+{
+	GtkBox *box;
+	GtkWidget *widget;
+	GQueue queue = G_QUEUE_INIT;
+	EMailExtensionRegistry *ext_registry;
+	EMailFormatterContext fmt_context = { 0 };
+	EAttachmentButton *previous_attachment_button = NULL;
+	GSList *depth_stack = NULL;
+	gint depth = 0;
+
+	g_return_if_fail (E_IS_MAIL_DISPLAY (display));
+
+	if (!display->priv->alt_bin)
+		return;
+
+	widget = gtk_bin_get_child (display->priv->alt_bin);
+	if (widget)
+		gtk_container_remove (GTK_CONTAINER (display->priv->alt_bin), widget);
+
+	if (!display->priv->part_list) {
+		printf ("%s: nothing to format:\n", __FUNCTION__);
+		return;
+	}
+
+	fmt_context.part_list = display->priv->part_list;
+	fmt_context.mode = E_MAIL_FORMATTER_MODE_NORMAL;
+	fmt_context.flags = E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSABLE;
+	fmt_context.uri = NULL;
+
+	widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4);
+	gtk_widget_show (widget);
+
+	gtk_container_add (GTK_CONTAINER (display->priv->alt_bin), widget);
+
+	box = GTK_BOX (widget);
+
+	ext_registry = e_mail_formatter_get_extension_registry (display->priv->formatter);
+
+	printf ("%s: would process:\n", __FUNCTION__);
+	e_mail_part_list_queue_parts (display->priv->part_list, NULL, &queue);
+
+	while (!g_queue_is_empty (&queue)) {
+		EMailPart *part;
+		EMailPartAttachment *attachment_part;
+		gboolean is_rfc822_start = FALSE, is_rfc822_end = FALSE;
+
+		part = g_queue_pop_head (&queue);
+
+		if (E_IS_MAIL_PART_ATTACHMENT (part))
+			attachment_part = E_MAIL_PART_ATTACHMENT (part);
+		else
+			attachment_part = NULL;
+
+		if (e_mail_part_get_id (part)) {
+			is_rfc822_start = g_str_has_suffix (e_mail_part_get_id (part), ".rfc822");
+			is_rfc822_end = g_str_has_suffix (e_mail_part_get_id (part), ".rfc822.end");
+		}
+
+		if ((!part->is_hidden || (previous_attachment_button && !is_rfc822_start && !is_rfc822_end)) && e_mail_part_get_mime_type (part)) {
+			GQueue *formatters;
+
+			formatters = e_mail_extension_registry_get_for_mime_type (ext_registry, e_mail_part_get_mime_type (part));
+			if (!formatters)
+				e_mail_extension_registry_get_fallback (ext_registry, e_mail_part_get_mime_type (part));
+
+			printf ("  %s: %s | cid: %s | mime_type: %s | is_attachment: %d | hidden: %d\n", __FUNCTION__,
+				e_mail_part_get_id (part),
+				e_mail_part_get_cid (part),
+				e_mail_part_get_mime_type (part),
+				e_mail_part_get_is_attachment (part) ? 1 : 0,
+				part->is_hidden ? 1 : 0);
+			printf ("     formatters: %d\n", formatters ? g_queue_get_length (formatters) : -1);
+			if (formatters) {
+				EMailFormatterExtension *fmt_ext;
+				GList *head, *link;
+
+				widget = NULL;
+
+				head = g_queue_peek_head_link (formatters);
+				for (link = head; link != NULL; link = g_list_next (link)) {
+					fmt_ext = link->data;
+
+					printf ("        %p (%s)", fmt_ext, fmt_ext ? G_OBJECT_TYPE_NAME (fmt_ext) : "");
+					if (fmt_ext) {
+						printf (" has-widget:%d", e_mail_formatter_extension_has_widget (fmt_ext));
+						if (e_mail_formatter_extension_has_widget (fmt_ext)) {
+							widget = e_mail_formatter_extension_get_widget (fmt_ext, &fmt_context, part);
+						}
+					}
+					printf ("\n");
+
+					if (!widget) {
+						#define NO_FRAMES
+						#ifdef NO_FRAMES
+						CamelFolder *folder;
+						const gchar *message_uid;
+						gchar *uri;
+						#else
+						GOutputStream *stream;
+						gchar *html;
+						#endif
+						gboolean create_widget;
+
+						#ifdef NO_FRAMES
+						folder = e_mail_part_list_get_folder (display->priv->part_list);
+						message_uid = e_mail_part_list_get_message_uid (display->priv->part_list);
+						uri = e_mail_part_build_uri (
+							folder, message_uid,
+							"part_id", G_TYPE_STRING, e_mail_part_get_id (part),
+							"mode", G_TYPE_INT, E_MAIL_FORMATTER_MODE_RAW,
+							"headers_collapsable", G_TYPE_INT, 0,
+							NULL);
+						create_widget = uri != NULL;
+
+						#else
+
+						stream = g_memory_output_stream_new_resizable ();
+
+						html = e_mail_formatter_get_html_header (display->priv->formatter);
+						g_output_stream_write_all (stream, html, strlen (html), NULL, NULL, NULL);
+						g_free (html);
+
+						create_widget = e_mail_formatter_extension_format (fmt_ext, display->priv->formatter,
+							&fmt_context, part, stream, NULL);
+						#endif
+
+						if (create_widget) {
+							widget = e_mail_web_view_new (display);
+
+							/* FIXME WK2 - the WebKitWebView should report the content height on its own, this is just to have shown something */
+							g_object_set (G_OBJECT (widget), "height-request", 250, NULL);
+
+							#ifdef NO_FRAMES
+
+							e_web_view_load_uri (E_WEB_VIEW (widget), uri);
+							g_free (uri);
+
+							#else
+
+							g_output_stream_write_all (
+								stream, "</body></html>", strlen ("</body></html>"),
+								NULL, NULL, NULL);
+
+							g_output_stream_close (stream, NULL, NULL);
+
+							html = g_strndup (
+								g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (stream)),
+								g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (stream)));
+
+							e_web_view_load_string (E_WEB_VIEW (widget), html);
+							g_free (html);
+
+							#endif
+						}
+
+						#ifndef NO_FRAMES
+						g_clear_object (&stream);
+						#endif
+					}
+
+					if (widget) {
+						if (previous_attachment_button) {
+							e_binding_bind_property (
+								previous_attachment_button, "expanded",
+								widget, "visible",
+								G_BINDING_SYNC_CREATE);
+							printf ("%s: b) %d\n", __FUNCTION__, e_mail_part_should_show_inline (part));
+							previous_attachment_button = NULL;
+
+							if (e_mail_part_should_show_inline (part))
+								gtk_widget_show (widget);
+							else
+								gtk_widget_hide (widget);
+						} else {
+							gtk_widget_show (widget);
+						}
+
+						#if GTK_CHECK_VERSION(3,12,0)
+						gtk_widget_set_margin_start (widget,
+							gtk_widget_get_margin_start (widget) + 6 + (depth_stack ? 0 : 6));
+						#else
+						gtk_widget_set_margin_left (widget,
+							gtk_widget_get_margin_left (widget) + 6 + (depth_stack ? 0 : 6));
+						#endif
+						gtk_box_pack_start (box, widget, FALSE, FALSE, 0);
+
+						if (E_IS_ATTACHMENT_BAR (widget)) {
+							EAttachmentBar *bar = E_ATTACHMENT_BAR (widget);
+							EAttachmentStore *store;
+							NumAttachmentsData *nad;
+
+							/* Always hide an attachment bar without attachments */
+							store = e_attachment_bar_get_store (bar);
+
+							nad = g_new0 (NumAttachmentsData, 1);
+							nad->store = g_object_ref (store);
+							nad->handler_id = g_signal_connect (
+								store, "notify::num-attachments",
+								G_CALLBACK (mail_display_attachment_count_changed),
+								bar);
+
+							g_object_weak_ref (G_OBJECT (bar), attachment_bar_gone_cb, nad);
+
+							/* Initial sync */
+							mail_display_attachment_count_changed (store, NULL, GTK_WIDGET (bar));
+						} else if (GTK_IS_BOX (widget)) {
+							EAttachmentButton *button = NULL;
+							GList *children, *link;
+
+							children = gtk_container_get_children (GTK_CONTAINER (widget));
+							for (link = children; link; link = g_list_next (link)) {
+								if (E_IS_ATTACHMENT_BUTTON (link->data)) {
+									button = E_ATTACHMENT_BUTTON (link->data);
+									break;
+								}
+							}
+
+							g_list_free (children);
+
+							if (button && e_attachment_button_get_expandable (button)) {
+								EAttachment *attachment;
+
+								g_warn_if_fail (previous_attachment_button == NULL);
+								previous_attachment_button = button;
+
+								e_attachment_button_set_expanded (button, e_mail_part_should_show_inline (part));
+								printf ("%s: a) %d\n", __FUNCTION__, e_mail_part_should_show_inline (part));
+
+								attachment = attachment_part ? e_mail_part_attachment_ref_attachment (attachment_part) : NULL;
+								if (attachment && e_attachment_is_mail_note (attachment)) {
+									CamelFolder *folder;
+									const gchar *message_uid;
+
+									folder = e_mail_part_list_get_folder (display->priv->part_list);
+									message_uid = e_mail_part_list_get_message_uid (display->priv->part_list);
+
+									if (folder && message_uid) {
+										CamelMessageInfo *info;
+
+										info = camel_folder_get_message_info (folder, message_uid);
+										if (info) {
+											if (!camel_message_info_user_flag (info, E_MAIL_NOTES_USER_FLAG))
+												camel_message_info_set_user_flag (info, E_MAIL_NOTES_USER_FLAG, TRUE);
+											camel_message_info_unref (info);
+										}
+									}
+								}
+
+								g_clear_object (&attachment);
+							}
+						}
+
+						break;
+					}
+				}
+			}
+
+			if (part->is_hidden)
+				previous_attachment_button = NULL;
+		} else if (is_rfc822_start) {
+			GtkWidget *frame;
+
+			frame = gtk_frame_new (NULL);
+			gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+
+			#if GTK_CHECK_VERSION(3,12,0)
+			gtk_widget_set_margin_start (frame,
+				gtk_widget_get_margin_start (frame) + 6 + (depth_stack ? 0 : 6));
+			gtk_widget_set_margin_end (frame,
+				gtk_widget_get_margin_end (frame) + 6);
+			#else
+			gtk_widget_set_margin_left (frame,
+				gtk_widget_get_margin_left (frame) + 6 + (depth_stack ? 0 : 6));
+			gtk_widget_set_margin_right (frame,
+				gtk_widget_get_margin_right (frame) + 6);
+			#endif
+			gtk_widget_set_margin_top (frame,
+				gtk_widget_get_margin_top (frame) + 6);
+			gtk_widget_set_margin_bottom (frame,
+				gtk_widget_get_margin_bottom (frame) + 6);
+
+			gtk_widget_show (frame);
+			gtk_box_pack_start (box, frame, FALSE, FALSE, 0);
+
+			widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4);
+
+			#if GTK_CHECK_VERSION(3,12,0)
+			gtk_widget_set_margin_start (widget,
+				gtk_widget_get_margin_start (widget) + 12);
+			#else
+			gtk_widget_set_margin_left (widget,
+				gtk_widget_get_margin_left (widget) + 12);
+			#endif
+
+			gtk_widget_show (widget);
+			gtk_container_add (GTK_CONTAINER (frame), widget);
+
+			depth_stack = g_slist_prepend (depth_stack, box);
+			box = GTK_BOX (widget);
+
+			depth++;
+			printf ("  %s: %s | cid: %s | mime_type: %s | is_attachment: %d Beginning of new message, new depth:%d\n", __FUNCTION__,
+				e_mail_part_get_id (part),
+				e_mail_part_get_cid (part),
+				e_mail_part_get_mime_type (part),
+				e_mail_part_get_is_attachment (part) ? 1 : 0,
+				depth);
+
+			if (previous_attachment_button) {
+				printf ("%s: c) %d\n", __FUNCTION__, e_mail_part_should_show_inline (part));
+				e_binding_bind_property (
+					previous_attachment_button, "expanded",
+					frame, "visible",
+					G_BINDING_SYNC_CREATE);
+				previous_attachment_button = NULL;
+			}
+		} else if (is_rfc822_end) {
+			g_warn_if_fail (previous_attachment_button == NULL);
+
+			printf ("  %s: %s | cid: %s | mime_type: %s | is_attachment: %d End of message, at depth:%d\n", __FUNCTION__,
+				e_mail_part_get_id (part),
+				e_mail_part_get_cid (part),
+				e_mail_part_get_mime_type (part),
+				e_mail_part_get_is_attachment (part) ? 1 : 0,
+				depth);
+			depth--;
+
+			g_warn_if_fail (depth_stack != NULL);
+
+			if (depth_stack) {
+				box = depth_stack->data;
+				depth_stack = g_slist_remove (depth_stack, box);
+			}
+		} else {
+			printf (" SKIPPING %s: %s | cid: %s | mime_type: %s | is_attachment: %d | hidden:%d\n", __FUNCTION__,
+				e_mail_part_get_id (part),
+				e_mail_part_get_cid (part),
+				e_mail_part_get_mime_type (part),
+				e_mail_part_get_is_attachment (part) ? 1 : 0,
+				part->is_hidden ? 1 : 0);
+		}
+
+		g_object_unref (part);
+	}
+
+	printf ("%s: final depth:%d\n", __FUNCTION__, depth);
+}
+
 void
 e_mail_display_set_part_list (EMailDisplay *display,
                               EMailPartList *part_list)
@@ -2866,6 +3233,8 @@ e_mail_display_set_part_list (EMailDisplay *display,
 	display->priv->part_list = part_list;
 
 	g_object_notify (G_OBJECT (display), "part-list");
+
+	e_mail_display_fill_alt_bin (display);
 }
 
 gboolean
@@ -3242,3 +3611,14 @@ e_mail_display_set_remote_content (EMailDisplay *display,
 
 	g_mutex_unlock (&display->priv->remote_content_lock);
 }
+
+void
+e_mail_display_set_alt_bin (EMailDisplay *display,
+			    GtkBin *bin)
+{
+	g_return_if_fail (E_IS_MAIL_DISPLAY (display));
+	g_return_if_fail (GTK_IS_BIN (bin));
+	g_return_if_fail (display->priv->alt_bin == NULL);
+
+	display->priv->alt_bin = bin;
+}
diff --git a/mail/e-mail-display.h b/mail/e-mail-display.h
index 63d7a6b..80bc26d 100644
--- a/mail/e-mail-display.h
+++ b/mail/e-mail-display.h
@@ -107,6 +107,9 @@ void		e_mail_display_set_remote_content
 						(EMailDisplay *display,
 						 EMailRemoteContent *remote_content);
 
+void		e_mail_display_set_alt_bin	(EMailDisplay *display,
+						 GtkBin *bin);
+
 G_END_DECLS
 
 #endif /* E_MAIL_DISPLAY_H */
diff --git a/mail/e-mail-paned-view.c b/mail/e-mail-paned-view.c
index c8d1091..879931a 100644
--- a/mail/e-mail-paned-view.c
+++ b/mail/e-mail-paned-view.c
@@ -728,12 +728,27 @@ mail_paned_view_constructed (GObject *object)
 
 	container = priv->paned;
 
-	widget = e_preview_pane_new (E_WEB_VIEW (priv->display));
+	widget = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
 	gtk_paned_pack2 (GTK_PANED (container), widget, FALSE, FALSE);
+	gtk_widget_show (widget);
+
+	container = widget;
+
+	widget = e_preview_pane_new (E_WEB_VIEW (priv->display));
+	gtk_paned_pack1 (GTK_PANED (container), widget, FALSE, FALSE);
 	priv->preview_pane = g_object_ref (widget);
 	gtk_widget_show (GTK_WIDGET (priv->display));
 	gtk_widget_show (widget);
 
+	widget = gtk_scrolled_window_new (NULL, NULL);
+	gtk_scrolled_window_set_policy (
+		GTK_SCROLLED_WINDOW (widget),
+		GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+	gtk_paned_pack2 (GTK_PANED (container), widget, FALSE, FALSE);
+	gtk_widget_show (widget);
+
+	e_mail_display_set_alt_bin (priv->display, GTK_BIN (widget));
+
 	e_binding_bind_property (
 		object, "preview-visible",
 		widget, "visible",
diff --git a/mail/e-mail-web-view.c b/mail/e-mail-web-view.c
new file mode 100644
index 0000000..05d3956
--- /dev/null
+++ b/mail/e-mail-web-view.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc. (www.redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <e-util/e-util.h>
+
+#include "e-mail-web-view.h"
+
+struct _EMailWebViewPrivate {
+	EMailDisplay *mail_display;
+};
+
+enum {
+	PROP_0,
+	PROP_MAIL_DISPLAY
+};
+
+G_DEFINE_TYPE (EMailWebView, e_mail_web_view, E_TYPE_WEB_VIEW)
+
+static void
+mail_web_view_initialize (WebKitWebView *web_view)
+{
+	WebKitSettings *webkit_settings;
+
+	webkit_settings = webkit_web_view_get_settings (web_view);
+
+	g_object_set (webkit_settings,
+		"enable-frame-flattening", TRUE,
+		NULL);
+}
+
+static void
+e_mail_web_view_set_mail_display (EMailWebView *mail_web_view,
+				  EMailDisplay *mail_display)
+{
+	g_return_if_fail (E_IS_MAIL_WEB_VIEW (mail_web_view));
+	g_return_if_fail (E_IS_MAIL_DISPLAY (mail_display));
+	g_return_if_fail (mail_web_view->priv->mail_display == NULL);
+
+	mail_web_view->priv->mail_display = g_object_ref (mail_display);
+}
+
+static void
+mail_web_view_set_property (GObject *object,
+			    guint property_id,
+			    const GValue *value,
+			    GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_MAIL_DISPLAY:
+			e_mail_web_view_set_mail_display (
+				E_MAIL_WEB_VIEW (object),
+				g_value_get_object (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_web_view_get_property (GObject *object,
+			    guint property_id,
+			    GValue *value,
+			    GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_MAIL_DISPLAY:
+			g_value_set_object (
+				value,
+				e_mail_web_view_get_mail_display (
+				E_MAIL_WEB_VIEW (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_web_view_constructed (GObject *object)
+{
+	/* Chain up to parent's method. */
+	G_OBJECT_CLASS (e_mail_web_view_parent_class)->constructed (object);
+
+	mail_web_view_initialize (WEBKIT_WEB_VIEW (object));
+
+	e_web_view_update_fonts (E_WEB_VIEW (object));
+}
+
+static void
+mail_web_view_dispose (GObject *object)
+{
+	EMailWebView *mail_web_view = E_MAIL_WEB_VIEW (object);
+
+	g_clear_object (&mail_web_view->priv->mail_display);
+
+	/* Chain up to parent's method. */
+	G_OBJECT_CLASS (e_mail_web_view_parent_class)->dispose (object);
+}
+
+static void
+e_mail_web_view_class_init (EMailWebViewClass *class)
+{
+	GObjectClass *object_class;
+
+	g_type_class_add_private (class, sizeof (EMailWebViewPrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = mail_web_view_set_property;
+	object_class->get_property = mail_web_view_get_property;
+	object_class->constructed = mail_web_view_constructed;
+	object_class->dispose = mail_web_view_dispose;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_MAIL_DISPLAY,
+		g_param_spec_object (
+			"mail-display",
+			"Mail Display",
+			NULL,
+			E_TYPE_MAIL_DISPLAY,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT_ONLY |
+			G_PARAM_STATIC_STRINGS));
+}
+
+static void
+e_mail_web_view_init (EMailWebView *mail_web_view)
+{
+	mail_web_view->priv = G_TYPE_INSTANCE_GET_PRIVATE (mail_web_view, E_TYPE_MAIL_WEB_VIEW, EMailWebViewPrivate);
+}
+
+GtkWidget *
+e_mail_web_view_new (EMailDisplay *mail_display)
+{
+	g_return_val_if_fail (E_IS_MAIL_DISPLAY (mail_display), NULL);
+
+	return g_object_new (E_TYPE_MAIL_WEB_VIEW,
+		"mail-display", mail_display,
+		NULL);
+}
+
+EMailDisplay *
+e_mail_web_view_get_mail_display (EMailWebView *mail_web_view)
+{
+	g_return_val_if_fail (E_IS_MAIL_WEB_VIEW (mail_web_view), NULL);
+
+	return mail_web_view->priv->mail_display;
+}
diff --git a/mail/e-mail-web-view.h b/mail/e-mail-web-view.h
new file mode 100644
index 0000000..cc198a9
--- /dev/null
+++ b/mail/e-mail-web-view.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc. (www.redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef E_MAIL_WEB_VIEW_H
+#define E_MAIL_WEB_VIEW_H
+
+#include <e-util/e-util.h>
+#include <mail/e-mail-display.h>
+
+/* Standard GObject macros */
+#define E_TYPE_MAIL_WEB_VIEW \
+	(e_mail_web_view_get_type ())
+#define E_MAIL_WEB_VIEW(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_MAIL_WEB_VIEW, EMailWebView))
+#define E_MAIL_WEB_VIEW_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_MAIL_WEB_VIEW, EMailWebViewClass))
+#define E_IS_MAIL_WEB_VIEW(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_MAIL_WEB_VIEW))
+#define E_IS_MAIL_WEB_VIEW_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_MAIL_WEB_VIEW))
+#define E_MAIL_WEB_VIEW_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_MAIL_WEB_VIEW, EMailWebViewClass))
+
+G_BEGIN_DECLS
+
+typedef struct _EMailWebView EMailWebView;
+typedef struct _EMailWebViewClass EMailWebViewClass;
+typedef struct _EMailWebViewPrivate EMailWebViewPrivate;
+
+struct _EMailWebView {
+	EWebView web_view;
+	EMailWebViewPrivate *priv;
+};
+
+struct _EMailWebViewClass {
+	EWebViewClass parent_class;
+};
+
+GType		e_mail_web_view_get_type	(void) G_GNUC_CONST;
+GtkWidget *	e_mail_web_view_new		(EMailDisplay *mail_display);
+EMailDisplay *	e_mail_web_view_get_mail_display(EMailWebView *mail_web_view);
+
+G_END_DECLS
+
+#endif /* E_MAIL_WEB_VIEW_H */
