72979730ed03429699c47737bc5b9d25f11470d9
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index ae6ea6d..882c9bf 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -485,7 +485,18 @@ ephy_embed_base_init (gpointer g_class)
 									  "The embed's title",
 									  _("Blank page"),
 									  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_string ("status message",
+                                                                          "Status Message",
+                                                                          "The embed's statusbar message",
+                                                                          NULL,
+                                                                          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_string ("link-message",
+                                                                          "Link Message",
+                                                                          "The embed's link message",
+                                                                          NULL,
+                                                                          G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
 		initialized = TRUE;
 	}
 
@@ -685,7 +696,7 @@ ephy_embed_get_location (EphyEmbed *embed,
  *
  * Return value: the URL of the link over which the mouse is hovering
  **/
-char *
+const char *
 ephy_embed_get_link_message (EphyEmbed *embed)
 {
 	EphyEmbedIface *iface = EPHY_EMBED_GET_IFACE (embed);
@@ -1196,3 +1207,25 @@ ephy_embed_get_address (EphyEmbed *embed)
 	return iface->get_address (embed);
 }
 
+/**
+ * ephy_embed_get_status_message:
+ * @embed: an #EphyEmbed
+ *
+ * Returns the message displayed in @embed's #EphyWindow's
+ * #EphyStatusbar. If the user is hovering the mouse over a hyperlink,
+ * this function will return the same value as
+ * ephy_embed_get_link_message(). Otherwise, it will return a network
+ * status message, or NULL.
+ *
+ * The message returned has a limited lifetime, and so should be copied with
+ * g_strdup() if it must be stored.
+ *
+ * Return value: The current statusbar message
+ **/
+const char *
+ephy_embed_get_status_message (EphyEmbed *embed)
+{
+	EphyEmbedIface *iface = EPHY_EMBED_GET_IFACE (embed);
+	return iface->get_status_message (embed);
+}
+
diff --git a/embed/ephy-embed.h b/embed/ephy-embed.h
index 70058ee..0dc9cfa 100644
--- a/embed/ephy-embed.h
+++ b/embed/ephy-embed.h
@@ -199,7 +199,7 @@ struct _EphyEmbedIface
 	const char *       (* get_title)		(EphyEmbed *embed);
 	char *		   (* get_location)		(EphyEmbed *embed,
 							 gboolean toplevel);
-	char *		   (* get_link_message)		(EphyEmbed *embed);
+	const char *	   (* get_link_message)		(EphyEmbed *embed);
 	char *		   (* get_js_status)		(EphyEmbed *embed);
 	int		   (* shistory_n_items)		(EphyEmbed *embed);
 	void		   (* shistory_get_nth)		(EphyEmbed *embed,
@@ -251,6 +251,7 @@ struct _EphyEmbedIface
 							 const char *address,
 							 EphyEmbedAddressExpire expire);
 	const char *	   (* get_address)		(EphyEmbed *embed);
+        const char *       (* get_status_message)       (EphyEmbed *embed);
 };
 
 GType		  ephy_embed_net_state_get_type		(void);
@@ -283,7 +284,7 @@ const char	 *ephy_embed_get_title			(EphyEmbed *embed);
 char		 *ephy_embed_get_location		(EphyEmbed *embed,
 							 gboolean toplevel);
 
-char		 *ephy_embed_get_link_message		(EphyEmbed *embed);
+const char	 *ephy_embed_get_link_message		(EphyEmbed *embed);
 
 char		 *ephy_embed_get_js_status		(EphyEmbed *embed);
 
@@ -364,6 +365,9 @@ void		 ephy_embed_set_typed_address		(EphyEmbed *embed,
 /* Address */
 const char *	 ephy_embed_get_address			(EphyEmbed *embed);
 
+/* Status messages */
+const char *       ephy_embed_get_status_message        (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 7adbcce..6f8b5c6 100644
--- a/embed/mozilla/mozilla-embed.cpp
+++ b/embed/mozilla/mozilla-embed.cpp
@@ -89,8 +89,13 @@ static void mozilla_embed_zoom_change_cb	(EphyEmbed *embed,
 						 MozillaEmbed *membed);
 static void mozilla_embed_title_change_cb       (EphyEmbed *embed,
                                                  MozillaEmbed *membed);
+static void mozilla_embed_link_message_cb       (EphyEmbed *embed,
+                                                 MozillaEmbed *membed);
 static void mozilla_embed_set_title             (MozillaEmbed *embed,
                                                  char *title);
+static void mozilla_embed_set_loading_title     (MozillaEmbed *embed,
+                                                 const char *title,
+                                                 gboolean is_address);
 static void impl_set_typed_address		(EphyEmbed *embed,
 						 const char *address,
 						 EphyEmbedAddressExpire expire);
@@ -108,6 +113,8 @@ typedef enum
 } MozillaEmbedLoadState;
 
 #define MAX_TITLE_LENGTH	512 /* characters */
+#define RELOAD_DELAY		250 /* ms */
+#define RELOAD_DELAY_MAX_TICKS	40  /* RELOAD_DELAY * RELOAD_DELAY_MAX_TICKS = 10 s */
 
 struct MozillaEmbedPrivate
 {
@@ -135,6 +142,12 @@ struct MozillaEmbedPrivate
 	int cur_requests;
 	int total_requests;
 	char *status_message;
+	char *link_message;
+
+	/* File watch */
+	GnomeVFSMonitorHandle *monitor;
+	guint reload_scheduled_id;
+	guint reload_delay_ticks;	
 };
 
 #define WINDOWWATCHER_CONTRACTID "@mozilla.org/embedcomp/window-watcher;1"
@@ -144,10 +157,12 @@ enum
 	PROP_0,
 	PROP_ADDRESS,
 	PROP_DOCUMENT_TYPE,
+        PROP_LINK_MESSAGE,
 	PROP_LOAD_PROGRESS,
 	PROP_LOAD_STATUS,
 	PROP_NAVIGATION,
 	PROP_SECURITY,
+	PROP_STATUS_MESSAGE,
         PROP_TITLE,
 	PROP_TYPED_ADDRESS,
 	PROP_ZOOM
@@ -266,6 +281,9 @@ mozilla_embed_get_property (GObject *object,
 	case PROP_ZOOM:
 		g_value_set_float (value, priv->zoom);
 		break;
+        case PROP_LINK_MESSAGE:
+                g_value_set_string (value, priv->link_message);
+                break;
 	case PROP_LOAD_PROGRESS:
 		g_value_set_int (value, priv->load_percent);
 		break;
@@ -275,6 +293,9 @@ mozilla_embed_get_property (GObject *object,
 	case PROP_NAVIGATION:
 		g_value_set_flags (value, priv->nav_flags);
 		break;
+        case PROP_STATUS_MESSAGE:
+                g_value_set_string (value, priv->status_message);
+                break;
         case PROP_TITLE:
                 g_value_set_string (value, priv->title);
                 break;
@@ -304,8 +325,10 @@ mozilla_embed_set_property (GObject *object,
 	case PROP_DOCUMENT_TYPE:
 	case PROP_LOAD_PROGRESS:
 	case PROP_LOAD_STATUS:
+        case PROP_LINK_MESSAGE:
 	case PROP_NAVIGATION:
 	case PROP_SECURITY:
+        case PROP_STATUS_MESSAGE:
 	case PROP_ZOOM:
 		/* read only */
 		break;
@@ -343,6 +366,8 @@ mozilla_embed_class_init (MozillaEmbedClass *klass)
 	g_object_class_override_property (object_class, PROP_ADDRESS, "address");
 	g_object_class_override_property (object_class, PROP_TYPED_ADDRESS, "typed-address");
 	g_object_class_override_property (object_class, PROP_TITLE, "title");
+	g_object_class_override_property (object_class, PROP_STATUS_MESSAGE, "message");
+	g_object_class_override_property (object_class, PROP_LINK_MESSAGE, "link-message");
 
 	g_type_class_add_private (object_class, sizeof(MozillaEmbedPrivate));
 }
@@ -384,6 +409,9 @@ mozilla_embed_init (MozillaEmbed *embed)
         g_signal_connect_object (embed, "title",
                                  G_CALLBACK (mozilla_embed_title_change_cb),
                                  embed, (GConnectFlags) 0);
+	g_signal_connect_object (embed, "link_message",
+				 G_CALLBACK (mozilla_embed_link_message_cb),
+				 embed, (GConnectFlags)0);
 
 	priv->document_type = EPHY_EMBED_DOCUMENT_HTML;
 	priv->security_level = EPHY_EMBED_STATE_IS_UNKNOWN;
@@ -437,6 +465,8 @@ mozilla_embed_finalize (GObject *object)
 	g_free (embed->priv->typed_address);
 	g_free (embed->priv->title);
 	g_free (embed->priv->loading_title);
+	g_free (embed->priv->status_message);
+	g_free (embed->priv->link_message);
 
 	G_OBJECT_CLASS (mozilla_embed_parent_class)->finalize (object);
 
@@ -629,12 +659,6 @@ impl_get_title (EphyEmbed *embed)
 }
 
 static char *
-impl_get_link_message (EphyEmbed *embed)
-{
-	return gtk_moz_embed_get_link_message (GTK_MOZ_EMBED (embed));
-}
-
-static char *
 impl_get_js_status (EphyEmbed *embed)
 {
 	return gtk_moz_embed_get_js_status (GTK_MOZ_EMBED (embed));
@@ -1101,6 +1125,33 @@ impl_get_address (EphyEmbed *embed)
 	return priv->address ? priv->address : "about:blank";
 }
 
+static const char*
+impl_get_status_message (EphyEmbed *embed)
+{
+        MozillaEmbedPrivate *priv = MOZILLA_EMBED (embed)->priv;
+
+	if (priv->link_message && priv->link_message[0] != '\0')
+	{
+		return priv->link_message;
+	}
+	else if (priv->status_message)
+	{
+		return priv->status_message;
+	}
+	else
+	{
+		return NULL;
+	}
+}
+
+static const char*
+impl_get_link_message (EphyEmbed *embed)
+{
+        MozillaEmbedPrivate *priv = MOZILLA_EMBED (embed)->priv;
+
+        return priv->link_message;
+}
+
 static void
 mozilla_embed_set_address (MozillaEmbed *embed, char *address)
 {
@@ -1127,14 +1178,272 @@ mozilla_embed_set_address (MozillaEmbed *embed, char *address)
 }
 
 static void
+mozilla_embed_file_monitor_cancel (MozillaEmbed *embed)
+{
+	MozillaEmbedPrivate *priv = embed->priv;
+
+	if (priv->monitor != NULL)
+	{
+		LOG ("Cancelling file monitor");
+
+		gnome_vfs_monitor_cancel (priv->monitor);
+		priv->monitor = NULL;
+	}
+
+	if (priv->reload_scheduled_id != 0)
+	{
+		LOG ("Cancelling scheduled reload");
+
+		g_source_remove (priv->reload_scheduled_id);
+		priv->reload_scheduled_id = 0;
+	}
+
+	priv->reload_delay_ticks = 0;
+}
+
+static gboolean
+ephy_file_monitor_reload_cb (MozillaEmbed *embed)
+{
+	MozillaEmbedPrivate *priv = embed->priv;
+
+	if (priv->reload_delay_ticks > 0)
+	{
+		priv->reload_delay_ticks--;
+
+		/* Run again */
+		return TRUE;
+	}
+
+	if (priv->is_loading)
+	{
+		/* Wait a bit to reload if we're still loading! */
+		priv->reload_delay_ticks = RELOAD_DELAY_MAX_TICKS / 2;
+
+		/* Run again */
+		return TRUE;
+	}
+
+	priv->reload_scheduled_id = 0;
+
+	LOG ("Reloading file '%s'", impl_get_address (embed));
+
+	impl_reload (EPHY_EMBED (embed), TRUE);
+
+	/* don't run again */
+	return FALSE;
+}
+
+static void
+mozilla_embed_file_monitor_cb (GnomeVFSMonitorHandle *handle,
+                               const gchar *monitor_uri,
+                               const gchar *info_uri,
+                               GnomeVFSMonitorEventType event_type,
+                               MozillaEmbed *embed)
+{
+	gboolean uri_is_directory;
+	gboolean should_reload;
+	char* local_path;
+	MozillaEmbedPrivate *priv = embed->priv;
+
+	LOG ("File '%s' has changed, scheduling reload", monitor_uri);
+
+	local_path = gnome_vfs_get_local_path_from_uri(monitor_uri);
+	uri_is_directory = g_file_test(local_path, G_FILE_TEST_IS_DIR);
+	g_free(local_path);
+
+	switch (event_type)
+	{
+		/* These events will always trigger a reload: */
+		case GNOME_VFS_MONITOR_EVENT_CHANGED:
+		case GNOME_VFS_MONITOR_EVENT_CREATED:
+			should_reload = TRUE;
+			break;
+
+		/* These events will only trigger a reload for directories: */
+		case GNOME_VFS_MONITOR_EVENT_DELETED:
+		case GNOME_VFS_MONITOR_EVENT_METADATA_CHANGED:
+			should_reload = uri_is_directory;
+			break;
+
+		/* These events don't trigger a reload: */
+		case GNOME_VFS_MONITOR_EVENT_STARTEXECUTING:
+		case GNOME_VFS_MONITOR_EVENT_STOPEXECUTING:
+		default:
+			should_reload = FALSE;
+			break;
+	}
+
+	if (should_reload) {
+		/* We make a lot of assumptions here, but basically we know
+		 * that we just have to reload, by construction.
+		 * Delay the reload a little bit so we don't endlessly
+		 * reload while a file is written.
+		 */
+		if (priv->reload_delay_ticks == 0)
+		{
+			priv->reload_delay_ticks = 1;
+		}
+		else
+		{
+			/* Exponential backoff */
+			priv->reload_delay_ticks = MIN (priv->reload_delay_ticks * 2,
+					RELOAD_DELAY_MAX_TICKS);
+		}
+
+		if (priv->reload_scheduled_id == 0)
+		{
+			priv->reload_scheduled_id =
+				g_timeout_add (RELOAD_DELAY,
+						(GSourceFunc) ephy_file_monitor_reload_cb, embed);
+		}
+	}
+}
+
+static void
+mozilla_embed_update_file_monitor (MozillaEmbed *embed,
+                                   const gchar *address)
+{
+	MozillaEmbedPrivate *priv = embed->priv;
+	GnomeVFSMonitorHandle *handle = NULL;
+	gboolean local;
+	char* local_path;
+	GnomeVFSMonitorType monitor_type;
+
+	if (priv->monitor != NULL &&
+	    priv->address != NULL && address != NULL &&
+	    strcmp (priv->address, address) == 0)
+	
+	{
+		/* same address, no change needed */
+		return;
+	}
+
+	mozilla_embed_file_monitor_cancel (embed);
+
+	local = g_str_has_prefix (address, "file://");
+	if (local == FALSE) return;
+	
+	local_path = gnome_vfs_get_local_path_from_uri(address);
+	monitor_type = g_file_test(local_path, G_FILE_TEST_IS_DIR)
+		? GNOME_VFS_MONITOR_DIRECTORY
+		: GNOME_VFS_MONITOR_FILE;
+	g_free(local_path);
+
+	if (gnome_vfs_monitor_add (&handle, address,
+				   monitor_type,
+				   (GnomeVFSMonitorCallback) mozilla_embed_file_monitor_cb,
+				   embed) == GNOME_VFS_OK)
+	{
+		LOG ("Installed monitor for file '%s'", address);
+
+		priv->monitor = handle;
+	}
+}
+
+static void
+mozilla_embed_set_link_message (MozillaEmbed *embed,
+                                char *link_message)
+{
+	char *status_message;
+	char **splitted_message;
+        MozillaEmbedPrivate *priv = embed->priv;
+
+	g_free (priv->link_message);
+	status_message = ephy_string_blank_chr (link_message);
+	
+	if (status_message && g_str_has_prefix (status_message, "mailto:"))
+	{
+		int i = 1;
+		char *p;
+		GString *tmp;
+		
+		/* We first want to eliminate all the things after "?", like
+		 * cc, subject and alike.
+		 */
+		
+		p = strchr (status_message, '?');
+		if (p != NULL) *p = '\0';
+		
+		/* Then we also want to check if there is more than an email address
+		 * in the mailto: list.
+		 */
+		
+		splitted_message = g_strsplit_set (status_message, ";", -1);
+		tmp = g_string_new (g_strdup_printf (_("Send an email message to “%s”"),
+						     (splitted_message[0] + 7)));
+		
+		while (splitted_message [i] != NULL)
+		{
+			g_string_append_printf (tmp, ", “%s”", splitted_message[i]);
+			i++;
+		}
+		
+		priv->link_message = g_string_free (tmp, FALSE);
+		
+		g_free (status_message);
+		g_strfreev (splitted_message);
+	}
+	else
+	{
+		priv->link_message = status_message;
+	}
+
+	g_object_notify (G_OBJECT (embed), "status-message");
+	g_object_notify (G_OBJECT (embed), "link-message");
+}
+
+static void
 mozilla_embed_location_changed_cb (GtkMozEmbed *embed, 
 				   MozillaEmbed *membed)
 {
 	char *location;
+        GObject *object = G_OBJECT (embed);
 
 	location = gtk_moz_embed_get_location (embed);
 	g_signal_emit_by_name (membed, "ge_location", location);
 	g_free (location);
+
+	g_object_freeze_notify (object);
+
+	/* do this up here so we still have the old address around */
+	mozilla_embed_update_file_monitor (membed, location);
+
+	/* Do not expose about:blank to the user, an empty address
+	   bar will do better */
+	if (location == NULL || location[0] == '\0' ||
+	    strcmp (location, "about:blank") == 0)
+	{
+		mozilla_embed_set_address (membed, NULL);
+		mozilla_embed_set_title (membed, NULL);
+	}
+	else
+	{
+		char *embed_address;
+
+		/* we do this to get rid of an eventual password in the URL */
+		embed_address = impl_get_location (EPHY_EMBED (embed), TRUE);
+		mozilla_embed_set_address (membed, embed_address);
+		mozilla_embed_set_loading_title (membed, embed_address, TRUE);
+	}
+
+	mozilla_embed_set_link_message (membed, NULL);
+#if 0
+	mozilla_embed_set_icon_address (embed, NULL);
+#endif
+	mozilla_embed_update_navigation_flags (membed);
+
+	g_object_notify (object, "title");
+
+	g_object_thaw_notify (object);
+}
+
+static void
+mozilla_embed_link_message_cb       (EphyEmbed *embed,
+                                     MozillaEmbed *membed)
+{
+  char *link_message = gtk_moz_embed_get_link_message (GTK_MOZ_EMBED (membed));
+  mozilla_embed_set_link_message (membed, link_message);
+  g_free (link_message);
 }
 
 static gboolean
@@ -1872,6 +2181,7 @@ ephy_embed_iface_init (EphyEmbedIface *iface)
 	iface->get_typed_address = impl_get_typed_address;
 	iface->set_typed_address = impl_set_typed_address;
 	iface->get_address = impl_get_address;
+        iface->get_status_message = impl_get_status_message;
 }
 
 static void
diff --git a/src/ephy-tab.c b/src/ephy-tab.c
index 58637ab..57e4137 100644
--- a/src/ephy-tab.c
+++ b/src/ephy-tab.c
@@ -73,15 +73,11 @@
 #define EPHY_TAB_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_TAB, EphyTabPrivate))
 
 #define MAX_HIDDEN_POPUPS	5
-#define RELOAD_DELAY		250 /* ms */
-#define RELOAD_DELAY_MAX_TICKS	40  /* RELOAD_DELAY * RELOAD_DELAY_MAX_TICKS = 10 s */
 
 struct _EphyTabPrivate
 {
 	guint id;
 
-	char *status_message;
-	char *link_message;
 	char *icon_address;
 	GdkPixbuf *icon;
 	int width;
@@ -89,11 +85,6 @@ struct _EphyTabPrivate
 	GSList *hidden_popups;
 	GSList *shown_popups;
 	guint idle_resize_handler;
-
-	/* File watch */
-	GnomeVFSMonitorHandle *monitor;
-	guint reload_scheduled_id;
-	guint reload_delay_ticks;	
 };
 
 static void ephy_tab_class_init		(EphyTabClass *klass);
@@ -106,7 +97,6 @@ enum
 	PROP_0,
 	PROP_ICON,
 	PROP_ICON_ADDRESS,
-	PROP_MESSAGE,
 	PROP_HIDDEN_POPUP_COUNT,
 	PROP_POPUPS_ALLOWED,
 };
@@ -129,8 +119,6 @@ static GArray *tabs_id_array = NULL;
 static guint n_tabs = 0;
 
 /* internal functions, accessible only from this file */
-static void	ephy_tab_set_link_message	(EphyTab *tab,
-						 char *message);
 static guint	popup_blocker_n_hidden		(EphyTab *tab);
 static gboolean	ephy_tab_get_popups_allowed	(EphyTab *tab);
 static void	ephy_tab_set_popups_allowed	(EphyTab *tab,
@@ -196,7 +184,6 @@ ephy_tab_set_property (GObject *object,
 			ephy_tab_set_icon_address (tab, g_value_get_string (value));
 			break;
 		case PROP_ICON:
-		case PROP_MESSAGE:
 		case PROP_HIDDEN_POPUP_COUNT:
 			/* read only */
 			break;
@@ -220,9 +207,6 @@ ephy_tab_get_property (GObject *object,
 		case PROP_ICON_ADDRESS:
 			g_value_set_string (value, priv->icon_address);
 			break;
-		case PROP_MESSAGE:
-			g_value_set_string (value, ephy_tab_get_status_message (tab));
-			break;
 		case PROP_HIDDEN_POPUP_COUNT:
 			g_value_set_int (value, popup_blocker_n_hidden (tab));
 			break;
@@ -339,14 +323,6 @@ ephy_tab_class_init (EphyTabClass *class)
 							      (G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)));
 
 	g_object_class_install_property (object_class,
-					 PROP_MESSAGE,
-					 g_param_spec_string ("message",
-							      "Message",
-							      "The tab's statusbar message",
-							      NULL,
-							      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",
@@ -686,8 +662,6 @@ ephy_tab_finalize (GObject *object)
 	}
 
 	g_free (priv->icon_address);
-	g_free (priv->link_message);
-	g_free (priv->status_message);
 	popups_manager_reset (tab);
 
 	G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -752,79 +726,6 @@ ephy_tab_new (void)
 	return EPHY_TAB (g_object_new (EPHY_TYPE_TAB, NULL));
 }
 
-static void
-ephy_tab_set_link_message (EphyTab *tab, char *message)
-{
-	char *status_message;
-	char **splitted_message;
-	g_return_if_fail (EPHY_IS_TAB (tab));
-
-	g_free (tab->priv->link_message);
-	status_message = ephy_string_blank_chr (message);
-	
-	if (status_message && g_str_has_prefix (status_message, "mailto:"))
-	{
-		int i = 1;
-		char *p;
-		GString *tmp;
-		
-		/* We first want to eliminate all the things after "?", like
-		 * cc, subject and alike.
-		 */
-		
-		p = strchr (status_message, '?');
-		if (p != NULL) *p = '\0';
-		
-		/* Then we also want to check if there is more than an email address
-		 * in the mailto: list.
-		 */
-		
-		splitted_message = g_strsplit_set (status_message, ";", -1);
-		tmp = g_string_new (g_strdup_printf (_("Send an email message to “%s”"),
-						     (splitted_message[0] + 7)));
-		
-		while (splitted_message [i] != NULL)
-		{
-			g_string_append_printf (tmp, ", “%s”", splitted_message[i]);
-			i++;
-		}
-		
-		tab->priv->link_message = g_string_free (tmp, FALSE);
-		
-		g_free (status_message);
-		g_strfreev (splitted_message);
-	}
-	else
-	{
-		tab->priv->link_message = status_message;
-	}
-
-	g_object_notify (G_OBJECT (tab), "message");
-}
-
-/**
- * ephy_tab_get_link_message:
- * @tab: an #EphyTab
- *
- * Returns the message displayed in @tab's #EphyWindow's #EphyStatusbar when
- * the user hovers the mouse over a hyperlink.
- *
- * The message returned has a limited lifetime, and so should be copied with
- * g_strdup() if it must be stored.
- *
- * Listen to the "link_message" signal on the @tab's #EphyEmbed to be notified
- * when the link message changes.
- *
- * Return value: The current link statusbar message
- **/
-const char *
-ephy_tab_get_link_message (EphyTab *tab)
-{
-	g_return_val_if_fail (EPHY_IS_TAB (tab), NULL);
-
-	return tab->priv->link_message;
-}
-
 /**
  * ephy_tab_get_embed:
  * @tab: an #EphyTab
@@ -1005,176 +906,6 @@ ephy_tab_set_icon_address (EphyTab *tab,
 	g_object_notify (object, "icon-address");
 }
 
-static void
-ephy_tab_file_monitor_cancel (EphyTab *tab)
-{
-	EphyTabPrivate *priv = tab->priv;
-
-	if (priv->monitor != NULL)
-	{
-		LOG ("Cancelling file monitor");
-
-		gnome_vfs_monitor_cancel (priv->monitor);
-		priv->monitor = NULL;
-	}
-
-	if (priv->reload_scheduled_id != 0)
-	{
-		LOG ("Cancelling scheduled reload");
-
-		g_source_remove (priv->reload_scheduled_id);
-		priv->reload_scheduled_id = 0;
-	}
-
-	priv->reload_delay_ticks = 0;
-}
-
-static gboolean
-ephy_file_monitor_reload_cb (EphyTab *tab)
-{
-	EphyTabPrivate *priv = tab->priv;
-	EphyEmbed *embed;
-	gboolean is_loading;
-
-	if (priv->reload_delay_ticks > 0)
-	{
-		priv->reload_delay_ticks--;
-
-		/* Run again */
-		return TRUE;
-	}
-
-	is_loading = ephy_embed_get_load_status (ephy_tab_get_embed (tab));
-
-	if (is_loading)
-	{
-		/* Wait a bit to reload if we're still loading! */
-		priv->reload_delay_ticks = RELOAD_DELAY_MAX_TICKS / 2;
-
-		/* Run again */
-		return TRUE;
-	}
-
-	priv->reload_scheduled_id = 0;
-
-	embed = ephy_tab_get_embed (tab);
-	if (embed == NULL) return FALSE;
-
-	LOG ("Reloading file '%s'", ephy_embed_get_address (embed));
-
-	ephy_embed_reload (embed, TRUE);
-
-	/* don't run again */
-	return FALSE;
-}
-
-static void
-ephy_tab_file_monitor_cb (GnomeVFSMonitorHandle *handle,
-			  const gchar *monitor_uri,
-			  const gchar *info_uri,
-			  GnomeVFSMonitorEventType event_type,
-			  EphyTab *tab)
-{
-	gboolean uri_is_directory;
-	gboolean should_reload;
-	char* local_path;
-	EphyTabPrivate *priv = tab->priv;
-
-	LOG ("File '%s' has changed, scheduling reload", monitor_uri);
-
-	local_path = gnome_vfs_get_local_path_from_uri(monitor_uri);
-	uri_is_directory = g_file_test(local_path, G_FILE_TEST_IS_DIR);
-	g_free(local_path);
-
-	switch (event_type)
-	{
-		/* These events will always trigger a reload: */
-		case GNOME_VFS_MONITOR_EVENT_CHANGED:
-		case GNOME_VFS_MONITOR_EVENT_CREATED:
-			should_reload = TRUE;
-			break;
-
-		/* These events will only trigger a reload for directories: */
-		case GNOME_VFS_MONITOR_EVENT_DELETED:
-		case GNOME_VFS_MONITOR_EVENT_METADATA_CHANGED:
-			should_reload = uri_is_directory;
-			break;
-
-		/* These events don't trigger a reload: */
-		case GNOME_VFS_MONITOR_EVENT_STARTEXECUTING:
-		case GNOME_VFS_MONITOR_EVENT_STOPEXECUTING:
-		default:
-			should_reload = FALSE;
-			break;
-	}
-
-	if (should_reload) {
-		/* We make a lot of assumptions here, but basically we know
-		 * that we just have to reload, by construction.
-		 * Delay the reload a little bit so we don't endlessly
-		 * reload while a file is written.
-		 */
-		if (priv->reload_delay_ticks == 0)
-		{
-			priv->reload_delay_ticks = 1;
-		}
-		else
-		{
-			/* Exponential backoff */
-			priv->reload_delay_ticks = MIN (priv->reload_delay_ticks * 2,
-					RELOAD_DELAY_MAX_TICKS);
-		}
-
-		if (priv->reload_scheduled_id == 0)
-		{
-			priv->reload_scheduled_id =
-				g_timeout_add (RELOAD_DELAY,
-						(GSourceFunc) ephy_file_monitor_reload_cb, tab);
-		}
-	}
-}
-
-static void
-ephy_tab_update_file_monitor (EphyTab *tab,
-			      const gchar *address)
-{
-	EphyTabPrivate *priv = tab->priv;
-	GnomeVFSMonitorHandle *handle = NULL;
-	gboolean local;
-	char* local_path;
-	GnomeVFSMonitorType monitor_type;
-
-	if (priv->monitor != NULL &&
-	    priv->address != NULL && address != NULL &&
-	    strcmp (priv->address, address) == 0)
-	
-	{
-		/* same address, no change needed */
-		return;
-	}
-
-	ephy_tab_file_monitor_cancel (tab);
-
-	local = g_str_has_prefix (address, "file://");
-	if (local == FALSE) return;
-	
-	local_path = gnome_vfs_get_local_path_from_uri(address);
-	monitor_type = g_file_test(local_path, G_FILE_TEST_IS_DIR)
-		? GNOME_VFS_MONITOR_DIRECTORY
-		: GNOME_VFS_MONITOR_FILE;
-	g_free(local_path);
-
-	if (gnome_vfs_monitor_add (&handle, address,
-				   monitor_type,
-				   (GnomeVFSMonitorCallback) ephy_tab_file_monitor_cb,
-				   tab) == GNOME_VFS_OK)
-	{
-		LOG ("Installed monitor for file '%s'", address);
-
-		priv->monitor = handle;
-	}
-}
-
 /**
  * ephy_tab_get_icon:
  * @tab: an #EphyTab
@@ -1222,13 +953,6 @@ ephy_tab_favicon_cb (EphyEmbed *embed,
 	ephy_tab_set_icon_address (tab, address);
 }
 
-static void
-ephy_tab_link_message_cb (EphyEmbed *embed,
-			  EphyTab *tab)
-{
-	ephy_tab_set_link_message (tab, ephy_embed_get_link_message (embed));
-}
-
 static gboolean
 ephy_tab_open_uri_cb (EphyEmbed *embed,
 		      const char *uri,
@@ -1249,49 +973,6 @@ ephy_tab_open_uri_cb (EphyEmbed *embed,
 	return FALSE;
 }
 
-#if 0
-static void
-ephy_tab_address_cb (EphyEmbed *embed,
-		     const char *address,
-		     EphyTab *tab)
-{
-	GObject *object = G_OBJECT (tab);
-
-	LOG ("ephy_tab_address_cb tab %p address %s", tab, address);
-
-	g_object_freeze_notify (object);
-
-	/* do this up here so we still have the old address around */
-	ephy_tab_update_file_monitor (tab, address);
-
-	/* Do not expose about:blank to the user, an empty address
-	   bar will do better */
-	if (address == NULL || address[0] == '\0' ||
-	    strcmp (address, "about:blank") == 0)
-	{
-		ephy_tab_set_address (tab, NULL);
-		ephy_tab_set_title (tab, embed, NULL);
-	}
-	else
-	{
-		char *embed_address;
-
-		/* we do this to get rid of an eventual password in the URL */
-		embed_address = ephy_embed_get_location (embed, TRUE);
-		ephy_tab_set_address (tab, embed_address);
-		ephy_tab_set_loading_title (tab, embed_address, TRUE);
-	}
-
-	ephy_tab_set_link_message (tab, NULL);
-	ephy_tab_set_icon_address (tab, NULL);
-	ephy_embed_update_navigation_flags (embed);
-
-	g_object_notify (object, "title");
-
-	g_object_thaw_notify (object);
-}
-#endif
-
 static void
 ephy_tab_content_change_cb (EphyEmbed *embed, const char *address, EphyTab *tab)
 {
@@ -1539,7 +1220,6 @@ ephy_tab_init (EphyTab *tab)
 	tab->priv->height = -1;
 	priv->icon_address = NULL;
 	priv->icon = NULL;
-	priv->reload_delay_ticks = 0;
 
 	embed = ephy_embed_factory_new_object (EPHY_TYPE_EMBED);
 	g_assert (embed != NULL);
@@ -1547,15 +1227,9 @@ ephy_tab_init (EphyTab *tab)
 	gtk_container_add (GTK_CONTAINER (tab), GTK_WIDGET (embed));
 	gtk_widget_show (GTK_WIDGET (embed));
 
-	g_signal_connect_object (embed, "link_message",
-				 G_CALLBACK (ephy_tab_link_message_cb),
-				 tab, 0);
 	g_signal_connect_object (embed, "open_uri",
 				 G_CALLBACK (ephy_tab_open_uri_cb),
 				 tab, 0);
-	g_signal_connect_object (embed, "ge_location",
-				 G_CALLBACK (ephy_tab_address_cb),
-				 tab, 0);
 	g_signal_connect_object (embed, "ge_new_window",
 				 G_CALLBACK (ephy_tab_new_window_cb),
 				 tab, 0);
@@ -1580,42 +1254,6 @@ ephy_tab_init (EphyTab *tab)
 }
 
 /**
- * ephy_tab_get_status_message:
- * @tab: an #EphyTab
- *
- * Returns the message displayed in @tab's #EphyWindow's
- * #EphyStatusbar. If the user is hovering the mouse over a hyperlink,
- * this function will return the same value as
- * ephy_tab_get_link_message(). Otherwise, it will return a network
- * status message, or NULL.
- *
- * The message returned has a limited lifetime, and so should be copied with
- * g_strdup() if it must be stored.
- *
- * Listen to "notify::message" to be notified when the message property changes.
- *
- * Return value: The current statusbar message
- **/
-const char *
-ephy_tab_get_status_message (EphyTab *tab)
-{
-	g_return_val_if_fail (EPHY_IS_TAB (tab), NULL);
-
-	if (tab->priv->link_message && tab->priv->link_message[0] != '\0')
-	{
-		return tab->priv->link_message;
-	}
-	else if (tab->priv->status_message)
-	{
-		return tab->priv->status_message;
-	}
-	else
-	{
-		return NULL;
-	}
-}
-
-/**
  * ephy_tab_get_title_composite:
  * @tab: an #EphyTab
  *
