diff -uprN evolution-2.28.3.1/addressbook/gui/widgets//e-addressbook-view.c evolution/addressbook/gui/widgets/e-addressbook-view.c
--- evolution-2.28.3.1/addressbook/gui/widgets//e-addressbook-view.c	2009-08-07 14:16:51.000000000 +0530
+++ evolution/addressbook/gui/widgets/e-addressbook-view.c	2010-06-13 13:20:14.000000000 +0530
@@ -64,6 +64,8 @@
 #include <libxml/tree.h>
 #include <libxml/parser.h>
 
+#include "e-telepathy.h"
+
 #define SHOW_ALL_SEARCH "(contains \"x-evolution-any-field\" \"\")"
 
 #define d(x)
@@ -928,12 +930,19 @@ new_list (EPopup *ep, EPopupItem *pitem,
 	g_object_unref(contact);
 }
 
+static void
+invoke_telepathy (EPopup *ep, EPopupItem *pitem, gpointer data)
+{
+    return;
+}
+
 static EPopupItem eabv_popup_items[] = {
 	{ E_POPUP_ITEM, (gchar *) "05.open", (gchar *) N_("_Open"), open_contact, NULL, NULL, EAB_POPUP_SELECT_ANY|EAB_POPUP_SELECT_EDITABLE },
+	{ E_POPUP_BAR, (gchar *) "06.bar" },
+    { E_POPUP_ITEM, (gchar *)"07.telepathy", (gchar *) N_("Connecting..."), invoke_telepathy, NULL, (gchar *) "telepathy",0,EAB_POPUP_SELECT_EDITABLE },
 	{ E_POPUP_BAR, (gchar *) "10.bar" },
 	{ E_POPUP_ITEM, (gchar *) "10.new",  (gchar *) N_("_New Contact..."), new_card, NULL, (gchar *) "contact-new", 0, EAB_POPUP_SELECT_EDITABLE},
 	{ E_POPUP_ITEM, (gchar *) "15.newlist", (gchar *) N_("New Contact _List..."), new_list, NULL, (gchar *) "stock_contact-list", 0, EAB_POPUP_SELECT_EDITABLE },
-
 	{ E_POPUP_BAR, (gchar *) "20.bar" },
 	{ E_POPUP_ITEM, (gchar *) "30.saveas", (gchar *) N_("_Save as vCard..."), save_as, NULL, (gchar *) "document-save-as", 0, EAB_POPUP_SELECT_ANY },
 	{ E_POPUP_ITEM, (gchar *) "40.forward", (gchar *) N_("_Forward Contact"), send_as, NULL, (gchar *) "mail-forward", EAB_POPUP_SELECT_ONE },
@@ -981,6 +990,9 @@ eabv_popup_free(EPopup *ep, GSList *list
 	g_free(cab);
 }
 
+static gchar *telepathy_str = N_("Getting Status...");
+static void *telepathy_handle = NULL;
+
 static void
 do_popup_menu(EABView *view, GdkEvent *event)
 {
@@ -1016,7 +1028,27 @@ do_popup_menu(EABView *view, GdkEvent *e
 	t->target.widget = (GtkWidget *)view;
 
 	for (i=0;i<sizeof(eabv_popup_items)/sizeof(eabv_popup_items[0]);i++)
+    {
+        if (eabv_popup_items[i].activate == invoke_telepathy)
+        {
+printf("Here:%X\n",telepathy_handle);
+            if(!telepathy_handle)
+                telepathy_handle = tel_initialize("jabber", "username@gmail.com", "password");
+            if (1) /* Status */
+            {
+                gchar *icon;
+                GList *contact_list = get_selected_contacts (view);
+                tel_get_im_status (telepathy_handle, contact_list->data, &telepathy_str, &icon);
+                //telepathy_str = tel_get_cur_status (telepathy_handle);
+                eabv_popup_items[i].label = (gchar *)telepathy_str;
+                eabv_popup_items[i].image = (gchar *)telepathy_str;
+
+                g_list_foreach (contact_list, (GFunc) g_object_unref, NULL);
+            	g_list_free (contact_list);
+            }
+        }
 		menus = g_slist_prepend(menus, &eabv_popup_items[i]);
+    }
 
 	e_popup_add_items((EPopup *)ep, menus, NULL, eabv_popup_free, contact_and_book);
 
diff -uprN evolution-2.28.3.1/addressbook/gui/widgets//e-telepathy.c evolution/addressbook/gui/widgets/e-telepathy.c
--- evolution-2.28.3.1/addressbook/gui/widgets//e-telepathy.c	1970-01-01 05:30:00.000000000 +0530
+++ evolution/addressbook/gui/widgets/e-telepathy.c	2010-06-13 18:09:23.000000000 +0530
@@ -0,0 +1,626 @@
+/* 
+ *
+ */
+
+#include <telepathy-glib/connection-manager.h>
+#include <telepathy-glib/connection.h>
+#include <telepathy-glib/contact.h>
+#include <telepathy-glib/channel.h>
+#include <telepathy-glib/interfaces.h>
+#include <telepathy-glib/util.h>
+#include <glib/gprintf.h>
+#include <pthread.h>
+
+#define TEL_REFRESH_TIME  10
+
+#include <libebook/e-book.h>
+#include "eab-contact-compare.h"
+
+// TODO: Pass these around in user_data:
+static GMainLoop *mainloop = NULL;
+static TpDBusDaemon *bus_daemon = NULL;
+static TpConnection *connection = NULL;
+static guint contact_list_handle = 0;
+static const TpIntSet* channel_members_set = NULL;
+//static TpContact * const *tel_contacts;
+static guint tel_n_contacts;
+
+typedef struct TEL_CONTACT
+{
+  gchar *status;
+  EContact *contact;
+}tel_contact;
+
+static tel_contact *tel_contacts;
+
+// TODO: move all user data to here
+typedef struct TEL_USER_DATA
+{
+  gchar *protocol;
+  gchar *username;
+  gchar *password;
+  TpConnection *connection;
+  gchar *status;
+  gchar *alias;
+}tel_user_data;
+
+static void disconnect ()
+{
+  if (!connection)
+    return;
+
+  g_printf ("DEBUG: Disconnecting.\n");
+  tp_cli_connection_call_disconnect (connection, -1, NULL, NULL,
+    NULL, NULL); /* Also destroys the connection object. */
+  connection = NULL;
+}
+
+void show_contact_information (TpContact *contact)
+{
+  g_printf ("Contact: Identifier=%s\n", 
+    tp_contact_get_identifier (contact));
+
+  g_printf ("  Alias=%s\n", 
+    tp_contact_get_alias (contact));
+
+  g_printf ("  Presence Status=%s\n", 
+    tp_contact_get_presence_status (contact));
+}
+
+void on_connection_get_contacts_by_id (TpConnection *connection,
+  guint n_contacts,
+  TpContact * const *contacts,
+  const gchar * const *requested_ids,
+  GHashTable *failed_id_errors,
+  const GError *error,
+  gpointer user_data,
+  GObject *weak_object)
+{
+  guint i;
+  if (error) 
+    return;
+  for (i=0;i<n_contacts;i++)
+  {
+    TpContact *contact = contacts[i];
+    if (contact)
+      show_contact_information (contact);
+  }
+}
+
+void on_connection_get_contacts_by_handle (TpConnection *connection,
+  guint n_contacts,
+  TpContact * const *contacts,
+  guint n_failed,
+  const TpHandle *failed,
+  const GError *error,
+  gpointer user_data,
+  GObject *weak_object)
+{
+  void on_connection_ready (TpConnection *connection,
+                            const GError *error,
+                            gpointer user_data);
+
+  if (error)
+      g_printf ("tp_connection_get_contacts_by_handle() failed: %s\n", error->message);
+  if (!tel_contacts && n_contacts)
+  {
+    tel_n_contacts = n_contacts;
+    tel_contacts = (tel_contact *) g_malloc0 ( sizeof(tel_contact)*n_contacts);
+    if (!tel_contacts)
+      return;
+  }
+
+  guint i = 0;
+  for (i = 0; i < n_contacts; ++i)
+    {
+      TpContact *contact = contacts[i];
+
+      if (contact)
+      {
+        show_contact_information (contact);
+        if (i<tel_n_contacts)
+        {
+          EContact *cur_contact = e_contact_new();
+          if (tel_contacts[i].status)
+          {
+            // TODO: Locking
+            g_free (tel_contacts[i].status);
+            g_object_unref (tel_contacts[i].contact);
+          }
+          e_contact_set (cur_contact, E_CONTACT_EMAIL_1, 
+                         tp_contact_get_identifier (contact));
+          e_contact_set (cur_contact, E_CONTACT_FULL_NAME, 
+                         tp_contact_get_alias (contact));
+//          tel_contacts[i].id = g_ascii_strdown (g_strdup (tp_contact_get_identifier (contact)), -1);
+//          tel_contacts[i].alias = g_strdup (tp_contact_get_alias (contact));
+          tel_contacts[i].status = g_strdup (tp_contact_get_presence_status (contact));
+          tel_contacts[i].contact = cur_contact;
+        }
+      }
+    }
+
+    //tel_n_contacts = n_contacts;
+    //tel_contacts = contacts;
+
+#if 0
+  /* Disconnect the connection.
+     Otherwise it will be orphaned. */
+  disconnect();
+#else
+  /* Refresh, TODO: Change this with hooks to status changed events - if present */
+g_printf("Refreshing connectiong...\n");
+  sleep (TEL_REFRESH_TIME);
+  on_connection_ready (connection, NULL, user_data);
+#endif
+}
+
+
+void on_connection_ready (TpConnection *connection,
+  const GError *error,
+  gpointer user_data)
+{
+  if (error)
+  {
+    g_printf ("tp_connection_call_when_ready() failed: %s\n", error->message);
+     return;
+  }
+
+  /* Actually get the information now that the connection is ready: */
+
+
+  /* Get a GArray instead of a TpIntSet,
+   * so we can easily create a normal array: */
+  GArray *members_array = g_array_new (TRUE, TRUE, sizeof(guint));
+  TpIntSetIter iter = TP_INTSET_ITER_INIT (channel_members_set );
+  while (tp_intset_iter_next (&iter))
+    {
+      g_array_append_val (members_array, iter.element);
+    }
+  channel_members_set = NULL; /* We don't need this anymore. */  
+
+  g_printf("DEBUG: members_array size=%u\n", members_array->len);
+
+
+  /* Get information about each contact: */ 
+  guint n_handles = members_array->len;
+  TpHandle* handles = (TpHandle*)g_array_free (members_array, FALSE);
+  members_array = NULL;
+  
+  /* The extra optional information that we are interested in: */
+  TpContactFeature features[] = {TP_CONTACT_FEATURE_ALIAS, 
+    TP_CONTACT_FEATURE_AVATAR_TOKEN, TP_CONTACT_FEATURE_PRESENCE};
+
+  g_printf ("DEBUG: Calling tp_connection_get_contacts_by_handle()\n");
+
+  tp_connection_get_contacts_by_handle (connection,
+    n_handles, handles,
+    sizeof (features) / sizeof(TpContactFeature), features,
+    &on_connection_get_contacts_by_handle,
+    user_data, /* user_data */
+    NULL, /* destroy */
+    NULL /* weak_object */);
+  g_free (handles);
+}
+
+void on_channel_ready (TpChannel *channel,
+  const GError *error,
+  gpointer user_data)
+{
+  if (error)
+  {
+    g_printf ("tp_channel_call_when_ready() failed: %s\n", error->message);
+    return;
+  }
+
+
+  /* List the channel members: */
+  channel_members_set = tp_channel_group_get_members (channel);
+  if (!channel_members_set )
+    {
+      g_printf ("tp_channel_group_get_members() returned NULL.\n");
+      return;
+    }
+
+  g_printf("DEBUG: Number of members: %u\n", tp_intset_size (channel_members_set ));
+
+ 
+  /* tp_connection_get_contacts_by_handle() requires the connection to be 
+   * ready: */
+  tp_connection_call_when_ready (connection, 
+    &on_connection_ready,
+    NULL);
+}
+
+void on_connection_request_channel (TpConnection *proxy,
+  const gchar *channel_dbus_path,
+  const GError *error,
+  gpointer user_data,
+  GObject *weak_object)
+{
+  if (error)
+    {
+      g_printf ("tp_cli_connection_call_request_channel() failed: %s\n", error->message);
+      return;
+    }
+
+  g_printf("DEBUG: channel D-Bus path received: %s\n", channel_dbus_path);
+
+
+  /* Create the channel proxy for the ContactList's Group interface: */
+  GError *error_inner = NULL;
+  TpChannel *channel = tp_channel_new (connection, 
+    channel_dbus_path, /* object_path */
+    TP_IFACE_CHANNEL_TYPE_CONTACT_LIST, /* optional_channel_type */
+    TP_HANDLE_TYPE_LIST, /* optional_handle_type */
+    contact_list_handle, /* optional_handle */
+    &error_inner);
+
+  if (error_inner)
+    {
+      g_printf ("tp_channel_new() failed: %s\n", error_inner->message);
+      g_clear_error (&error_inner);
+      return;
+    }
+
+  /* Wait until the channel is ready for use: */
+  tp_channel_call_when_ready (channel, 
+    &on_channel_ready,
+    NULL);
+}
+
+void on_connection_request_handles (TpConnection *proxy,
+  const GArray *handles_array,
+  const GError *error,
+  gpointer user_data,
+  GObject *weak_object)
+{
+  if (error)
+    {
+      g_printf ("tp_cli_connection_call_request_handles() failed: %s\n", error->message);
+      return;
+    }
+
+  if (!handles_array || handles_array->len == 0)
+    {
+      g_printf ("No handles received.\n");
+      return;
+    }
+ 
+  contact_list_handle = g_array_index (handles_array, guint, 0);
+  g_printf("DEBUG: Count of handles received: %u\n", handles_array->len);
+  g_printf("DEBUG: subscribe handle received: %u\n", contact_list_handle);
+
+
+  /* Request the channel: */
+  tp_cli_connection_call_request_channel (connection, 
+    -1, /* timeout */
+    TP_IFACE_CHANNEL_TYPE_CONTACT_LIST, /* in_Type */
+    TP_HANDLE_TYPE_LIST, /* in_Handle_Type - the correct type for ContactList */
+    contact_list_handle, /* in_Handle */
+    TRUE, /* in_Suppress_Handler */
+    &on_connection_request_channel, user_data, /* user_data */
+    NULL, /* destroy */
+    NULL /* weak_ref */);
+}
+
+
+/* A utility function to make our debug output easier to read. */
+const gchar* get_reason_description (TpConnectionStatusReason reason)
+{
+  switch (reason)
+    {
+      case TP_CONNECTION_STATUS_REASON_NONE_SPECIFIED:
+        return "None specified";
+      case TP_CONNECTION_STATUS_REASON_REQUESTED:
+        return "Requested";
+      case TP_CONNECTION_STATUS_REASON_NETWORK_ERROR:
+        return "Network error";
+      case TP_CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED:
+        return "Authentication failed";
+      case TP_CONNECTION_STATUS_REASON_ENCRYPTION_ERROR:
+        return "Encryption Error";
+      case TP_CONNECTION_STATUS_REASON_NAME_IN_USE:
+        return "Name in use";
+      case TP_CONNECTION_STATUS_REASON_CERT_NOT_PROVIDED:
+        return "Certificate not provided";
+      case TP_CONNECTION_STATUS_REASON_CERT_UNTRUSTED:
+        return "Certificate untrusted";
+      case TP_CONNECTION_STATUS_REASON_CERT_EXPIRED:
+        return "Certificate expired";
+      case TP_CONNECTION_STATUS_REASON_CERT_NOT_ACTIVATED:
+        return "Certificate not activated";
+      case TP_CONNECTION_STATUS_REASON_CERT_HOSTNAME_MISMATCH:
+        return "Certificate hostname mismatch";
+      case TP_CONNECTION_STATUS_REASON_CERT_FINGERPRINT_MISMATCH:
+        return "Certificate fingerprint mismatch";
+      case TP_CONNECTION_STATUS_REASON_CERT_SELF_SIGNED:
+        return "Cerficate is self signed";
+      case TP_CONNECTION_STATUS_REASON_CERT_OTHER_ERROR:
+        return "Other certificate error";
+      default:
+        return "Unknown reason";
+   }
+}
+
+void on_connection_status_changed (TpConnection *proxy,
+  guint arg_Status,
+  guint arg_Reason,
+  gpointer user_data,
+  GObject *weak_object)
+{
+  switch(arg_Status)
+    {
+      case TP_CONNECTION_STATUS_CONNECTED:
+        g_printf ("Connection status: Connected (reason: %s)\n", get_reason_description (arg_Reason));
+
+        /* Get the contacts information for this connection,
+         * and then disconnect the connection: */
+        
+        /* Request the handle for the ContactList, which lists.
+         * We need this handle to request the Group channel: */
+        const gchar **identifier_names = (const gchar **)g_malloc0(2 * sizeof(char*));
+        identifier_names[0] = "subscribe";
+        tp_cli_connection_call_request_handles (connection, 
+          -1, /* timeout */
+          TP_HANDLE_TYPE_LIST, /* in_Handle_Type - the correct type for ContactList for server-defined lists, such as "subscribe". */
+          identifier_names, /* in_Names */
+          &on_connection_request_handles, user_data, /* user_data */
+          NULL, /* destroy */
+          NULL /* weak_ref */);
+
+        break;
+
+      case TP_CONNECTION_STATUS_CONNECTING:
+        g_printf ("Connection status: Connecting (reason: %s)\n", get_reason_description (arg_Reason));
+
+        break;
+
+      case TP_CONNECTION_STATUS_DISCONNECTED:
+        g_printf ("Connection status: Disconnected (reason: %s)\n", get_reason_description (arg_Reason));
+
+        /* Finish with the connection object: */
+        if (connection)
+          {
+            g_object_unref (connection);
+            connection = NULL;
+          }
+
+        /* Stop the application: */
+        g_main_loop_quit (mainloop);
+
+        break;
+
+      default:
+        g_printf ("Connection status: Unknown status.\n");
+        break;
+    }
+}
+
+void
+got_connection (TpConnectionManager *connection_manager,
+                const gchar *service_name,
+                const gchar *object_path,
+                const GError *request_connection_error,
+                gpointer user_data,
+                GObject *weak_object)
+{
+  TpProxySignalConnection *signal_connection;
+  GError *error = NULL;
+
+  if (request_connection_error != NULL)
+    {
+      g_printf ("RequestConnection failed: %s\n",
+          request_connection_error->message);
+      g_main_loop_quit (mainloop);
+      return;
+    }
+
+  connection = tp_connection_new (bus_daemon, service_name, object_path, &error);
+
+  if (error != NULL)
+    {
+      g_printf ("tp_connection_new() failed: %s\n", error->message);
+      g_clear_error (&error);
+      g_main_loop_quit (mainloop);
+      return;
+    }
+
+  g_printf("DEBUG: Connection created.\n");
+
+  /* React to connection status changes,
+   * including errors when we try to connect: */
+  signal_connection = tp_cli_connection_connect_to_status_changed (connection,
+      &on_connection_status_changed,
+      user_data, /* user_data */
+      NULL, /* destroy_callback */
+      NULL, /* weak_object */
+      &error);
+
+  if (error)
+    {
+      g_printf ("couldn't connect to StatusChanged: %s\n", error->message);
+      g_clear_error (&error);
+      g_main_loop_quit (mainloop);
+      return;
+    }
+
+  /* Connect the connection: */
+  g_printf ("DEBUG: Calling Connect().\n");
+  tp_cli_connection_call_connect (connection, -1, NULL, NULL, NULL, NULL);
+}
+
+
+static void * 
+tel_create_connection (void *arg)
+{
+  tel_user_data *data = (tel_user_data *)arg;
+  g_type_init ();
+
+  /* Create the main loop: */
+  mainloop = g_main_loop_new (NULL, FALSE);
+
+  bus_daemon = tp_dbus_daemon_new (tp_get_bus ());
+
+  /* Get the connection manager: */
+  GError *error = NULL;
+  TpConnectionManager *connection_manager = 
+    tp_connection_manager_new (bus_daemon, "gabble", NULL, &error);
+  if (error)
+    {
+      g_printf ("tp_connection_manager_new() failed: %s\n", error->message);
+      g_clear_error (&error);
+      return NULL;
+    }
+
+  /* Get the connection : */
+  GHashTable *parameters = g_hash_table_new_full (NULL, NULL, NULL,
+      (GDestroyNotify) tp_g_value_slice_free);
+
+  GValue *value = tp_g_value_slice_new (G_TYPE_STRING);
+  g_value_set_static_string (value, data->username);
+  g_hash_table_insert (parameters, "account", value);
+
+  value = tp_g_value_slice_new (G_TYPE_STRING);
+  g_value_set_static_string (value, data->password);
+  g_hash_table_insert (parameters, "password", value);
+
+  /* This jabber-specific parameter can avoid clashes with 
+     other telepathy clients that use the default jabber 
+     resource name. */
+  value = tp_g_value_slice_new (G_TYPE_STRING);
+  g_value_set_static_string (value, "evolution telepathy");
+  g_hash_table_insert (parameters, "resource", value);
+
+  /* Call RequestConnection; it will return asynchronously by calling got_connection */
+  tp_cli_connection_manager_call_request_connection (connection_manager, -1,
+      data->protocol, parameters, got_connection, arg, NULL, NULL);  // arg->user_data
+
+  g_hash_table_unref (parameters);
+  parameters = NULL;
+
+
+  /* Run the main loop, 
+   * to keep our application alive while we wait for responses from telepathy.
+   * This function returns when we call g_main_loop_quit() from elsewhere.
+   */
+  g_main_loop_run (mainloop);
+
+
+g_printf("Main Loop Returns\n");
+
+  /* Clean up: */
+  g_object_unref (connection_manager);
+  g_main_loop_unref (mainloop);
+  g_object_unref (bus_daemon);
+
+  /* Free User Data -> check if struct data also needs to be freed */
+  g_free (arg);
+
+  return 0;
+}
+
+void * 
+tel_initialize (gchar *protocol, gchar *username, gchar *password)
+{
+  pthread_t thread_handle;
+  pthread_attr_t thread_attr;
+  tel_user_data *handle = (tel_user_data *) g_malloc0 (sizeof(tel_user_data));
+  if (!handle)
+    return NULL;
+
+  handle->protocol = protocol;
+  handle->username = username;
+  handle->password = password;
+
+  pthread_attr_init (&thread_attr);
+  pthread_attr_setdetachstate (&thread_attr, PTHREAD_CREATE_DETACHED);
+  if (pthread_create (&thread_handle, &thread_attr, tel_create_connection, 
+                        handle))
+      return NULL;
+
+  pthread_attr_destroy (&thread_attr);
+
+  return handle;
+}
+
+int 
+tel_close (void *handle)
+{
+  tel_user_data *data = (tel_user_data *)handle;
+  disconnect();
+  g_main_loop_quit (mainloop); //handle->mainloop);
+  return 0;
+}
+
+static gchar *tel_add_contact = "Add Contact";
+static gchar *tel_add_contact_icon = "add";
+static gchar *tel_contact_pending = "Getting Status...";
+
+int
+tel_get_im_status (void *handle, EContact *contact, gchar **status, gchar **icon)
+{
+#if 1
+  guint i;
+  if (!tel_contacts)
+  {
+    *status = tel_contact_pending;
+    *icon = tel_add_contact_icon;
+    return 0;
+  }
+  for (i=0;i<tel_n_contacts;i++)
+  {
+    gboolean found=FALSE;
+    //const gchar *id = tel_contacts[i].id;
+    //const gchar *al = tel_contacts[i].alias;
+
+    //if (!id || !al)
+      //continue;
+
+#if 0
+    if (email && !g_strcmp0 (g_ascii_strdown (email, -1), g_ascii_strdown (id, -1)))
+       found = TRUE;
+    // TODO: Compare 
+#else
+    //EContact *cur_contact = e_contact_new();
+    EABContactMatchType match;
+    //e_contact_set (cur_contact, E_CONTACT_EMAIL_1, id);
+    //e_contact_set (cur_contact, E_CONTACT_FULL_NAME, al);
+    match = eab_contact_compare_email (tel_contacts[i].contact, contact);
+    if (match == EAB_CONTACT_MATCH_PARTIAL || 
+        match == EAB_CONTACT_MATCH_EXACT)
+        found = TRUE;
+#endif
+    if (found)
+    {
+      *status = tel_contacts[i].status;
+      *icon = tel_add_contact_icon;
+      return 1;
+    }
+  }
+  *status = tel_add_contact;
+  *icon = tel_add_contact_icon;
+  return 0;
+#else
+ gchar *ids[] = { email };
+ TpContactFeature features[] = {TP_CONTACT_FEATURE_ALIAS, 
+    TP_CONTACT_FEATURE_AVATAR_TOKEN, TP_CONTACT_FEATURE_PRESENCE};
+ ((tel_user_data *)handle)->status = tel_contact_pending;
+ tp_connection_get_contacts_by_id(connection, 1, ids, 
+    sizeof (features) / sizeof(TpContactFeature), features,
+    &on_connection_get_contacts_by_id,
+    handle, /* user_data */
+    NULL, /* destroy */
+    NULL /* weak_object */);
+  sleep (1);
+#endif
+}
+
+gchar *tel_get_cur_status (void *handle)
+{
+  return ((tel_user_data *)handle)->status;
+}
+
+gchar *tel_get_cur_icon (void *handle)
+{
+  return tel_add_contact_icon;
+}
diff -uprN evolution-2.28.3.1/addressbook/gui/widgets//e-telepathy.h evolution/addressbook/gui/widgets/e-telepathy.h
--- evolution-2.28.3.1/addressbook/gui/widgets//e-telepathy.h	1970-01-01 05:30:00.000000000 +0530
+++ evolution/addressbook/gui/widgets/e-telepathy.h	2010-06-13 13:17:01.000000000 +0530
@@ -0,0 +1,16 @@
+
+#ifndef _E_TELEPATHY_H__
+#define _E_TELEPATHY_H__
+
+int
+tel_get_im_status (void *handle, EContact *contact, gchar **status, gchar **icon);
+
+int 
+tel_close (void *handle);
+
+void * 
+tel_initialize (gchar *protocol, gchar *username, gchar *password);
+gchar *tel_get_cur_status (void *handle);
+gchar *tel_get_cur_icon (void *handle);
+
+#endif
diff -uprN evolution-2.28.3.1/addressbook/gui/widgets//Makefile.am evolution/addressbook/gui/widgets/Makefile.am
--- evolution-2.28.3.1/addressbook/gui/widgets//Makefile.am	2009-07-13 13:15:12.000000000 +0530
+++ evolution/addressbook/gui/widgets/Makefile.am	2010-06-12 20:03:24.000000000 +0530
@@ -56,7 +56,9 @@ libeabwidgets_la_SOURCES =			\
 	gal-view-minicard.c			\
 	gal-view-minicard.h			\
 	gal-view-factory-minicard.c		\
-	gal-view-factory-minicard.h
+	gal-view-factory-minicard.h \
+    e-telepathy.c \
+    e-telepathy.h
 
 dist-hook:
 	cd $(distdir); rm -f $(BUILT_SOURCES)
diff -uprN evolution-2.28.3.1/addressbook/gui/widgets//Makefile.in evolution/addressbook/gui/widgets/Makefile.in
--- evolution-2.28.3.1/addressbook/gui/widgets//Makefile.in	2010-03-04 18:47:32.000000000 +0530
+++ evolution/addressbook/gui/widgets/Makefile.in	2010-06-12 20:03:59.000000000 +0530
@@ -487,7 +487,9 @@ libeabwidgets_la_SOURCES = \
 	gal-view-minicard.c			\
 	gal-view-minicard.h			\
 	gal-view-factory-minicard.c		\
-	gal-view-factory-minicard.h
+	gal-view-factory-minicard.h \
+    e-telepathy.c \
+    e-telepathy.h
 
 etspec_DATA = e-addressbook-view.etspec
 EXTRA_DIST = \
