f842eb38a0c04748659ed82a95fcb731bdd3f730
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index 03b1500..99e194e 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -460,8 +460,13 @@ ephy_embed_base_init (gpointer g_class)
                                                                            "The embed's load status",
                                                                            FALSE,
                                                                            G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
-
+                g_object_interface_install_property (g_class,
+                                                     g_param_spec_flags ("navigation",
+                                                                         "Navigation flags",
+                                                                         "The embed's navigation flags",
+                                                                         EPHY_TYPE_EMBED_NAVIGATION_FLAGS,
+                                                                         0,
+                                                                         G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
 
 		initialized = TRUE;
 	}
@@ -1125,4 +1130,25 @@ ephy_embed_set_load_status (EphyEmbed *embed, gboolean status)
 	return iface->set_load_status (embed, status);
 }
 
+/**
+ * ephy_embed_get_navigation_flags:
+ * @embed: an #EphyEmbed
+ *
+ * Returns @embed's navigation flags.
+ *
+ * Return value: @embed's navigation flags
+ **/
+EphyEmbedNavigationFlags
+ephy_embed_get_navigation_flags (EphyEmbed *embed)
+{
+	EphyEmbedIface *iface = EPHY_EMBED_GET_IFACE (embed);
+	return iface->get_navigation_flags (embed);
+}
+
+void
+ephy_embed_update_navigation_flags (EphyEmbed *embed)
+{
+	EphyEmbedIface *iface = EPHY_EMBED_GET_IFACE (embed);
+	return iface->update_navigation_flags (embed);
+}
 
diff --git a/embed/ephy-embed.h b/embed/ephy-embed.h
index 394e778..2c64234 100644
--- a/embed/ephy-embed.h
+++ b/embed/ephy-embed.h
@@ -101,6 +101,13 @@ typedef enum
 	EPHY_EMBED_DOCUMENT_OTHER
 } EphyEmbedDocumentType;
 
+typedef enum
+{
+	EPHY_EMBED_NAV_UP	= 1 << 0,
+	EPHY_EMBED_NAV_BACK	= 1 << 1,
+	EPHY_EMBED_NAV_FORWARD	= 1 << 2
+} EphyEmbedNavigationFlags;
+
 struct _EphyEmbedIface
 {
 	GTypeInterface base_iface;
@@ -233,6 +240,8 @@ struct _EphyEmbedIface
 	void		   (* set_load_percent)		(EphyEmbed *embed, int percent);
 	gboolean	   (* get_load_status)		(EphyEmbed *embed);
 	void		   (* set_load_status)		(EphyEmbed *embed, gboolean percent);
+	void		   (* update_navigation_flags)	(EphyEmbed *embed);
+	EphyEmbedNavigationFlags (* get_navigation_flags) (EphyEmbed *embed);
 };
 
 GType		  ephy_embed_net_state_get_type		(void);
@@ -333,8 +342,13 @@ int		 ephy_embed_get_load_percent		(EphyEmbed *embed);
 void		 ephy_embed_set_load_percent		(EphyEmbed *embed, int percent); /* FIXME: remove me */
 
 /* Load status */
-gboolean         ephy_embed_get_load_status             (EphyEmbed *embed);
-void             ephy_embed_set_load_status             (EphyEmbed *embed, gboolean status); /* FIXME: remove me */
+gboolean	 ephy_embed_get_load_status		(EphyEmbed *embed);
+void		 ephy_embed_set_load_status		(EphyEmbed *embed, gboolean status); /* FIXME: remove me */
+
+/* Navigation flags */
+
+void		 ephy_embed_update_navigation_flags	(EphyEmbed *embed); /* FIXME: remove me */
+EphyEmbedNavigationFlags ephy_embed_get_navigation_flags (EphyEmbed *embed);
 
 /* Encoding */
 char		 *ephy_embed_get_encoding		(EphyEmbed *embed);
diff --git a/embed/mozilla/mozilla-embed.cpp b/embed/mozilla/mozilla-embed.cpp
index 3693f4e..f2c9908 100644
--- a/embed/mozilla/mozilla-embed.cpp
+++ b/embed/mozilla/mozilla-embed.cpp
@@ -104,6 +104,7 @@ struct MozillaEmbedPrivate
 	EphyEmbedSecurityLevel security_level;
 	/* guint security_level : 3; ? */
 	EphyEmbedDocumentType document_type;
+	EphyEmbedNavigationFlags nav_flags;
 	float zoom;
 
 	/* Flags */
@@ -121,6 +122,7 @@ enum
 	PROP_DOCUMENT_TYPE,
 	PROP_LOAD_PROGRESS,
 	PROP_LOAD_STATUS,
+	PROP_NAVIGATION,
 	PROP_SECURITY,
 	PROP_ZOOM
 };
@@ -241,6 +243,9 @@ mozilla_embed_get_property (GObject *object,
 	case PROP_LOAD_STATUS:
 		g_value_set_boolean (value, priv->is_loading);
 		break;
+	case PROP_NAVIGATION:
+		g_value_set_flags (value, priv->nav_flags);
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -259,6 +264,7 @@ mozilla_embed_set_property (GObject *object,
 	case PROP_DOCUMENT_TYPE:
 	case PROP_LOAD_PROGRESS:
 	case PROP_LOAD_STATUS:
+	case PROP_NAVIGATION:
 	case PROP_SECURITY:
 	case PROP_ZOOM:
 		/* read only */
@@ -293,6 +299,7 @@ mozilla_embed_class_init (MozillaEmbedClass *klass)
 	g_object_class_override_property (object_class, PROP_ZOOM, "zoom");
 	g_object_class_override_property (object_class, PROP_LOAD_PROGRESS, "load-progress");
 	g_object_class_override_property (object_class, PROP_LOAD_STATUS, "load-status");
+	g_object_class_override_property (object_class, PROP_NAVIGATION, "navigation");
 
 	g_type_class_add_private (object_class, sizeof(MozillaEmbedPrivate));
 }
@@ -961,6 +968,42 @@ impl_set_load_status (EphyEmbed *embed, gboolean status)
 }
 
 static void
+impl_update_navigation_flags (EphyEmbed *embed)
+{
+	MozillaEmbedPrivate *priv = MOZILLA_EMBED (embed)->priv;
+	guint flags = 0;
+
+	if (ephy_embed_can_go_up (embed))
+	{
+		flags |= EPHY_EMBED_NAV_UP;
+	}
+
+	if (ephy_embed_can_go_back (embed))
+	{
+		flags |= EPHY_EMBED_NAV_BACK;
+	}
+
+	if (ephy_embed_can_go_forward (embed))
+	{
+		flags |= EPHY_EMBED_NAV_FORWARD;
+	}
+
+	if (priv->nav_flags != (EphyEmbedNavigationFlags)flags)
+	{
+		priv->nav_flags = (EphyEmbedNavigationFlags)flags;
+
+		g_object_notify (G_OBJECT (embed), "navigation");
+	}
+}
+
+static EphyEmbedNavigationFlags
+impl_get_navigation_flags (EphyEmbed *embed)
+{
+	MozillaEmbedPrivate *priv = MOZILLA_EMBED (embed)->priv;
+	return priv->nav_flags;
+}
+
+static void
 mozilla_embed_location_changed_cb (GtkMozEmbed *embed, 
 				   MozillaEmbed *membed)
 {
@@ -1421,6 +1464,8 @@ ephy_embed_iface_init (EphyEmbedIface *iface)
 	iface->set_load_percent = impl_set_load_percent;
 	iface->get_load_status = impl_get_load_status;
 	iface->set_load_status = impl_set_load_status;
+	iface->update_navigation_flags = impl_update_navigation_flags;
+	iface->get_navigation_flags = impl_get_navigation_flags;
 }
 
 static void
diff --git a/src/ephy-tab.c b/src/ephy-tab.c
index 73c1e1c..87d4a01 100644
--- a/src/ephy-tab.c
+++ b/src/ephy-tab.c
@@ -95,7 +95,6 @@ struct _EphyTabPrivate
 	int height;
 	GSList *hidden_popups;
 	GSList *shown_popups;
-	EphyTabNavigationFlags nav_flags;
 	guint idle_resize_handler;
 
 	/* Flags */
@@ -121,7 +120,6 @@ enum
 	PROP_ICON,
 	PROP_ICON_ADDRESS,
 	PROP_MESSAGE,
-	PROP_NAVIGATION,
 	PROP_HIDDEN_POPUP_COUNT,
 	PROP_POPUPS_ALLOWED,
 	PROP_TITLE,
@@ -148,8 +146,6 @@ static guint n_tabs = 0;
 /* internal functions, accessible only from this file */
 static void	ephy_tab_set_link_message	(EphyTab *tab,
 						 char *message);
-static void	ephy_tab_update_navigation_flags(EphyTab *tab,
-						 EphyEmbed *embed);
 static void	ephy_tab_set_title		(EphyTab *tab,
 						 EphyEmbed *embed,
 						 char *new_title);
@@ -224,7 +220,6 @@ ephy_tab_set_property (GObject *object,
 		case PROP_ADDRESS:
 		case PROP_ICON:
 		case PROP_MESSAGE:
-		case PROP_NAVIGATION:
 		case PROP_HIDDEN_POPUP_COUNT:
 		case PROP_TITLE:
 			/* read only */
@@ -255,9 +250,6 @@ ephy_tab_get_property (GObject *object,
 		case PROP_MESSAGE:
 			g_value_set_string (value, ephy_tab_get_status_message (tab));
 			break;
-		case PROP_NAVIGATION:
-			g_value_set_flags (value, priv->nav_flags);
-			break;
 		case PROP_HIDDEN_POPUP_COUNT:
 			g_value_set_int (value, popup_blocker_n_hidden (tab));
 			break;
@@ -396,15 +388,6 @@ ephy_tab_class_init (EphyTabClass *class)
 							      G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
 
 	g_object_class_install_property (object_class,
-					 PROP_NAVIGATION,
-					 g_param_spec_flags ("navigation",
-							     "Navigation flags",
-							     "The tab's navigation flags",
-							     EPHY_TYPE_TAB_NAVIGATION_FLAGS,
-							     0,
-							     G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
-	g_object_class_install_property (object_class,
 					 PROP_HIDDEN_POPUP_COUNT,
 					 g_param_spec_int ("hidden-popup-count",
 							   "Number of Blocked Popups",
@@ -1443,7 +1426,7 @@ ephy_tab_address_cb (EphyEmbed *embed,
 
 	ephy_tab_set_link_message (tab, NULL);
 	ephy_tab_set_icon_address (tab, NULL);
-	ephy_tab_update_navigation_flags (tab, embed);
+	ephy_embed_update_navigation_flags (embed);
 
 	g_object_notify (object, "title");
 
@@ -1623,7 +1606,7 @@ ephy_tab_net_state_cb (EphyEmbed *embed,
 
 			ephy_embed_set_load_percent (embed, 0);
 			ephy_embed_set_load_status (embed, TRUE);
-			ephy_tab_update_navigation_flags (tab, embed);
+			ephy_embed_update_navigation_flags (embed);
 
 			ensure_page_info (tab, embed, uri);
 
@@ -1639,7 +1622,7 @@ ephy_tab_net_state_cb (EphyEmbed *embed,
 
 			ephy_embed_set_load_percent (ephy_tab_get_embed (tab), 100);
 			ephy_embed_set_load_status (embed, FALSE);
-			ephy_tab_update_navigation_flags (tab, embed);
+			ephy_embed_update_navigation_flags (embed);
 
 			g_free (priv->loading_title);
 			priv->loading_title = NULL;
@@ -1950,50 +1933,6 @@ ephy_tab_init (EphyTab *tab)
 				 tab,  0);
 }
 
-static void
-ephy_tab_update_navigation_flags (EphyTab *tab, EphyEmbed *embed)
-{
-	EphyTabNavigationFlags flags = 0;
-
-	if (ephy_embed_can_go_up (embed))
-	{
-		flags |= EPHY_TAB_NAV_UP;
-	}
-
-	if (ephy_embed_can_go_back (embed))
-	{
-		flags |= EPHY_TAB_NAV_BACK;
-	}
-
-	if (ephy_embed_can_go_forward (embed))
-	{
-		flags |= EPHY_TAB_NAV_FORWARD;
-	}
-
-	if (flags != tab->priv->nav_flags)
-	{
-		tab->priv->nav_flags = flags;
-
-		g_object_notify (G_OBJECT (tab), "navigation");
-	}
-}
-
-/**
- * ephy_tab_get_navigation_flags:
- * @tab: an #EphyTab
- *
- * Returns @tab's navigation flags.
- *
- * Return value: @tab's navigation flags
- **/
-EphyTabNavigationFlags
-ephy_tab_get_navigation_flags (EphyTab *tab)
-{
-	g_return_val_if_fail (EPHY_IS_TAB (tab), 0);
-
-	return tab->priv->nav_flags;
-}
-
 /**
  * ephy_tab_get_status_message:
  * @tab: an #EphyTab
diff --git a/src/ephy-tab.h b/src/ephy-tab.h
index cb40338..4eac975 100644
--- a/src/ephy-tab.h
+++ b/src/ephy-tab.h
@@ -42,13 +42,6 @@ typedef struct _EphyTabPrivate	EphyTabPrivate;
 
 typedef enum
 {
-	EPHY_TAB_NAV_UP		= 1 << 0,
-	EPHY_TAB_NAV_BACK	= 1 << 1,
-	EPHY_TAB_NAV_FORWARD	= 1 << 2
-} EphyTabNavigationFlags;
-
-typedef enum
-{
 	EPHY_TAB_ADDRESS_EXPIRE_NOW,
 	EPHY_TAB_ADDRESS_EXPIRE_NEXT,
 	EPHY_TAB_ADDRESS_EXPIRE_CURRENT
@@ -97,8 +90,6 @@ void			ephy_tab_set_typed_address	(EphyTab *tab,
 							 const char *address,
 							 EphyTabAddressExpire expire);
 
-EphyTabNavigationFlags	ephy_tab_get_navigation_flags	(EphyTab *tab);
-
 EphyEmbedSecurityLevel	ephy_tab_get_security_level	(EphyTab *tab);
 
 void			ephy_tab_get_size		(EphyTab *tab,
diff --git a/src/ephy-window.c b/src/ephy-window.c
index e7c13c8..1f4b475 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -1468,30 +1468,29 @@ sync_tab_message (EphyTab *tab, GParamSpec *pspec, EphyWindow *window)
 }
 
 static void
-sync_tab_navigation (EphyTab *tab,
+sync_tab_navigation (EphyEmbed *embed,
 		     GParamSpec *pspec,
 		     EphyWindow *window)
 {
-	EphyTabNavigationFlags flags;
+	EphyEmbedNavigationFlags flags;
 	gboolean up = FALSE, back = FALSE, forward = FALSE;
-	EphyEmbed *embed;
 	char *back_url   = NULL, *forward_url   = NULL;
 	char *back_title = NULL, *forward_title = NULL;
 	gint position;
 
 	if (window->priv->closing) return;
 
-	flags = ephy_tab_get_navigation_flags (tab);
+	flags = ephy_embed_get_navigation_flags (embed);
 
-	if (flags & EPHY_TAB_NAV_UP)
+	if (flags & EPHY_EMBED_NAV_UP)
 	{
 		up = TRUE;
 	}
-	if (flags & EPHY_TAB_NAV_BACK)
+	if (flags & EPHY_EMBED_NAV_BACK)
 	{
 		back = TRUE;
 	}
-	if (flags & EPHY_TAB_NAV_FORWARD)
+	if (flags & EPHY_EMBED_NAV_FORWARD)
 	{
 		forward = TRUE;
 	}
@@ -1499,9 +1498,6 @@ sync_tab_navigation (EphyTab *tab,
 	ephy_toolbar_set_navigation_actions (window->priv->toolbar,
 					     back, forward, up);
 
-	embed = ephy_tab_get_embed (tab);
-	if (embed == NULL) return;
-
 	position = ephy_embed_shistory_get_pos (embed);
 
 	if (position > 0)
@@ -2155,9 +2151,6 @@ ephy_window_set_active_tab (EphyWindow *window, EphyTab *new_tab)
 						      G_CALLBACK (sync_tab_message),
 						      window);
 		g_signal_handlers_disconnect_by_func (old_tab,
-						      G_CALLBACK (sync_tab_navigation),
-						      window);
-		g_signal_handlers_disconnect_by_func (old_tab,
 						      G_CALLBACK (sync_tab_popup_windows),
 						      window);
 		g_signal_handlers_disconnect_by_func (old_tab,
@@ -2184,6 +2177,9 @@ ephy_window_set_active_tab (EphyWindow *window, EphyTab *new_tab)
 		g_signal_handlers_disconnect_by_func (embed,
 						      G_CALLBACK (sync_tab_load_status),
 						      window);
+		g_signal_handlers_disconnect_by_func (embed,
+						      G_CALLBACK (sync_tab_navigation),
+						      window);
 
 		g_signal_handlers_disconnect_by_func
 			(embed, G_CALLBACK (tab_context_menu_cb), window);
@@ -2203,11 +2199,11 @@ ephy_window_set_active_tab (EphyWindow *window, EphyTab *new_tab)
 		sync_tab_zoom		(embed, NULL, window);
 		sync_tab_load_progress	(embed, NULL, window);
 		sync_tab_load_status	(embed, NULL, window);
+		sync_tab_navigation	(embed, NULL, window);
 
 		sync_tab_address	(new_tab, NULL, window);
 		sync_tab_icon		(new_tab, NULL, window);
 		sync_tab_message	(new_tab, NULL, window);
-		sync_tab_navigation	(new_tab, NULL, window);
 		sync_tab_popup_windows	(new_tab, NULL, window);
 		sync_tab_popups_allowed	(new_tab, NULL, window);
 		sync_tab_title		(new_tab, NULL, window);
@@ -2221,9 +2217,6 @@ ephy_window_set_active_tab (EphyWindow *window, EphyTab *new_tab)
 		g_signal_connect_object (new_tab, "notify::message",
 					 G_CALLBACK (sync_tab_message),
 					 window, 0);
-		g_signal_connect_object (new_tab, "notify::navigation",
-					 G_CALLBACK (sync_tab_navigation),
-					 window, 0);
 		g_signal_connect_object (new_tab, "notify::hidden-popup-count",
 					 G_CALLBACK (sync_tab_popup_windows),
 					 window, 0);
@@ -2246,6 +2239,9 @@ ephy_window_set_active_tab (EphyWindow *window, EphyTab *new_tab)
 		g_signal_connect_object (embed, "notify::load-status",
 					 G_CALLBACK (sync_tab_load_status),
 					 window, 0);
+		g_signal_connect_object (embed, "notify::navigation",
+					 G_CALLBACK (sync_tab_navigation),
+					 window, 0);
 		g_signal_connect_object (embed, "ge-context-menu",
 					 G_CALLBACK (tab_context_menu_cb),
 					 window, G_CONNECT_AFTER);
diff --git a/src/epiphany.defs b/src/epiphany.defs
index 394ef4d..02c5bfa 100644
--- a/src/epiphany.defs
+++ b/src/epiphany.defs
@@ -217,6 +217,17 @@
 
 ;; Enumerations and flags ...
 
+(define-flags EmbedNavigationFlags
+  (in-module "Ephy")
+  (c-name "EphyEmbedNavigationFlags")
+  (gtype-id "EPHY_TYPE_EMBED_NAVIGATION_FLAGS")
+  (values
+    '("up" "EPHY_EMBED_NAV_UP")
+    '("back" "EPHY_EMBED_NAV_BACK")
+    '("forward" "EPHY_EMBED_NAV_FORWARD")
+  )
+)
+
 (define-flags EmbedEventContext
   (in-module "Ephy")
   (c-name "EphyEmbedEventContext")
@@ -426,17 +437,6 @@
   )
 )
 
-(define-flags TabNavigationFlags
-  (in-module "Ephy")
-  (c-name "EphyTabNavigationFlags")
-  (gtype-id "EPHY_TYPE_TAB_NAVIGATION_FLAGS")
-  (values
-    '("up" "EPHY_TAB_NAV_UP")
-    '("back" "EPHY_TAB_NAV_BACK")
-    '("forward" "EPHY_TAB_NAV_FORWARD")
-  )
-)
-
 (define-enum TabAddressExpire
   (in-module "Ephy")
   (c-name "EphyTabAddressExpire")
@@ -942,6 +942,11 @@
 
 ;; From ../embed/ephy-embed.h
 
+(define-function ephy_embed_navigation_flags_get_type
+  (c-name "ephy_embed_navigation_flags_get_type")
+  (return-type "GType")
+)
+
 (define-function ephy_embed_net_state_get_type
   (c-name "ephy_embed_net_state_get_type")
   (return-type "GType")
@@ -3372,12 +3377,6 @@
   )
 )
 
-(define-method get_navigation_flags
-  (of-object "EphyTab")
-  (c-name "ephy_tab_get_navigation_flags")
-  (return-type "EphyTabNavigationFlags")
-)
-
 (define-method get_size
   (of-object "EphyTab")
   (c-name "ephy_tab_get_size")
@@ -3533,11 +3532,6 @@
   (return-type "GType")
 )
 
-(define-function ephy_tab_navigation_flags_get_type
-  (c-name "ephy_tab_navigation_flags_get_type")
-  (return-type "GType")
-)
-
 (define-function ephy_tab_address_expire_get_type
   (c-name "ephy_tab_address_expire_get_type")
   (return-type "GType")
