diff --git a/configure.ac b/configure.ac
index 79fc93f..da3c953 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,7 +26,7 @@ AC_SUBST(LIBEMPATHY_GTK_REVISION)
 
 # Minimal version required
 GLIB_REQUIRED=2.22.0
-GTK_REQUIRED=2.16.0
+GTK_REQUIRED=2.18.0
 GCONF_REQUIRED=1.2.0
 LIBPANELAPPLET_REQUIRED=2.10.0
 TELEPATHY_GLIB_REQUIRED=0.7.35
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index 3931115..58c08c1 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -574,7 +574,18 @@ 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 *escaped, *with_markup;
+
+			escaped = g_markup_escape_text (priv->subject, -1);
+			if ((with_markup = empathy_add_link_markup (escaped)) != NULL) {
+				gtk_label_set_markup (GTK_LABEL (priv->label_topic),
+					with_markup);
+				g_free (with_markup);
+			} else {
+				gtk_label_set_text (GTK_LABEL (priv->subject),
+					priv->subject);
+			}
+			g_free (escaped);
 			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 d6f8063..4275f13 100644
--- a/libempathy-gtk/empathy-contact-widget.c
+++ b/libempathy-gtk/empathy-contact-widget.c
@@ -898,8 +898,29 @@ 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        *escaped, *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 {
+      escaped = g_markup_escape_text (status, -1);
+      if ((with_markup = empathy_add_link_markup (escaped)) != NULL) {
+        gtk_label_set_markup (GTK_LABEL (information->label_status),
+                              with_markup);
+        g_free (with_markup);
+      } else {
+        gtk_label_set_text (GTK_LABEL (information->label_status),
+                            status);
+      }
+      g_free (escaped);
+    }
+  }
   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-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c
index d7fd017..b2cdb45 100644
--- a/libempathy-gtk/empathy-theme-adium.c
+++ b/libempathy-gtk/empathy-theme-adium.c
@@ -289,97 +289,47 @@ theme_adium_populate_popup_cb (WebKitWebView *view,
 	gtk_widget_show (item);
 }
 
-static gchar *
-theme_adium_parse_body (EmpathyThemeAdium *theme,
-			const gchar       *text)
+static gchar*
+theme_adium_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);
-
-	/* 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 {
-			gchar *real_url;
-
-			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 */
-			real_url = empathy_make_absolute_url_len (text + s, e - s);
-
-			g_string_append (string, "<a href=\"");
-			g_string_append (string, real_url);
-			g_string_append (string, "\">");
-			g_string_append_len (string, text + s, e - s);
-			g_string_append (string, "</a>");
-
-			g_free (real_url);
-			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);
-		}
-
-		g_free (ret);
-		text = ret = g_string_free (string, FALSE);
-	} else 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_match_info_free (match_info);
-	g_regex_unref (uri_regex);
+	g_slist_free (smileys);
+	return g_string_free (string, FALSE);
+}
+
+static gchar*
+theme_adium_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 ) {
@@ -392,8 +342,48 @@ 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);
+	}
+
+	return ret;
+}
+
+static gchar *
+theme_adium_parse_body (EmpathyThemeAdium *theme,
+			const gchar       *text)
+{
+	EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
+	gboolean               use_smileys = FALSE;
+	gchar                 *free_tmp, *tmp, *ret;
+
+	free_tmp = ret = g_strdup (text);
+
+	empathy_conf_get_bool (empathy_conf_get (),
+			       EMPATHY_PREFS_CHAT_SHOW_SMILEYS,
+			       &use_smileys);
+
+	if (use_smileys) {
+		/* Replace smileys by a <img/> tag */
+		if ((tmp = theme_adium_add_smiley_markup (ret,
+					priv->smiley_manager)) != NULL) {
+			g_free (free_tmp);
+			free_tmp = tmp;
+			ret = tmp;
+		}
+	}
+
+	/* Add <a href></a> arround links */
+	if ((tmp = empathy_add_link_markup (ret)) != NULL) {
+		g_free (free_tmp);
+		free_tmp = tmp;
+		ret = tmp;
+	}
+
+	/* Replace \n by <br/> */
+	if ((tmp = theme_adium_replace_with_br (ret)) != NULL) {
+		g_free (free_tmp);
+		free_tmp = tmp;
+		ret = tmp;
 	}
 
 	return ret;
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index aeb665c..527feb9 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -1559,3 +1559,61 @@ empathy_receive_file_with_file_chooser (EmpathyFTHandler *handler)
 
 	gtk_widget_show (widget);
 }
+
+/**
+ * empathy_add_link_markup:
+ * @text: the text you want to analyze.
+ *
+ * Analyzes @text to search any URI regex, and swaps each one with an HTML "a href" markup.
+ *
+ * Returns: the new text with HTML markup, if at least one URI is found, else %NULL.
+ **/
+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);
+
+	return ret;
+}
diff --git a/libempathy-gtk/empathy-ui-utils.h b/libempathy-gtk/empathy-ui-utils.h
index 39baeaf..595d342 100644
--- a/libempathy-gtk/empathy-ui-utils.h
+++ b/libempathy-gtk/empathy-ui-utils.h
@@ -113,6 +113,8 @@ gchar *     empathy_make_absolute_url                   (const gchar *url);
 gchar *     empathy_make_absolute_url_len               (const gchar *url,
 							 guint len);
 
+gchar *     empathy_add_link_markup                     (const gchar      *text);
+
 G_END_DECLS
 
 #endif /*  __EMPATHY_UI_UTILS_H__ */
