diff --git a/libempathy/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c
index c49033c..9374268 100644
--- a/libempathy/empathy-tp-contact-list.c
+++ b/libempathy/empathy-tp-contact-list.c
@@ -70,8 +70,6 @@ typedef struct {
 	GHashTable     *add_to_group;
 
 	EmpathyContactListFlags flags;
-
-	TpProxySignalConnection *new_channels_sig;
 } EmpathyTpContactListPriv;
 
 typedef enum {
@@ -279,23 +277,20 @@ tp_contact_list_group_ready_cb (TpChannel *channel,
 static void
 tp_contact_list_group_add_channel (EmpathyTpContactList *list,
 				   const gchar          *object_path,
-				   const gchar          *channel_type,
-				   TpHandleType          handle_type,
-				   guint                 handle)
+				   GHashTable           *properties)
 {
 	EmpathyTpContactListPriv *priv = GET_PRIV (list);
 	TpChannel                *channel;
+	GError *error = NULL;
 
-	/* Only accept server-side contact groups */
-	if (tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST) ||
-	    handle_type != TP_HANDLE_TYPE_GROUP) {
+	channel = tp_channel_new_from_properties (priv->connection,
+				  object_path, properties, &error);
+	if (channel == NULL) {
+		DEBUG ("Failed to create group channel: %s", error->message);
+		g_error_free (error);
 		return;
 	}
 
-	channel = tp_channel_new (priv->connection,
-				  object_path, channel_type,
-				  handle_type, handle, NULL);
-
 	/* Give the ref to the callback */
 	tp_channel_call_when_ready (channel,
 				    tp_contact_list_group_ready_cb,
@@ -702,54 +697,6 @@ tp_contact_list_store_group_members_changed_cb (TpChannel     *channel,
 }
 
 static void
-tp_contact_list_new_channel_cb (TpConnection *proxy,
-				const gchar  *object_path,
-				const gchar  *channel_type,
-				guint         handle_type,
-				guint         handle,
-				gboolean      suppress_handler,
-				gpointer      user_data,
-				GObject      *list)
-{
-	tp_contact_list_group_add_channel (EMPATHY_TP_CONTACT_LIST (list),
-					   object_path, channel_type,
-					   handle_type, handle);
-}
-
-static void
-tp_contact_list_list_channels_cb (TpConnection    *connection,
-				  const GPtrArray *channels,
-				  const GError    *error,
-				  gpointer         user_data,
-				  GObject         *list)
-{
-	guint i;
-
-	if (error) {
-		DEBUG ("Error: %s", error->message);
-		return;
-	}
-
-	for (i = 0; i < channels->len; i++) {
-		GValueArray  *chan_struct;
-		const gchar  *object_path;
-		const gchar  *channel_type;
-		TpHandleType  handle_type;
-		guint         handle;
-
-		chan_struct = g_ptr_array_index (channels, i);
-		object_path = g_value_get_boxed (g_value_array_get_nth (chan_struct, 0));
-		channel_type = g_value_get_string (g_value_array_get_nth (chan_struct, 1));
-		handle_type = g_value_get_uint (g_value_array_get_nth (chan_struct, 2));
-		handle = g_value_get_uint (g_value_array_get_nth (chan_struct, 3));
-
-		tp_contact_list_group_add_channel (EMPATHY_TP_CONTACT_LIST (list),
-						   object_path, channel_type,
-						   handle_type, handle);
-	}
-}
-
-static void
 tp_contact_list_finalize (GObject *object)
 {
 	EmpathyTpContactListPriv *priv;
@@ -794,15 +741,6 @@ tp_contact_list_finalize (GObject *object)
 	G_OBJECT_CLASS (empathy_tp_contact_list_parent_class)->finalize (object);
 }
 
-static gboolean
-received_all_list_channels (EmpathyTpContactList *self)
-{
-	EmpathyTpContactListPriv *priv = GET_PRIV (self);
-
-	return (priv->stored != NULL && priv->publish != NULL &&
-		priv->subscribe != NULL);
-}
-
 static void
 got_list_channel (EmpathyTpContactList *list,
 		  TpChannel *channel)
@@ -837,12 +775,6 @@ got_list_channel (EmpathyTpContactList *list,
 				  G_CALLBACK (tp_contact_list_subscribe_group_members_changed_cb),
 				  list);
 	}
-
-	if (received_all_list_channels (list) && priv->new_channels_sig != NULL) {
-		/* We don't need to watch NewChannels anymore */
-		tp_proxy_signal_connection_disconnect (priv->new_channels_sig);
-		priv->new_channels_sig = NULL;
-	}
 }
 
 static void
@@ -868,20 +800,16 @@ list_ensure_channel_cb (TpConnection *conn,
 }
 
 static void
-new_channels_cb (TpConnection *conn,
-		 const GPtrArray *channels,
-		 gpointer user_data,
-		 GObject *weak_object)
+iterate_on_channels (EmpathyTpContactList *list,
+		     const GPtrArray *channels)
 {
-	EmpathyTpContactList *list = EMPATHY_TP_CONTACT_LIST (weak_object);
 	guint i;
 
 	for (i = 0; i < channels->len ; i++) {
 		GValueArray *arr = g_ptr_array_index (channels, i);
 		const gchar *path;
 		GHashTable *properties;
-		const gchar *id;
-		TpChannel *channel;
+		TpHandleType handle_type;
 
 		path = g_value_get_boxed (g_value_array_get_nth (arr, 0));
 		properties = g_value_get_boxed (g_value_array_get_nth (arr, 1));
@@ -891,21 +819,47 @@ new_channels_cb (TpConnection *conn,
 		    TP_IFACE_CHANNEL_TYPE_CONTACT_LIST))
 			return;
 
-		if (tp_asv_get_uint32 (properties,
-				       TP_IFACE_CHANNEL ".TargetHandleType", NULL)
-		    != TP_HANDLE_TYPE_LIST)
+		if (tp_asv_get_string (properties, TP_IFACE_CHANNEL ".TargetID") == NULL)
 			return;
 
-		id = tp_asv_get_string (properties,
-					TP_IFACE_CHANNEL ".TargetID");
-		if (id == NULL)
+		handle_type = tp_asv_get_uint32 (properties,
+			TP_IFACE_CHANNEL ".TargetHandleType", NULL);
+
+		if (handle_type != TP_HANDLE_TYPE_GROUP)
 			return;
 
-		channel = tp_channel_new_from_properties (conn, path,
-							  properties, NULL);
-		got_list_channel (list, channel);
-		g_object_unref (channel);
+		tp_contact_list_group_add_channel (list, path, properties);
+	}
+}
+
+static void
+new_channels_cb (TpConnection *conn,
+		 const GPtrArray *channels,
+		 gpointer user_data,
+		 GObject *weak_object)
+{
+	EmpathyTpContactList *list = EMPATHY_TP_CONTACT_LIST (weak_object);
+
+	iterate_on_channels (list, channels);
+}
+
+static void
+got_channels_cb (TpProxy *conn,
+		 const GValue *out,
+		 const GError *error,
+		 gpointer user_data,
+		 GObject *weak_object)
+{
+	EmpathyTpContactList *list = EMPATHY_TP_CONTACT_LIST (weak_object);
+	const GPtrArray *channels;
+
+	if (error != NULL) {
+		DEBUG ("Get Channels property failed: %s", error->message);
+		return;
 	}
+
+	channels = g_value_get_boxed (out);
+	iterate_on_channels (list, channels);
 }
 
 static void
@@ -922,6 +876,11 @@ conn_ready_cb (TpConnection *connection,
 		goto out;
 	}
 
+	/* Look for existing group channels */
+	tp_cli_dbus_properties_call_get (connection, -1,
+		TP_IFACE_CONNECTION_INTERFACE_REQUESTS, "Channels", got_channels_cb,
+		NULL, NULL, G_OBJECT (list));
+
 	request = tp_asv_new (
 		TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST,
 		TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_UINT, TP_HANDLE_TYPE_LIST,
@@ -930,24 +889,23 @@ conn_ready_cb (TpConnection *connection,
 	/* Watch the NewChannels signal so if ensuring list channels fails (for
 	 * example because the server is slow and the D-Bus call timeouts before CM
 	 * fetches the roster), we have a chance to get them later. */
-	priv->new_channels_sig =
-	  tp_cli_connection_interface_requests_connect_to_new_channels (
+	tp_cli_connection_interface_requests_connect_to_new_channels (
 		priv->connection, new_channels_cb, NULL, NULL, G_OBJECT (list), NULL);
 
 	/* Request the 'stored' list. */
 	tp_asv_set_static_string (request, TP_IFACE_CHANNEL ".TargetID", "stored");
 	tp_cli_connection_interface_requests_call_ensure_channel (priv->connection,
-		-1, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
+		G_MAXINT, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
 
 	/* Request the 'publish' list. */
 	tp_asv_set_static_string (request, TP_IFACE_CHANNEL ".TargetID", "publish");
 	tp_cli_connection_interface_requests_call_ensure_channel (priv->connection,
-		-1, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
+		G_MAXINT, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
 
 	/* Request the 'subscribe' list. */
 	tp_asv_set_static_string (request, TP_IFACE_CHANNEL ".TargetID", "subscribe");
 	tp_cli_connection_interface_requests_call_ensure_channel (priv->connection,
-		-1, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
+		G_MAXINT, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
 
 	g_hash_table_unref (request);
 out:
@@ -989,16 +947,6 @@ tp_contact_list_constructed (GObject *list)
 
 	tp_connection_call_when_ready (priv->connection, conn_ready_cb,
 		g_object_ref (list));
-
-	tp_cli_connection_call_list_channels (priv->connection, -1,
-					      tp_contact_list_list_channels_cb,
-					      NULL, NULL,
-					      list);
-
-	tp_cli_connection_connect_to_new_channel (priv->connection,
-						  tp_contact_list_new_channel_cb,
-						  NULL, NULL,
-						  list, NULL);
 }
 
 static void
