Index: calendar/ChangeLog
===================================================================
--- calendar/ChangeLog	(revision 7812)
+++ calendar/ChangeLog	(working copy)
@@ -1,3 +1,10 @@
+2007-06-12  Milan Crha  <mcrha@redhat.com>
+
+	** Fix for bug #311098
+	
+	* backends/contacts/e-cal-backend-contacts.c: (contacts_changed_cb):
+	Always remove old tracked data and add new if possible.
+
 2007-06-04  Chenthill Palanisamy  <pchenthill@novell.com>
 
 	* libedata-cal/e-cal-backend-sexp.c: (resolve_tzid),
Index: calendar/backends/contacts/e-cal-backend-contacts.c
===================================================================
--- calendar/backends/contacts/e-cal-backend-contacts.c	(revision 7812)
+++ calendar/backends/contacts/e-cal-backend-contacts.c	(working copy)
@@ -331,11 +331,13 @@
                 EContact *contact = E_CONTACT (i->data);
                 const char *uid = e_contact_get_const (contact, E_CONTACT_UID);
                 
-                /* If no date is set, remove from list of tracked contacts */                 
-                if (!e_contact_get (contact, E_CONTACT_BIRTH_DATE) &&
-                    !e_contact_get (contact, E_CONTACT_ANNIVERSARY)) {
-                        g_hash_table_remove (cbc->priv->tracked_contacts, (char *)uid);
-                } else {
+                /* Because this is a change of contact, then always remove old tracked data
+		   and if possible, add with (possibly) new values.
+		*/
+		g_hash_table_remove (cbc->priv->tracked_contacts, (char *)uid);
+
+                if (e_contact_get (contact, E_CONTACT_BIRTH_DATE) ||
+                    e_contact_get (contact, E_CONTACT_ANNIVERSARY)) {
                         ContactRecord *cr = contact_record_new (cbc, contact);
                         g_hash_table_insert (cbc->priv->tracked_contacts, g_strdup (uid), cr);
                 }
