diff --git a/configure.ac b/configure.ac
index a1a5071..8b6cc38 100644
--- a/configure.ac
+++ b/configure.ac
@@ -34,6 +34,7 @@ TELEPATHY_GLIB_REQUIRED=0.7.7
 MISSION_CONTROL_REQUIRED=4.61
 ENCHANT_REQUIRED=1.2.0
 ISO_CODES_REQUIRED=0.35
+LIBSEXY_REQUIRED=0.1.11
 
 # Uncomment that to build without deprecated symbols
 # AC_DEFINE(GTK_DISABLE_DEPRECATED, 1, [Disable deprecated GTK symbols])
@@ -101,6 +102,8 @@ PKG_CHECK_MODULES(EMPATHY,
    x11
    libglade-2.0 >= $LIBGLADE_REQUIRED
    libebook-1.2
+   libsexy >= $LIBSEXY_REQUIRED
+   gmodule-2.0
 ])
 
 # -----------------------------------------------------------
diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am
index 225c25e..3b16362 100644
--- a/libempathy-gtk/Makefile.am
+++ b/libempathy-gtk/Makefile.am
@@ -4,7 +4,8 @@ AM_CPPFLAGS =                                           \
 	-DDATADIR=\""$(datadir)"\"              	\
 	$(EMPATHY_CFLAGS)				\
 	$(ENCHANT_CFLAGS)				\
-	$(WARN_CFLAGS)
+	$(WARN_CFLAGS)					\
+	$(LIBSEXY_CFLAGS)
 
 BUILT_SOURCES = 					\
 	empathy-gtk-marshal.h				\
@@ -48,7 +49,8 @@ libempathy_gtk_la_SOURCES =             	\
 	empathy-cell-renderer-text.c		\
 	empathy-spell.c				\
 	empathy-contact-menu.c			\
-	totem-subtitle-encoding.c totem-subtitle-encoding.h
+	totem-subtitle-encoding.c totem-subtitle-encoding.h \
+	topic-label.c topic-label.h
 
 # do not distribute generated files
 nodist_libempathy_gtk_la_SOURCES =\
@@ -57,7 +59,8 @@ nodist_libempathy_gtk_la_SOURCES =\
 libempathy_gtk_la_LIBADD =			\
 	$(EMPATHY_LIBS)				\
 	$(ENCHANT_LIBS)				\
-	$(top_builddir)/libempathy/libempathy.la
+	$(top_builddir)/libempathy/libempathy.la \
+	$(LIBSEXY_LIBS)
 
 libempathy_gtk_la_LDFLAGS =                \
        -version-info ${LIBEMPATHY_GTK_CURRENT}:${LIBEMPATHY_GTK_REVISION}:${LIBEMPATHY_GTK_AGE} \
@@ -96,7 +99,8 @@ libempathy_gtk_headers =			\
 	empathy-smiley-manager.h		\
 	empathy-cell-renderer-text.h		\
 	empathy-spell.h				\
-	empathy-contact-menu.h
+	empathy-contact-menu.h			\
+	topic-label.h
 
 libempathy_gtk_includedir = $(includedir)/libempathy-gtk/
 libempathy_gtk_include_HEADERS =		\
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index 9de2c79..3c157c4 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -49,6 +49,7 @@
 #include "empathy-contact-list-view.h"
 #include "empathy-contact-menu.h"
 #include "empathy-ui-utils.h"
+#include "topic-label.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_CHAT
 #include <libempathy/empathy-debug.h>
@@ -87,8 +88,7 @@ typedef struct {
 	GtkWidget         *scrolled_window_chat;
 	GtkWidget         *scrolled_window_input;
 	GtkWidget         *scrolled_window_contacts;
-	GtkWidget         *hbox_topic;
-	GtkWidget         *label_topic;
+	GtkWidget         *topic_label;
 	GtkWidget         *contact_list_view;
 } EmpathyChatPriv;
 
@@ -530,10 +530,10 @@ chat_property_changed_cb (EmpathyTpChat *tp_chat,
 		g_object_notify (G_OBJECT (chat), "subject");
 
 		if (G_STR_EMPTY (priv->subject)) {
-			gtk_widget_hide (priv->hbox_topic);
+			gtk_widget_hide (priv->topic_label);
 		} else {
-			gtk_label_set_text (GTK_LABEL (priv->label_topic), priv->subject);
-			gtk_widget_show (priv->hbox_topic);
+			topic_label_set_topic (TOPIC_LABEL (priv->topic_label), priv->subject);
+			gtk_widget_show (priv->topic_label);
 		}
 		if (priv->block_events_timeout_id == 0) {
 			gchar *str;
@@ -1253,8 +1253,7 @@ chat_create_ui (EmpathyChat *chat)
 					"vbox_left", &priv->vbox_left,
 					"scrolled_window_chat", &priv->scrolled_window_chat,
 					"scrolled_window_input", &priv->scrolled_window_input,
-					"hbox_topic", &priv->hbox_topic,
-					"label_topic", &priv->label_topic,
+					"topic_label", &priv->topic_label,
 					"scrolled_window_contacts", &priv->scrolled_window_contacts,
 					NULL);
 	g_free (filename);
@@ -1305,7 +1304,7 @@ chat_create_ui (EmpathyChat *chat)
 	chat_set_show_contacts (chat, priv->remote_contact == NULL);
 
 	/* Initialy hide the topic, will be shown if not empty */
-	gtk_widget_hide (priv->hbox_topic);
+	gtk_widget_hide (priv->topic_label);
 
 	/* Set widget focus order */
 	list = g_list_append (NULL, priv->scrolled_window_input);
@@ -1318,7 +1317,7 @@ chat_create_ui (EmpathyChat *chat)
 	g_list_free (list);
 
 	list = g_list_append (NULL, priv->hpaned);
-	list = g_list_append (list, priv->hbox_topic);
+	list = g_list_append (list, priv->topic_label);
 	gtk_container_set_focus_chain (GTK_CONTAINER (priv->widget), list);
 	g_list_free (list);
 
diff --git a/libempathy-gtk/empathy-chat.glade b/libempathy-gtk/empathy-chat.glade
index f313c2f..3277a24 100644
--- a/libempathy-gtk/empathy-chat.glade
+++ b/libempathy-gtk/empathy-chat.glade
@@ -13,42 +13,12 @@
         <property name="border_width">4</property>
         <property name="spacing">6</property>
         <child>
-          <widget class="GtkHBox" id="hbox_topic">
+          <widget class="Custom" id="topic_label">
             <property name="visible">True</property>
-            <property name="spacing">6</property>
-            <child>
-              <widget class="GtkLabel" id="label80">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="yalign">0</property>
-                <property name="label" translatable="yes">&lt;b&gt;Topic:&lt;/b&gt;</property>
-                <property name="use_markup">True</property>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="label_topic">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="xalign">0</property>
-                <property name="use_markup">True</property>
-                <property name="wrap">True</property>
-                <property name="selectable">True</property>
-                <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
-                <property name="single_line_mode">True</property>
-              </widget>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
+            <property name="creation_function">topic_label_new</property>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="padding">2</property>
           </packing>
         </child>
         <child>
diff --git a/libempathy-gtk/topic-label.c b/libempathy-gtk/topic-label.c
new file mode 100644
index 0000000..48c7ca2
--- /dev/null
+++ b/libempathy-gtk/topic-label.c
@@ -0,0 +1,150 @@
+/*
+ * topic-label.c - Widget encapsulating the topic label
+ *
+ * Copyright (C) 2004-2007 xchat-gnome team
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * 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 General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ */
+#include <config.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+#include <libsexy/sexy-url-label.h>
+
+#include "empathy-ui-utils.h"
+
+#include "topic-label.h"
+
+static void  topic_label_class_init       (TopicLabelClass *klass);
+static void  topic_label_init             (TopicLabel      *label);
+static void  topic_label_finalize         (GObject         *object);
+static void  topic_label_expand_activate  (GtkExpander     *expander,
+                                           TopicLabel      *label);
+static void  topic_label_size_allocate    (GtkWidget       *widget,
+                                           GtkAllocation   *allocation);
+
+#define TOPIC_LABEL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TOPIC_LABEL_TYPE, TopicLabelPriv))
+
+struct _TopicLabelPriv
+{
+	GtkWidget      *expander;
+	GtkWidget      *label;
+	GtkWidget      *sizing_label;
+};
+
+G_DEFINE_TYPE (TopicLabel, topic_label, GTK_TYPE_HBOX);
+
+static void
+topic_label_class_init (TopicLabelClass *klass)
+{
+	GObjectClass   *gobject_class;
+	GtkWidgetClass *widget_class;
+
+	gobject_class = G_OBJECT_CLASS (klass);
+	gobject_class->finalize = topic_label_finalize;
+
+	widget_class = GTK_WIDGET_CLASS (klass);
+	widget_class->size_allocate = topic_label_size_allocate;
+
+	g_type_class_add_private (gobject_class, sizeof (TopicLabelPriv));
+}
+
+static void
+topic_label_init (TopicLabel *label)
+{
+	TopicLabelPriv *priv;
+
+	priv = label->priv = TOPIC_LABEL_GET_PRIVATE (label);
+	priv->expander = gtk_expander_new (NULL);
+	priv->label = sexy_url_label_new ();
+	priv->sizing_label = sexy_url_label_new ();
+	gtk_expander_set_expanded (GTK_EXPANDER (priv->expander), FALSE);
+	gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END);
+	gtk_label_set_selectable (GTK_LABEL (priv->label), TRUE);
+	gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.0);
+
+	gtk_widget_show (priv->expander);
+	gtk_widget_show (priv->label);
+	gtk_widget_show (GTK_WIDGET (label));
+
+	gtk_box_pack_start (GTK_BOX (label), priv->expander, FALSE, TRUE, 0);
+	gtk_box_pack_start (GTK_BOX (label), priv->label,    TRUE,  TRUE, 0);
+	gtk_box_set_spacing (GTK_BOX (label), 6);
+
+	g_signal_connect (G_OBJECT (priv->expander), "activate", G_CALLBACK (topic_label_expand_activate), (gpointer) label);
+}
+
+static void
+topic_label_finalize (GObject *object)
+{
+	G_OBJECT_CLASS (topic_label_parent_class)->finalize (object);
+}
+
+static void
+topic_label_expand_activate (GtkExpander *expander, TopicLabel *label)
+{
+	TopicLabelPriv *priv = label->priv;
+
+	if (gtk_expander_get_expanded (expander)) {
+		gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END);
+		gtk_label_set_line_wrap (GTK_LABEL (priv->label), FALSE);
+	} else {
+		gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_NONE);
+		gtk_label_set_line_wrap (GTK_LABEL (priv->label), TRUE);
+	}
+}
+
+GtkWidget *
+topic_label_new (void)
+{
+	return g_object_new (TOPIC_LABEL_TYPE, NULL);
+}
+
+void
+topic_label_set_topic (TopicLabel *label, const char *topic)
+{
+	TopicLabelPriv *priv = label->priv;
+
+	if (topic) {
+		sexy_url_label_set_markup (SEXY_URL_LABEL (priv->label), topic);
+		sexy_url_label_set_markup (SEXY_URL_LABEL (priv->sizing_label), topic);
+	} else {
+		gtk_label_set_text (GTK_LABEL (priv->label), "");
+		gtk_label_set_text (GTK_LABEL (priv->sizing_label), "");
+	}
+}
+
+static void
+topic_label_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
+{
+	TopicLabel     *label;
+	TopicLabelPriv *priv;
+	GtkRequisition  request;
+
+	GTK_WIDGET_CLASS (topic_label_parent_class)->size_allocate (widget, allocation);
+
+	label = TOPIC_LABEL (widget);
+	priv = label->priv;
+
+	gtk_widget_size_request (priv->sizing_label, &request);
+
+	if (request.width < allocation->width - 6) {
+		gtk_widget_hide (priv->expander);
+	} else {
+		gtk_widget_show (priv->expander);
+	}
+}
diff --git a/libempathy-gtk/topic-label.h b/libempathy-gtk/topic-label.h
new file mode 100644
index 0000000..53479b5
--- /dev/null
+++ b/libempathy-gtk/topic-label.h
@@ -0,0 +1,56 @@
+/*
+ * topic-label.h - Widget encapsulating the topic label
+ *
+ * Copyright (C) 2004-2007 xchat-gnome team
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * 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 General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ */
+#ifndef XCHAT_GNOME_TOPIC_LABEL_H
+#define XCHAT_GNOME_TOPIC_LABEL_H
+
+#include <gtk/gtkhbox.h>
+
+G_BEGIN_DECLS
+
+typedef struct _TopicLabel      TopicLabel;
+typedef struct _TopicLabelClass TopicLabelClass;
+typedef struct _TopicLabelPriv  TopicLabelPriv;
+
+#define TOPIC_LABEL_TYPE            (topic_label_get_type ())
+#define TOPIC_LABEL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TOPIC_LABEL_TYPE, TopicLabel))
+#define TOPIC_LABEL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TOPIC_LABEL_TYPE, TopicLabelClass))
+#define IS_TOPIC_LABEL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TOPIC_LABEL_TYPE))
+#define IS_TOPIC_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TOPIC_LABEL_TYPE))
+
+struct _TopicLabel
+{
+	GtkHBox parent;
+
+	TopicLabelPriv *priv;
+};
+
+struct _TopicLabelClass
+{
+	GtkHBoxClass parent_class;
+};
+
+GType      topic_label_get_type         (void) G_GNUC_CONST;
+GtkWidget *topic_label_new              (void);
+void       topic_label_set_topic        (TopicLabel *label, const char *topic);
+
+G_END_DECLS
+
+#endif
