diff --git a/calendar/backends/caldav/e-cal-backend-caldav.c b/calendar/backends/caldav/e-cal-backend-caldav.c
index 510e8f5..88ba6e5 100644
--- a/calendar/backends/caldav/e-cal-backend-caldav.c
+++ b/calendar/backends/caldav/e-cal-backend-caldav.c
@@ -1133,130 +1133,153 @@ synchronize_object (ECalBackendCalDAV *c
 		g_free (old_cs);
 	}
 
 	g_object_unref (comp);
 	
 	return res;
 }
 
 #define etags_match(_tag1, _tag2) ((_tag1 == _tag2) ? TRUE :                 \
 				   g_str_equal (_tag1 != NULL ? _tag1 : "",  \
 					        _tag2 != NULL ? _tag2 : "")) 
 
 static void
 synchronize_cache (ECalBackendCalDAV *cbdav)
 {
 	ECalBackendCalDAVPrivate *priv;
 	ECalBackendCache         *bcache;
 	CalDAVObject             *sobjs;
 	CalDAVObject             *object;
 	GHashTable               *hindex;
+	GHashTable               *eindex;
 	GList                    *cobjs;
 	GList                    *citer;
 	gboolean                  res;
 	int			  len;
 	int                       i;
 	
 	priv   = E_CAL_BACKEND_CALDAV_GET_PRIVATE (cbdav);	
 	bcache = priv->cache;
 	len    = 0;
 	sobjs  = NULL;
 	
 	res = caldav_server_list_objects (cbdav, &sobjs, &len);
 	
 	if (res == FALSE) {
 		/* FIXME: bloek! */
 		g_warning ("Could not synch server BLehh!");
 		return;
 	}
 
 	hindex = g_hash_table_new (g_str_hash, g_str_equal);
+	eindex = g_hash_table_new (g_str_hash, g_str_equal);
 	cobjs = e_cal_backend_cache_get_components (bcache);
 
 	/* build up a index for the href entry */	
 	for (citer = cobjs; citer; citer = g_list_next (citer)) {
 		ECalComponent *ccomp = E_CAL_COMPONENT (citer->data);
 		const char *href;	
+		const char *etag;
 		
 		href = e_cal_component_get_href (ccomp);
 		
 		if (href == NULL) {
 			g_warning ("href of object NULL :(");
 			continue;
 		}
 			
 		g_hash_table_insert (hindex, (gpointer) href, ccomp);
+
+		etag = e_cal_component_get_etag (ccomp);
+		if (etag == NULL) {
+			g_warning ("etag of object NULL :(");
+			continue;
+		}
+			
+		g_hash_table_insert (eindex, (gpointer) etag, ccomp);
 	}
 	
 	/* see if we have to upate or add some objects */
 	for (i = 0, object = sobjs; i < len; i++, object++) {
 		ECalComponent *ccomp;
 		const char *etag = NULL;
+		int found_by_etag = 0;
 
 		if (object->status != 200) {
 			/* just continue here, so that the object
 			 * doesnt get removed from the cobjs list
 			 * - therefore it will be removed */
 			continue;
 		}
 
 		res = TRUE;
 		ccomp = g_hash_table_lookup (hindex, object->href);
+
+		if (ccomp == NULL  && object->etag != NULL ) {
+			/* Since we might format URLs differently to the server, search by ETag also */
+			g_warning ("Couldn't find HREF: %s so searching for ETAG: %s", object->href, object->etag );
+			ccomp = g_hash_table_lookup (eindex, object->etag);
+			if (ccomp != NULL) {
+				found_by_etag = 1;
+				g_warning ("Found object by ETAG: %s rather than HREF: %s", object->etag, object->href );
+			} 
+		} 
 		
 		if (ccomp != NULL) {
 			etag = e_cal_component_get_etag (ccomp);	
 		} 
 		
-		if (!etag || !etags_match (etag, object->etag)) {
+		if (!etag || !etags_match (etag, object->etag) || found_by_etag ) {
 			res = synchronize_object (cbdav, object, ccomp);
 		}
 	 	
 		if (res == TRUE) {
 			cobjs = g_list_remove (cobjs, ccomp);
 		}
 
 		caldav_object_free (object, FALSE);
 	}
 
 	/* remove old (not on server anymore) items from cache */
 	for (citer = cobjs; citer; citer = g_list_next (citer)) {
 		ECalComponent *comp;
 		const char *uid;
 		
 		comp = E_CAL_COMPONENT (citer->data);
 		e_cal_component_get_uid (comp, &uid);
 
 		if (e_cal_backend_cache_remove_component (bcache, uid, NULL) && 
 		    priv->report_changes) {
 			char *str = e_cal_component_get_as_string (comp);
 			ECalComponentId *id = e_cal_component_get_id (comp);
 		       	
 			e_cal_backend_notify_object_removed (E_CAL_BACKEND (cbdav), 
 							     id, str, NULL);
 			e_cal_component_free_id (id);
 			g_free (str);
 		}
 
 		g_object_unref (comp);
 	}
 	
 	g_hash_table_destroy (hindex);
+	g_hash_table_destroy (eindex);
 	g_list_free (cobjs);
 	
 }
 
 /* ************************************************************************* */
 static gpointer 
 synch_slave_loop (gpointer data)
 {
 	ECalBackendCalDAVPrivate *priv;
 	ECalBackendCalDAV        *cbdav;
 	
 	cbdav = E_CAL_BACKEND_CALDAV (data);	
 	priv = E_CAL_BACKEND_CALDAV_GET_PRIVATE (cbdav);
 
 	g_mutex_lock (priv->lock);	
 
 	while (priv->slave_cmd != SLAVE_SHOULD_DIE) {
 		GTimeVal alarm_clock;	
 		if (priv->slave_cmd == SLAVE_SHOULD_SLEEP) {
 			/* just sleep until we get woken up again */
