diff --git a/src/empathy-accounts-dialog.c b/src/empathy-accounts-dialog.c
index edec600..893d1e7 100644
--- a/src/empathy-accounts-dialog.c
+++ b/src/empathy-accounts-dialog.c
@@ -777,8 +777,77 @@ accounts_dialog_name_editing_started_cb (GtkCellRenderer *renderer,
   DEBUG ("Editing account name started; stopping flashing");
 }
 
+static const gchar *
+get_status_icon_for_account (EmpathyAccountsDialog *self,
+    TpAccount *account)
+{
+  EmpathyAccountsDialogPriv *priv = GET_PRIV (self);
+  TpConnectionStatus status;
+  TpConnectionStatusReason reason;
+  TpConnectionPresenceType presence;
+
+  if (account == NULL)
+    return empathy_icon_name_for_presence (TP_CONNECTION_PRESENCE_TYPE_OFFLINE);
+
+  if (!tp_account_is_enabled (account))
+    return empathy_icon_name_for_presence (TP_CONNECTION_PRESENCE_TYPE_OFFLINE);
+
+  status = tp_account_get_connection_status (account, &reason);
+
+  if (status == TP_CONNECTION_STATUS_DISCONNECTED)
+    {
+      if (reason != TP_CONNECTION_STATUS_REASON_REQUESTED)
+        /* An error occured */
+        return GTK_STOCK_DIALOG_ERROR;
+
+        presence = TP_CONNECTION_PRESENCE_TYPE_OFFLINE;
+    }
+  else if (status == TP_CONNECTION_STATUS_CONNECTING)
+    {
+      /* Account is connecting. Display a blinking account alternating between
+       * the offline icon and the requested presence. */
+      if (priv->connecting_show)
+        presence = tp_account_get_requested_presence (account, NULL, NULL);
+      else
+        presence = TP_CONNECTION_PRESENCE_TYPE_OFFLINE;
+    }
+  else
+    {
+      /* status == TP_CONNECTION_STATUS_CONNECTED */
+      presence = tp_account_get_current_presence (account, NULL, NULL);
+
+      /* If presence is Unset (CM doesn't implement SimplePresence),
+       * display the 'available' icon.
+       * We also check Offline because of this MC5 bug: fd.o #26060 */
+      if (presence == TP_CONNECTION_PRESENCE_TYPE_OFFLINE ||
+          presence == TP_CONNECTION_PRESENCE_TYPE_UNSET)
+        presence = TP_CONNECTION_PRESENCE_TYPE_AVAILABLE;
+    }
+
+  return empathy_icon_name_for_presence (presence);
+}
+
 static void
-accounts_dialog_model_pixbuf_data_func (GtkTreeViewColumn *tree_column,
+accounts_dialog_model_status_pixbuf_data_func (GtkTreeViewColumn *tree_column,
+    GtkCellRenderer *cell,
+    GtkTreeModel *model,
+    GtkTreeIter *iter,
+    EmpathyAccountsDialog *dialog)
+{
+  TpAccount *account;
+
+  gtk_tree_model_get (model, iter, COL_ACCOUNT_POINTER, &account, -1);
+
+  g_object_set (cell,
+      "icon-name", get_status_icon_for_account (dialog, account),
+      NULL);
+
+  if (account != NULL)
+    g_object_unref (account);
+}
+
+static void
+accounts_dialog_model_protocol_pixbuf_data_func (GtkTreeViewColumn *tree_column,
     GtkCellRenderer *cell,
     GtkTreeModel *model,
     GtkTreeIter *iter,
@@ -788,7 +857,6 @@ accounts_dialog_model_pixbuf_data_func (GtkTreeViewColumn *tree_column,
   gchar              *icon_name;
   GdkPixbuf          *pixbuf;
   TpConnectionStatus  status;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
   gtk_tree_model_get (model, iter,
       COL_STATUS, &status,
@@ -798,29 +866,6 @@ accounts_dialog_model_pixbuf_data_func (GtkTreeViewColumn *tree_column,
   icon_name = empathy_account_settings_get_icon_name (settings);
   pixbuf = empathy_pixbuf_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
 
-  if (pixbuf)
-    {
-      if (status == TP_CONNECTION_STATUS_DISCONNECTED ||
-          (status == TP_CONNECTION_STATUS_CONNECTING &&
-              !priv->connecting_show))
-        {
-          GdkPixbuf *modded_pixbuf;
-
-          modded_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
-              TRUE,
-              8,
-              gdk_pixbuf_get_width (pixbuf),
-              gdk_pixbuf_get_height (pixbuf));
-
-          gdk_pixbuf_saturate_and_pixelate (pixbuf,
-              modded_pixbuf,
-              1.0,
-              TRUE);
-          g_object_unref (pixbuf);
-          pixbuf = modded_pixbuf;
-        }
-    }
-
   g_object_set (cell,
       "visible", TRUE,
       "pixbuf", pixbuf,
@@ -995,12 +1040,21 @@ accounts_dialog_model_add_columns (EmpathyAccountsDialog *dialog)
   gtk_tree_view_column_set_expand (column, TRUE);
   gtk_tree_view_append_column (view, column);
 
-  /* Icon renderer */
+  /* Status icon renderer */
   cell = gtk_cell_renderer_pixbuf_new ();
   gtk_tree_view_column_pack_start (column, cell, FALSE);
   gtk_tree_view_column_set_cell_data_func (column, cell,
       (GtkTreeCellDataFunc)
-      accounts_dialog_model_pixbuf_data_func,
+      accounts_dialog_model_status_pixbuf_data_func,
+      dialog,
+      NULL);
+
+  /* Protocol icon renderer */
+  cell = gtk_cell_renderer_pixbuf_new ();
+  gtk_tree_view_column_pack_start (column, cell, FALSE);
+  gtk_tree_view_column_set_cell_data_func (column, cell,
+      (GtkTreeCellDataFunc)
+      accounts_dialog_model_protocol_pixbuf_data_func,
       dialog,
       NULL);
 
@@ -1351,6 +1405,25 @@ accounts_dialog_connection_changed_cb (TpAccount *account,
 }
 
 static void
+update_account_in_treeview (EmpathyAccountsDialog *self,
+    TpAccount *account)
+{
+  EmpathyAccountsDialogPriv *priv = GET_PRIV (self);
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
+  if (accounts_dialog_get_account_iter (self, account, &iter))
+    {
+      GtkTreePath *path;
+
+      path = gtk_tree_model_get_path (model, &iter);
+      gtk_tree_model_row_changed (model, path, &iter);
+      gtk_tree_path_free (path);
+    }
+}
+
+static void
 accounts_dialog_presence_changed_cb (TpAccount *account,
     guint presence,
     gchar *status,
@@ -1359,6 +1432,8 @@ accounts_dialog_presence_changed_cb (TpAccount *account,
 {
   /* Update the status-infobar in the details view */
   accounts_dialog_update_status_infobar (dialog, account);
+
+  update_account_in_treeview (dialog, account);
 }
 
 static void
@@ -1508,6 +1583,7 @@ accounts_dialog_account_disabled_cb (TpAccountManager *manager,
     EmpathyAccountsDialog *dialog)
 {
   enable_or_disable_account (dialog, account, FALSE);
+  update_account_in_treeview (dialog, account);
 }
 
 static void
