diff --git a/configure.ac b/configure.ac
index 8b498d9..57e9d12 100644
--- a/configure.ac
+++ b/configure.ac
@@ -31,7 +31,7 @@ AC_COPYRIGHT([
 # Minimal version required
 
 # Hardp deps
-FOLKS_REQUIRED=0.3.0
+FOLKS_REQUIRED=0.3.0.1
 GCONF_REQUIRED=1.2.0
 GLIB_REQUIRED=2.25.9
 GNUTLS_REQUIRED=2.8.5
diff --git a/libempathy-gtk/empathy-individual-dialogs.c b/libempathy-gtk/empathy-individual-dialogs.c
index edfb3fd..85ed7d1 100644
--- a/libempathy-gtk/empathy-individual-dialogs.c
+++ b/libempathy-gtk/empathy-individual-dialogs.c
@@ -56,8 +56,7 @@ can_add_contact_to_account (TpAccount *account,
     return FALSE;
 
   individual_manager = empathy_individual_manager_dup_singleton ();
-  result = empathy_individual_manager_get_flags_for_connection (
-    individual_manager, connection) & EMPATHY_INDIVIDUAL_MANAGER_CAN_ADD;
+  result = empathy_connection_can_add_personas (connection);
   g_object_unref (individual_manager);
 
   return result;
diff --git a/libempathy-gtk/empathy-individual-menu.c b/libempathy-gtk/empathy-individual-menu.c
index b1237cf..e3159b4 100644
--- a/libempathy-gtk/empathy-individual-menu.c
+++ b/libempathy-gtk/empathy-individual-menu.c
@@ -822,15 +822,12 @@ empathy_individual_edit_menu_item_new (FolksIndividual *individual)
   if (empathy_individual_manager_initialized ())
     {
       TpConnection *connection;
-      EmpathyIndividualManagerFlags flags;
 
       manager = empathy_individual_manager_dup_singleton ();
       connection = empathy_contact_get_connection (contact);
-      flags = empathy_individual_manager_get_flags_for_connection (
-          manager, connection);
 
-      enable = (flags & EMPATHY_INDIVIDUAL_MANAGER_CAN_ALIAS ||
-                flags & EMPATHY_INDIVIDUAL_MANAGER_CAN_GROUP);
+      enable = (empathy_connection_can_alias_personas (connection) &&
+                empathy_connection_can_group_personas (connection));
 
       g_object_unref (manager);
     }
diff --git a/libempathy-gtk/empathy-individual-store.c b/libempathy-gtk/empathy-individual-store.c
index 77f3016..c915946 100644
--- a/libempathy-gtk/empathy-individual-store.c
+++ b/libempathy-gtk/empathy-individual-store.c
@@ -158,8 +158,7 @@ static void
 add_individual_to_store (GtkTreeStore *self,
     GtkTreeIter *iter,
     GtkTreeIter *parent,
-    FolksIndividual *individual,
-    EmpathyIndividualManagerFlags flags)
+    FolksIndividual *individual)
 {
   gboolean can_audio_call, can_video_call;
 
@@ -172,7 +171,6 @@ add_individual_to_store (GtkTreeStore *self,
       EMPATHY_INDIVIDUAL_STORE_COL_INDIVIDUAL, individual,
       EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, FALSE,
       EMPATHY_INDIVIDUAL_STORE_COL_IS_SEPARATOR, FALSE,
-      EMPATHY_INDIVIDUAL_STORE_COL_FLAGS, flags,
       EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL, can_audio_call,
       EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL, can_video_call,
       -1);
@@ -376,7 +374,6 @@ individual_store_add_individual (EmpathyIndividualStore *self,
   GList *groups = NULL, *l;
   EmpathyContact *contact;
   TpConnection *connection;
-  EmpathyIndividualManagerFlags flags = 0;
   gchar *protocol_name;
 
   priv = GET_PRIV (self);
@@ -392,8 +389,6 @@ individual_store_add_individual (EmpathyIndividualStore *self,
 
   contact = empathy_contact_dup_from_folks_individual (individual);
   connection = empathy_contact_get_connection (contact);
-  flags = empathy_individual_manager_get_flags_for_connection (priv->manager,
-      connection);
 
   tp_connection_parse_object_path (connection, &protocol_name, NULL);
 
@@ -420,7 +415,7 @@ individual_store_add_individual (EmpathyIndividualStore *self,
         }
 
       add_individual_to_store (GTK_TREE_STORE (self), &iter, parent,
-          individual, flags);
+          individual);
     }
 
   g_free (protocol_name);
@@ -434,7 +429,7 @@ individual_store_add_individual (EmpathyIndividualStore *self,
           FALSE);
 
       add_individual_to_store (GTK_TREE_STORE (self), &iter, &iter_group,
-          individual, flags);
+          individual);
     }
   g_list_free (groups);
   if (group_set != NULL)
@@ -450,7 +445,7 @@ individual_store_add_individual (EmpathyIndividualStore *self,
           &iter_group, NULL, NULL, TRUE);
 
       add_individual_to_store (GTK_TREE_STORE (self), &iter, &iter_group,
-          individual, flags);
+          individual);
     }
 
   individual_store_contact_update (self, individual);
@@ -1493,7 +1488,6 @@ individual_store_setup (EmpathyIndividualStore *self)
     G_TYPE_BOOLEAN,             /* Is separator */
     G_TYPE_BOOLEAN,             /* Can make audio calls */
     G_TYPE_BOOLEAN,             /* Can make video calls */
-    EMPATHY_TYPE_INDIVIDUAL_MANAGER_FLAGS,      /* Flags */
     G_TYPE_BOOLEAN,             /* Is a fake group */
   };
 
diff --git a/libempathy-gtk/empathy-individual-store.h b/libempathy-gtk/empathy-individual-store.h
index 4c99610..debb218 100644
--- a/libempathy-gtk/empathy-individual-store.h
+++ b/libempathy-gtk/empathy-individual-store.h
@@ -63,7 +63,6 @@ typedef enum
   EMPATHY_INDIVIDUAL_STORE_COL_IS_SEPARATOR,
   EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL,
   EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL,
-  EMPATHY_INDIVIDUAL_STORE_COL_FLAGS,
   EMPATHY_INDIVIDUAL_STORE_COL_IS_FAKE_GROUP,
   EMPATHY_INDIVIDUAL_STORE_COL_COUNT,
 } EmpathyIndividualStoreCol;
diff --git a/libempathy-gtk/empathy-individual-view.c b/libempathy-gtk/empathy-individual-view.c
index ebc71a1..2f2aae9 100644
--- a/libempathy-gtk/empathy-individual-view.c
+++ b/libempathy-gtk/empathy-individual-view.c
@@ -2132,29 +2132,6 @@ empathy_individual_view_dup_selected (EmpathyIndividualView *view)
   return individual;
 }
 
-EmpathyIndividualManagerFlags
-empathy_individual_view_get_flags (EmpathyIndividualView *view)
-{
-  EmpathyIndividualViewPriv *priv;
-  GtkTreeSelection *selection;
-  GtkTreeIter iter;
-  GtkTreeModel *model;
-  EmpathyIndividualFeatureFlags flags;
-
-  g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_VIEW (view), 0);
-
-  priv = GET_PRIV (view);
-
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
-  if (!gtk_tree_selection_get_selected (selection, &model, &iter))
-    return 0;
-
-  gtk_tree_model_get (model, &iter,
-      EMPATHY_INDIVIDUAL_STORE_COL_FLAGS, &flags, -1);
-
-  return flags;
-}
-
 gchar *
 empathy_individual_view_get_selected_group (EmpathyIndividualView *view,
     gboolean *is_fake_group)
@@ -2355,7 +2332,8 @@ empathy_individual_view_get_individual_menu (EmpathyIndividualView *view)
   GtkWidget *menu = NULL;
   GtkWidget *item;
   GtkWidget *image;
-  EmpathyIndividualManagerFlags flags;
+  gboolean can_remove = FALSE;
+  GList *l;
 
   g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_VIEW (view), NULL);
 
@@ -2363,16 +2341,31 @@ empathy_individual_view_get_individual_menu (EmpathyIndividualView *view)
   if (individual == NULL)
     return NULL;
 
-  flags = empathy_individual_view_get_flags (view);
+  /* If any of the Individual's personas can be removed, add an option to
+   * remove. This will act as a best-effort option. If any Personas cannot be
+   * removed from the server, then this option will just be inactive upon
+   * subsequent menu openings */
+  for (l = folks_individual_get_personas (individual); l != NULL; l = l->next)
+    {
+      FolksPersona *persona = FOLKS_PERSONA (l->data);
+      FolksPersonaStore *store = folks_persona_get_store (persona);
+      FolksMaybeBool maybe_can_remove =
+          folks_persona_store_get_can_remove_personas (store);
+
+      if (maybe_can_remove == FOLKS_MAYBE_BOOL_TRUE)
+        {
+          can_remove = TRUE;
+          break;
+        }
+    }
 
   menu = empathy_individual_menu_new (individual, priv->individual_features);
 
   /* Remove contact */
-  if (priv->view_features &
-      EMPATHY_INDIVIDUAL_VIEW_FEATURE_INDIVIDUAL_REMOVE &&
-      flags & EMPATHY_INDIVIDUAL_MANAGER_CAN_REMOVE)
+  if ((priv->view_features &
+      EMPATHY_INDIVIDUAL_VIEW_FEATURE_INDIVIDUAL_REMOVE) &&
+      can_remove)
     {
-
       /* create the menu if required, or just add a separator */
       if (menu == NULL)
         menu = gtk_menu_new ();
diff --git a/libempathy-gtk/empathy-individual-view.h b/libempathy-gtk/empathy-individual-view.h
index 51a487d..94ec8cc 100644
--- a/libempathy-gtk/empathy-individual-view.h
+++ b/libempathy-gtk/empathy-individual-view.h
@@ -98,9 +98,6 @@ EmpathyIndividualView *empathy_individual_view_new (
 FolksIndividual *empathy_individual_view_dup_selected (
     EmpathyIndividualView *view);
 
-EmpathyIndividualManagerFlags empathy_individual_view_get_flags (
-    EmpathyIndividualView *view);
-
 gchar *empathy_individual_view_get_selected_group (EmpathyIndividualView *view,
     gboolean * is_fake_group);
 
diff --git a/libempathy/empathy-contact.c b/libempathy/empathy-contact.c
index a7aa0e7..4db37f6 100644
--- a/libempathy/empathy-contact.c
+++ b/libempathy/empathy-contact.c
@@ -39,6 +39,7 @@
 #endif
 
 #include "empathy-contact.h"
+#include "empathy-individual-manager.h"
 #include "empathy-utils.h"
 #include "empathy-enum-types.h"
 #include "empathy-marshal.h"
diff --git a/libempathy/empathy-individual-manager.c b/libempathy/empathy-individual-manager.c
index d707e17..07295c8 100644
--- a/libempathy/empathy-individual-manager.c
+++ b/libempathy/empathy-individual-manager.c
@@ -34,8 +34,6 @@
 #include <extensions/extensions.h>
 
 #include "empathy-individual-manager.h"
-#include "empathy-contact-manager.h"
-#include "empathy-contact-list.h"
 #include "empathy-marshal.h"
 #include "empathy-utils.h"
 
@@ -51,7 +49,6 @@
 typedef struct
 {
   FolksIndividualAggregator *aggregator;
-  EmpathyContactManager *contact_manager;
   GHashTable *individuals; /* Individual.id -> Individual */
 } EmpathyIndividualManagerPriv;
 
@@ -222,7 +219,6 @@ individual_manager_dispose (GObject *object)
   EmpathyIndividualManagerPriv *priv = GET_PRIV (object);
 
   g_hash_table_destroy (priv->individuals);
-  tp_clear_object (&priv->contact_manager);
   tp_clear_object (&priv->aggregator);
 
   G_OBJECT_CLASS (empathy_individual_manager_parent_class)->dispose (object);
@@ -316,7 +312,6 @@ empathy_individual_manager_init (EmpathyIndividualManager *self)
       EMPATHY_TYPE_INDIVIDUAL_MANAGER, EmpathyIndividualManagerPriv);
 
   self->priv = priv;
-  priv->contact_manager = empathy_contact_manager_dup_singleton ();
   priv->individuals = g_hash_table_new_full (g_str_hash, g_str_equal,
       NULL, g_object_unref);
 
@@ -502,36 +497,6 @@ empathy_individual_manager_remove_group (EmpathyIndividualManager *manager,
       (gpointer) group);
 }
 
-EmpathyIndividualManagerFlags
-empathy_individual_manager_get_flags_for_connection (
-    EmpathyIndividualManager *self,
-    TpConnection *connection)
-{
-  EmpathyIndividualManagerPriv *priv;
-  EmpathyContactListFlags list_flags;
-  EmpathyIndividualManagerFlags flags;
-
-  g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_MANAGER (self),
-      EMPATHY_INDIVIDUAL_MANAGER_NO_FLAGS);
-
-  priv = GET_PRIV (self);
-
-  list_flags = empathy_contact_manager_get_flags_for_connection (
-    priv->contact_manager, connection);
-
-  flags = EMPATHY_INDIVIDUAL_MANAGER_NO_FLAGS;
-  if (list_flags & EMPATHY_CONTACT_LIST_CAN_ADD)
-    flags |= EMPATHY_INDIVIDUAL_MANAGER_CAN_ADD;
-  if (list_flags & EMPATHY_CONTACT_LIST_CAN_REMOVE)
-    flags |= EMPATHY_INDIVIDUAL_MANAGER_CAN_REMOVE;
-  if (list_flags & EMPATHY_CONTACT_LIST_CAN_ALIAS)
-    flags |= EMPATHY_INDIVIDUAL_MANAGER_CAN_ALIAS;
-  if (list_flags & EMPATHY_CONTACT_LIST_CAN_GROUP)
-    flags |= EMPATHY_INDIVIDUAL_MANAGER_CAN_GROUP;
-
-  return flags;
-}
-
 static void
 link_personas_cb (FolksIndividualAggregator *aggregator,
     GAsyncResult *async_result,
diff --git a/libempathy/empathy-individual-manager.h b/libempathy/empathy-individual-manager.h
index 72104fc..f2f5f5b 100644
--- a/libempathy/empathy-individual-manager.h
+++ b/libempathy/empathy-individual-manager.h
@@ -35,14 +35,6 @@ G_BEGIN_DECLS
 #define EMPATHY_IS_INDIVIDUAL_MANAGER(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_INDIVIDUAL_MANAGER))
 #define EMPATHY_IS_INDIVIDUAL_MANAGER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_INDIVIDUAL_MANAGER))
 #define EMPATHY_INDIVIDUAL_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_INDIVIDUAL_MANAGER, EmpathyIndividualManagerClass))
-    typedef enum
-{
-  EMPATHY_INDIVIDUAL_MANAGER_NO_FLAGS = 0,
-  EMPATHY_INDIVIDUAL_MANAGER_CAN_ADD = 1 << 0,
-  EMPATHY_INDIVIDUAL_MANAGER_CAN_REMOVE = 1 << 1,
-  EMPATHY_INDIVIDUAL_MANAGER_CAN_ALIAS = 1 << 2,
-  EMPATHY_INDIVIDUAL_MANAGER_CAN_GROUP = 1 << 3,
-} EmpathyIndividualManagerFlags;
 
 typedef struct _EmpathyIndividualManager EmpathyIndividualManager;
 typedef struct _EmpathyIndividualManagerClass EmpathyIndividualManagerClass;
@@ -82,11 +74,6 @@ void empathy_individual_manager_remove (EmpathyIndividualManager *manager,
 void empathy_individual_manager_remove_group (EmpathyIndividualManager *manager,
     const gchar *group);
 
-EmpathyIndividualManagerFlags
-empathy_individual_manager_get_flags_for_connection (
-    EmpathyIndividualManager *manager,
-    TpConnection *connection);
-
 void empathy_individual_manager_link_personas (EmpathyIndividualManager *self,
     GList *personas);
 
diff --git a/libempathy/empathy-utils.c b/libempathy/empathy-utils.c
index c479f99..6bbd53f 100644
--- a/libempathy/empathy-utils.c
+++ b/libempathy/empathy-utils.c
@@ -770,6 +770,86 @@ tp_channel_group_change_reason_from_folks_groups_change_reason (
   return (TpChannelGroupChangeReason) reason;
 }
 
+TpfPersonaStore *
+empathy_get_persona_store_for_connection (TpConnection *connection)
+{
+  FolksBackendStore *backend_store;
+  FolksBackend *backend;
+  TpfPersonaStore *result = NULL;
+
+  backend_store = folks_backend_store_dup ();
+  backend = folks_backend_store_get_backend_by_name (backend_store,
+      "telepathy");
+  if (backend != NULL)
+    {
+      GHashTable *stores_hash;
+      GList *stores, *l;
+
+      stores_hash = folks_backend_get_persona_stores (backend);
+      stores = g_hash_table_get_values (stores_hash);
+      for (l = stores; l != NULL && result == NULL; l = l->next)
+        {
+          TpfPersonaStore *persona_store = TPF_PERSONA_STORE (l->data);
+          TpAccount *account;
+          TpConnection *conn_cur;
+
+          account = tpf_persona_store_get_account (persona_store);
+          conn_cur = tp_account_get_connection (account);
+          if (conn_cur == connection)
+            result = persona_store;
+        }
+
+      g_list_free (stores);
+    }
+
+  g_object_unref (backend);
+  g_object_unref (backend_store);
+
+  return result;
+}
+
+gboolean
+empathy_connection_can_add_personas (TpConnection *connection)
+{
+  FolksPersonaStore *persona_store;
+
+  g_return_val_if_fail (TP_IS_CONNECTION (connection), FALSE);
+
+  persona_store = FOLKS_PERSONA_STORE (
+      empathy_get_persona_store_for_connection (connection));
+
+  return (folks_persona_store_get_can_add_personas (persona_store) ==
+      FOLKS_MAYBE_BOOL_TRUE);
+}
+
+gboolean
+empathy_connection_can_alias_personas (TpConnection *connection)
+{
+  FolksPersonaStore *persona_store;
+
+  g_return_val_if_fail (TP_IS_CONNECTION (connection), FALSE);
+
+  persona_store = FOLKS_PERSONA_STORE (
+      empathy_get_persona_store_for_connection (connection));
+
+  return (folks_persona_store_get_can_alias_personas (persona_store) ==
+      FOLKS_MAYBE_BOOL_TRUE);
+}
+
+gboolean
+empathy_connection_can_group_personas (TpConnection *connection)
+{
+  FolksPersonaStore *persona_store;
+
+  g_return_val_if_fail (TP_IS_CONNECTION (connection), FALSE);
+
+  persona_store = FOLKS_PERSONA_STORE (
+      empathy_get_persona_store_for_connection (connection));
+
+  return (folks_persona_store_get_can_group_personas (persona_store) ==
+      FOLKS_MAYBE_BOOL_TRUE);
+}
+
 gchar *
 empathy_get_x509_certificate_hostname (gnutls_x509_crt_t cert)
 {
diff --git a/libempathy/empathy-utils.h b/libempathy/empathy-utils.h
index ca184f5..3c89962 100644
--- a/libempathy/empathy-utils.h
+++ b/libempathy/empathy-utils.h
@@ -34,6 +34,7 @@
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 #include <folks/folks.h>
+#include <folks/folks-telepathy.h>
 #include <telepathy-glib/account-manager.h>
 
 #include "empathy-contact.h"
@@ -99,6 +100,10 @@ TpConnectionPresenceType empathy_folks_presence_type_to_tp (FolksPresenceType ty
 gboolean empathy_folks_individual_contains_contact (FolksIndividual *individual);
 EmpathyContact * empathy_contact_dup_from_folks_individual (FolksIndividual *individual);
 TpChannelGroupChangeReason tp_channel_group_change_reason_from_folks_groups_change_reason (FolksGroupableChangeReason reason);
+TpfPersonaStore * empathy_get_persona_store_for_connection (TpConnection *connection);
+gboolean empathy_connection_can_add_personas (TpConnection *connection);
+gboolean empathy_connection_can_alias_personas (TpConnection *connection);
+gboolean empathy_connection_can_group_personas (TpConnection *connection);
 
 gchar * empathy_get_x509_certificate_hostname (gnutls_x509_crt_t cert);
 
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index 85a64a3..a89ba1c 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -101,6 +101,7 @@ G_DEFINE_TYPE (EmpathyMainWindow, empathy_main_window, GTK_TYPE_WINDOW);
 #define GET_PRIV(self) ((EmpathyMainWindowPriv *)((EmpathyMainWindow *) self)->priv)
 
 struct _EmpathyMainWindowPriv {
+	EmpathyContactList      *contact_manager;
 	EmpathyIndividualStore  *individual_store;
 	EmpathyIndividualView   *individual_view;
 	TpAccountManager        *account_manager;
@@ -695,6 +696,7 @@ empathy_main_window_finalize (GObject *window)
 
 	g_object_unref (priv->account_manager);
 	g_object_unref (priv->individual_store);
+	g_object_unref (priv->contact_manager);
 	g_hash_table_destroy (priv->errors);
 
 	/* disconnect all handlers of status-changed signal */
@@ -1536,7 +1538,6 @@ static void
 empathy_main_window_init (EmpathyMainWindow *window)
 {
 	EmpathyMainWindowPriv    *priv;
-	EmpathyContactList       *list_iface;
 	EmpathyIndividualManager *individual_manager;
 	GtkBuilder               *gui;
 	GtkWidget                *sw;
@@ -1676,7 +1677,12 @@ empathy_main_window_init (EmpathyMainWindow *window)
 	gtk_container_add (GTK_CONTAINER (item), priv->throbber);
 	priv->throbber_tool_item = GTK_WIDGET (item);
 
-	list_iface = EMPATHY_CONTACT_LIST (empathy_contact_manager_dup_singleton ());
+	/* XXX: this class is designed to live for the duration of the program,
+	 * so it's got a race condition between its signal handlers and its
+	 * finalization. The class is planned to be removed, so we won't fix
+	 * this before then. */
+	priv->contact_manager = EMPATHY_CONTACT_LIST (
+			empathy_contact_manager_dup_singleton ());
 	individual_manager = empathy_individual_manager_dup_singleton ();
 	priv->individual_store = empathy_individual_store_new (
 			individual_manager);
@@ -1691,11 +1697,9 @@ empathy_main_window_init (EmpathyMainWindow *window)
 			EMPATHY_INDIVIDUAL_FEATURE_ALL);
 
 	priv->butterfly_log_migration_members_changed_id = g_signal_connect (
-			list_iface, "members-changed",
+			priv->contact_manager, "members-changed",
 			G_CALLBACK (main_window_members_changed_cb), window);
 
-	g_object_unref (list_iface);
-
 	gtk_widget_show (GTK_WIDGET (priv->individual_view));
 	gtk_container_add (GTK_CONTAINER (sw),
 			   GTK_WIDGET (priv->individual_view));
