diff --git a/COPYRIGHT b/COPYRIGHT
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -98,6 +98,7 @@
 Michael Carlson
 Rodrigo Tobar Carrizo
 Keegan Carruthers-Smith
+Ed Catmur
 Ludovico Cavedon
 Steve Cavilia
 Julien Cegarra
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -355,7 +355,7 @@
 AC_ARG_ENABLE(gevolution,
 	[AC_HELP_STRING([--enable-gevolution],
 		[compile with the Evolution plugin])],
-	enable_gevolution="$enableval", enable_gevolution="no")
+	enable_gevolution="$enableval", enable_gevolution="yes")
 AC_ARG_ENABLE(cap,
 	[AC_HELP_STRING([--enable-cap],
 		[compile with Contact Availability Prediction plugin])],
@@ -529,18 +529,10 @@
 	dnl # Check for stuff needed by the Evolution integration plugin.
 	dnl #######################################################################
 	if test "x$enable_gevolution" = "xyes"; then
-		evo_deps="libebook-1.2 libedata-book-1.2 evolution-data-server-1.2 < 3.6"
+		evo_deps="libebook-1.2 libedata-book-1.2 evolution-data-server-1.2 >= 3.6"
 		PKG_CHECK_MODULES(EVOLUTION_ADDRESSBOOK, $evo_deps, , [
 			enable_gevolution="no"
 		])
-		if test "x$enable_gevolution" = "xno"; then
-			evo_deps="libebook-1.0 libedata-book-1.0"
-			PKG_CHECK_MODULES(EVOLUTION_ADDRESSBOOK, $evo_deps, [
-				enable_gevolution="yes"
-			], [
-				enable_gevolution="no"
-			])
-		fi
 		if test "x$enable_gevolution" = "xyes"; then
 			AC_DEFINE(HAVE_EVOLUTION_ADDRESSBOOK, 1, [Define if we're using evolution addressbook.])
 			AC_SUBST(EVOLUTION_ADDRESSBOOK_CFLAGS)
@@ -548,7 +540,7 @@
 		else
 			if test "x$force_deps" = "xyes" ; then
 				AC_MSG_ERROR([
-Evolution development headers not found (libebook, libedata-book, evolution-data-server < 3.6).
+Evolution development headers not found (libebook, libedata-book, evolution-data-server >= 3.6).
 Use --disable-gevolution if you do not need it.
 ])
 			fi
diff --git a/pidgin/plugins/gevolution/add_buddy_dialog.c b/pidgin/plugins/gevolution/add_buddy_dialog.c
--- a/pidgin/plugins/gevolution/add_buddy_dialog.c
+++ b/pidgin/plugins/gevolution/add_buddy_dialog.c
@@ -227,8 +227,7 @@
 }
 
 static void
-populate_treeview(GevoAddBuddyDialog *dialog, const gchar *uri)
-{
+populate_treeview(GevoAddBuddyDialog *dialog, const gchar *uid) {
 	EBookQuery *query;
 	EBook *book;
 	gboolean status;
@@ -250,8 +249,7 @@
 
 	gtk_list_store_clear(dialog->model);
 
-	if (!gevo_load_addressbook(uri, &book, &err))
-	{
+	if(!gevo_load_addressbook(uid, &book, &err)) {
 		purple_debug_error("evolution",
 						 "Error retrieving default addressbook: %s\n", err->message);
 		g_error_free(err);
@@ -328,16 +326,17 @@
 addrbook_change_cb(GtkComboBox *combo, GevoAddBuddyDialog *dialog)
 {
 	GtkTreeIter iter;
-	const char *esource_uri;
+	const char *esource_uid;
 
-	if (!gtk_combo_box_get_active_iter(combo, &iter))
+	if(!gtk_combo_box_get_active_iter(combo, &iter)) {
 		return;
+	}
 
 	gtk_tree_model_get(GTK_TREE_MODEL(dialog->addrbooks), &iter,
-					   ADDRBOOK_COLUMN_URI, &esource_uri,
-					   -1);
+	                   ADDRBOOK_COLUMN_UID, &esource_uid,
+	                   -1);
 
-	populate_treeview(dialog, esource_uri);
+	populate_treeview(dialog, esource_uid);
 }
 
 static void
diff --git a/pidgin/plugins/gevolution/assoc-buddy.c b/pidgin/plugins/gevolution/assoc-buddy.c
--- a/pidgin/plugins/gevolution/assoc-buddy.c
+++ b/pidgin/plugins/gevolution/assoc-buddy.c
@@ -130,8 +130,7 @@
 }
 
 static void
-populate_treeview(GevoAssociateBuddyDialog *dialog, const gchar *uri)
-{
+populate_treeview(GevoAssociateBuddyDialog *dialog, const gchar *uid) {
 	EBook *book;
 	EBookQuery *query;
 	const char *prpl_id;
@@ -154,8 +153,7 @@
 
 	gtk_list_store_clear(dialog->model);
 
-	if (!gevo_load_addressbook(uri, &book, &err))
-	{
+	if(!gevo_load_addressbook(uid, &book, &err)) {
 		purple_debug_error("evolution",
 						 "Error retrieving addressbook: %s\n", err->message);
 		g_error_free(err);
@@ -241,16 +239,17 @@
 addrbook_change_cb(GtkComboBox *combo, GevoAssociateBuddyDialog *dialog)
 {
 	GtkTreeIter iter;
-	const char *esource_uri;
+	const char *esource_uid;
 
-	if (!gtk_combo_box_get_active_iter(combo, &iter))
+	if(!gtk_combo_box_get_active_iter(combo, &iter)) {
 		return;
+	}
 
 	gtk_tree_model_get(GTK_TREE_MODEL(dialog->addrbooks), &iter,
-					   ADDRBOOK_COLUMN_URI, &esource_uri,
-					   -1);
+	                   ADDRBOOK_COLUMN_UID, &esource_uid,
+	                   -1);
 
-	populate_treeview(dialog, esource_uri);
+	populate_treeview(dialog, esource_uid);
 }
 
 static void
diff --git a/pidgin/plugins/gevolution/eds-utils.c b/pidgin/plugins/gevolution/eds-utils.c
--- a/pidgin/plugins/gevolution/eds-utils.c
+++ b/pidgin/plugins/gevolution/eds-utils.c
@@ -52,9 +52,9 @@
 void
 gevo_addrbooks_model_populate(GtkTreeModel *model)
 {
-	ESourceList *addressbooks;
+	ESourceRegistry *registry;
 	GError *err = NULL;
-	GSList *groups, *g;
+	GList *sources, *s;
 	GtkTreeIter iter;
 	GtkListStore *list;
 
@@ -63,89 +63,81 @@
 
 	list = GTK_LIST_STORE(model);
 
-	if (!e_book_get_addressbooks(&addressbooks, &err))
-	{
+	registry = e_source_registry_new_sync(NULL, &err);
+
+	if(!registry) {
 		purple_debug_error("evolution",
-						 "Unable to fetch list of address books.\n");
+		                   "Unable to fetch list of address books.\n");
 
 		gtk_list_store_append(list, &iter);
 		gtk_list_store_set(list, &iter,
-						   ADDRBOOK_COLUMN_NAME, _("None"),
-						   ADDRBOOK_COLUMN_URI,  NULL,
-						   -1);
-
-		return;
-	}
+		                   ADDRBOOK_COLUMN_NAME, _("None"),
+		                   ADDRBOOK_COLUMN_UID,  NULL,
+		                   -1);
 
-	groups = e_source_list_peek_groups(addressbooks);
-
-	if (groups == NULL)
-	{
-		gtk_list_store_append(list, &iter);
-		gtk_list_store_set(list, &iter,
-						   ADDRBOOK_COLUMN_NAME, _("None"),
-						   ADDRBOOK_COLUMN_URI,  NULL,
-						   -1);
+		g_clear_error(&err);
 
 		return;
 	}
 
-	for (g = groups; g != NULL; g = g->next)
-	{
-		GSList *sources, *s;
-
-		sources = e_source_group_peek_sources(g->data);
+	sources = e_source_registry_list_sources(registry,
+	                                         E_SOURCE_EXTENSION_ADDRESS_BOOK);
 
-		for (s = sources; s != NULL; s = s->next)
-		{
-			ESource *source = E_SOURCE(s->data);
-
-			g_object_ref(source);
+	if(sources == NULL) {
+		g_object_unref(registry);
+		gtk_list_store_append(list, &iter);
+		gtk_list_store_set(list, &iter,
+		                   ADDRBOOK_COLUMN_NAME, _("None"),
+		                   ADDRBOOK_COLUMN_UID,  NULL,
+		                   -1);
 
-			gtk_list_store_append(list, &iter);
-			gtk_list_store_set(list, &iter,
-							   ADDRBOOK_COLUMN_NAME, e_source_peek_name(source),
-							   ADDRBOOK_COLUMN_URI,  e_source_get_uri(source),
-							   -1);
-		}
+		return;
 	}
 
-	g_object_unref(addressbooks);
+	for(s = sources; s != NULL; s = s->next) {
+		ESource *source = E_SOURCE(s->data);
+
+		g_object_ref(source);
+
+		gtk_list_store_append(list, &iter);
+		gtk_list_store_set(list, &iter,
+		                   ADDRBOOK_COLUMN_NAME, e_source_get_display_name(source),
+		                   ADDRBOOK_COLUMN_UID,  e_source_get_uid(source),
+		                   -1);
+	}
+
+	g_object_unref(registry);
+	g_list_free_full(sources, g_object_unref);
 }
 
 static EContact *
-gevo_run_query_in_uri(const gchar *uri, EBookQuery *query)
-{
+gevo_run_query_in_source(ESource *source, EBookQuery *query) {
 	EBook *book;
 	gboolean status;
 	GList *cards;
 	GError *err = NULL;
 
-	if (!gevo_load_addressbook(uri, &book, &err))
-	{
+	if(!gevo_load_addressbook_from_source(source, &book, &err)) {
 		purple_debug_error("evolution",
-						 "Error retrieving addressbook: %s\n", err->message);
+		                   "Error retrieving addressbook: %s\n", err->message);
 		g_error_free(err);
 		return NULL;
 	}
 
 	status = e_book_get_contacts(book, query, &cards, NULL);
-	if (!status)
-	{
+	if(!status) {
 		purple_debug_error("evolution", "Error %d in getting card list\n",
-						 status);
+		                   status);
 		g_object_unref(book);
 		return NULL;
 	}
 	g_object_unref(book);
 
-	if (cards != NULL)
-	{
+	if(cards != NULL) {
 		EContact *contact = E_CONTACT(cards->data);
 		GList *cards2 = cards->next;
 
-		if (cards2 != NULL)
-		{
+		if(cards2 != NULL) {
 			/* Break off the first contact and free the rest. */
 			cards->next = NULL;
 			cards2->prev = NULL;
@@ -172,75 +164,63 @@
 EContact *
 gevo_search_buddy_in_contacts(PurpleBuddy *buddy, EBookQuery *query)
 {
-	ESourceList *addressbooks;
+	ESourceRegistry *registry;
 	GError *err = NULL;
 	EBookQuery *full_query;
-	GSList *groups, *g;
+	GList *sources, *s;
 	EContact *result;
 	EContactField protocol_field = gevo_prpl_get_field(buddy->account, buddy);
 
-	if (protocol_field == 0)
+	if(protocol_field == 0) {
 		return NULL;
+	}
 
-	if (query != NULL)
-	{
+	if(query != NULL) {
 		EBookQuery *queries[2];
 
 		queries[0] = query;
 		queries[1] = e_book_query_field_test(protocol_field, E_BOOK_QUERY_IS, buddy->name);
-		if (queries[1] == NULL)
-		{
+		if(queries[1] == NULL) {
 			purple_debug_error("evolution", "Error in creating protocol query\n");
 			e_book_query_unref(query);
 			return NULL;
 		}
 
 		full_query = e_book_query_and(2, queries, TRUE);
-	}
-	else
-	{
+	} else {
 		full_query = e_book_query_field_test(protocol_field, E_BOOK_QUERY_IS, buddy->name);
-		if (full_query == NULL)
-		{
+		if(full_query == NULL) {
 			purple_debug_error("evolution", "Error in creating protocol query\n");
 			return NULL;
 		}
 	}
 
-	if (!e_book_get_addressbooks(&addressbooks, &err))
-	{
+	registry = e_source_registry_new_sync(NULL, &err);
+
+	if(!registry) {
 		purple_debug_error("evolution",
-						 "Unable to fetch list of address books.\n");
+		                   "Unable to fetch list of address books.\n");
 		e_book_query_unref(full_query);
-		if (err != NULL)
+		if(err != NULL) {
 			g_error_free(err);
-		return NULL;
-	}
-
-	groups = e_source_list_peek_groups(addressbooks);
-	if (groups == NULL)
-	{
-		g_object_unref(addressbooks);
-		e_book_query_unref(full_query);
+		}
 		return NULL;
 	}
 
-	for (g = groups; g != NULL; g = g->next)
-	{
-		GSList *sources, *s;
-		sources = e_source_group_peek_sources(g->data);
-		for (s = sources; s != NULL; s = s->next)
-		{
-			result = gevo_run_query_in_uri(e_source_get_uri(E_SOURCE(s->data)), full_query);
-			if (result != NULL) {
-			    g_object_unref(addressbooks);
-				e_book_query_unref(full_query);
-			    return result;
-			}
+	sources = e_source_registry_list_sources(registry, E_SOURCE_EXTENSION_ADDRESS_BOOK);
+
+	for(s = sources; s != NULL; s = s->next) {
+		result = gevo_run_query_in_source(E_SOURCE(s->data), full_query);
+		if(result != NULL) {
+		    g_object_unref(registry);
+		    g_list_free_full(sources, g_object_unref);
+			e_book_query_unref(full_query);
+		    return result;
 		}
 	}
 
-	g_object_unref(addressbooks);
+	g_object_unref(registry);
+	g_list_free_full(sources, g_object_unref);
 	e_book_query_unref(full_query);
 	return NULL;
 }
diff --git a/pidgin/plugins/gevolution/gevo-util.c b/pidgin/plugins/gevolution/gevo-util.c
--- a/pidgin/plugins/gevolution/gevo-util.c
+++ b/pidgin/plugins/gevolution/gevo-util.c
@@ -120,26 +120,51 @@
 }
 
 gboolean
-gevo_load_addressbook(const gchar* uri, EBook **book, GError **error)
-{
+gevo_load_addressbook(const gchar* uid, EBook **book, GError **error) {
 	gboolean result = FALSE;
+	ESourceRegistry *registry;
+	ESource *source;
 
 	g_return_val_if_fail(book != NULL, FALSE);
 
-	if (uri == NULL)
-		*book = e_book_new_system_addressbook(error);
-	else
-		*book = e_book_new_from_uri(uri, error);
+	registry = e_source_registry_new_sync(NULL, error);
+
+	if(!registry) {
+	    return FALSE;
+	}
+
+	if(uid == NULL) {
+		source = e_source_registry_ref_default_address_book(registry);
+	} else {
+		source = e_source_registry_ref_source(registry, uid);
+	}
+
+	g_object_unref(registry);
+
+	result = gevo_load_addressbook_from_source(source, book, error);
 
-	if (*book == NULL)
+	g_object_unref(source);
+
+	return result;
+}
+
+gboolean
+gevo_load_addressbook_from_source(ESource *source, EBook **book,
+                                  GError **error)
+{
+	gboolean result = FALSE;
+
+	*book = e_book_new(source, error);
+
+	if(*book == NULL) {
 		return FALSE;
+	}
 
 	*error = NULL;
 
 	result = e_book_open(*book, FALSE, error);
 
-	if (!result && *book != NULL)
-	{
+	if(!result && *book != NULL) {
 		g_object_unref(*book);
 		*book = NULL;
 	}
diff --git a/pidgin/plugins/gevolution/gevolution.h b/pidgin/plugins/gevolution/gevolution.h
--- a/pidgin/plugins/gevolution/gevolution.h
+++ b/pidgin/plugins/gevolution/gevolution.h
@@ -25,12 +25,12 @@
 # include "config.h"
 #endif
 
-#include <libebook/e-book.h>
+#include <libebook/libebook.h>
 
 enum
 {
 	ADDRBOOK_COLUMN_NAME,
-	ADDRBOOK_COLUMN_URI,
+	ADDRBOOK_COLUMN_UID,
 	NUM_ADDRBOOK_COLUMNS
 };
 
@@ -123,7 +123,8 @@
 
 EContactField gevo_prpl_get_field(PurpleAccount *account, PurpleBuddy *buddy);
 gboolean gevo_prpl_is_supported(PurpleAccount *account, PurpleBuddy *buddy);
-gboolean gevo_load_addressbook(const gchar *uri, EBook **book, GError **error);
+gboolean gevo_load_addressbook(const gchar *uid, EBook **book, GError **error);
+gboolean gevo_load_addressbook_from_source(ESource *source, EBook **book, GError **error);
 char *gevo_get_email_for_buddy(PurpleBuddy *buddy);
 
 GevoAssociateBuddyDialog *gevo_associate_buddy_dialog_new(PurpleBuddy *buddy);
