diff --git a/addressbook/backends/file/e-book-backend-file.c b/addressbook/backends/file/e-book-backend-file.c
index 1b7c7d7..15c62df 100644
--- a/addressbook/backends/file/e-book-backend-file.c
+++ b/addressbook/backends/file/e-book-backend-file.c
@@ -539,6 +539,33 @@ get_closure (EDataBookView *book_view)
 	return g_object_get_data (G_OBJECT (book_view), "EBookBackendFile.BookView::closure");
 }
 
+static void
+notify_update_vcard (EDataBookView *book_view,
+		     gboolean       uid_only,
+		     gboolean       prefiltered,
+		     const gchar   *id,
+		     const gchar   *vcard)
+{
+	gchar *final_vcard;
+
+	if (uid_only) {
+		/* Create a shallow version of the contacts for views that are
+		 * only interested in the uid. */
+		EContact *shallow = e_contact_new ();
+
+		e_contact_set (shallow, E_CONTACT_UID, id);
+		final_vcard = e_vcard_to_string (E_VCARD (shallow), EVC_FORMAT_VCARD_30);
+		g_object_unref (shallow);
+	} else {
+		final_vcard = g_strdup (vcard);
+	}
+
+	if (prefiltered)
+		e_data_book_view_notify_update_prefiltered_vcard (book_view, id, final_vcard);
+	else
+		e_data_book_view_notify_update_vcard (book_view, final_vcard);
+}
+
 static gpointer
 book_view_thread (gpointer data)
 {
@@ -546,10 +573,11 @@ book_view_thread (gpointer data)
 	FileBackendSearchClosure *closure;
 	EBookBackendFile *bf;
 	const gchar *query;
+	const gchar **requested_fields;
 	DB  *db;
 	DBT id_dbt, vcard_dbt;
 	gint db_error;
-	gboolean allcontacts;
+	gboolean allcontacts, uid_only;
 
 	g_return_val_if_fail (E_IS_DATA_BOOK_VIEW (data), NULL);
 
@@ -578,6 +606,13 @@ book_view_thread (gpointer data)
 		allcontacts = FALSE;
 	}
 
+	/* If only the UID was requested, avoid digging everything else up */
+	requested_fields = e_data_book_view_get_requested_fields (book_view);
+	if (requested_fields && requested_fields[0] != NULL && requested_fields[1] == NULL)
+		uid_only = (strcmp (e_contact_field_name (E_CONTACT_UID), requested_fields[0]) == 0);
+	else
+		uid_only = FALSE;
+
 	d(printf ("signalling parent thread\n"));
 	e_flag_set (closure->running);
 
@@ -602,7 +637,7 @@ book_view_thread (gpointer data)
 			db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0);
 
 			if (db_error == 0) {
-				e_data_book_view_notify_update_prefiltered_vcard (book_view, id, vcard_dbt.data);
+				notify_update_vcard (book_view, uid_only, TRUE, id, vcard_dbt.data);
 			}
 			else {
 				g_warning (G_STRLOC ": db->get failed with %s", db_strerror (db_error));
@@ -630,10 +665,8 @@ book_view_thread (gpointer data)
 
 				/* don't include the version in the list of cards */
 				if (strcmp (id_dbt.data, E_BOOK_BACKEND_FILE_VERSION_NAME)) {
-					if (allcontacts)
-						e_data_book_view_notify_update_prefiltered_vcard (book_view, id_dbt.data, vcard_dbt.data);
-					else
-						e_data_book_view_notify_update_vcard (book_view, vcard_dbt.data);
+					notify_update_vcard (book_view, uid_only, allcontacts, 
+							     id_dbt.data, vcard_dbt.data);
 				} else {
 					g_free (vcard_dbt.data);
 				}
diff --git a/addressbook/libebook/e-book.c b/addressbook/libebook/e-book.c
index b747bcc..fbfac59 100644
--- a/addressbook/libebook/e-book.c
+++ b/addressbook/libebook/e-book.c
@@ -1780,6 +1780,24 @@ e_book_remove_contacts_async (EBook              *book,
 	return TRUE;
 }
 
+static gchar **
+string_array_from_list (GList *list)
+{
+	gchar **array = NULL;
+	gint    size, i;
+	GList  *l;
+
+	if (list) {
+		size = g_list_length (list);
+		array = g_new0 (gchar *, size + 1);
+
+		for (l = list, i = 0; l; l = l->next, i++)
+			array[i] = (gchar *)l->data;
+	}
+
+	return array;
+}
+
 /**
  * e_book_get_book_view:
  * @book: an #EBook
@@ -1806,17 +1824,21 @@ e_book_get_book_view (EBook       *book,
 	GError *err = NULL;
 	EGdbusBookView *gdbus_bookview;
 	gchar *sexp, *view_path;
+	gchar **fields_array = NULL;
 	gboolean ret = TRUE;
 
 	e_return_error_if_fail (E_IS_BOOK (book), E_BOOK_ERROR_INVALID_ARG);
 	e_return_error_if_fail (book->priv->gdbus_book, E_BOOK_ERROR_REPOSITORY_OFFLINE);
 
-	sexp = e_book_query_to_string (query);
+	sexp         = e_book_query_to_string (query);
+	fields_array = string_array_from_list (requested_fields);
 
-	if (!e_gdbus_book_call_get_book_view_sync (book->priv->gdbus_book, sexp, max_results, &view_path, NULL, &err)) {
+	if (!e_gdbus_book_call_get_book_view_sync (book->priv->gdbus_book, sexp, 
+						   (const gchar * const *)fields_array, 
+						   max_results, &view_path, NULL, &err)) {
 		*book_view = NULL;
 		g_free (sexp);
-
+		g_free (fields_array);
 		return unwrap_gerror (err, error);
 	}
 
@@ -1838,6 +1860,7 @@ e_book_get_book_view (EBook       *book,
 
 	g_free (view_path);
 	g_free (sexp);
+	g_free (fields_array);
 
 	return ret;
 }
@@ -1911,6 +1934,7 @@ e_book_async_get_book_view (EBook                 *book,
 			    gpointer               closure)
 {
 	AsyncData *data;
+	gchar **fields_array = NULL;
 	gchar *sexp;
 
 	e_return_async_error_val_if_fail (E_IS_BOOK (book), E_BOOK_ERROR_INVALID_ARG);
@@ -1922,11 +1946,15 @@ e_book_async_get_book_view (EBook                 *book,
 	data->callback = cb;
 	data->closure = closure;
 
-	sexp = e_book_query_to_string (query);
+	sexp         = e_book_query_to_string (query);
+	fields_array = string_array_from_list (requested_fields);
 
-	e_gdbus_book_call_get_book_view (book->priv->gdbus_book, sexp, max_results, NULL, get_book_view_reply, data);
+	e_gdbus_book_call_get_book_view (book->priv->gdbus_book, sexp,
+					 (const gchar * const *)fields_array,
+					 max_results, NULL, get_book_view_reply, data);
 
 	g_free (sexp);
+	g_free (fields_array);
 	return 0;
 }
 #endif
@@ -1956,6 +1984,7 @@ e_book_get_book_view_async (EBook                      *book,
 			    gpointer                    closure)
 {
 	AsyncData *data;
+	gchar **fields_array = NULL;
 	gchar *sexp;
 
 	e_return_ex_async_error_val_if_fail (E_IS_BOOK (book), E_BOOK_ERROR_INVALID_ARG);
@@ -1967,11 +1996,15 @@ e_book_get_book_view_async (EBook                      *book,
 	data->excallback = cb;
 	data->closure = closure;
 
-	sexp = e_book_query_to_string (query);
+	sexp         = e_book_query_to_string (query);
+	fields_array = string_array_from_list (requested_fields);
 
-	e_gdbus_book_call_get_book_view (book->priv->gdbus_book, sexp, max_results, NULL, get_book_view_reply, data);
+	e_gdbus_book_call_get_book_view (book->priv->gdbus_book, sexp,
+					 (const gchar * const *)fields_array,
+					 max_results, NULL, get_book_view_reply, data);
 
 	g_free (sexp);
+	g_free (fields_array);
 
 	return TRUE;
 }
diff --git a/addressbook/libedata-book/e-data-book-view.c b/addressbook/libedata-book/e-data-book-view.c
index 6aa6cd3..dce561c 100644
--- a/addressbook/libedata-book/e-data-book-view.c
+++ b/addressbook/libedata-book/e-data-book-view.c
@@ -45,9 +45,10 @@ struct _EDataBookViewPrivate {
 	EDataBook *book;
 	EBookBackend *backend;
 
-	gchar * card_query;
+	gchar            *card_query;
 	EBookBackendSExp *card_sexp;
-	gint max_results;
+	gchar           **requested_fields;
+	gint              max_results;
 
 	gboolean running;
 	GMutex *pending_mutex;
@@ -476,13 +477,18 @@ e_data_book_view_notify_status_message (EDataBookView *book_view, const gchar *m
  * @book: The #EDataBook to search
  * @card_query: The query as a string
  * @card_sexp: The query as an #EBookBackendSExp
+ * @requested_fields: The vcard fields requested for this view or %NULL for all fields.
  * @max_results: The maximum number of results to return
  *
  * Create a new #EDataBookView for the given #EBook, filtering on #card_sexp,
  * and place it on DBus at the object path #path.
  */
 EDataBookView *
-e_data_book_view_new (EDataBook *book, const gchar *card_query, EBookBackendSExp *card_sexp, gint max_results)
+e_data_book_view_new (EDataBook           *book, 
+		      const gchar         *card_query, 
+		      EBookBackendSExp    *card_sexp, 
+		      const gchar * const *requested_fields,
+		      gint                 max_results)
 {
 	EDataBookView *view;
 	EDataBookViewPrivate *priv;
@@ -497,6 +503,7 @@ e_data_book_view_new (EDataBook *book, const gchar *card_query, EBookBackendSExp
 	priv->card_query = g_strdup (card_query);
 	priv->card_sexp = card_sexp;
 	priv->max_results = max_results;
+	priv->requested_fields = g_strdupv ((gchar **)requested_fields);
 
 	return view;
 }
@@ -637,6 +644,7 @@ e_data_book_view_finalize (GObject *object)
 	g_array_free (priv->removes, TRUE);
 
 	g_free (priv->card_query);
+	g_strfreev (priv->requested_fields);
 
 	g_mutex_free (priv->pending_mutex);
 
@@ -690,6 +698,23 @@ e_data_book_view_get_card_sexp (EDataBookView *book_view)
 }
 
 /**
+ * e_data_book_view_get_requested_fields:
+ * @book_view: an #EDataBookView
+ *
+ * Gets the required fields which should be reported
+ * in #EContacts.
+ *
+ * Returns: A %NULL terminated array of field names which should not be freed or modified.
+ **/
+const gchar **
+e_data_book_view_get_requested_fields (EDataBookView *book_view)
+{
+	g_return_val_if_fail (E_IS_DATA_BOOK_VIEW (book_view), NULL);
+
+	return (const gchar **)book_view->priv->requested_fields;
+}
+
+/**
  * e_data_book_view_get_max_results:
  * @book_view: an #EDataBookView
  *
diff --git a/addressbook/libedata-book/e-data-book-view.h b/addressbook/libedata-book/e-data-book-view.h
index 1f856b9..2e37c0a 100644
--- a/addressbook/libedata-book/e-data-book-view.h
+++ b/addressbook/libedata-book/e-data-book-view.h
@@ -52,10 +52,11 @@ struct _EDataBookViewClass {
 	GObjectClass parent;
 };
 
-EDataBookView *e_data_book_view_new                  (EDataBook        *book,
-						      const gchar      *card_query,
-						      EBookBackendSExp *card_sexp,
-						      gint              max_results);
+EDataBookView *e_data_book_view_new                  (EDataBook           *book,
+						      const gchar         *card_query,
+						      EBookBackendSExp    *card_sexp,
+						      const gchar * const *requested_fields,
+						      gint                 max_results);
 
 guint e_data_book_view_register_gdbus_object (EDataBookView *query, GDBusConnection *connection, const gchar *object_path, GError **error);
 
@@ -63,11 +64,12 @@ void              e_data_book_view_set_thresholds    (EDataBookView *book_view,
 						      gint minimum_grouping_threshold,
 						      gint maximum_grouping_threshold);
 
-const gchar *       e_data_book_view_get_card_query    (EDataBookView                *book_view);
+const gchar *     e_data_book_view_get_card_query    (EDataBookView                *book_view);
 EBookBackendSExp* e_data_book_view_get_card_sexp     (EDataBookView                *book_view);
-gint               e_data_book_view_get_max_results   (EDataBookView                *book_view);
+const gchar ** e_data_book_view_get_requested_fields (EDataBookView                *book_view);
+gint              e_data_book_view_get_max_results   (EDataBookView                *book_view);
 EBookBackend*     e_data_book_view_get_backend       (EDataBookView                *book_view);
-void         e_data_book_view_notify_update          (EDataBookView                *book_view,
+void              e_data_book_view_notify_update     (EDataBookView                *book_view,
 						      EContact                     *contact);
 
 void         e_data_book_view_notify_update_vcard    (EDataBookView                *book_view,
diff --git a/addressbook/libedata-book/e-data-book.c b/addressbook/libedata-book/e-data-book.c
index 9d58510..76086fc 100644
--- a/addressbook/libedata-book/e-data-book.c
+++ b/addressbook/libedata-book/e-data-book.c
@@ -636,7 +636,12 @@ construct_bookview_path (void)
 }
 
 static gboolean
-impl_Book_getBookView (EGdbusBook *object, GDBusMethodInvocation *invocation, const gchar *search, const guint max_results, EDataBook *book)
+impl_Book_getBookView (EGdbusBook            *object, 
+		       GDBusMethodInvocation *invocation, 
+		       const gchar           *search, 
+		       const gchar * const   *requested_fields,
+		       const guint            max_results, 
+		       EDataBook *book)
 {
 	EBookBackend *backend = e_data_book_get_backend (book);
 	EBookBackendSExp *card_sexp;
@@ -654,7 +659,7 @@ impl_Book_getBookView (EGdbusBook *object, GDBusMethodInvocation *invocation, co
 	}
 
 	path = construct_bookview_path ();
-	book_view = e_data_book_view_new (book, search, card_sexp, max_results);
+	book_view = e_data_book_view_new (book, search, card_sexp, requested_fields, max_results);
 	e_data_book_view_register_gdbus_object (book_view, g_dbus_method_invocation_get_connection (invocation), path, &error);
 
 	if (error) {
diff --git a/addressbook/libedata-book/e-data-book.xml b/addressbook/libedata-book/e-data-book.xml
index 4641483..da5ea4d 100644
--- a/addressbook/libedata-book/e-data-book.xml
+++ b/addressbook/libedata-book/e-data-book.xml
@@ -98,7 +98,7 @@
       <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_AddressBook_Book_getBookView"/>
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
       <arg name="query" type="s" direction="in"/>
-      <!-- <arg name="fields" type="as" direction="in"/> -->
+      <arg name="requested_fields" type="as" direction="in"/>
       <arg name="max_results" type="u" direction="in"/>
       <arg name="view" type="o" direction="out"/>
     </method>
diff --git a/addressbook/libegdbus/Makefile.am b/addressbook/libegdbus/Makefile.am
index 8610649..5e2650f 100644
--- a/addressbook/libegdbus/Makefile.am
+++ b/addressbook/libegdbus/Makefile.am
@@ -1,3 +1,8 @@
+# The marshallers
+MARSHAL_GENERATED = e-gdbus-marshal.c e-gdbus-marshal.h
+@EVO_MARSHAL_RULE@
+
+
 GDBUS_XML_FILES =					\
 	../libedata-book/e-data-book-factory.xml	\
 	../libedata-book/e-data-book-view.xml		\
@@ -18,14 +23,13 @@ libegdbus_book_la_CPPFLAGS =			\
 	$(E_DATA_SERVER_CFLAGS)
 
 libegdbus_book_la_SOURCES =			\
+	$(MARSHAL_GENERATED)			\
 	e-gdbus-egdbusbook.h			\
 	e-gdbus-egdbusbook.c			\
 	e-gdbus-egdbusbookfactory.h		\
 	e-gdbus-egdbusbookfactory.c		\
 	e-gdbus-egdbusbookview.h		\
 	e-gdbus-egdbusbookview.c		\
-	e-gdbus-marshallers.h			\
-	e-gdbus-marshallers.c			\
 	e-gdbus-typemappers.h
 
 libegdbus_book_la_LIBADD =			\
@@ -33,6 +37,8 @@ libegdbus_book_la_LIBADD =			\
 
 libegdbus_book_la_LDFLAGS = $(NO_UNDEFINED)
 
-EXTRA_DIST = e-gdbus-marshallers.list
+BUILT_SOURCES = $(MARSHAL_GENERATED)
+CLEANFILES    = $(BUILT_SOURCES)
+EXTRA_DIST    = e-gdbus-marshal.list
 
 -include $(top_srcdir)/git.mk
diff --git a/addressbook/libegdbus/e-gdbus-egdbusbook.c b/addressbook/libegdbus/e-gdbus-egdbusbook.c
index 43c5248..d314431 100644
--- a/addressbook/libegdbus/e-gdbus-egdbusbook.c
+++ b/addressbook/libegdbus/e-gdbus-egdbusbook.c
@@ -56,7 +56,7 @@
 
 #include "e-gdbus-egdbusbook.h"
 #include "e-gdbus-typemappers.h"
-#include "e-gdbus-marshallers.h"
+#include "e-gdbus-marshal.h"
 
 typedef EGdbusBookIface EGdbusBookInterface;
 G_DEFINE_INTERFACE (EGdbusBook, e_gdbus_book, G_TYPE_OBJECT);
@@ -299,7 +299,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, writable),
                   NULL,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_VOID__BOOLEAN,
+                  e_gdbus_marshal_VOID__BOOLEAN,
                   G_TYPE_NONE,
                   1,
                   G_TYPE_BOOLEAN);
@@ -329,7 +329,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, connection),
                   NULL,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_VOID__BOOLEAN,
+                  e_gdbus_marshal_VOID__BOOLEAN,
                   G_TYPE_NONE,
                   1,
                   G_TYPE_BOOLEAN);
@@ -389,7 +389,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_open),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_BOOLEAN,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_BOOLEAN,
                   G_TYPE_BOOLEAN,
                   2,
                   G_TYPE_DBUS_METHOD_INVOCATION,
@@ -414,7 +414,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_remove),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
@@ -439,7 +439,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_get_contact),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_STRING,
                   G_TYPE_BOOLEAN,
                   2,
                   G_TYPE_DBUS_METHOD_INVOCATION,
@@ -465,7 +465,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_get_contact_list),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_STRING,
                   G_TYPE_BOOLEAN,
                   2,
                   G_TYPE_DBUS_METHOD_INVOCATION,
@@ -493,7 +493,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_authenticate_user),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING_STRING_STRING,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_STRING_STRING_STRING,
                   G_TYPE_BOOLEAN,
                   4,
                   G_TYPE_DBUS_METHOD_INVOCATION,
@@ -521,7 +521,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_add_contact),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_STRING,
                   G_TYPE_BOOLEAN,
                   2,
                   G_TYPE_DBUS_METHOD_INVOCATION,
@@ -547,7 +547,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_remove_contacts),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_BOXED,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_BOXED,
                   G_TYPE_BOOLEAN,
                   2,
                   G_TYPE_DBUS_METHOD_INVOCATION,
@@ -573,7 +573,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_modify_contact),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_STRING,
                   G_TYPE_BOOLEAN,
                   2,
                   G_TYPE_DBUS_METHOD_INVOCATION,
@@ -598,7 +598,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_get_static_capabilities),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
@@ -622,7 +622,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_get_required_fields),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
@@ -646,7 +646,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_get_supported_fields),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
@@ -670,7 +670,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_get_supported_auth_methods),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
@@ -696,11 +696,12 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_get_book_view),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING_UINT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_STRING_BOXED_UINT,
                   G_TYPE_BOOLEAN,
-                  3,
+                  4,
                   G_TYPE_DBUS_METHOD_INVOCATION,
                   G_TYPE_STRING,
+		  G_TYPE_STRV,
                   G_TYPE_UINT);
   /**
    * EGdbusBook::handle-get-changes:
@@ -723,7 +724,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_get_changes),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_STRING,
                   G_TYPE_BOOLEAN,
                   2,
                   G_TYPE_DBUS_METHOD_INVOCATION,
@@ -748,7 +749,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_cancel_operation),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
@@ -772,7 +773,7 @@ e_gdbus_book_default_init (EGdbusBookIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookIface, handle_close),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
@@ -2138,6 +2139,7 @@ _out:
  * e_gdbus_book_call_get_book_view:
  * @proxy: A #EGdbusBook.
  * @in_query: Method parameter.
+ * @in_requested_fields: The requested vcard fields for the new view
  * @in_max_results: Method parameter.
  * @cancellable: A #GCancellable or %NULL.
  * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL if you don't care about the result of the method invocation.
@@ -2156,14 +2158,18 @@ _out:
 void e_gdbus_book_call_get_book_view (
         EGdbusBook *proxy,
         const gchar *in_query,
+	const gchar * const *in_requested_fields,
         guint in_max_results,
         GCancellable *cancellable,
         GAsyncReadyCallback callback,
         gpointer user_data)
 {
   GVariant *_params;
-  _params = g_variant_new ("(su)",
+  gchar    *empty[1] = { NULL };
+
+  _params = g_variant_new ("(s^asu)",
                            in_query,
+			   (gchar **)in_requested_fields ? (gchar **)in_requested_fields : empty,
                            in_max_results);
   g_dbus_proxy_call (G_DBUS_PROXY (proxy),
                      "getBookView",
@@ -2213,6 +2219,7 @@ _out:
  * e_gdbus_book_call_get_book_view_sync:
  * @proxy: A #EGdbusBook.
  * @in_query: Method parameter.
+ * @in_requested_fields: The requested vcard fields for the new view
  * @in_max_results: Method parameter.
  * @out_view: Return location for out parameter or %NULL. Free with g_free().
  * @cancellable: A #GCancellable or %NULL.
@@ -2229,6 +2236,7 @@ _out:
 gboolean e_gdbus_book_call_get_book_view_sync (
         EGdbusBook *proxy,
         const gchar *in_query,
+	const gchar * const *in_requested_fields,
         guint in_max_results,
         gchar **out_view,
         GCancellable *cancellable,
@@ -2237,8 +2245,11 @@ gboolean e_gdbus_book_call_get_book_view_sync (
   gboolean _ret = FALSE;
   GVariant *_params;
   GVariant *_result;
-  _params = g_variant_new ("(su)",
+  gchar    *empty[1] = { NULL };
+
+  _params = g_variant_new ("(s^asu)",
                            in_query,
+			   (gchar **)in_requested_fields ? (gchar **)in_requested_fields : empty,
                            in_max_results);
   _result = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
                                    "getBookView",
@@ -3359,6 +3370,13 @@ static const GDBusArgInfo e_gdbus_book_method_in_getBookView_query =
   (gchar *) "s",
   (GDBusAnnotationInfo **) NULL,
 };
+static const GDBusArgInfo e_gdbus_book_method_in_getBookView_requested_fields =
+{
+  -1,
+  (gchar *) "requested_fields",
+  (gchar *) "as",
+  (GDBusAnnotationInfo **) NULL,
+};
 static const GDBusArgInfo e_gdbus_book_method_in_getBookView_max_results =
 {
   -1,
@@ -3369,6 +3387,7 @@ static const GDBusArgInfo e_gdbus_book_method_in_getBookView_max_results =
 static const GDBusArgInfo * const e_gdbus_book_method_in_getBookView_arg_pointers[] =
 {
   &e_gdbus_book_method_in_getBookView_query,
+  &e_gdbus_book_method_in_getBookView_requested_fields,
   &e_gdbus_book_method_in_getBookView_max_results,
   NULL
 };
@@ -3674,14 +3693,18 @@ handle_method_call (GDBusConnection       *connection,
         EGdbusBook *object = E_GDBUS_BOOK (user_data);
         gboolean handled;
         const gchar *arg_query;
+	gchar **arg_req_fields;
         guint arg_max_results;
         g_variant_get (parameters,
-                       "(&su)",
+                       "(&s^a&su)",
                        &arg_query,
+		       &arg_req_fields,
                        &arg_max_results);
         g_signal_emit (object,
                        signals[method_id],
-                       0, invocation, arg_query, arg_max_results, &handled);
+                       0, invocation, arg_query, arg_req_fields, arg_max_results, &handled);
+
+	g_free (arg_req_fields);
         if (!handled)
           goto not_implemented;
       }
diff --git a/addressbook/libegdbus/e-gdbus-egdbusbook.h b/addressbook/libegdbus/e-gdbus-egdbusbook.h
index 767dbea..ad119c2 100644
--- a/addressbook/libegdbus/e-gdbus-egdbusbook.h
+++ b/addressbook/libegdbus/e-gdbus-egdbusbook.h
@@ -235,6 +235,7 @@ struct _EGdbusBookIface
         EGdbusBook *object,
         GDBusMethodInvocation *invocation,
         const gchar *in_query,
+	const gchar * const *in_requested_fields,
         guint in_max_results);
   gboolean (*handle_get_changes) (
         EGdbusBook *object,
@@ -478,6 +479,7 @@ gboolean e_gdbus_book_call_get_supported_auth_methods_sync (
 void e_gdbus_book_call_get_book_view (
         EGdbusBook *proxy,
         const gchar *in_query,
+	const gchar * const *in_requested_fields,
         guint in_max_results,
         GCancellable *cancellable,
         GAsyncReadyCallback callback,
@@ -492,6 +494,7 @@ gboolean e_gdbus_book_call_get_book_view_finish (
 gboolean e_gdbus_book_call_get_book_view_sync (
         EGdbusBook *proxy,
         const gchar *in_query,
+	const gchar * const *in_requested_fields,
         guint in_max_results,
         gchar **out_view,
         GCancellable *cancellable,
diff --git a/addressbook/libegdbus/e-gdbus-egdbusbookfactory.c b/addressbook/libegdbus/e-gdbus-egdbusbookfactory.c
index c7c4b1f..6fb7c16 100644
--- a/addressbook/libegdbus/e-gdbus-egdbusbookfactory.c
+++ b/addressbook/libegdbus/e-gdbus-egdbusbookfactory.c
@@ -56,7 +56,7 @@
 
 #include "e-gdbus-egdbusbookfactory.h"
 #include "e-gdbus-typemappers.h"
-#include "e-gdbus-marshallers.h"
+#include "e-gdbus-marshal.h"
 
 typedef EGdbusBookFactoryIface EGdbusBookFactoryInterface;
 G_DEFINE_INTERFACE (EGdbusBookFactory, e_gdbus_book_factory, G_TYPE_OBJECT);
@@ -152,7 +152,7 @@ e_gdbus_book_factory_default_init (EGdbusBookFactoryIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookFactoryIface, handle_get_book),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING,
+                  e_gdbus_marshal_BOOLEAN__OBJECT_STRING,
                   G_TYPE_BOOLEAN,
                   2,
                   G_TYPE_DBUS_METHOD_INVOCATION,
diff --git a/addressbook/libegdbus/e-gdbus-egdbusbookview.c b/addressbook/libegdbus/e-gdbus-egdbusbookview.c
index fe4eab4..37510d8 100644
--- a/addressbook/libegdbus/e-gdbus-egdbusbookview.c
+++ b/addressbook/libegdbus/e-gdbus-egdbusbookview.c
@@ -56,7 +56,7 @@
 
 #include "e-gdbus-egdbusbookview.h"
 #include "e-gdbus-typemappers.h"
-#include "e-gdbus-marshallers.h"
+#include "e-gdbus-marshal.h"
 
 typedef EGdbusBookViewIface EGdbusBookViewInterface;
 G_DEFINE_INTERFACE (EGdbusBookView, e_gdbus_book_view, G_TYPE_OBJECT);
@@ -371,7 +371,7 @@ e_gdbus_book_view_default_init (EGdbusBookViewIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookViewIface, contacts_added),
                   NULL,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_VOID__BOXED,
+                  e_gdbus_marshal_VOID__BOXED,
                   G_TYPE_NONE,
                   1,
                   G_TYPE_STRV);
@@ -401,7 +401,7 @@ e_gdbus_book_view_default_init (EGdbusBookViewIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookViewIface, contacts_changed),
                   NULL,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_VOID__BOXED,
+                  e_gdbus_marshal_VOID__BOXED,
                   G_TYPE_NONE,
                   1,
                   G_TYPE_STRV);
@@ -431,7 +431,7 @@ e_gdbus_book_view_default_init (EGdbusBookViewIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookViewIface, contacts_removed),
                   NULL,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_VOID__BOXED,
+                  e_gdbus_marshal_VOID__BOXED,
                   G_TYPE_NONE,
                   1,
                   G_TYPE_STRV);
@@ -461,7 +461,7 @@ e_gdbus_book_view_default_init (EGdbusBookViewIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookViewIface, status_message),
                   NULL,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_VOID__STRING,
+                  e_gdbus_marshal_VOID__STRING,
                   G_TYPE_NONE,
                   1,
                   G_TYPE_STRING);
@@ -492,7 +492,7 @@ e_gdbus_book_view_default_init (EGdbusBookViewIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookViewIface, complete),
                   NULL,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_VOID__UINT_STRING,
+                  e_gdbus_marshal_VOID__UINT_STRING,
                   G_TYPE_NONE,
                   2,
                   G_TYPE_UINT,
@@ -524,7 +524,7 @@ e_gdbus_book_view_default_init (EGdbusBookViewIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookViewIface, handle_start),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
@@ -548,7 +548,7 @@ e_gdbus_book_view_default_init (EGdbusBookViewIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookViewIface, handle_stop),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
@@ -572,7 +572,7 @@ e_gdbus_book_view_default_init (EGdbusBookViewIface *iface)
                   G_STRUCT_OFFSET (EGdbusBookViewIface, handle_dispose),
                   g_signal_accumulator_true_handled,
                   NULL,
-                  _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT,
+                  e_gdbus_marshal_BOOLEAN__OBJECT,
                   G_TYPE_BOOLEAN,
                   1,
                   G_TYPE_DBUS_METHOD_INVOCATION);
diff --git a/addressbook/libegdbus/e-gdbus-marshal.list b/addressbook/libegdbus/e-gdbus-marshal.list
new file mode 100644
index 0000000..20e3a5d
--- /dev/null
+++ b/addressbook/libegdbus/e-gdbus-marshal.list
@@ -0,0 +1,10 @@
+BOOLEAN:OBJECT,STRING
+VOID:BOXED
+VOID:STRING
+VOID:UINT,STRING
+BOOLEAN:OBJECT
+VOID:BOOLEAN
+BOOLEAN:OBJECT,BOOLEAN
+BOOLEAN:OBJECT,STRING,STRING,STRING
+BOOLEAN:OBJECT,BOXED
+BOOLEAN:OBJECT,STRING,BOXED,UINT
diff --git a/addressbook/libegdbus/e-gdbus-marshallers.c b/addressbook/libegdbus/e-gdbus-marshallers.c
deleted file mode 100644
index cb9a4fa..0000000
--- a/addressbook/libegdbus/e-gdbus-marshallers.c
+++ /dev/null
@@ -1,343 +0,0 @@
-#include "e-gdbus-marshallers.h"
-
-#include	<glib-object.h>
-
-#ifdef G_ENABLE_DEBUG
-#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
-#define g_marshal_value_peek_char(v)     g_value_get_char (v)
-#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
-#define g_marshal_value_peek_int(v)      g_value_get_int (v)
-#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
-#define g_marshal_value_peek_long(v)     g_value_get_long (v)
-#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
-#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
-#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
-#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
-#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
-#define g_marshal_value_peek_float(v)    g_value_get_float (v)
-#define g_marshal_value_peek_double(v)   g_value_get_double (v)
-#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
-#define g_marshal_value_peek_param(v)    g_value_get_param (v)
-#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
-#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
-#define g_marshal_value_peek_object(v)   g_value_get_object (v)
-#define g_marshal_value_peek_variant(v)  g_value_get_variant (v)
-#else /* !G_ENABLE_DEBUG */
-/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
- *          Do not access GValues directly in your code. Instead, use the
- *          g_value_get_*() functions
- */
-#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
-#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
-#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
-#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
-#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
-#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
-#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
-#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
-#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
-#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
-#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
-#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
-#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
-#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
-#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
-#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
-#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
-#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
-#define g_marshal_value_peek_variant(v)  (v)->data[0].v_pointer
-#endif /* G_ENABLE_DEBUG */
-
-/* BOOLEAN:OBJECT,STRING (e-gdbus-marshallers.list:1) */
-void
-_e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING (GClosure     *closure,
-                                                           GValue       *return_value G_GNUC_UNUSED,
-                                                           guint         n_param_values,
-                                                           const GValue *param_values,
-                                                           gpointer      invocation_hint G_GNUC_UNUSED,
-                                                           gpointer      marshal_data)
-{
-  typedef gboolean (*GMarshalFunc_BOOLEAN__OBJECT_STRING) (gpointer     data1,
-                                                           gpointer     arg_1,
-                                                           gpointer     arg_2,
-                                                           gpointer     data2);
-  register GMarshalFunc_BOOLEAN__OBJECT_STRING callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
-  gboolean v_return;
-
-  g_return_if_fail (return_value != NULL);
-  g_return_if_fail (n_param_values == 3);
-
-  if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-      data1 = closure->data;
-      data2 = g_value_peek_pointer (param_values + 0);
-    }
-  else
-    {
-      data1 = g_value_peek_pointer (param_values + 0);
-      data2 = closure->data;
-    }
-  callback = (GMarshalFunc_BOOLEAN__OBJECT_STRING) (marshal_data ? marshal_data : cc->callback);
-
-  v_return = callback (data1,
-                       g_marshal_value_peek_object (param_values + 1),
-                       g_marshal_value_peek_string (param_values + 2),
-                       data2);
-
-  g_value_set_boolean (return_value, v_return);
-}
-
-/* VOID:BOXED (e-gdbus-marshallers.list:2) */
-
-/* VOID:STRING (e-gdbus-marshallers.list:3) */
-
-/* VOID:UINT,STRING (e-gdbus-marshallers.list:4) */
-void
-_e_gdbus_gdbus_cclosure_marshaller_VOID__UINT_STRING (GClosure     *closure,
-                                                      GValue       *return_value G_GNUC_UNUSED,
-                                                      guint         n_param_values,
-                                                      const GValue *param_values,
-                                                      gpointer      invocation_hint G_GNUC_UNUSED,
-                                                      gpointer      marshal_data)
-{
-  typedef void (*GMarshalFunc_VOID__UINT_STRING) (gpointer     data1,
-                                                  guint        arg_1,
-                                                  gpointer     arg_2,
-                                                  gpointer     data2);
-  register GMarshalFunc_VOID__UINT_STRING callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
-
-  g_return_if_fail (n_param_values == 3);
-
-  if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-      data1 = closure->data;
-      data2 = g_value_peek_pointer (param_values + 0);
-    }
-  else
-    {
-      data1 = g_value_peek_pointer (param_values + 0);
-      data2 = closure->data;
-    }
-  callback = (GMarshalFunc_VOID__UINT_STRING) (marshal_data ? marshal_data : cc->callback);
-
-  callback (data1,
-            g_marshal_value_peek_uint (param_values + 1),
-            g_marshal_value_peek_string (param_values + 2),
-            data2);
-}
-
-/* BOOLEAN:OBJECT (e-gdbus-marshallers.list:5) */
-void
-_e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT (GClosure     *closure,
-                                                    GValue       *return_value G_GNUC_UNUSED,
-                                                    guint         n_param_values,
-                                                    const GValue *param_values,
-                                                    gpointer      invocation_hint G_GNUC_UNUSED,
-                                                    gpointer      marshal_data)
-{
-  typedef gboolean (*GMarshalFunc_BOOLEAN__OBJECT) (gpointer     data1,
-                                                    gpointer     arg_1,
-                                                    gpointer     data2);
-  register GMarshalFunc_BOOLEAN__OBJECT callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
-  gboolean v_return;
-
-  g_return_if_fail (return_value != NULL);
-  g_return_if_fail (n_param_values == 2);
-
-  if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-      data1 = closure->data;
-      data2 = g_value_peek_pointer (param_values + 0);
-    }
-  else
-    {
-      data1 = g_value_peek_pointer (param_values + 0);
-      data2 = closure->data;
-    }
-  callback = (GMarshalFunc_BOOLEAN__OBJECT) (marshal_data ? marshal_data : cc->callback);
-
-  v_return = callback (data1,
-                       g_marshal_value_peek_object (param_values + 1),
-                       data2);
-
-  g_value_set_boolean (return_value, v_return);
-}
-
-/* VOID:BOOLEAN (e-gdbus-marshallers.list:6) */
-
-/* BOOLEAN:OBJECT,BOOLEAN (e-gdbus-marshallers.list:7) */
-void
-_e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_BOOLEAN (GClosure     *closure,
-                                                            GValue       *return_value G_GNUC_UNUSED,
-                                                            guint         n_param_values,
-                                                            const GValue *param_values,
-                                                            gpointer      invocation_hint G_GNUC_UNUSED,
-                                                            gpointer      marshal_data)
-{
-  typedef gboolean (*GMarshalFunc_BOOLEAN__OBJECT_BOOLEAN) (gpointer     data1,
-                                                            gpointer     arg_1,
-                                                            gboolean     arg_2,
-                                                            gpointer     data2);
-  register GMarshalFunc_BOOLEAN__OBJECT_BOOLEAN callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
-  gboolean v_return;
-
-  g_return_if_fail (return_value != NULL);
-  g_return_if_fail (n_param_values == 3);
-
-  if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-      data1 = closure->data;
-      data2 = g_value_peek_pointer (param_values + 0);
-    }
-  else
-    {
-      data1 = g_value_peek_pointer (param_values + 0);
-      data2 = closure->data;
-    }
-  callback = (GMarshalFunc_BOOLEAN__OBJECT_BOOLEAN) (marshal_data ? marshal_data : cc->callback);
-
-  v_return = callback (data1,
-                       g_marshal_value_peek_object (param_values + 1),
-                       g_marshal_value_peek_boolean (param_values + 2),
-                       data2);
-
-  g_value_set_boolean (return_value, v_return);
-}
-
-/* BOOLEAN:OBJECT,STRING,STRING,STRING (e-gdbus-marshallers.list:8) */
-void
-_e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING_STRING_STRING (GClosure     *closure,
-                                                                         GValue       *return_value G_GNUC_UNUSED,
-                                                                         guint         n_param_values,
-                                                                         const GValue *param_values,
-                                                                         gpointer      invocation_hint G_GNUC_UNUSED,
-                                                                         gpointer      marshal_data)
-{
-  typedef gboolean (*GMarshalFunc_BOOLEAN__OBJECT_STRING_STRING_STRING) (gpointer     data1,
-                                                                         gpointer     arg_1,
-                                                                         gpointer     arg_2,
-                                                                         gpointer     arg_3,
-                                                                         gpointer     arg_4,
-                                                                         gpointer     data2);
-  register GMarshalFunc_BOOLEAN__OBJECT_STRING_STRING_STRING callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
-  gboolean v_return;
-
-  g_return_if_fail (return_value != NULL);
-  g_return_if_fail (n_param_values == 5);
-
-  if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-      data1 = closure->data;
-      data2 = g_value_peek_pointer (param_values + 0);
-    }
-  else
-    {
-      data1 = g_value_peek_pointer (param_values + 0);
-      data2 = closure->data;
-    }
-  callback = (GMarshalFunc_BOOLEAN__OBJECT_STRING_STRING_STRING) (marshal_data ? marshal_data : cc->callback);
-
-  v_return = callback (data1,
-                       g_marshal_value_peek_object (param_values + 1),
-                       g_marshal_value_peek_string (param_values + 2),
-                       g_marshal_value_peek_string (param_values + 3),
-                       g_marshal_value_peek_string (param_values + 4),
-                       data2);
-
-  g_value_set_boolean (return_value, v_return);
-}
-
-/* BOOLEAN:OBJECT,BOXED (e-gdbus-marshallers.list:9) */
-void
-_e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_BOXED (GClosure     *closure,
-                                                          GValue       *return_value G_GNUC_UNUSED,
-                                                          guint         n_param_values,
-                                                          const GValue *param_values,
-                                                          gpointer      invocation_hint G_GNUC_UNUSED,
-                                                          gpointer      marshal_data)
-{
-  typedef gboolean (*GMarshalFunc_BOOLEAN__OBJECT_BOXED) (gpointer     data1,
-                                                          gpointer     arg_1,
-                                                          gpointer     arg_2,
-                                                          gpointer     data2);
-  register GMarshalFunc_BOOLEAN__OBJECT_BOXED callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
-  gboolean v_return;
-
-  g_return_if_fail (return_value != NULL);
-  g_return_if_fail (n_param_values == 3);
-
-  if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-      data1 = closure->data;
-      data2 = g_value_peek_pointer (param_values + 0);
-    }
-  else
-    {
-      data1 = g_value_peek_pointer (param_values + 0);
-      data2 = closure->data;
-    }
-  callback = (GMarshalFunc_BOOLEAN__OBJECT_BOXED) (marshal_data ? marshal_data : cc->callback);
-
-  v_return = callback (data1,
-                       g_marshal_value_peek_object (param_values + 1),
-                       g_marshal_value_peek_boxed (param_values + 2),
-                       data2);
-
-  g_value_set_boolean (return_value, v_return);
-}
-
-/* BOOLEAN:OBJECT,STRING,UINT (e-gdbus-marshallers.list:10) */
-void
-_e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING_UINT (GClosure     *closure,
-                                                                GValue       *return_value G_GNUC_UNUSED,
-                                                                guint         n_param_values,
-                                                                const GValue *param_values,
-                                                                gpointer      invocation_hint G_GNUC_UNUSED,
-                                                                gpointer      marshal_data)
-{
-  typedef gboolean (*GMarshalFunc_BOOLEAN__OBJECT_STRING_UINT) (gpointer     data1,
-                                                                gpointer     arg_1,
-                                                                gpointer     arg_2,
-                                                                guint        arg_3,
-                                                                gpointer     data2);
-  register GMarshalFunc_BOOLEAN__OBJECT_STRING_UINT callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
-  gboolean v_return;
-
-  g_return_if_fail (return_value != NULL);
-  g_return_if_fail (n_param_values == 4);
-
-  if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-      data1 = closure->data;
-      data2 = g_value_peek_pointer (param_values + 0);
-    }
-  else
-    {
-      data1 = g_value_peek_pointer (param_values + 0);
-      data2 = closure->data;
-    }
-  callback = (GMarshalFunc_BOOLEAN__OBJECT_STRING_UINT) (marshal_data ? marshal_data : cc->callback);
-
-  v_return = callback (data1,
-                       g_marshal_value_peek_object (param_values + 1),
-                       g_marshal_value_peek_string (param_values + 2),
-                       g_marshal_value_peek_uint (param_values + 3),
-                       data2);
-
-  g_value_set_boolean (return_value, v_return);
-}
-
diff --git a/addressbook/libegdbus/e-gdbus-marshallers.h b/addressbook/libegdbus/e-gdbus-marshallers.h
deleted file mode 100644
index d477e91..0000000
--- a/addressbook/libegdbus/e-gdbus-marshallers.h
+++ /dev/null
@@ -1,77 +0,0 @@
-
-#ifndef ___e_gdbus_gdbus_cclosure_marshaller_MARSHAL_H__
-#define ___e_gdbus_gdbus_cclosure_marshaller_MARSHAL_H__
-
-#include	<glib-object.h>
-
-G_BEGIN_DECLS
-
-/* BOOLEAN:OBJECT,STRING (e-gdbus-marshallers.list:1) */
-extern void _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING (GClosure     *closure,
-                                                                       GValue       *return_value,
-                                                                       guint         n_param_values,
-                                                                       const GValue *param_values,
-                                                                       gpointer      invocation_hint,
-                                                                       gpointer      marshal_data);
-
-/* VOID:BOXED (e-gdbus-marshallers.list:2) */
-#define _e_gdbus_gdbus_cclosure_marshaller_VOID__BOXED	g_cclosure_marshal_VOID__BOXED
-
-/* VOID:STRING (e-gdbus-marshallers.list:3) */
-#define _e_gdbus_gdbus_cclosure_marshaller_VOID__STRING	g_cclosure_marshal_VOID__STRING
-
-/* VOID:UINT,STRING (e-gdbus-marshallers.list:4) */
-extern void _e_gdbus_gdbus_cclosure_marshaller_VOID__UINT_STRING (GClosure     *closure,
-                                                                  GValue       *return_value,
-                                                                  guint         n_param_values,
-                                                                  const GValue *param_values,
-                                                                  gpointer      invocation_hint,
-                                                                  gpointer      marshal_data);
-
-/* BOOLEAN:OBJECT (e-gdbus-marshallers.list:5) */
-extern void _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT (GClosure     *closure,
-                                                                GValue       *return_value,
-                                                                guint         n_param_values,
-                                                                const GValue *param_values,
-                                                                gpointer      invocation_hint,
-                                                                gpointer      marshal_data);
-
-/* VOID:BOOLEAN (e-gdbus-marshallers.list:6) */
-#define _e_gdbus_gdbus_cclosure_marshaller_VOID__BOOLEAN	g_cclosure_marshal_VOID__BOOLEAN
-
-/* BOOLEAN:OBJECT,BOOLEAN (e-gdbus-marshallers.list:7) */
-extern void _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_BOOLEAN (GClosure     *closure,
-                                                                        GValue       *return_value,
-                                                                        guint         n_param_values,
-                                                                        const GValue *param_values,
-                                                                        gpointer      invocation_hint,
-                                                                        gpointer      marshal_data);
-
-/* BOOLEAN:OBJECT,STRING,STRING,STRING (e-gdbus-marshallers.list:8) */
-extern void _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING_STRING_STRING (GClosure     *closure,
-                                                                                     GValue       *return_value,
-                                                                                     guint         n_param_values,
-                                                                                     const GValue *param_values,
-                                                                                     gpointer      invocation_hint,
-                                                                                     gpointer      marshal_data);
-
-/* BOOLEAN:OBJECT,BOXED (e-gdbus-marshallers.list:9) */
-extern void _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_BOXED (GClosure     *closure,
-                                                                      GValue       *return_value,
-                                                                      guint         n_param_values,
-                                                                      const GValue *param_values,
-                                                                      gpointer      invocation_hint,
-                                                                      gpointer      marshal_data);
-
-/* BOOLEAN:OBJECT,STRING,UINT (e-gdbus-marshallers.list:10) */
-extern void _e_gdbus_gdbus_cclosure_marshaller_BOOLEAN__OBJECT_STRING_UINT (GClosure     *closure,
-                                                                            GValue       *return_value,
-                                                                            guint         n_param_values,
-                                                                            const GValue *param_values,
-                                                                            gpointer      invocation_hint,
-                                                                            gpointer      marshal_data);
-
-G_END_DECLS
-
-#endif /* ___e_gdbus_gdbus_cclosure_marshaller_MARSHAL_H__ */
-
diff --git a/addressbook/libegdbus/e-gdbus-marshallers.list b/addressbook/libegdbus/e-gdbus-marshallers.list
deleted file mode 100644
index 46f24d4..0000000
--- a/addressbook/libegdbus/e-gdbus-marshallers.list
+++ /dev/null
@@ -1,10 +0,0 @@
-BOOLEAN:OBJECT,STRING
-VOID:BOXED
-VOID:STRING
-VOID:UINT,STRING
-BOOLEAN:OBJECT
-VOID:BOOLEAN
-BOOLEAN:OBJECT,BOOLEAN
-BOOLEAN:OBJECT,STRING,STRING,STRING
-BOOLEAN:OBJECT,BOXED
-BOOLEAN:OBJECT,STRING,UINT
diff --git a/addressbook/tests/ebook/Makefile.am b/addressbook/tests/ebook/Makefile.am
index 32c8e40..c2dca52 100644
--- a/addressbook/tests/ebook/Makefile.am
+++ b/addressbook/tests/ebook/Makefile.am
@@ -32,6 +32,7 @@ TESTS = \
 	test-ebook-add-contact			     \
 	test-ebook-get-contact			     \
 	test-ebook-get-book-view		     \
+	test-ebook-get-book-view-uid-only	     \
 	test-ebook-commit-contact		     \
 	test-ebook-remove-contact		     \
 	test-ebook-remove-contact-by-id		     \
@@ -83,6 +84,8 @@ test_ebook_commit_contact_LDADD=$(TEST_LIBS)
 test_ebook_commit_contact_CPPFLAGS=$(TEST_CPPFLAGS)
 test_ebook_get_book_view_LDADD=$(TEST_LIBS)
 test_ebook_get_book_view_CPPFLAGS=$(TEST_CPPFLAGS)
+test_ebook_get_book_view_uid_only_LDADD=$(TEST_LIBS)
+test_ebook_get_book_view_uid_only_CPPFLAGS=$(TEST_CPPFLAGS)
 test_ebook_get_contact_LDADD=$(TEST_LIBS)
 test_ebook_get_contact_CPPFLAGS=$(TEST_CPPFLAGS)
 test_ebook_get_required_fields_LDADD=$(TEST_LIBS)
diff --git a/addressbook/tests/ebook/ebook-test-utils.c b/addressbook/tests/ebook/ebook-test-utils.c
index 12045fe..76e2195 100644
--- a/addressbook/tests/ebook/ebook-test-utils.c
+++ b/addressbook/tests/ebook/ebook-test-utils.c
@@ -732,11 +732,12 @@ ebook_test_utils_book_async_remove (EBook       *book,
 void
 ebook_test_utils_book_get_book_view (EBook       *book,
                                      EBookQuery  *query,
+				     GList       *requested_fields,
                                      EBookView  **view)
 {
         GError *error = NULL;
 
-        if (!e_book_get_book_view (book, query, NULL, -1, view, &error)) {
+        if (!e_book_get_book_view (book, query, requested_fields, -1, view, &error)) {
                 const gchar *uri;
 
                 uri = e_book_get_uri (book);
@@ -769,6 +770,7 @@ get_book_view_cb (EBook            *book,
 void
 ebook_test_utils_book_async_get_book_view (EBook       *book,
                                            EBookQuery  *query,
+					   GList       *requested_fields,
                                            GSourceFunc  callback,
                                            gpointer     user_data)
 {
@@ -777,7 +779,7 @@ ebook_test_utils_book_async_get_book_view (EBook       *book,
         closure = g_new0 (EBookTestClosure, 1);
         closure->cb = callback;
         closure->user_data = user_data;
-        if (!e_book_get_book_view_async (book, query, NULL, -1, (EBookBookViewAsyncCallback) get_book_view_cb, closure)) {
+        if (!e_book_get_book_view_async (book, query, requested_fields, -1, (EBookBookViewAsyncCallback) get_book_view_cb, closure)) {
                 g_warning ("failed to set up book view retrieval");
                 exit(1);
         }
diff --git a/addressbook/tests/ebook/ebook-test-utils.h b/addressbook/tests/ebook/ebook-test-utils.h
index 789e21d..13e128b 100644
--- a/addressbook/tests/ebook/ebook-test-utils.h
+++ b/addressbook/tests/ebook/ebook-test-utils.h
@@ -148,10 +148,12 @@ ebook_test_utils_book_async_remove (EBook          *book,
 void
 ebook_test_utils_book_get_book_view (EBook       *book,
                                      EBookQuery  *query,
+				     GList       *requested_fields,
                                      EBookView  **view);
 void
 ebook_test_utils_book_async_get_book_view (EBook       *book,
                                            EBookQuery  *query,
+					   GList       *requested_fields,
                                            GSourceFunc  callback,
                                            gpointer     user_data);
 
diff --git a/addressbook/tests/ebook/test-ebook-get-book-view-uid-only.c b/addressbook/tests/ebook/test-ebook-get-book-view-uid-only.c
new file mode 100644
index 0000000..d149244
--- /dev/null
+++ b/addressbook/tests/ebook/test-ebook-get-book-view-uid-only.c
@@ -0,0 +1,123 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+#include <stdlib.h>
+#include <libebook/e-book.h>
+
+#include "ebook-test-utils.h"
+
+static GMainLoop *loop;
+
+static void
+contacts_added (EBookView *book_view, const GList *contacts)
+{
+	GList *l;
+
+	for (l = (GList*)contacts; l; l = l->next) {
+		EContact *contact = l->data;
+
+		test_print ("UID: %s\n", (gchar *)e_contact_get_const (contact, E_CONTACT_UID));
+
+		if (e_contact_get_const (contact, E_CONTACT_FULL_NAME) != NULL) {
+			g_warning ("received contact name `%s' when only the uid was requested",
+				   (gchar *)e_contact_get_const (contact, E_CONTACT_FULL_NAME));
+			exit(1);
+		}
+	}
+}
+
+static void
+contacts_removed (EBookView *book_view, const GList *ids)
+{
+	GList *l;
+
+	for (l = (GList*)ids; l; l = l->next) {
+		test_print ("Removed contact: %s\n", (gchar *)l->data);
+	}
+}
+
+static void
+view_complete (EBookView *book_view, EBookViewStatus status, const gchar *error_msg)
+{
+	e_book_view_stop (book_view);
+	g_object_unref (book_view);
+	g_main_loop_quit (loop);
+}
+
+static void
+setup_and_start_view (EBookView *view)
+{
+	g_signal_connect (view, "contacts_added", G_CALLBACK (contacts_added), NULL);
+	g_signal_connect (view, "contacts_removed", G_CALLBACK (contacts_removed), NULL);
+	g_signal_connect (view, "view_complete", G_CALLBACK (view_complete), NULL);
+
+	e_book_view_start (view);
+}
+
+static void
+get_book_view_cb (EBookTestClosure *closure)
+{
+	g_assert (closure->view);
+
+	setup_and_start_view (closure->view);
+}
+
+static void
+setup_book (EBook     **book_out)
+{
+	EBook *book;
+
+	book = ebook_test_utils_book_new_temp (NULL);
+	ebook_test_utils_book_open (book, FALSE);
+
+	ebook_test_utils_book_add_contact_from_test_case_verify (book, "simple-1", NULL);
+	ebook_test_utils_book_add_contact_from_test_case_verify (book, "simple-2", NULL);
+	ebook_test_utils_book_add_contact_from_test_case_verify (book, "name-only", NULL);
+
+	*book_out = book;
+}
+
+gint
+main (gint argc, gchar **argv)
+{
+	EBook *book;
+	EBookQuery *query;
+	EBookView *view;
+	GList requested_field = { 0, };
+
+	requested_field.data = (gpointer)e_contact_field_name (E_CONTACT_UID);
+
+	g_type_init ();
+
+	/*
+	 * Sync version
+	 */
+	setup_book (&book);
+	query = e_book_query_any_field_contains ("");
+	ebook_test_utils_book_get_book_view (book, query, &requested_field, &view);
+	setup_and_start_view (view);
+
+	test_print ("successfully set up the book view\n");
+
+	loop = g_main_loop_new (NULL, TRUE);
+	g_main_loop_run (loop);
+
+        e_book_query_unref (query);
+	ebook_test_utils_book_remove (book);
+
+	/*
+	 * Async version
+	 */
+	setup_book (&book);
+	query = e_book_query_any_field_contains ("");
+
+	loop = g_main_loop_new (NULL, TRUE);
+	ebook_test_utils_book_async_get_book_view (book, query, &requested_field,
+			(GSourceFunc) get_book_view_cb, loop);
+
+	g_main_loop_run (loop);
+
+        e_book_query_unref (query);
+	ebook_test_utils_book_remove (book);
+
+	return 0;
+}
diff --git a/addressbook/tests/ebook/test-ebook-get-book-view.c b/addressbook/tests/ebook/test-ebook-get-book-view.c
index e4a3277..f8e6a20 100644
--- a/addressbook/tests/ebook/test-ebook-get-book-view.c
+++ b/addressbook/tests/ebook/test-ebook-get-book-view.c
@@ -101,7 +101,7 @@ main (gint argc, gchar **argv)
 	 */
 	setup_book (&book);
 	query = e_book_query_any_field_contains ("");
-	ebook_test_utils_book_get_book_view (book, query, &view);
+	ebook_test_utils_book_get_book_view (book, query, NULL, &view);
 	setup_and_start_view (view);
 
 	test_print ("successfully set up the book view\n");
@@ -119,7 +119,7 @@ main (gint argc, gchar **argv)
 	query = e_book_query_any_field_contains ("");
 
 	loop = g_main_loop_new (NULL, TRUE);
-	ebook_test_utils_book_async_get_book_view (book, query,
+	ebook_test_utils_book_async_get_book_view (book, query, NULL,
 			(GSourceFunc) get_book_view_cb, loop);
 
 	g_main_loop_run (loop);
