diff --git a/configure.ac b/configure.ac
index 8a85a75..97e2fa7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -306,6 +306,33 @@ fi
 AM_CONDITIONAL(HAVE_NOTHERE, test "x$have_nothere" = "xyes")
 
 # -----------------------------------------------------------
+# libindicate
+# -----------------------------------------------------------
+AC_ARG_ENABLE(libindicate,
+              AS_HELP_STRING([--enable-libindicate=@<:@no/yes/auto@:>@],
+                             [build libindicate support]), ,
+                             enable_libindicate=auto)
+
+if test "x$enable_libindicate" != "xno"; then
+   PKG_CHECK_MODULES(INDICATE, 
+   [
+     indicate
+   ], have_libindicate="yes", have_libindicate="no")
+else
+   have_libindicate=no
+fi
+
+if test "x$enable_libindicate" = "xyes" -a "x$have_libindicate" != "xyes"; then
+   AC_MSG_ERROR([Couldn't find libindicate.])
+fi
+
+if test "x$enable_libindicate" = "xyes"; then
+   AC_DEFINE(HAVE_LIBINDICATE, 1, [Define if you have libindicate])
+fi
+
+AM_CONDITIONAL(HAVE_LIBINDICATE, test "x$have_libindicate" = "xyes")
+
+# -----------------------------------------------------------
 # Tests
 # -----------------------------------------------------------
 AC_ARG_ENABLE(tests,
@@ -431,4 +458,5 @@ Configure summary:
 	Python bindings.............:  ${have_python}
 	Megaphone applet............:  ${have_megaphone}
 	Nothere applet..............:  ${have_nothere}
+	libindicate support.........:  ${have_libindicate}
 "
diff --git a/libempathy-gtk/empathy-conf.h b/libempathy-gtk/empathy-conf.h
index 07026df..0c315e5 100644
--- a/libempathy-gtk/empathy-conf.h
+++ b/libempathy-gtk/empathy-conf.h
@@ -69,6 +69,7 @@ struct _EmpathyConfClass {
 #define EMPATHY_PREFS_UI_AVATAR_DIRECTORY          EMPATHY_PREFS_PATH "/ui/avatar_directory"
 #define EMPATHY_PREFS_UI_SHOW_AVATARS              EMPATHY_PREFS_PATH "/ui/show_avatars"
 #define EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST      EMPATHY_PREFS_PATH "/ui/compact_contact_list"
+#define EMPATHY_PREFS_UI_USE_LIBINDICATE           EMPATHY_PREFS_PATH "/ui/use_libindicate"
 #define EMPATHY_PREFS_CONTACTS_SHOW_OFFLINE        EMPATHY_PREFS_PATH "/contacts/show_offline"
 #define EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM      EMPATHY_PREFS_PATH "/contacts/sort_criterium"
 #define EMPATHY_PREFS_HINTS_CLOSE_MAIN_WINDOW      EMPATHY_PREFS_PATH "/hints/close_main_window"
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index f30c58a..2a031f9 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -1249,24 +1249,30 @@ empathy_window_iconify (GtkWindow *window, GtkStatusIcon *status_icon)
 	Display      *dpy;
 	GdkWindow    *gdk_window;
 
-	gtk_status_icon_get_geometry (status_icon, NULL, &icon_location, NULL);
-	gdk_window = GTK_WIDGET (window)->window;
-	dpy = gdk_x11_drawable_get_xdisplay (gdk_window);
-
-	data[0] = icon_location.x;
-	data[1] = icon_location.y;
-	data[2] = icon_location.width;
-	data[3] = icon_location.height;
-
-	XChangeProperty (dpy,
-			 GDK_WINDOW_XID (gdk_window),
-			 gdk_x11_get_xatom_by_name_for_display (gdk_drawable_get_display (gdk_window),
-			 "_NET_WM_ICON_GEOMETRY"),
-			 XA_CARDINAL, 32, PropModeReplace,
-			 (guchar *)&data, 4);
+	if (gtk_status_icon_get_visible (status_icon)) {
+		gtk_status_icon_get_geometry (status_icon, NULL, &icon_location, NULL);
+		gdk_window = GTK_WIDGET (window)->window;
+		dpy = gdk_x11_drawable_get_xdisplay (gdk_window);
+	
+		data[0] = icon_location.x;
+		data[1] = icon_location.y;
+		data[2] = icon_location.width;
+		data[3] = icon_location.height;
+	
+		XChangeProperty (dpy,
+				 GDK_WINDOW_XID (gdk_window),
+				 gdk_x11_get_xatom_by_name_for_display (gdk_drawable_get_display (gdk_window),
+				 "_NET_WM_ICON_GEOMETRY"),
+				 XA_CARDINAL, 32, PropModeReplace,
+				 (guchar *)&data, 4);
+	}
 
 	gtk_window_set_skip_taskbar_hint (window, TRUE);
-	gtk_window_iconify (window);
+	if (gtk_status_icon_get_visible (status_icon)) {
+		gtk_window_iconify (window);
+	} else {
+		gtk_widget_hide (GTK_WIDGET(window));
+	}
 }
 
 /* Takes care of moving the window to the current workspace. */
diff --git a/src/Makefile.am b/src/Makefile.am
index 8973d53..89630f3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -4,6 +4,7 @@ AM_CPPFLAGS =						\
 	-I$(top_srcdir)                          	\
 	$(EMPATHY_CFLAGS)				\
 	$(LIBNOTIFY_CFLAGS)				\
+	$(INDICATE_CFLAGS)				\
 	$(LIBCHAMPLAIN_CFLAGS)				\
 	$(DISABLE_DEPRECATED)
 	$(WARN_CFLAGS)
@@ -13,6 +14,7 @@ LDADD =								\
 	$(top_builddir)/libempathy/libempathy.la		\
 	$(top_builddir)/extensions/libemp-extensions.la		\
 	$(LIBNOTIFY_LIBS)					\
+	$(INDICATE_LIBS)					\
 	$(EMPATHY_LIBS)						\
 	$(LIBCHAMPLAIN_LIBS)
 
@@ -49,6 +51,11 @@ empathy_SOURCES =							\
 	bacon-message-connection.c bacon-message-connection.h		\
 	ephy-spinner.c ephy-spinner.h
 
+if HAVE_LIBINDICATE
+empathy_SOURCES += empathy-indicator-manager.c empathy-indicator-manager.h \
+				   empathy-indicator.c empathy-indicator.h
+endif
+
 nodist_empathy_SOURCES = $(BUILT_SOURCES)
 
 empathy_logs_SOURCES = empathy-logs.c
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index 248a408..53b006f 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -56,6 +56,11 @@
 #include "empathy-about-dialog.h"
 #include "empathy-misc.h"
 
+#ifdef HAVE_LIBINDICATE
+#include "empathy-indicator.h"
+#include "empathy-indicator-manager.h"
+#endif
+
 #define DEBUG_FLAG EMPATHY_DEBUG_CHAT
 #include <libempathy/empathy-debug.h>
 
@@ -72,6 +77,10 @@ typedef struct {
 	GtkWidget   *dialog;
 	GtkWidget   *notebook;
 	NotifyNotification *notification;
+#ifdef HAVE_LIBINDICATE
+	EmpathyIndicatorManager *indicator_manager;
+	GHashTable  *indicators;
+#endif
 
 	/* Menu items. */
 	GtkUIManager *ui_manager;
@@ -869,6 +878,77 @@ chat_window_notification_closed_cb (NotifyNotification *notify,
 	g_slice_free (NotificationData, cb_data);
 }
 
+#ifdef HAVE_LIBINDICATE
+static void
+chat_window_indicator_activate_cb (EmpathyIndicator *indicator,
+				    NotificationData *cb_data)
+{
+	empathy_chat_window_present_chat (cb_data->chat);
+
+	empathy_indicator_hide (indicator);
+	g_object_unref (indicator);
+	g_object_unref (cb_data->chat);
+	g_slice_free (NotificationData, cb_data);
+}
+
+static void
+chat_window_add_indicator (EmpathyChatWindow *window,
+					 EmpathyMessage *message,
+					 EmpathyChat    *chat)
+{
+	EmpathyChatWindowPriv *priv = GET_PRIV (window);
+	EmpathyContact *sender;
+	const char *body;
+	NotificationData *cb_data;
+	gboolean use_libindicate;
+	EmpathyIndicator *indicator;
+
+	empathy_conf_get_bool (empathy_conf_get (),
+			       EMPATHY_PREFS_UI_USE_LIBINDICATE,
+		               &use_libindicate);
+
+	if (!use_libindicate) {
+		return;
+	}
+
+	cb_data = g_slice_new0 (NotificationData);
+	cb_data->chat = g_object_ref (chat);
+	cb_data->window = window;
+
+	sender = empathy_message_get_sender (message);
+	body = empathy_message_get_body (message);
+
+	indicator = g_hash_table_lookup (priv->indicators, chat);
+	if (indicator) {
+		empathy_indicator_update (indicator, body);
+	} else {
+		indicator = empathy_indicator_manager_add_indicator (priv->indicator_manager,
+			sender, body);
+		g_signal_connect (indicator, "activate",
+				  G_CALLBACK (chat_window_indicator_activate_cb), cb_data);
+		g_hash_table_insert(priv->indicators, chat, g_object_ref(indicator));
+	}
+	empathy_indicator_show (indicator);
+}
+
+static void
+chat_window_remove_indicator (EmpathyChatWindow *window, EmpathyChat *chat)
+{
+	EmpathyIndicator *indicator;
+	EmpathyChatWindowPriv *priv = GET_PRIV (window);
+
+	indicator = g_hash_table_lookup (priv->indicators, chat);
+
+	if (!indicator) {
+		return;
+	}
+
+	empathy_indicator_hide (indicator);
+	g_hash_table_remove (priv->indicators, chat);
+	g_object_unref (indicator);
+}
+#endif
+
 static void
 chat_window_show_or_update_notification (EmpathyChatWindow *window,
 					 EmpathyMessage *message,
@@ -975,6 +1055,9 @@ chat_window_new_message_cb (EmpathyChat       *chat,
 		empathy_sound_play (GTK_WIDGET (priv->dialog),
 		    EMPATHY_SOUND_MESSAGE_INCOMING);
 		chat_window_show_or_update_notification (window, message, chat);
+#ifdef HAVE_LIBINDICATE
+		chat_window_add_indicator (window, message, chat);
+#endif
 	}
 
 	if (!g_list_find (priv->chats_new_msg, chat)) {
@@ -1039,6 +1122,10 @@ chat_window_page_switched_cb (GtkNotebook      *notebook,
 	priv->chats_new_msg = g_list_remove (priv->chats_new_msg, chat);
 
 	chat_window_update_chat_tab (chat);
+
+#ifdef HAVE_LIBINDICATE
+	chat_window_remove_indicator (window, chat);
+#endif
 }
 
 static void
@@ -1149,6 +1236,11 @@ chat_window_focus_in_event_cb (GtkWidget        *widget,
 	/* Update the title, since we now mark all unread messages as read. */
 	chat_window_update_chat_tab (priv->current_chat);
 
+#ifdef HAVE_LIBINDICATE
+	/* Remove the indicator for the active chat */
+	chat_window_remove_indicator (window, priv->current_chat);
+#endif
+
 	return FALSE;
 }
 
@@ -1366,6 +1458,10 @@ empathy_chat_window_init (EmpathyChatWindow *window)
 	g_object_unref (gui);
 
 	priv->chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL);
+#ifdef HAVE_LIBINDICATE
+	priv->indicator_manager = empathy_indicator_manager_dup_singleton ();
+	priv->indicators = g_hash_table_new (NULL, NULL);
+#endif
 
 	priv->notebook = gtk_notebook_new ();
 	gtk_notebook_set_group (GTK_NOTEBOOK (priv->notebook), "EmpathyChatWindow");
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index 6dcd697..18923f4 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -61,6 +61,14 @@
 #include "empathy-event-manager.h"
 #include "empathy-ft-manager.h"
 
+#ifdef HAVE_LIBINDICATE
+#include "empathy-indicator-manager.h"
+#endif
+
+#ifdef HAVE_LIBINDICATE
+#include "empathy-indicator-manager.h"
+#endif
+
 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
 #include <libempathy/empathy-debug.h>
 
@@ -106,6 +114,10 @@ typedef struct {
 
 	/* Actions that are enabled when there are connected accounts */
 	GList                  *actions_connected;
+#ifdef HAVE_LIBINDICATE
+	EmpathyIndicatorManager *indicator_manager;
+      	GHashTable              *indicator_timeouts;
+#endif
 } EmpathyMainWindow;
 
 static EmpathyMainWindow *window = NULL;
@@ -595,6 +607,10 @@ main_window_contact_presence_changed_cb (EmpathyContactMonitor *monitor,
         /* someone is logging in */
         empathy_sound_play (GTK_WIDGET (window->window),
           EMPATHY_SOUND_CONTACT_CONNECTED);
+#ifdef HAVE_LIBINDICATE
+        empathy_indicator_manager_add_login_indicator (window->indicator_manager,
+          contact);
+#endif
     }
 }
 
@@ -1160,6 +1176,10 @@ empathy_main_window_show (void)
 			      "help_contents", "activate", main_window_help_contents_cb,
 			      NULL);
 
+#ifdef HAVE_LIBINDICATE
+	window->indicator_manager = empathy_indicator_manager_dup_singleton ();
+#endif
+
 	/* Set up connection related widgets. */
 	main_window_connection_items_setup (window, gui);
 
diff --git a/src/empathy-misc.c b/src/empathy-misc.c
index a1a0847..7cfaa2e 100644
--- a/src/empathy-misc.c
+++ b/src/empathy-misc.c
@@ -30,6 +30,29 @@
 /* public methods */
 
 GdkPixbuf *
+empathy_misc_get_pixbuf_for_indicator (EmpathyContact *contact)
+{
+	GdkPixbuf *pixbuf = NULL;
+	GtkIconTheme *icon_theme;
+
+	if (contact != NULL) {
+		pixbuf = empathy_pixbuf_avatar_from_contact_scaled (contact,
+								    16, 16);
+	}
+
+	if (!pixbuf) {
+		icon_theme = gtk_icon_theme_get_default ();
+		/* TODO: connect to icon theme changes */
+		if (icon_theme) {
+		pixbuf = gtk_icon_theme_load_icon (icon_theme, "stock_person",
+				16, 0, NULL);
+		}
+	}
+
+	return pixbuf;
+}
+
+GdkPixbuf *
 empathy_misc_get_pixbuf_for_notification (EmpathyContact *contact,
 					  const char *icon_name)
 {
diff --git a/src/empathy-misc.h b/src/empathy-misc.h
index b3fe8fd..38c000f 100644
--- a/src/empathy-misc.h
+++ b/src/empathy-misc.h
@@ -43,6 +43,7 @@ typedef enum {
 gboolean    empathy_notification_is_enabled  (void);
 GdkPixbuf * empathy_misc_get_pixbuf_for_notification (EmpathyContact *contact,
                                                       const char *icon_name);
+GdkPixbuf * empathy_misc_get_pixbuf_for_indicator (EmpathyContact *contact);
 
 G_END_DECLS
 
diff --git a/src/empathy-preferences.c b/src/empathy-preferences.c
index 406db4c..ed045d1 100644
--- a/src/empathy-preferences.c
+++ b/src/empathy-preferences.c
@@ -48,6 +48,7 @@ typedef struct {
 	GtkWidget *checkbutton_show_avatars;
 	GtkWidget *checkbutton_compact_contact_list;
 	GtkWidget *checkbutton_show_smileys;
+	GtkWidget *checkbutton_use_libindicate;
 	GtkWidget *combobox_chat_theme;
 	GtkWidget *checkbutton_separate_chat_windows;
 	GtkWidget *checkbutton_autoconnect;
@@ -233,6 +234,14 @@ preferences_setup_widgets (EmpathyPreferences *preferences)
 					  EMPATHY_PREFS_UI_SHOW_AVATARS,
 					  preferences->checkbutton_show_avatars);
 
+#ifdef HAVE_LIBINDICATE
+	preferences_hookup_toggle_button (preferences,
+					  EMPATHY_PREFS_UI_USE_LIBINDICATE,
+					  preferences->checkbutton_use_libindicate);
+#else
+	gtk_widget_hide(GTK_WIDGET(preferences->checkbutton_use_libindicate));
+#endif
+
 	preferences_hookup_toggle_button (preferences,
 					  EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
 					  preferences->checkbutton_compact_contact_list);
@@ -1123,6 +1132,7 @@ empathy_preferences_show (GtkWindow *parent)
 		"checkbutton_show_avatars", &preferences->checkbutton_show_avatars,
 		"checkbutton_compact_contact_list", &preferences->checkbutton_compact_contact_list,
 		"checkbutton_show_smileys", &preferences->checkbutton_show_smileys,
+		"checkbutton_use_libindicate", &preferences->checkbutton_use_libindicate,
 		"combobox_chat_theme", &preferences->combobox_chat_theme,
 		"checkbutton_separate_chat_windows", &preferences->checkbutton_separate_chat_windows,
 		"checkbutton_autoconnect", &preferences->checkbutton_autoconnect,
diff --git a/src/empathy-preferences.ui b/src/empathy-preferences.ui
index d92fc8f..ec79423 100644
--- a/src/empathy-preferences.ui
+++ b/src/empathy-preferences.ui
@@ -86,6 +86,20 @@
                                 <property name="position">2</property>
                               </packing>
                             </child>
+                            <child>
+                              <object class="GtkCheckButton" id="checkbutton_use_libindicate">
+                                <property name="label" translatable="yes">Use Indicators</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">3</property>
+                              </packing>
+                            </child>
                           </object>
                         </child>
                       </object>
diff --git a/src/empathy-status-icon.c b/src/empathy-status-icon.c
index 9c21948..dccbba4 100644
--- a/src/empathy-status-icon.c
+++ b/src/empathy-status-icon.c
@@ -26,6 +26,7 @@
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 
+#include <libnotify/notify.h>
 #include <libnotify/notification.h>
 
 #include <libempathy/empathy-utils.h>
@@ -44,6 +45,10 @@
 #include "empathy-event-manager.h"
 #include "empathy-misc.h"
 
+#ifdef HAVE_LIBINDICATE
+#include "empathy-indicator-manager.h"
+#endif
+
 #define DEBUG_FLAG EMPATHY_DEBUG_DISPATCHER
 #include <libempathy/empathy-debug.h>
 
@@ -67,10 +72,17 @@ typedef struct {
 	GtkAction           *show_window_item;
 	GtkAction           *new_message_item;
 	GtkAction           *status_item;
+#ifdef HAVE_LIBINDICATE
+       EmpathyIndicatorManager *indicator_manager;
+#endif
 } EmpathyStatusIconPriv;
 
 G_DEFINE_TYPE (EmpathyStatusIcon, empathy_status_icon, G_TYPE_OBJECT);
 
+#ifdef HAVE_LIBINDICATE
+static void indicate_server_activate_cb (EmpathyIndicatorManager *, EmpathyStatusIcon   *);
+#endif
+
 static gboolean
 activate_event (EmpathyEvent *event)
 {
@@ -79,6 +91,29 @@ activate_event (EmpathyEvent *event)
 	return FALSE;
 }
 
+static gboolean
+notification_server_supports_actions (void)
+{
+	GList * caps = notify_get_server_caps();
+	GList * l;
+	gboolean ret = FALSE;
+
+	for (l = caps; l; l = l->next) {
+		gchar *cap = (gchar *)l->data;
+		if (!cap) {
+			continue;
+		}
+		if (!strcmp(cap, "actions")) {
+			ret = TRUE;
+			break;
+		}
+	}
+	g_list_foreach(caps, (GFunc)g_free, NULL);
+	g_list_free(caps);
+
+	return ret;
+}
+
 static void
 status_icon_notification_closed_cb (NotifyNotification *notification,
 				    EmpathyStatusIcon  *icon)
@@ -108,8 +143,9 @@ status_icon_notification_closed_cb (NotifyNotification *notification,
 		 */
 		g_idle_add ((GSourceFunc) activate_event, priv->event);
 	} else {
-		/* inhibit other updates for this event */
-		empathy_event_inhibit_updates (priv->event);
+		if (notification_server_supports_actions ()) {
+			empathy_event_inhibit_updates (priv->event);
+		}
 	}
 }
 
@@ -317,6 +353,25 @@ status_icon_set_visibility (EmpathyStatusIcon *icon,
 	}
 }
 
+#ifdef HAVE_LIBINDICATE
+static void
+status_icon_set_use_libindicate (EmpathyStatusIcon *icon,
+			    gboolean           use_libindicate)
+{
+	EmpathyStatusIconPriv *priv = GET_PRIV (icon);
+
+	if (use_libindicate) {
+		empathy_indicator_manager_set_server_visible (priv->indicator_manager,
+				TRUE);
+		gtk_status_icon_set_visible(priv->icon, FALSE);
+	} else {
+		empathy_indicator_manager_set_server_visible (priv->indicator_manager,
+				FALSE);
+		gtk_status_icon_set_visible(priv->icon, TRUE);
+	}
+}
+#endif
+
 static void
 status_icon_notify_visibility_cb (EmpathyConf *conf,
 				  const gchar *key,
@@ -330,16 +385,51 @@ status_icon_notify_visibility_cb (EmpathyConf *conf,
 	}
 }
 
+#ifdef HAVE_LIBINDICATE
+static void
+status_icon_notify_libindicate_cb (EmpathyConf *conf,
+				  const gchar *key,
+				  gpointer     user_data)
+{
+	EmpathyStatusIcon *icon = user_data;
+	gboolean           use_libindicate = FALSE;
+
+	if (empathy_conf_get_bool (conf, key, &use_libindicate)) {
+		status_icon_set_use_libindicate (icon, use_libindicate);
+	}
+}
+#endif
+
 static void
 status_icon_toggle_visibility (EmpathyStatusIcon *icon)
 {
 	EmpathyStatusIconPriv *priv = GET_PRIV (icon);
 	gboolean               visible;
+#ifdef HAVE_LIBINDICATE
+	gboolean               use_libindicate;
+#endif
 
 	visible = gtk_window_is_active (priv->window);
+#ifdef HAVE_LIBINDICATE
+	empathy_conf_get_bool (empathy_conf_get (),
+			       EMPATHY_PREFS_UI_USE_LIBINDICATE,
+		               &use_libindicate);
+	if (use_libindicate) {
+		visible = GTK_WIDGET_VISIBLE (priv->window);
+	}
+#endif
 	status_icon_set_visibility (icon, !visible, TRUE);
 }
 
+#ifdef HAVE_LIBINDICATE
+static void
+indicate_server_activate_cb (EmpathyIndicatorManager *manager,
+				  EmpathyStatusIcon *icon)
+{
+	status_icon_toggle_visibility(icon);
+}
+#endif
+
 static void
 status_icon_idle_notify_cb (EmpathyStatusIcon *icon)
 {
@@ -554,6 +644,13 @@ empathy_status_icon_init (EmpathyStatusIcon *icon)
 				 status_icon_notify_visibility_cb,
 				 icon);
 
+#ifdef HAVE_LIBINDICATE
+	empathy_conf_notify_add (empathy_conf_get (),
+				 EMPATHY_PREFS_UI_USE_LIBINDICATE,
+				 status_icon_notify_libindicate_cb,
+				 icon);
+#endif
+
 	status_icon_create_menu (icon);
 	status_icon_idle_notify_cb (icon);
 
@@ -583,6 +680,9 @@ empathy_status_icon_new (GtkWindow *window, gboolean hide_contact_list)
 	EmpathyStatusIconPriv *priv;
 	EmpathyStatusIcon     *icon;
 	gboolean               should_hide;
+#ifdef HAVE_LIBINDICATE
+	gboolean               use_libindicate;
+#endif
 
 	g_return_val_if_fail (GTK_IS_WINDOW (window), NULL);
 
@@ -590,6 +690,12 @@ empathy_status_icon_new (GtkWindow *window, gboolean hide_contact_list)
 	priv = GET_PRIV (icon);
 
 	priv->window = g_object_ref (window);
+#ifdef HAVE_LIBINDICATE
+	priv->indicator_manager = empathy_indicator_manager_dup_singleton ();
+	g_signal_connect (priv->indicator_manager, "server-activate",
+			  G_CALLBACK (indicate_server_activate_cb),
+			  icon);
+#endif
 
 	g_signal_connect_after (priv->window, "key-press-event",
 			  G_CALLBACK (status_icon_key_press_event_cb),
@@ -607,6 +713,13 @@ empathy_status_icon_new (GtkWindow *window, gboolean hide_contact_list)
 		should_hide = TRUE;
 	}
 
+#ifdef HAVE_LIBINDICATE
+	empathy_conf_get_bool (empathy_conf_get (),
+			       EMPATHY_PREFS_UI_USE_LIBINDICATE,
+		               &use_libindicate);
+	status_icon_set_use_libindicate (icon, use_libindicate);
+#endif
+
 	if (gtk_window_is_active (priv->window) == should_hide) {
 		status_icon_set_visibility (icon, !should_hide, FALSE);
 	}
