--- empathy-2.26.0.1.orig/config.h.in
+++ empathy-2.26.0.1/config.h.in
@@ -30,6 +30,9 @@
 /* Define if your <locale.h> file defines LC_MESSAGES. */
 #undef HAVE_LC_MESSAGES
 
+/* Define if you have libindicate */
+#undef HAVE_LIBINDICATE
+
 /* Define to 1 if you have the <locale.h> header file. */
 #undef HAVE_LOCALE_H
 
--- empathy-2.26.0.1.orig/configure.ac
+++ empathy-2.26.0.1/configure.ac
@@ -234,6 +234,33 @@
 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,
--- empathy-2.26.0.1.orig/libempathy-gtk/empathy-ui-utils.c
+++ empathy-2.26.0.1/libempathy-gtk/empathy-ui-utils.c
@@ -1300,24 +1300,30 @@
 	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. */
--- empathy-2.26.0.1.orig/libempathy-gtk/empathy-conf.h
+++ empathy-2.26.0.1/libempathy-gtk/empathy-conf.h
@@ -69,6 +69,7 @@
 #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"
--- empathy-2.26.0.1.orig/src/empathy-chat-window.c
+++ empathy-2.26.0.1/src/empathy-chat-window.c
@@ -57,6 +57,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>
 
@@ -73,6 +78,10 @@
 	GtkWidget   *dialog;
 	GtkWidget   *notebook;
 	NotifyNotification *notification;
+#ifdef HAVE_LIBINDICATE
+	EmpathyIndicatorManager *indicator_manager;
+	GHashTable  *indicators;
+#endif
 
 	/* Menu items. */
 	GtkWidget   *menu_conv_clear;
@@ -861,6 +870,77 @@
 	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,
@@ -951,6 +1031,9 @@
 
 	if (!has_focus) {
 		chat_window_show_or_update_notification (window, message, chat);
+#ifdef HAVE_LIBINDICATE
+		chat_window_add_indicator (window, message, chat);
+#endif
 	}
 
 	if (has_focus && priv->current_chat == chat) {
@@ -1029,6 +1112,10 @@
 	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
@@ -1139,6 +1226,11 @@
 	/* 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;
 }
 
@@ -1346,6 +1438,10 @@
 	g_object_unref (glade);
 
 	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"); 
--- empathy-2.26.0.1.orig/src/Makefile.am
+++ empathy-2.26.0.1/src/Makefile.am
@@ -2,6 +2,7 @@
 	-I$(top_srcdir)                          	\
 	$(EMPATHY_CFLAGS)				\
 	$(LIBNOTIFY_CFLAGS)				\
+	$(INDICATE_CFLAGS)			\
 	$(WARN_CFLAGS)
 
 LDADD =								\
@@ -9,6 +10,7 @@
 	$(top_builddir)/libempathy/libempathy.la		\
 	$(top_builddir)/extensions/libemp-extensions.la		\
 	$(LIBNOTIFY_LIBS)					\
+	$(INDICATE_LIBS)					\
 	$(EMPATHY_LIBS)
 
 bin_PROGRAMS =			\
@@ -40,6 +42,11 @@
 	empathy-tube-dispatch.c empathy-tube-dispatch.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
--- empathy-2.26.0.1.orig/src/empathy-preferences.c
+++ empathy-2.26.0.1/src/empathy-preferences.c
@@ -49,6 +49,7 @@
 	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;
@@ -228,6 +229,14 @@
 					  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);
@@ -1077,6 +1086,7 @@
 		"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,
--- empathy-2.26.0.1.orig/src/empathy-status-icon.c
+++ empathy-2.26.0.1/src/empathy-status-icon.c
@@ -27,6 +27,7 @@
 #include <glade/glade.h>
 #include <gdk/gdkkeysyms.h>
 
+#include <libnotify/notify.h>
 #include <libnotify/notification.h>
 
 #include <libempathy/empathy-utils.h>
@@ -45,6 +46,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 @@
 	GtkWidget           *show_window_item;
 	GtkWidget           *message_item;
 	GtkWidget           *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 @@
 	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 @@
 		 */
 		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);
+		}
 	}
 }
 
@@ -320,6 +356,25 @@
 	}
 }
 
+#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,
@@ -333,16 +388,51 @@
 	}
 }
 
+#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)
 {
@@ -522,6 +612,9 @@
 	g_object_unref (priv->idle);
 	g_object_unref (priv->account_manager);
 	g_object_unref (priv->event_manager);
+#ifdef HAVE_LIBINDICATE
+	g_object_unref (priv->indicator_manager);
+#endif
 }
 
 static void
@@ -556,6 +649,13 @@
 				 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);
 
@@ -585,6 +685,9 @@
 	EmpathyStatusIconPriv *priv;
 	EmpathyStatusIcon     *icon;
 	gboolean               should_hide;
+#ifdef HAVE_LIBINDICATE
+	gboolean               use_libindicate;
+#endif
 
 	g_return_val_if_fail (GTK_IS_WINDOW (window), NULL);
 
@@ -592,6 +695,12 @@
 	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 (priv->window, "key-press-event",
 			  G_CALLBACK (status_icon_key_press_event_cb),
@@ -609,6 +718,13 @@
 		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);
 	}
--- empathy-2.26.0.1.orig/src/empathy-main-window.c
+++ empathy-2.26.0.1/src/empathy-main-window.c
@@ -61,6 +61,10 @@
 #include "empathy-chatrooms-window.h"
 #include "empathy-event-manager.h"
 
+#ifdef HAVE_LIBINDICATE
+#include "empathy-indicator-manager.h"
+#endif
+
 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
 #include <libempathy/empathy-debug.h>
 
@@ -106,6 +110,11 @@
 
 	/* Widgets that are enabled when there are connected accounts */
 	GList                  *widgets_connected;
+
+#ifdef HAVE_LIBINDICATE
+	EmpathyIndicatorManager *indicator_manager;
+	GHashTable              *indicator_timeouts;
+#endif
 } EmpathyMainWindow;
 
 static EmpathyMainWindow *window = NULL;
@@ -467,7 +476,7 @@
 	account = empathy_contact_get_account (contact);
 	should_play = !empathy_account_manager_is_account_just_connected (window->account_manager, account);
 
-	if (!should_play) {
+	if (should_play) {
 		return;
 	}
 
@@ -475,6 +484,10 @@
 		/* 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
 		return;
 	}
 
@@ -556,6 +569,10 @@
 			      "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, glade);
 	g_object_unref (glade);
--- empathy-2.26.0.1.orig/src/empathy-misc.h
+++ empathy-2.26.0.1/src/empathy-misc.h
@@ -43,6 +43,7 @@
 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
 
--- empathy-2.26.0.1.orig/src/empathy-misc.c
+++ empathy-2.26.0.1/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)
 {
--- empathy-2.26.0.1.orig/src/empathy-preferences.glade
+++ empathy-2.26.0.1/src/empathy-preferences.glade
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--*- mode: xml -*-->
+<?xml version="1.0"?>
 <glade-interface>
+  <!-- interface-requires gtk+ 2.16 -->
+  <!-- interface-naming-policy toplevel-contextual -->
   <widget class="GtkDialog" id="preferences_dialog">
     <property name="border_width">5</property>
     <property name="title" translatable="yes">Preferences</property>
     <property name="role">preferences</property>
-    <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+    <property name="window_position">center-on-parent</property>
     <property name="icon_name">gtk-preferences</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="type_hint">dialog</property>
     <property name="has_separator">False</property>
     <child internal-child="vbox">
       <widget class="GtkVBox" id="dialog-vbox5">
@@ -28,7 +28,7 @@
                   <widget class="GtkFrame" id="frame3">
                     <property name="visible">True</property>
                     <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
+                    <property name="shadow_type">none</property>
                     <child>
                       <widget class="GtkAlignment" id="alignment11">
                         <property name="visible">True</property>
@@ -40,26 +40,27 @@
                             <property name="spacing">6</property>
                             <child>
                               <widget class="GtkCheckButton" id="checkbutton_compact_contact_list">
+                                <property name="label" translatable="yes">Show co_mpact contact list</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Show co_mpact contact list</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
                               <packing>
                                 <property name="expand">False</property>
                                 <property name="fill">False</property>
+                                <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
                               <widget class="GtkCheckButton" id="checkbutton_show_avatars">
+                                <property name="label" translatable="yes">Show _avatars</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
                                 <property name="tooltip" translatable="yes">Avatars are user chosen images shown in the contact list</property>
-                                <property name="label" translatable="yes">Show _avatars</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="active">True</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
@@ -71,11 +72,11 @@
                             </child>
                             <child>
                               <widget class="GtkCheckButton" id="checkbutton_show_smileys">
+                                <property name="label" translatable="yes">Show _smileys as images</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Show _smileys as images</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="active">True</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
@@ -85,6 +86,19 @@
                                 <property name="position">2</property>
                               </packing>
                             </child>
+                            <child>
+                              <widget 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="xalign">0.37000000476837158</property>
+                                <property name="draw_indicator">True</property>
+                              </widget>
+                              <packing>
+                                <property name="position">3</property>
+                              </packing>
+                            </child>
                           </widget>
                         </child>
                       </widget>
@@ -103,13 +117,14 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
                   <widget class="GtkFrame" id="frame4">
                     <property name="visible">True</property>
                     <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
+                    <property name="shadow_type">none</property>
                     <child>
                       <widget class="GtkAlignment" id="alignment12">
                         <property name="visible">True</property>
@@ -120,25 +135,26 @@
                             <property name="visible">True</property>
                             <child>
                               <widget class="GtkCheckButton" id="checkbutton_separate_chat_windows">
+                                <property name="label" translatable="yes">_Open new chats in separate windows</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">_Open new chats in separate windows</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
                               <packing>
                                 <property name="expand">False</property>
                                 <property name="fill">False</property>
+                                <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
                               <widget class="GtkCheckButton" id="checkbutton_autoconnect">
+                                <property name="label" translatable="yes">Automatically _connect on startup </property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Automatically _connect on startup </property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="active">True</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
@@ -171,7 +187,7 @@
                   <widget class="GtkFrame" id="frame13">
                     <property name="visible">True</property>
                     <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
+                    <property name="shadow_type">none</property>
                     <child>
                       <widget class="GtkAlignment" id="alignment31">
                         <property name="visible">True</property>
@@ -182,25 +198,26 @@
                             <property name="visible">True</property>
                             <child>
                               <widget class="GtkRadioButton" id="radiobutton_contact_list_sort_by_name">
+                                <property name="label" translatable="yes">Sort by _name</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Sort by _name</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
                               <packing>
                                 <property name="expand">False</property>
                                 <property name="fill">False</property>
+                                <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
                               <widget class="GtkRadioButton" id="radiobutton_contact_list_sort_by_state">
+                                <property name="label" translatable="yes">Sort by s_tate</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Sort by s_tate</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="draw_indicator">True</property>
                                 <property name="group">radiobutton_contact_list_sort_by_name</property>
                               </widget>
@@ -229,6 +246,9 @@
                     <property name="position">2</property>
                   </packing>
                 </child>
+                <child>
+                  <placeholder/>
+                </child>
               </widget>
             </child>
             <child>
@@ -237,8 +257,8 @@
                 <property name="label" translatable="yes">General</property>
               </widget>
               <packing>
-                <property name="type">tab</property>
                 <property name="tab_fill">False</property>
+                <property name="type">tab</property>
               </packing>
             </child>
             <child>
@@ -248,16 +268,17 @@
                 <property name="spacing">6</property>
                 <child>
                   <widget class="GtkCheckButton" id="checkbutton_notifications_enabled">
+                    <property name="label" translatable="yes">_Enable bubble notifications</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
-                    <property name="label" translatable="yes">_Enable bubble notifications</property>
+                    <property name="receives_default">False</property>
                     <property name="use_underline">True</property>
-                    <property name="response_id">0</property>
                     <property name="draw_indicator">True</property>
                   </widget>
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
@@ -270,21 +291,24 @@
                         <property name="spacing">6</property>
                         <child>
                           <widget class="GtkCheckButton" id="checkbutton_notifications_disabled_away">
+                            <property name="label" translatable="yes">Disable notifications when _away or busy</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="label" translatable="yes">Disable notifications when _away or busy</property>
+                            <property name="receives_default">False</property>
                             <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
                             <property name="draw_indicator">True</property>
                           </widget>
+                          <packing>
+                            <property name="position">0</property>
+                          </packing>
                         </child>
                         <child>
                           <widget class="GtkCheckButton" id="checkbutton_notifications_focus">
+                            <property name="label" translatable="yes">Enable notifications when the _chat is not focused</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="label" translatable="yes">Enable notifications when the _chat is not focused</property>
+                            <property name="receives_default">False</property>
                             <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
                             <property name="draw_indicator">True</property>
                           </widget>
                           <packing>
@@ -310,9 +334,9 @@
                 <property name="label" translatable="yes">Notifications</property>
               </widget>
               <packing>
-                <property name="type">tab</property>
                 <property name="position">4</property>
                 <property name="tab_fill">False</property>
+                <property name="type">tab</property>
               </packing>
             </child>
             <child>
@@ -326,16 +350,17 @@
                     <property name="spacing">6</property>
                     <child>
                       <widget class="GtkCheckButton" id="checkbutton_sounds_enabled">
+                        <property name="label" translatable="yes">_Enable sound notifications</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="label" translatable="yes">_Enable sound notifications</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
                         <property name="draw_indicator">True</property>
                       </widget>
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">False</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
@@ -344,11 +369,11 @@
                         <property name="left_padding">12</property>
                         <child>
                           <widget class="GtkCheckButton" id="checkbutton_sounds_disabled_away">
+                            <property name="label" translatable="yes">Disable sounds when _away or busy</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="label" translatable="yes">Disable sounds when _away or busy</property>
+                            <property name="receives_default">False</property>
                             <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
                             <property name="draw_indicator">True</property>
                           </widget>
                         </child>
@@ -360,6 +385,7 @@
                   </widget>
                   <packing>
                     <property name="expand">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
@@ -376,6 +402,7 @@
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">False</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
@@ -386,9 +413,9 @@
                           <widget class="GtkScrolledWindow" id="scrolledwindow19">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                            <property name="shadow_type">GTK_SHADOW_IN</property>
+                            <property name="hscrollbar_policy">automatic</property>
+                            <property name="vscrollbar_policy">automatic</property>
+                            <property name="shadow_type">in</property>
                             <child>
                               <widget class="GtkTreeView" id="treeview_sounds">
                                 <property name="visible">True</property>
@@ -419,9 +446,9 @@
                 <property name="label" translatable="yes">Sounds</property>
               </widget>
               <packing>
-                <property name="type">tab</property>
                 <property name="position">2</property>
                 <property name="tab_fill">False</property>
+                <property name="type">tab</property>
               </packing>
             </child>
             <child>
@@ -433,7 +460,7 @@
                   <widget class="GtkFrame" id="frame7">
                     <property name="visible">True</property>
                     <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
+                    <property name="shadow_type">none</property>
                     <child>
                       <widget class="GtkAlignment" id="alignment15">
                         <property name="visible">True</property>
@@ -454,9 +481,9 @@
                                       <widget class="GtkScrolledWindow" id="scrolledwindow18">
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
-                                        <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                                        <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                                        <property name="shadow_type">GTK_SHADOW_IN</property>
+                                        <property name="hscrollbar_policy">automatic</property>
+                                        <property name="vscrollbar_policy">automatic</property>
+                                        <property name="shadow_type">in</property>
                                         <child>
                                           <widget class="GtkTreeView" id="treeview_spell_checker">
                                             <property name="visible">True</property>
@@ -465,10 +492,19 @@
                                           </widget>
                                         </child>
                                       </widget>
+                                      <packing>
+                                        <property name="position">0</property>
+                                      </packing>
                                     </child>
                                   </widget>
+                                  <packing>
+                                    <property name="position">0</property>
+                                  </packing>
                                 </child>
                               </widget>
+                              <packing>
+                                <property name="position">0</property>
+                              </packing>
                             </child>
                             <child>
                               <widget class="GtkHBox" id="hbox155">
@@ -482,6 +518,7 @@
                                   </widget>
                                   <packing>
                                     <property name="expand">False</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -517,6 +554,9 @@
                       </packing>
                     </child>
                   </widget>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
                 </child>
                 <child>
                   <placeholder/>
@@ -532,9 +572,9 @@
                 <property name="label" translatable="yes">Spell Checking</property>
               </widget>
               <packing>
-                <property name="type">tab</property>
                 <property name="position">3</property>
                 <property name="tab_fill">False</property>
+                <property name="type">tab</property>
               </packing>
             </child>
             <child>
@@ -546,7 +586,7 @@
                   <widget class="GtkFrame" id="frame11">
                     <property name="visible">True</property>
                     <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
+                    <property name="shadow_type">none</property>
                     <child>
                       <widget class="GtkAlignment" id="alignment19">
                         <property name="visible">True</property>
@@ -570,6 +610,7 @@
                                   <packing>
                                     <property name="expand">False</property>
                                     <property name="fill">False</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -584,6 +625,9 @@
                                   </packing>
                                 </child>
                               </widget>
+                              <packing>
+                                <property name="position">0</property>
+                              </packing>
                             </child>
                           </widget>
                         </child>
@@ -603,6 +647,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
               </widget>
@@ -616,9 +661,9 @@
                 <property name="label" translatable="yes">Themes</property>
               </widget>
               <packing>
-                <property name="type">tab</property>
                 <property name="position">4</property>
                 <property name="tab_fill">False</property>
+                <property name="type">tab</property>
               </packing>
             </child>
           </widget>
@@ -629,21 +674,28 @@
         <child internal-child="action_area">
           <widget class="GtkHButtonBox" id="dialog-action_area5">
             <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <property name="layout_style">end</property>
             <child>
               <widget class="GtkButton" id="button_close">
+                <property name="label">gtk-close</property>
+                <property name="response_id">-6</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
-                <property name="label">gtk-close</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">-6</property>
               </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
             </child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </widget>
--- empathy-2.26.0.1.orig/src/empathy-indicator-manager.c
+++ empathy-2.26.0.1/src/empathy-indicator-manager.c
@@ -0,0 +1,337 @@
+#include <config.h>
+
+#include <gtk/gtk.h>
+
+#include <libempathy/empathy-contact.h>
+#include <libempathy/empathy-dispatcher.h>
+#include <libempathy/empathy-utils.h>
+
+#include <libempathy-gtk/empathy-conf.h>
+#include <libempathy-gtk/empathy-ui-utils.h>
+
+#include "empathy-event-manager.h"
+#include "empathy-indicator.h"
+#include "empathy-indicator-manager.h"
+#include "empathy-misc.h"
+
+#include <libindicate/server.h>
+
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIndicatorManager)
+
+enum {
+  SERVER_ACTIVATE,
+  LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
+typedef struct {
+  EmpathyEventManager *event_manager;
+  IndicateServer      *indicate_server;
+  GSList              *indicator_events;
+  GHashTable          *login_timeouts;
+} EmpathyIndicatorManagerPriv;
+
+typedef struct {
+  EmpathyIndicator   *indicator;
+  EmpathyEvent        *event;
+} IndicatorEvent;
+
+typedef struct {
+	EmpathyIndicatorManager *manager;
+	EmpathyIndicator *indicator;
+} LoginData;
+
+G_DEFINE_TYPE (EmpathyIndicatorManager, empathy_indicator_manager, G_TYPE_OBJECT);
+
+static EmpathyIndicatorManager * manager_singleton = NULL;
+
+static void
+free_indicator_event (IndicatorEvent *indicator_event)
+{
+  g_object_unref(indicator_event->indicator);
+  g_free(indicator_event);
+}
+
+static void
+indicate_server_activate (IndicateServer          *server,
+                          EmpathyIndicatorManager *manager)
+{
+  g_signal_emit (manager, signals[SERVER_ACTIVATE], 0);
+}
+
+static void
+indicate_show_cb (EmpathyIndicator *indicator,
+                  EmpathyEvent     *event)
+{
+  empathy_event_activate (event);
+}
+
+static void
+indicator_manager_event_added_cb (EmpathyEventManager *event_manager,
+			    EmpathyEvent        *event,
+			    EmpathyIndicatorManager   *manager)
+{
+  EmpathyIndicator *indicator;
+  EmpathyIndicatorManagerPriv *priv = GET_PRIV (manager);
+  IndicatorEvent *indicator_event;
+
+  if (!event->contact)
+      return;
+  indicator = empathy_indicator_new (event->contact, event->message, "im");
+  if (!indicator)
+      return;
+  empathy_indicator_show (indicator);
+  g_signal_connect(G_OBJECT(indicator), "activate",
+          G_CALLBACK(indicate_show_cb),
+          event);
+  indicator_event = (IndicatorEvent *) g_malloc(sizeof(IndicatorEvent));
+  indicator_event->indicator = g_object_ref(indicator);
+  indicator_event->event = event;
+  priv->indicator_events = g_slist_prepend(priv->indicator_events,
+          indicator_event);
+}
+
+static void
+indicator_manager_event_removed_cb (EmpathyEventManager *event_manager,
+			      EmpathyEvent        *event,
+			      EmpathyIndicatorManager   *manager)
+{
+  EmpathyIndicatorManagerPriv *priv = GET_PRIV (manager);
+  GSList *l;
+  IndicatorEvent *ret = NULL;
+
+  for (l = priv->indicator_events; l; l = l->next)
+  {
+    IndicatorEvent *indicator_event = l->data;
+    if (indicator_event->event == event) {
+      ret = indicator_event;
+      break;
+    }
+  }
+
+  if (!ret)
+    return;
+
+  priv->indicator_events = g_slist_remove (priv->indicator_events, ret);
+
+  empathy_indicator_hide (ret->indicator);
+  free_indicator_event (ret);
+}
+
+static void
+indicator_manager_event_updated_cb (EmpathyEventManager *event_manager,
+			      EmpathyEvent        *event,
+			      EmpathyIndicatorManager   *manager)
+{
+  EmpathyIndicatorManagerPriv *priv = GET_PRIV (manager);
+  GSList *l;
+  IndicatorEvent *ret = NULL;
+
+  for (l = priv->indicator_events; l; l = l->next)
+  {
+    IndicatorEvent *indicator_event = l->data;
+    if (indicator_event->event == event) {
+      ret = indicator_event;
+      break;
+    }
+  }
+
+  if (!ret)
+    return;
+
+  empathy_indicator_update (ret->indicator, event->message);
+}
+
+static gboolean
+indicate_login_timeout (gpointer data)
+{
+  LoginData *login_data = (LoginData *)data;
+  EmpathyIndicator *e_indicator = login_data->indicator;
+  EmpathyIndicatorManager *manager = login_data->manager;
+  EmpathyIndicatorManagerPriv *priv = GET_PRIV (manager);
+  GValue *wrapped_timeout;
+  guint login_timeout;
+
+  wrapped_timeout = g_hash_table_lookup (priv->login_timeouts, e_indicator);
+  if (wrapped_timeout) {
+    login_timeout = g_value_get_uint (wrapped_timeout);
+    g_hash_table_remove (priv->login_timeouts, e_indicator);
+    empathy_indicator_hide (e_indicator);
+    g_object_unref(e_indicator);
+    g_slice_free (GValue, wrapped_timeout);
+  }
+  g_object_unref (e_indicator);
+  g_object_unref (manager);
+  g_slice_free (LoginData, data);
+
+  return FALSE;
+}
+
+static void
+indicate_login_cb (EmpathyIndicator *e_indicator,
+                   EmpathyIndicatorManager *manager)
+{
+  EmpathyIndicatorManagerPriv *priv = GET_PRIV (manager);
+  GSList *events, *l;
+  EmpathyContact *contact;
+
+  g_hash_table_remove (priv->login_timeouts, e_indicator);
+  empathy_indicator_hide (e_indicator);
+  g_object_unref (e_indicator);
+
+  contact = empathy_indicator_get_contact (e_indicator);
+  /* If the contact has an event activate it, otherwise the
+   * default handler of row-activated will be called. */
+  events = empathy_event_manager_get_events (priv->event_manager);
+  for (l = events; l; l = l->next) {
+    EmpathyEvent *event = l->data;
+
+    if (event->contact == contact) {
+      empathy_event_activate (event);
+      return;
+    }
+  }
+
+  /* Else start a new conversation */
+  empathy_dispatcher_chat_with_contact (contact, NULL, NULL);
+}
+
+EmpathyIndicatorManager *
+empathy_indicator_manager_dup_singleton (void)
+{
+  return g_object_new (EMPATHY_TYPE_INDICATOR_MANAGER, NULL);
+}
+
+static void
+indicator_manager_finalize (GObject *object)
+{
+  EmpathyIndicatorManagerPriv *priv = GET_PRIV (object);
+
+  g_slist_foreach (priv->indicator_events, (GFunc) free_indicator_event,
+          NULL);
+  g_object_unref (priv->event_manager);
+  g_object_unref (priv->indicate_server);
+  g_object_unref (priv->login_timeouts);
+}
+
+static GObject *
+indicator_manager_constructor (GType type,
+			   guint n_props,
+			   GObjectConstructParam *props)
+{
+	GObject *retval;
+
+	if (manager_singleton) {
+		retval = g_object_ref (manager_singleton);
+	} else {
+		retval = G_OBJECT_CLASS (empathy_indicator_manager_parent_class)->constructor
+			(type, n_props, props);
+
+		manager_singleton = EMPATHY_INDICATOR_MANAGER (retval);
+		g_object_add_weak_pointer (retval, (gpointer) &manager_singleton);
+	}
+
+	return retval;
+}
+
+static void
+empathy_indicator_manager_class_init (EmpathyIndicatorManagerClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = indicator_manager_finalize;
+  object_class->constructor = indicator_manager_constructor;
+
+  signals[SERVER_ACTIVATE] =
+    g_signal_new ("server-activate",
+      G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST,
+      0,
+      NULL, NULL,
+      g_cclosure_marshal_VOID__VOID,
+      G_TYPE_NONE,
+      0);
+
+  g_type_class_add_private (object_class, sizeof (EmpathyIndicatorManagerPriv));
+}
+
+static void
+empathy_indicator_manager_init (EmpathyIndicatorManager *manager)
+{
+  EmpathyIndicatorManagerPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
+    EMPATHY_TYPE_INDICATOR_MANAGER, EmpathyIndicatorManagerPriv);
+
+  manager->priv = priv;
+
+  priv->event_manager = empathy_event_manager_dup_singleton ();
+  priv->login_timeouts = g_hash_table_new (NULL, NULL);
+  priv->indicate_server = indicate_server_ref_default();
+  indicate_server_set_type (priv->indicate_server, "message.instant");
+  indicate_server_set_desktop_file (priv->indicate_server, "/usr/share/applications/empathy.desktop");
+
+  g_signal_connect (priv->indicate_server,
+        INDICATE_SERVER_SIGNAL_SERVER_DISPLAY,
+        G_CALLBACK(indicate_server_activate),
+        manager);
+
+  g_signal_connect (priv->event_manager, "event-added",
+        G_CALLBACK (indicator_manager_event_added_cb),
+        manager);
+  g_signal_connect (priv->event_manager, "event-removed",
+        G_CALLBACK (indicator_manager_event_removed_cb),
+        manager);
+  g_signal_connect (priv->event_manager, "event-updated",
+        G_CALLBACK (indicator_manager_event_updated_cb),
+        manager);
+}
+
+void
+empathy_indicator_manager_set_server_visible (EmpathyIndicatorManager *manager,
+                        gboolean visible)
+{
+  EmpathyIndicatorManagerPriv *priv = GET_PRIV (manager);
+
+  if (visible) {
+    indicate_server_show (priv->indicate_server);
+  } else {
+    /* Causes a crash on next show currently due to object not being
+       unregistered from dbus
+    indicate_server_hide (priv->indicate_server);
+    */
+  }
+}
+
+EmpathyIndicator *
+empathy_indicator_manager_add_indicator (EmpathyIndicatorManager *manager,
+                        EmpathyContact          *sender,
+                        const gchar             *body)
+{
+  return empathy_indicator_new (sender, body, "im");
+}
+
+void
+empathy_indicator_manager_add_login_indicator (EmpathyIndicatorManager *manager,
+                        EmpathyContact          *contact)
+{
+  EmpathyIndicatorManagerPriv *priv = GET_PRIV (manager);
+  guint login_timeout;
+  GValue *wrapped_timeout;
+  EmpathyIndicator *e_indicator = empathy_indicator_new (contact, NULL, "login");
+  LoginData *login_data = g_slice_new0 (LoginData);
+  g_warning( "here");
+  if (!login_data) {
+    return;
+  }
+  login_data->indicator = g_object_ref(e_indicator);
+  login_data->manager = g_object_ref(manager);
+
+  login_timeout = g_timeout_add_seconds(15, indicate_login_timeout, login_data);
+  wrapped_timeout = g_slice_new0 (GValue);
+  g_value_init (wrapped_timeout, G_TYPE_UINT);
+  g_value_set_uint (wrapped_timeout, login_timeout);
+  g_hash_table_insert (priv->login_timeouts, e_indicator, wrapped_timeout);
+  g_signal_connect(e_indicator, "activate",
+         G_CALLBACK(indicate_login_cb), manager);
+  empathy_indicator_show (e_indicator);
+}
--- empathy-2.26.0.1.orig/src/empathy-indicator.c
+++ empathy-2.26.0.1/src/empathy-indicator.c
@@ -0,0 +1,160 @@
+#include <gtk/gtk.h>
+
+#include <libempathy/empathy-contact.h>
+#include <libempathy/empathy-utils.h>
+
+#include "empathy-indicator.h"
+#include "empathy-misc.h"
+
+#include <libindicate/indicator-message.h>
+
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIndicator)
+
+enum {
+  ACTIVATE,
+  LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
+typedef struct {
+  IndicateIndicator *indicator;
+  EmpathyContact    *contact;
+} EmpathyIndicatorPriv;
+
+G_DEFINE_TYPE(EmpathyIndicator, empathy_indicator, G_TYPE_OBJECT)
+
+static void
+empathy_indicator_finalize (GObject *object)
+{
+  EmpathyIndicatorPriv *priv = GET_PRIV (object);
+
+  g_object_unref (priv->indicator);
+  g_object_unref (priv->contact);
+}
+
+static GObject *
+empathy_indicator_constructor (GType type,
+        guint n_props,
+        GObjectConstructParam *props)
+{
+  GObject *retval;
+
+  retval = G_OBJECT_CLASS (empathy_indicator_parent_class)->constructor
+      (type, n_props, props);
+
+  return retval;
+}
+
+static void
+empathy_indicator_class_init (EmpathyIndicatorClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = empathy_indicator_finalize;
+  object_class->constructor = empathy_indicator_constructor;
+
+  signals[ACTIVATE] =
+    g_signal_new ("activate",
+      G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST,
+      0,
+      NULL, NULL,
+      g_cclosure_marshal_VOID__VOID,
+      G_TYPE_NONE,
+      0);
+
+  g_type_class_add_private (object_class, sizeof (EmpathyIndicatorPriv));
+}
+
+static void
+indicate_show_cb (IndicateIndicator *indicator,
+        EmpathyIndicator *e_indicator)
+{
+  g_signal_emit (e_indicator, signals[ACTIVATE], 0);
+}
+
+static void
+empathy_indicator_init (EmpathyIndicator *e_indicator)
+{
+  EmpathyIndicatorPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (e_indicator,
+          EMPATHY_TYPE_INDICATOR, EmpathyIndicatorPriv);
+
+  e_indicator->priv = priv;
+}
+
+EmpathyIndicator *
+empathy_indicator_new (EmpathyContact *sender,
+            const gchar *body, const gchar *subtype)
+{
+  GdkPixbuf *pixbuf;
+  GTimeVal time;
+  EmpathyIndicatorPriv *priv;
+  EmpathyIndicator *e_indicator;
+
+  e_indicator = g_object_new (EMPATHY_TYPE_INDICATOR, NULL);
+  priv = GET_PRIV (e_indicator);
+
+  priv->indicator = g_object_ref(INDICATE_INDICATOR (indicate_indicator_message_new ()));
+  g_assert (priv->indicator);
+  indicate_indicator_set_property (priv->indicator, "subtype", g_strdup(subtype));
+  indicate_indicator_set_property (priv->indicator, "sender",
+          empathy_contact_get_name(sender));
+  priv->contact = g_object_ref(sender);
+  pixbuf = empathy_misc_get_pixbuf_for_indicator (sender);
+  if (pixbuf) {
+      indicate_indicator_set_property_icon (priv->indicator, "icon",
+              gdk_pixbuf_copy (pixbuf));
+      g_object_unref (pixbuf);
+  }
+  if (body) {
+      indicate_indicator_set_property (priv->indicator, "body",
+              g_strdup (body));
+  }
+  g_get_current_time(&time);
+  indicate_indicator_set_property_time (priv->indicator, "time", &time);
+  g_signal_connect(G_OBJECT(priv->indicator),
+          INDICATE_INDICATOR_SIGNAL_DISPLAY,
+          G_CALLBACK(indicate_show_cb),
+          e_indicator);
+
+  return e_indicator;
+}
+
+void
+empathy_indicator_show (EmpathyIndicator *e_indicator)
+{
+  EmpathyIndicatorPriv *priv = GET_PRIV (e_indicator);
+
+  indicate_indicator_show (priv->indicator);
+}
+
+void
+empathy_indicator_hide (EmpathyIndicator *e_indicator)
+{
+  EmpathyIndicatorPriv *priv = GET_PRIV (e_indicator);
+
+  indicate_indicator_hide (priv->indicator);
+}
+
+void
+empathy_indicator_update (EmpathyIndicator *e_indicator,
+        const gchar *body)
+{
+  EmpathyIndicatorPriv *priv = GET_PRIV (e_indicator);
+  GTimeVal time;
+
+  g_get_current_time(&time);
+  indicate_indicator_set_property_time(priv->indicator, "time", &time);
+  if (body) {
+      indicate_indicator_set_property (priv->indicator, "body",
+              g_strdup(body));
+  }
+}
+
+EmpathyContact *
+empathy_indicator_get_contact (EmpathyIndicator *e_indicator)
+{
+  EmpathyIndicatorPriv *priv = GET_PRIV (e_indicator);
+  return priv->contact;
+}
--- empathy-2.26.0.1.orig/src/empathy-indicator.h
+++ empathy-2.26.0.1/src/empathy-indicator.h
@@ -0,0 +1,41 @@
+#ifndef EMPATHY_INDICATOR_H
+#define EMPATHY_INDICATOR_H
+
+#include <glib.h>
+
+#include <libempathy/empathy-contact.h>
+
+G_BEGIN_DECLS
+
+#define EMPATHY_TYPE_INDICATOR         (empathy_indicator_get_type ())
+#define EMPATHY_INDICATOR(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_INDICATOR, EmpathyIndicator))
+#define EMPATHY_INDICATOR_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), EMPATHY_TYPE_INDICATOR, EmpathyIndicatorClass))
+#define EMPATHY_IS_INDICATOR(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_INDICATOR))
+#define EMPATHY_IS_INDICATOR_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_INDICATOR))
+#define EMPATHY_INDICATOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_INDICATOR, EmpathyIndicatorClass))
+
+typedef struct _EmpathyIndicator      EmpathyIndicator;
+typedef struct _EmpathyIndicatorClass EmpathyIndicatorClass;
+
+struct _EmpathyIndicator {
+	GObject parent;
+	gpointer priv;
+};
+
+struct _EmpathyIndicatorClass {
+	GObjectClass parent_class;
+};
+
+GType              empathy_indicator_get_type (void) G_GNUC_CONST;
+EmpathyIndicator  *empathy_indicator_new (EmpathyContact *sender,
+                        const gchar *body, const gchar *type);
+void               empathy_indicator_show (EmpathyIndicator *e_indicator);
+void               empathy_indicator_hide (EmpathyIndicator *e_indicator);
+void               empathy_indicator_update (EmpathyIndicator *e_indicator,
+                        const gchar *body);
+EmpathyContact    *empathy_indicator_get_contact (EmpathyIndicator *e_indicator);
+
+G_END_DECLS
+
+
+#endif /* EMPATHY-INDICATOR_H */
--- empathy-2.26.0.1.orig/src/empathy-indicator-manager.h
+++ empathy-2.26.0.1/src/empathy-indicator-manager.h
@@ -0,0 +1,44 @@
+#ifndef EMPATHY_INDICATOR_MANAGER_H
+#define EMPATHY_INDICATOR_MANAGER_H
+
+#include <glib.h>
+
+#include <libempathy/empathy-contact.h>
+#include "empathy-indicator.h"
+
+G_BEGIN_DECLS
+
+#define EMPATHY_TYPE_INDICATOR_MANAGER         (empathy_indicator_manager_get_type ())
+#define EMPATHY_INDICATOR_MANAGER(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_INDICATOR_MANAGER, EmpathyIndicatorManager))
+#define EMPATHY_INDICATOR_MANAGER_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), EMPATHY_TYPE_INDICATOR_MANAGER, EmpathyIndicatorManagerClass))
+#define EMPATHY_IS_INDICATOR_MANAGER(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_INDICATOR_MANAGER))
+#define EMPATHY_IS_INDICATOR_MANAGER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_INDICATOR_MANAGER))
+#define EMPATHY_INDICATOR_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_INDICATOR_MANAGER, EmpathyIndicatorManagerClass))
+
+typedef struct _EmpathyIndicatorManager      EmpathyIndicatorManager;
+typedef struct _EmpathyIndicatorManagerClass EmpathyIndicatorManagerClass;
+
+struct _EmpathyIndicatorManager {
+	GObject parent;
+	gpointer priv;
+};
+
+struct _EmpathyIndicatorManagerClass {
+	GObjectClass parent_class;
+};
+
+GType              empathy_indicator_manager_get_type (void) G_GNUC_CONST;
+EmpathyIndicatorManager *empathy_indicator_manager_dup_singleton (void);
+void               empathy_indicator_manager_set_server_visible (EmpathyIndicatorManager *manager,
+                        gboolean visible);
+EmpathyIndicator * empathy_indicator_manager_add_indicator (
+                        EmpathyIndicatorManager *manager,
+                        EmpathyContact          *sender,
+                        const gchar             *body);
+void               empathy_indicator_manager_add_login_indicator (
+                        EmpathyIndicatorManager *manager,
+                        EmpathyContact          *contact);
+
+G_END_DECLS
+
+#endif /* EMPATHY_INDICATOR_MANAGER_H */
