Index: libedata-book-dbus/e-data-book-view.c
===================================================================
--- libedata-book-dbus/e-data-book-view.c	(revision 156)
+++ libedata-book-dbus/e-data-book-view.c	(working copy)
@@ -286,15 +286,16 @@
 }
 
 void
-e_data_book_view_notify_update (EDataBookView *book_view, EContact *contact)
+e_data_book_view_notify_update (EDataBookView *book_view, char *vcard)
 {
   EDataBookViewPrivate *priv = E_DATA_BOOK_VIEW_GET_PRIVATE (book_view);
   gboolean currently_in_view, want_in_view;
   const char *id;
-  char *vcard;
+  EContact *contact;
 
   g_mutex_lock (priv->pending_mutex);
 
+  contact = e_contact_new_from_vcard (vcard);
   id = e_contact_get_const (contact, E_CONTACT_UID);
 
   currently_in_view =
@@ -303,9 +304,6 @@
     e_book_backend_sexp_match_contact (priv->card_sexp, contact);
 
   if (want_in_view) {
-    vcard = e_vcard_to_string (E_VCARD (contact),
-                               EVC_FORMAT_VCARD_30);
-
     if (currently_in_view)
       notify_change (priv, vcard);
     else
@@ -316,6 +314,7 @@
     /* else nothing; we're removing a card that wasn't there */
   }
 
+  g_object_unref (contact);
   g_mutex_unlock (priv->pending_mutex);
 }
 
Index: libedata-book-dbus/e-data-book-view.h
===================================================================
--- libedata-book-dbus/e-data-book-view.h	(revision 156)
+++ libedata-book-dbus/e-data-book-view.h	(working copy)
@@ -41,7 +41,7 @@
 GMutex*           e_data_book_view_get_mutex         (EDataBookView                *book_view);
 #endif
 void         e_data_book_view_notify_update          (EDataBookView                *book_view,
-                                                      EContact                     *contact);
+                                                      char *vcard);
 void         e_data_book_view_notify_remove          (EDataBookView                *book_view,
                                                       const char                   *id);
 void         e_data_book_view_notify_complete        (EDataBookView                *book_view, EDataBookStatus status);
Index: backends/file/e-book-backend-file.c
===================================================================
--- backends/file/e-book-backend-file.c	(revision 156)
+++ backends/file/e-book-backend-file.c	(working copy)
@@ -555,13 +555,10 @@
 			db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0);
 
 			if (db_error == 0) {
-				EContact *contact = create_contact (id_dbt.data, vcard_dbt.data);
 				/* notify_update will check if it matches for us */
-				e_data_book_view_notify_update (book_view, contact);
-				
-				g_object_unref (contact);
+				e_data_book_view_notify_update (book_view, vcard_dbt.data);
 
-				free (vcard_dbt.data);
+				//free (vcard_dbt.data);
 			}
 			else {
 				g_warning ("db->get returned %d", db_error);
@@ -592,10 +589,9 @@
 
 				/* don't include the version in the list of cards */
 				if (strcmp (id_dbt.data, E_BOOK_BACKEND_FILE_VERSION_NAME)) {
-					EContact *contact = create_contact (id_dbt.data, vcard_dbt.data);
 					/* notify_update will check if it matches for us */
-					e_data_book_view_notify_update (book_view, contact);
-					g_object_unref (contact);
+					e_data_book_view_notify_update (book_view, vcard_dbt.data);
+					//free (vcard_dbt.data);
 				}
 
 				db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_NEXT);
