diff --git a/libempathy-gtk/empathy-account-chooser.c b/libempathy-gtk/empathy-account-chooser.c
index 34ebc7e..c6bdf60 100644
--- a/libempathy-gtk/empathy-account-chooser.c
+++ b/libempathy-gtk/empathy-account-chooser.c
@@ -58,7 +58,7 @@
 typedef struct {
 	EmpathyAccountManager          *manager;
 	gboolean                        set_active_item;
-	gboolean			account_manually_set;
+	gboolean                        account_manually_set;
 	gboolean                        has_all_option;
 	EmpathyAccountChooserFilterFunc filter;
 	gpointer                        filter_data;
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index a8ca745..ba0f71b 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -569,6 +569,7 @@ chat_property_changed_cb (EmpathyTpChat *tp_chat,
 			  EmpathyChat   *chat)
 {
 	EmpathyChatPriv *priv = GET_PRIV (chat);
+	DEBUG ("property name: %s", name);
 
 	if (!tp_strdiff (name, "subject")) {
 		g_free (priv->subject);
@@ -578,7 +579,13 @@ chat_property_changed_cb (EmpathyTpChat *tp_chat,
 		if (EMP_STR_EMPTY (priv->subject)) {
 			gtk_widget_hide (priv->hbox_topic);
 		} else {
-			gtk_label_set_text (GTK_LABEL (priv->label_topic), priv->subject);
+			gchar *status_escaped, *status_with_markup;
+
+			status_escaped = g_markup_escape_text (priv->subject, -1);
+			status_with_markup = empathy_add_link_markup (status_escaped);
+			gtk_label_set_markup (GTK_LABEL (priv->label_topic), status_with_markup);
+			g_free (status_escaped);
+			g_free (status_with_markup);
 			gtk_widget_show (priv->hbox_topic);
 		}
 		if (priv->block_events_timeout_id == 0) {
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c
index a9a673c..1028539 100644
--- a/libempathy-gtk/empathy-contact-widget.c
+++ b/libempathy-gtk/empathy-contact-widget.c
@@ -890,8 +890,25 @@ contact_widget_name_notify_cb (EmpathyContactWidget *information)
 static void
 contact_widget_presence_notify_cb (EmpathyContactWidget *information)
 {
-  gtk_label_set_text (GTK_LABEL (information->label_status),
-      empathy_contact_get_status (information->contact));
+  gchar        *status_escaped, *status_with_markup;
+  const gchar  *status;
+
+  status = empathy_contact_get_status (information->contact);
+  if (status != NULL) {
+    if (information->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP) {
+      /* we don't like links in tooltips */
+      gtk_label_set_text (GTK_LABEL (information->label_status),
+                          status);
+    }
+    else {
+      status_escaped = g_markup_escape_text (status, -1);
+      status_with_markup = empathy_add_link_markup (status_escaped);
+      gtk_label_set_markup (GTK_LABEL (information->label_status),
+                            status_with_markup);
+      g_free (status_escaped);
+      g_free (status_with_markup);
+    }
+  }
   gtk_image_set_from_icon_name (GTK_IMAGE (information->image_state),
       empathy_icon_name_for_contact (information->contact),
       GTK_ICON_SIZE_BUTTON);
diff --git a/libempathy-gtk/empathy-smiley-manager.h b/libempathy-gtk/empathy-smiley-manager.h
index dc7428c..618e11c 100644
--- a/libempathy-gtk/empathy-smiley-manager.h
+++ b/libempathy-gtk/empathy-smiley-manager.h
@@ -21,7 +21,7 @@
  */
 
 #ifndef __EMPATHY_SMILEY_MANAGER__H__
-#define __EMPATHY_SMILEY_MANAGER_H__
+#define __EMPATHY_SMILEY_MANAGER__H__
 
 #include <glib-object.h>
 #include <gtk/gtk.h>
diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c
index 3fd4932..9d9d509 100644
--- a/libempathy-gtk/empathy-theme-adium.c
+++ b/libempathy-gtk/empathy-theme-adium.c
@@ -278,92 +278,43 @@ theme_adium_populate_popup_cb (WebKitWebView *view,
 }
 
 static gchar *
-theme_adium_parse_body (EmpathyThemeAdium *theme,
-			const gchar       *text)
+empathy_add_smiley_markup (const gchar      *text,
+                           EmpathySmileyManager *smiley_manager)
 {
-	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
-	gboolean               use_smileys = FALSE;
-	GSList                *smileys, *l;
-	GString               *string;
-	gint                   i;
-	GRegex                *uri_regex;
-	GMatchInfo            *match_info;
-	gboolean               match;
-	gchar                 *ret = NULL;
-	gint                   prev;
-
-	empathy_conf_get_bool (empathy_conf_get (),
-			       EMPATHY_PREFS_CHAT_SHOW_SMILEYS,
-			       &use_smileys);
-
-	if (use_smileys) {
-		/* Replace smileys by a <img/> tag */
-		string = g_string_sized_new (strlen (text));
-		smileys = empathy_smiley_manager_parse (priv->smiley_manager, text);
-		for (l = smileys; l; l = l->next) {
-			EmpathySmiley *smiley;
-
-			smiley = l->data;
-			if (smiley->path) {
-				g_string_append_printf (string,
-							"<abbr title='%s'><img src=\"%s\"/ alt=\"%s\"/></abbr>",
-							smiley->str, smiley->path, smiley->str);
-			} else {
-				gchar *str;
+	GString     *string;
+	GSList      *smileys, *l;
+
+	string = g_string_sized_new (strlen (text));
+	smileys = empathy_smiley_manager_parse (smiley_manager, text);
+	for (l = smileys; l; l = l->next) {
+		EmpathySmiley *smiley;
+
+		smiley = l->data;
+		if (smiley->path) {
+			g_string_append_printf (string,
+						"<abbr title='%s'><img src=\"%s\"/ alt=\"%s\"/></abbr>",
+						smiley->str, smiley->path, smiley->str);
+		} else {
+			gchar *str;
 
-				str = g_markup_escape_text (smiley->str, -1);
-				g_string_append (string, str);
-				g_free (str);
-			}
-			empathy_smiley_free (smiley);
+			str = g_markup_escape_text (smiley->str, -1);
+			g_string_append (string, str);
+			g_free (str);
 		}
-		g_slist_free (smileys);
-
-		g_free (ret);
-		text = ret = g_string_free (string, FALSE);
+		empathy_smiley_free (smiley);
 	}
+	g_slist_free (smileys);
 
-	/* Add <a href></a> arround links */
-	uri_regex = empathy_uri_regex_dup_singleton ();
-	match = g_regex_match (uri_regex, text, 0, &match_info);
-	if (match) {
-		gint last = 0;
-		gint s = 0, e = 0;
-
-		string = g_string_sized_new (strlen (text));
-		do {
-			g_match_info_fetch_pos (match_info, 0, &s, &e);
-
-			if (s > last) {
-				/* Append the text between last link (or the
-				 * start of the message) and this link */
-				g_string_append_len (string, text + last, s - last);
-			}
-
-			/* Append the link inside <a href=""></a> tag */
-			g_string_append (string, "<a href=\"");
-			g_string_append_len (string, text + s, e - s);
-			g_string_append (string, "\">");
-			g_string_append_len (string, text + s, e - s);
-			g_string_append (string, "</a>");
-
-			last = e;
-		} while (g_match_info_next (match_info, NULL));
-
-		if (e < strlen (text)) {
-			/* Append the text after the last link */
-			g_string_append_len (string, text + e, strlen (text) - e);
-		}
+	return g_string_free (string, FALSE);
+}
 
-		g_free (ret);
-		text = ret = g_string_free (string, FALSE);
-	}
-	g_match_info_free (match_info);
-	g_regex_unref (uri_regex);
+static gchar *
+empathy_replace_with_br (const gchar *text)
+{
+	GString    *string = NULL;
+	gint        i, prev = 0;
+	gchar      *ret = NULL;
 
-	/* Replace \n by <br/> */
-	string = NULL;
-	prev = 0;
 	for (i = 0; text[i] != '\0'; i++) {
 		if (text[i] == '\n') {
 			if (!string ) {
@@ -376,13 +327,45 @@ theme_adium_parse_body (EmpathyThemeAdium *theme,
 	}
 	if (string) {
 		g_string_append (string, text + prev);
-		g_free (ret);
-		text = ret = g_string_free (string, FALSE);
+		ret = g_string_free (string, FALSE);
+	}
+	else {
+		ret = g_strdup (text);
 	}
 
 	return ret;
 }
 
+static gchar *
+theme_adium_parse_body (EmpathyThemeAdium *theme,
+			const gchar       *text)
+{
+	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+	gboolean               use_smileys = FALSE;
+	gchar                 *tmp = NULL, *ret;
+
+	empathy_conf_get_bool (empathy_conf_get (),
+			       EMPATHY_PREFS_CHAT_SHOW_SMILEYS,
+			       &use_smileys);
+
+	if (use_smileys) {
+		/* Replace smileys by a <img/> tag */
+		ret = empathy_add_smiley_markup (text, priv->smiley_manager);
+	}
+
+	/* Add <a href></a> arround links */
+	tmp = ret;
+	ret = empathy_add_link_markup (ret);
+	g_free (tmp);
+
+	/* Replace \n by <br/> */
+	tmp = ret;
+	ret = empathy_replace_with_br (ret);
+	g_free (tmp);
+
+	return ret;
+}
+
 static void
 escape_and_append_len (GString *string, const gchar *str, gint len)
 {
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index 2218533..a08c59e 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -1545,3 +1545,57 @@ empathy_receive_file_with_file_chooser (EmpathyFTHandler *handler)
 
 	gtk_widget_show (widget);
 }
+
+gchar *
+empathy_add_link_markup (const gchar      *text)
+{
+	GString               *string;
+	GRegex                *uri_regex;
+	GMatchInfo            *match_info;
+	gboolean               match;
+	gchar                 *ret = NULL;
+
+	g_return_val_if_fail (text != NULL, NULL);
+
+	uri_regex = empathy_uri_regex_dup_singleton ();
+	match = g_regex_match (uri_regex, text, 0, &match_info);
+	if (match) {
+		gint last = 0;
+		gint s = 0, e = 0;
+
+		string = g_string_sized_new (strlen (text));
+		do {
+			g_match_info_fetch_pos (match_info, 0, &s, &e);
+
+			if (s > last) {
+				/* Append the text between last link (or the
+				 * start of the message) and this link */
+				g_string_append_len (string, text + last, s - last);
+			}
+
+			/* Append the link inside <a href=""></a> tag */
+			g_string_append (string, "<a href=\"");
+			g_string_append_len (string, text + s, e - s);
+			g_string_append (string, "\">");
+			g_string_append_len (string, text + s, e - s);
+			g_string_append (string, "</a>");
+
+			last = e;
+		} while (g_match_info_next (match_info, NULL));
+
+		if (e < strlen (text)) {
+			/* Append the text after the last link */
+			g_string_append_len (string, text + e, strlen (text) - e);
+		}
+
+		ret = g_string_free (string, FALSE);
+	}
+	g_match_info_free (match_info);
+	g_regex_unref (uri_regex);
+
+	if (! ret) {
+		ret = g_strdup (text);
+	}
+
+	return ret;
+}
\ No newline at end of file
diff --git a/libempathy-gtk/empathy-ui-utils.h b/libempathy-gtk/empathy-ui-utils.h
index 10f889b..0145dec 100644
--- a/libempathy-gtk/empathy-ui-utils.h
+++ b/libempathy-gtk/empathy-ui-utils.h
@@ -41,6 +41,7 @@
 #include <libempathy/empathy-ft-handler.h>
 
 #include "empathy-chat-view.h"
+#include "empathy-smiley-manager.h"
 
 G_BEGIN_DECLS
 
@@ -112,6 +113,8 @@ GtkWidget * empathy_link_button_new                     (const gchar      *url,
 void        empathy_send_file_with_file_chooser         (EmpathyContact   *contact);
 void        empathy_receive_file_with_file_chooser      (EmpathyFTHandler *handler);
 
+gchar *     empathy_add_link_markup                     (const gchar      *text);
+
 G_END_DECLS
 
 #endif /*  __EMPATHY_UI_UTILS_H__ */
