<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -34,6 +34,7 @@
 #include &lt;libedata-cal/e-cal-backend-cache.h&gt;
 #include &lt;libedata-cal/e-cal-backend-util.h&gt;
 #include &lt;libedata-cal/e-cal-backend-sexp.h&gt;
+#include &lt;libedata-cal/e-cal-backend-intervaltree.h&gt;
 
 /* LibXML2 includes */
 #include &lt;libxml/parser.h&gt;
@@ -2345,7 +2346,18 @@ caldav_get_object_list (ECalBackendSync  *backend,
 
 	g_mutex_lock (priv-&gt;lock);
 
-	list = e_cal_backend_cache_get_components (bcache);
+	time_t occur_start = -1, occur_end = -1;
+	gboolean prunning_by_time = e_cal_backend_sexp_evaluate_occur_times(sexp,
+									    &amp;occur_start,
+									    &amp;occur_end);
+
+	g_mutex_lock (priv-&gt;lock);
+
+	bkend = E_CAL_BACKEND (backend);
+
+	list = prunning_by_time ?
+		e_cal_backend_cache_get_components_occuring_in_range (priv-&gt;cache, occur_start, occur_end)
+		: e_cal_backend_cache_get_components (priv-&gt;cache);
 	bkend = E_CAL_BACKEND (backend);
 
 	for (iter = list; iter; iter = g_list_next (iter)) {
@@ -2394,11 +2406,19 @@ caldav_start_query (ECalBackend  *backend,
 		do_search = TRUE;
 	}
 
+	time_t occur_start = -1, occur_end = -1;
+	gboolean prunning_by_time = e_cal_backend_sexp_evaluate_occur_times(sexp,
+									    &amp;occur_start,
+									    &amp;occur_end);
+
 	g_mutex_lock (priv-&gt;lock);
 
-	list = e_cal_backend_cache_get_components (priv-&gt;cache);
 	bkend = E_CAL_BACKEND (backend);
 
+	list = prunning_by_time ?
+		e_cal_backend_cache_get_components_occuring_in_range (priv-&gt;cache, occur_start, occur_end)
+		: e_cal_backend_cache_get_components (priv-&gt;cache);
+
 	for (iter = list; iter; iter = g_list_next (iter)) {
 		ECalComponent *comp = E_CAL_COMPONENT (iter-&gt;data);
 </diff>
      <filename>calendar/backends/caldav/e-cal-backend-caldav.c</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@ INCLUDES =						\
 	-I$(top_builddir)/calendar/libical/src/libical	\
 	$(EVOLUTION_CALENDAR_CFLAGS)
 
-noinst_PROGRAMS = test-intervaltree test-intervaltree-coverage test-interval-searches
+noinst_PROGRAMS = test-interval-searches
 extension_LTLIBRARIES = libecalbackendfile.la
 
 libecalbackendfile_la_SOURCES =		\
@@ -18,8 +18,6 @@ libecalbackendfile_la_SOURCES =		\
 	e-cal-backend-file-factory.h\
 	e-cal-backend-file-events.c\
 	e-cal-backend-file-events.h\
-	e-cal-backend-file-intervaltree.c\
-	e-cal-backend-file-intervaltree.h\
 	e-cal-backend-file-journal.c\
 	e-cal-backend-file-journal.h\
 	e-cal-backend-file-todos.c\
@@ -38,16 +36,6 @@ libecalbackendfile_la_CFLAGS =	$(AM_CFLAGS)
 libecalbackendfile_la_LDFLAGS =		\
 	-module -avoid-version $(NO_UNDEFINED)
 
-test_intervaltree_SOURCES = test-intervaltree.c e-cal-backend-file-intervaltree.c
-
-test_intervaltree_LDADD = \
-	$(top_builddir)/calendar/libecal/libecal-1.2.la				\
-	$(top_builddir)/calendar/libedata-cal/libedata-cal-1.2.la		\
-	$(top_builddir)/libedataserver/libedataserver-1.2.la			\
-	$(EVOLUTION_CALENDAR_LIBS)
-
-test_intervaltree_CFLAGS = $(AM_CFLAGS)
-
 test_interval_searches_SOURCES = e-cal-backend-file.c
 
 test_interval_searches_LDADD = \
@@ -59,24 +47,3 @@ test_interval_searches_LDADD = \
 
 test_interval_searches_CFLAGS = $(AM_CFLAGS) -DTEST_QUERY_RESULT
 
-test_intervaltree_coverage_SOURCES = test-intervaltree.c e-cal-backend-file-intervaltree.c
-
-test_intervaltree_coverage_LDADD = \
-	$(top_builddir)/calendar/libecal/libecal-1.2.la				\
-	$(top_builddir)/calendar/libedata-cal/libedata-cal-1.2.la		\
-	$(top_builddir)/libedataserver/libedataserver-1.2.la			\
-	$(EVOLUTION_CALENDAR_LIBS)						\
-	-lgcov
-
-test_intervaltree_coverage_CFLAGS = $(AM_CFLAGS) -fprofile-arcs -ftest-coverage 
-
-.PHONY: coverage
-coverage: 
-	mkdir -p ./coverage
-	lcov --directory . --zerocounters
-	./test-intervaltree-coverage
-	lcov --directory . --capture --output-file ./coverage/*.info
-	genhtml -o ./coverage --legend --num-spaces 2 ./coverage/*.info
-
-clean-local:
-	rm -f *.gcda *.gcno</diff>
      <filename>calendar/backends/file/Makefile.am</filename>
    </modified>
    <modified>
      <diff>@@ -42,8 +42,8 @@
 #include &lt;libecal/e-cal-check-timezones.h&gt;
 #include &lt;libedata-cal/e-cal-backend-util.h&gt;
 #include &lt;libedata-cal/e-cal-backend-sexp.h&gt;
+#include &lt;libedata-cal/e-cal-backend-intervaltree.h&gt;
 #include &quot;e-cal-backend-file-events.h&quot;
-#include &quot;e-cal-backend-file-intervaltree.h&quot;
 
 #ifndef O_BINARY
 #define O_BINARY 0
@@ -533,7 +533,7 @@ remove_component_from_intervaltree (ECalBackendFile *cbfile, ECalComponent *comp
 	} else {
 		char *rid = e_cal_component_get_recurid_as_string (comp);
 		e_cal_component_get_uid (comp, &amp;uid);
-		gboolean res = e_intervaltree_remove (priv-&gt;interval_tree, uid, rid, time_start, time_end);
+		gboolean res = e_intervaltree_remove (priv-&gt;interval_tree, uid, rid);
 		g_free (rid);
 		return res;
 	}</diff>
      <filename>calendar/backends/file/e-cal-backend-file.c</filename>
    </modified>
    <modified>
      <diff>@@ -111,7 +111,7 @@ e_cal_backend_google_utils_populate_cache (ECalBackendGoogle *cbgo)
 			comp_str = e_cal_component_get_as_string (comp);
 
 			e_cal_backend_notify_object_created (E_CAL_BACKEND(cbgo), (const char *)comp_str);
-			e_cal_backend_cache_put_component (cache, comp);
+			e_cal_backend_google_put_component_to_cache (cbgo, comp);
 			g_object_unref (comp);
 			g_free (comp_str);
 		}
@@ -719,7 +719,7 @@ utils_update_insertion (ECalBackendGoogle *cbgo, ECalBackendCache *cache, EGoIte
 
 		if (comp) {
 			e_cal_component_commit_sequence (comp);
-			e_cal_backend_cache_put_component (cache, comp);
+			e_cal_backend_google_put_component_to_cache (cbgo, comp);
 
 			temp = e_cal_component_get_as_string (comp);
 </diff>
      <filename>calendar/backends/google/e-cal-backend-google-utils.c</filename>
    </modified>
    <modified>
      <diff>@@ -44,6 +44,7 @@
 
 #include &lt;libedata-cal/e-cal-backend-util.h&gt;
 #include &lt;libedata-cal/e-cal-backend-sexp.h&gt;
+#include &lt;libedata-cal/e-cal-backend-intervaltree.h&gt;
 
 #include &lt;libecal/e-cal-recur.h&gt;
 #include &lt;libecal/e-cal-time-util.h&gt;
@@ -317,7 +318,16 @@ e_cal_backend_google_get_object_list (ECalBackendSync *backend, EDataCal *cal, c
 	}
 
 	*objects = NULL;
-	components = e_cal_backend_cache_get_components (priv-&gt;cache);
+	time_t occur_start = -1, occur_end = -1;
+	gboolean prunning_by_time = e_cal_backend_sexp_evaluate_occur_times(cbsexp,
+									    &amp;occur_start,
+									    &amp;occur_end);
+
+	components = !prunning_by_time ?
+		e_cal_backend_cache_get_components (priv-&gt;cache)
+		: e_cal_backend_cache_get_components_occuring_in_range (priv-&gt;cache,
+								       occur_start,
+								       occur_end);
 
 	for (l = components; l != NULL; l = l-&gt;next) {
 		ECalComponent *comp = E_CAL_COMPONENT (l-&gt;data);</diff>
      <filename>calendar/backends/google/e-cal-backend-google.c</filename>
    </modified>
    <modified>
      <diff>@@ -37,6 +37,7 @@
 #include &quot;libedataserver/e-url.h&quot;
 #include &lt;libedata-cal/e-cal-backend-cache.h&gt;
 #include &lt;libedata-cal/e-cal-backend-util.h&gt;
+#include &lt;libedata-cal/e-cal-backend-intervaltree.h&gt;
 #include &lt;libecal/e-cal-component.h&gt;
 #include &lt;libecal/e-cal-time-util.h&gt;
 #include &quot;e-cal-backend-groupwise.h&quot;
@@ -1678,7 +1679,14 @@ e_cal_backend_groupwise_get_object_list (ECalBackendSync *backend, EDataCal *cal
 	}
 
 	*objects = NULL;
-	components = e_cal_backend_cache_get_components (priv-&gt;cache);
+	time_t occur_start = -1, occur_end = -1;
+	gboolean prunning_by_time = e_cal_backend_sexp_evaluate_occur_times(cbsexp,
+									    &amp;occur_start,
+									    &amp;occur_end);
+	components = prunning_by_time ?
+		e_cal_backend_cache_get_components_occuring_in_range (priv-&gt;cache, occur_start, occur_end)
+		: e_cal_backend_cache_get_components (priv-&gt;cache);
+
         for (l = components; l != NULL; l = l-&gt;next) {
                 ECalComponent *comp = E_CAL_COMPONENT (l-&gt;data);
 </diff>
      <filename>calendar/backends/groupwise/e-cal-backend-groupwise.c</filename>
    </modified>
    <modified>
      <diff>@@ -35,6 +35,7 @@
 #include &lt;libedata-cal/e-cal-backend-cache.h&gt;
 #include &lt;libedata-cal/e-cal-backend-util.h&gt;
 #include &lt;libedata-cal/e-cal-backend-sexp.h&gt;
+#include &lt;libedata-cal/e-cal-backend-intervaltree.h&gt;
 #include &lt;libsoup/soup.h&gt;
 #include &quot;e-cal-backend-http.h&quot;
 
@@ -839,7 +840,14 @@ e_cal_backend_http_get_object_list (ECalBackendSync *backend, EDataCal *cal, con
 	cbsexp = e_cal_backend_sexp_new (sexp);
 
 	*objects = NULL;
-	components = e_cal_backend_cache_get_components (priv-&gt;cache);
+	time_t occur_start = -1, occur_end = -1;
+	gboolean prunning_by_time = e_cal_backend_sexp_evaluate_occur_times(cbsexp,
+									    &amp;occur_start,
+									    &amp;occur_end);
+
+	components = prunning_by_time ?
+		e_cal_backend_cache_get_components_occuring_in_range (priv-&gt;cache, occur_start, occur_end)
+		: e_cal_backend_cache_get_components (priv-&gt;cache);
 	for (l = components; l != NULL; l = l-&gt;next) {
 		if (e_cal_backend_sexp_match_comp (cbsexp, E_CAL_COMPONENT (l-&gt;data), E_CAL_BACKEND (backend))) {
 			*objects = g_list_append (*objects, e_cal_component_get_as_string (l-&gt;data));
@@ -876,7 +884,15 @@ e_cal_backend_http_start_query (ECalBackend *backend, EDataCalView *query)
 	cbsexp = e_cal_backend_sexp_new (e_data_cal_view_get_text (query));
 
 	objects = NULL;
-	components = e_cal_backend_cache_get_components (priv-&gt;cache);
+	time_t occur_start = -1, occur_end = -1;
+	gboolean prunning_by_time = e_cal_backend_sexp_evaluate_occur_times(cbsexp,
+									    &amp;occur_start,
+									    &amp;occur_end);
+
+	components = prunning_by_time ?
+		e_cal_backend_cache_get_components_occuring_in_range (priv-&gt;cache, occur_start, occur_end)
+		: e_cal_backend_cache_get_components (priv-&gt;cache);
+
 	for (l = components; l != NULL; l = l-&gt;next) {
 		if (e_cal_backend_sexp_match_comp (cbsexp, E_CAL_COMPONENT (l-&gt;data), E_CAL_BACKEND (backend))) {
 			objects = g_list_append (objects, e_cal_component_get_as_string (l-&gt;data));</diff>
      <filename>calendar/backends/http/e-cal-backend-http.c</filename>
    </modified>
    <modified>
      <diff>@@ -22,6 +22,7 @@
 #include &lt;libedata-cal/e-cal-backend-cache.h&gt;
 #include &lt;libedata-cal/e-cal-backend-util.h&gt;
 #include &lt;libedata-cal/e-cal-backend-sexp.h&gt;
+#include &lt;libedata-cal/e-cal-backend-intervaltree.h&gt;
 #include &lt;glib/gi18n-lib.h&gt;
 #include &lt;string.h&gt;
 #include &quot;e-cal-backend-weather.h&quot;
@@ -554,7 +555,15 @@ e_cal_backend_weather_get_object_list (ECalBackendSync *backend, EDataCal *cal,
 		return GNOME_Evolution_Calendar_InvalidQuery;
 
 	*objects = NULL;
-	components = e_cal_backend_cache_get_components (priv-&gt;cache);
+	time_t occur_start = -1, occur_end = -1;
+	gboolean prunning_by_time = e_cal_backend_sexp_evaluate_occur_times(sexp,
+									    &amp;occur_start,
+									    &amp;occur_end);
+
+	components = prunning_by_time ?
+		e_cal_backend_cache_get_components_occuring_in_range (priv-&gt;cache, occur_start, occur_end)
+		: e_cal_backend_cache_get_components (priv-&gt;cache);
+
 	for (l = components; l != NULL; l = g_list_next (l)) {
 		if (e_cal_backend_sexp_match_comp (sexp, E_CAL_COMPONENT (l-&gt;data), E_CAL_BACKEND (backend)))
 			*objects = g_list_append (*objects, e_cal_component_get_as_string (l-&gt;data));
@@ -720,7 +729,16 @@ static void e_cal_backend_weather_start_query (ECalBackend *backend, EDataCalVie
 	}
 
 	objects = NULL;
-	components = e_cal_backend_cache_get_components (priv-&gt;cache);
+
+	time_t occur_start = -1, occur_end = -1;
+	gboolean prunning_by_time = e_cal_backend_sexp_evaluate_occur_times(sexp,
+									    &amp;occur_start,
+									    &amp;occur_end);
+
+	components = prunning_by_time ?
+		e_cal_backend_cache_get_components_occuring_in_range (priv-&gt;cache, occur_start, occur_end)
+		: e_cal_backend_cache_get_components (priv-&gt;cache);
+
 	for (l = components; l != NULL; l = g_list_next (l)) {
 		if (e_cal_backend_sexp_match_comp (sexp, E_CAL_COMPONENT (l-&gt;data), backend))
 			objects = g_list_append (objects, e_cal_component_get_as_string (l-&gt;data));</diff>
      <filename>calendar/backends/weather/e-cal-backend-weather.c</filename>
    </modified>
    <modified>
      <diff>@@ -32,13 +32,14 @@ $(CORBA_GENERATED_C): $(CORBA_GENERATED_H)
 
 # The libraray
 lib_LTLIBRARIES = libedata-cal-1.2.la
-noinst_PROGRAMS = test-e-sexp
+noinst_PROGRAMS = test-e-sexp test-intervaltree test-intervaltree-coverage 
 
 libedata_cal_1_2_la_SOURCES =		\
 	$(CORBA_GENERATED_C)		\
 	e-cal-backend.c			\
 	e-cal-backend-cache.c		\
 	e-cal-backend-factory.c		\
+	e-cal-backend-intervaltree.c	\
 	e-cal-backend-sexp.c		\
 	e-cal-backend-sync.c		\
 	e-cal-backend-util.c		\
@@ -62,6 +63,7 @@ libedata_calinclude_HEADERS = 		\
 	e-cal-backend.h			\
 	e-cal-backend-cache.h		\
 	e-cal-backend-factory.h		\
+	e-cal-backend-intervaltree.h	\
 	e-cal-backend-sync.h		\
 	e-cal-backend-util.h		\
 	e-cal-backend-sexp.h		\
@@ -77,6 +79,38 @@ test_e_sexp_SOURCES = e-cal-backend-sexp.c
 test_e_sexp_CFLAGS = $(AM_CFLAGS) -DTESTER
 test_e_sexp_LDADD = libedata-cal-1.2.la $(E_DATA_SERVER_LIBS)
 
+test_intervaltree_SOURCES = test-intervaltree.c e-cal-backend-intervaltree.c
+
+test_intervaltree_LDADD = \
+	$(top_builddir)/calendar/libecal/libecal-1.2.la				\
+	$(top_builddir)/calendar/libedata-cal/libedata-cal-1.2.la		\
+	$(top_builddir)/libedataserver/libedataserver-1.2.la			\
+	$(EVOLUTION_CALENDAR_LIBS)
+
+test_intervaltree_coverage_SOURCES = test-intervaltree.c e-cal-backend-intervaltree.c
+
+test_intervaltree_coverage_LDADD = \
+	$(top_builddir)/calendar/libecal/libecal-1.2.la				\
+	$(top_builddir)/calendar/libedata-cal/libedata-cal-1.2.la		\
+	$(top_builddir)/libedataserver/libedataserver-1.2.la			\
+	$(EVOLUTION_CALENDAR_LIBS)						\
+	-lgcov
+
+test_intervaltree_coverage_CFLAGS = $(AM_CFLAGS) -fprofile-arcs -ftest-coverage 
+
+.PHONY: coverage
+coverage: 
+	mkdir -p ./coverage
+	lcov --directory . --zerocounters
+	./test-intervaltree-coverage
+	lcov --directory . --capture --output-file ./coverage/*.info
+	genhtml -o ./coverage --legend --num-spaces 2 ./coverage/*.info
+
+clean-local:
+	rm -f *.gcda *.gcno
+
+test_intervaltree_CFLAGS = $(AM_CFLAGS)
+
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = libedata-cal-$(API_VERSION).pc
 </diff>
      <filename>calendar/libedata-cal/Makefile.am</filename>
    </modified>
    <modified>
      <diff>@@ -26,11 +26,13 @@
 #include &lt;string.h&gt;
 #include &lt;libecal/e-cal-util.h&gt;
 #include &quot;e-cal-backend-cache.h&quot;
+#include &quot;e-cal-backend-intervaltree.h&quot;
 
 struct _ECalBackendCachePrivate {
 	char *uri;
 	ECalSourceType source_type;
 	GHashTable *timezones;
+	EIntervalTree *intervaltree;
 };
 
 /* Property IDs */
@@ -42,6 +44,14 @@ enum {
 
 static GObjectClass *parent_class = NULL;
 
+static icaltimezone *
+resolve_tzid (const char *tzid)
+{
+	return (!strcmp (tzid, &quot;UTC&quot;))
+		? icaltimezone_get_utc_timezone ()
+		: icaltimezone_get_builtin_timezone_from_tzid (tzid);
+}
+
 static char *
 get_filename_from_uri (const char *uri, ECalSourceType source_type)
 {
@@ -159,11 +169,60 @@ e_cal_backend_cache_finalize (GObject *object)
 
 		g_free (priv);
 		cache-&gt;priv = NULL;
+
+		e_intervaltree_destroy (priv-&gt;intervaltree);
 	}
 
 	parent_class-&gt;finalize (object);
 }
 
+static void
+cache_reloaded_callback (EFileCache *self) 
+{
+	GSList *l;
+	icalcomponent *icalcomp;
+        char *comp_str;
+	ECalComponent *comp = NULL;
+
+	ECalBackendCache *cache = E_CAL_BACKEND_CACHE(self);
+	ECalBackendCachePrivate *priv = cache-&gt;priv;
+
+        if (!(l = e_file_cache_get_objects (self)))
+                return;
+
+	icaltimezone * default_zone = e_cal_backend_cache_get_default_timezone (cache);
+
+        for ( ; l != NULL; l = g_slist_next (l)) {
+                comp_str = l-&gt;data;
+                if (comp_str) {
+                        icalcomp = icalparser_parse_string (comp_str);
+                        if (icalcomp) {
+				icalcomponent_kind kind;
+
+				kind = icalcomponent_isa (icalcomp);
+
+				if (kind == ICAL_VEVENT_COMPONENT ||
+				    kind == ICAL_VTODO_COMPONENT || kind == ICAL_VJOURNAL_COMPONENT) {
+					comp = e_cal_component_new ();
+					if (e_cal_component_set_icalcomponent (comp, icalcomp)) {
+						time_t time_start, time_end;
+
+						get_component_occur_times (comp, &amp;time_start, &amp;time_end,
+									   resolve_tzid, NULL, default_zone);
+
+						e_intervaltree_insert (priv-&gt;intervaltree, time_start, time_end, comp);
+					}
+					else
+						g_object_unref (comp);
+				}
+				else
+					icalcomponent_free (icalcomp);
+			}
+		}
+	}
+}
+
+
 static GObject *
 e_cal_backend_cache_constructor (GType type,
                                  guint n_construct_properties,
@@ -221,6 +280,10 @@ e_cal_backend_cache_class_init (ECalBackendCacheClass *klass)
 					 g_param_spec_string (&quot;uri&quot;, NULL, NULL, &quot;&quot;,
 							      G_PARAM_READABLE | G_PARAM_WRITABLE
 							      | G_PARAM_CONSTRUCT_ONLY));
+
+	EFileCacheClass *file_class = E_FILE_CACHE_CLASS(klass);
+
+	file_class-&gt;cache_reloaded_callback = cache_reloaded_callback;
 }
 
 static void
@@ -240,6 +303,8 @@ e_cal_backend_cache_init (ECalBackendCache *cache)
 		(GDestroyNotify) g_free,
 		(GDestroyNotify) timezones_value_destroy);
 
+	priv-&gt;intervaltree = e_intervaltree_new();
+
 	cache-&gt;priv = priv;
 
 }
@@ -380,6 +445,7 @@ e_cal_backend_cache_put_component (ECalBackendCache *cache,
 	char *rid;
 	gboolean retval;
 	ECalBackendCachePrivate *priv;
+	time_t occurence_start, occurence_end;
 
 	g_return_val_if_fail (E_IS_CAL_BACKEND_CACHE (cache), FALSE);
 	g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE);
@@ -400,6 +466,13 @@ e_cal_backend_cache_put_component (ECalBackendCache *cache,
 	else
 		retval = e_file_cache_add_object (E_FILE_CACHE (cache), real_key, comp_str);
 
+	icaltimezone * default_zone = e_cal_backend_cache_get_default_timezone (cache);
+
+	get_component_occur_times (comp, &amp;occurence_start, &amp;occurence_end,
+				   resolve_tzid, NULL, default_zone);
+
+	e_intervaltree_insert (priv-&gt;intervaltree, occurence_start, occurence_end, comp);
+
 	g_free (real_key);
 	g_free (comp_str);
 	g_free (rid);
@@ -441,6 +514,9 @@ e_cal_backend_cache_remove_component (ECalBackendCache *cache,
 	retval = e_file_cache_remove_object (E_FILE_CACHE (cache), real_key);
 	g_free (real_key);
 
+	if (retval)
+		retval = e_intervaltree_remove (priv-&gt;intervaltree, uid, rid);
+
 	return retval;
 }
 
@@ -494,6 +570,57 @@ e_cal_backend_cache_get_components (ECalBackendCache *cache)
 }
 
 /**
+ * e_cal_backend_cache_get_components_occuring_in_range:
+ * @cache: An #ECalBackendCache object.
+ * @start:
+ * @end:
+ *
+ * Retrieves a list of components stored in the cache, that are occuring
+ * in time range [start, end].
+ *
+ * Return value: A list of the components. Each item in the list is
+ * an #ECalComponent, which should be freed when no longer needed.
+ */
+GList *
+e_cal_backend_cache_get_components_occuring_in_range (ECalBackendCache *cache, time_t start, time_t end)
+{
+        GList *l;
+	GList *list = NULL;
+	icalcomponent *icalcomp;
+	ECalComponent *comp = NULL;
+	ECalBackendCachePrivate *priv;
+
+        /* return null if cache is not a valid Backend Cache.  */
+	g_return_val_if_fail (E_IS_CAL_BACKEND_CACHE (cache), NULL);
+	priv = cache-&gt;priv;
+	if (!(l = e_intervaltree_search (priv-&gt;intervaltree, start, end)))
+                return NULL;
+
+	for ( ; l != NULL; l = g_list_next (l)) {
+		comp = l-&gt;data;
+		icalcomp = e_cal_component_get_icalcomponent (comp);
+		if (icalcomp) {
+			icalcomponent_kind kind;
+
+			kind = icalcomponent_isa (icalcomp);
+			if (kind == ICAL_VEVENT_COMPONENT || kind == ICAL_VTODO_COMPONENT || kind == ICAL_VJOURNAL_COMPONENT) {
+				/* already ref-ed in list l */
+				list = g_list_prepend (list, comp);
+			}
+			else
+				g_object_unref (comp);
+		}
+		else
+			g_object_unref (comp);
+	}
+
+	g_list_free (l);
+
+        return list;
+}
+
+
+/**
  * e_cal_backend_cache_get_components_by_uid:
  * @cache: An #ECalBackendCache object.
  * @uid: ID of the component to retrieve.</diff>
      <filename>calendar/libedata-cal/e-cal-backend-cache.c</filename>
    </modified>
    <modified>
      <diff>@@ -57,6 +57,7 @@ gboolean            e_cal_backend_cache_remove_component (ECalBackendCache *cach
 							  const char *rid);
 GList              *e_cal_backend_cache_get_components (ECalBackendCache *cache);
 GSList             *e_cal_backend_cache_get_components_by_uid (ECalBackendCache *cache, const char *uid);
+GList		   *e_cal_backend_cache_get_components_occuring_in_range (ECalBackendCache *cache, time_t start, time_t end);
 
 
 </diff>
      <filename>calendar/libedata-cal/e-cal-backend-cache.h</filename>
    </modified>
    <modified>
      <diff>@@ -46,6 +46,18 @@ enum {
 G_DEFINE_TYPE (EFileCache, e_file_cache, G_TYPE_OBJECT);
 
 static void
+e_file_cache_reloaded_callback (EFileCache *self) 
+{
+       EFileCacheClass *klass;
+       g_return_if_fail (E_IS_FILE_CACHE (self));
+
+       klass = E_FILE_CACHE_GET_CLASS (self);
+
+       if (klass-&gt;cache_reloaded_callback)
+               klass-&gt;cache_reloaded_callback (self);
+}
+
+static void
 e_file_cache_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
 {
 	EFileCache *cache;
@@ -85,6 +97,10 @@ e_file_cache_set_property (GObject *object, guint property_id, const GValue *val
 					   g_value_get_string (value));
 			}
 		}
+
+               if (priv-&gt;xml_hash)
+                       e_file_cache_reloaded_callback (cache);
+
 		break;
 	default :
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -494,4 +510,3 @@ e_file_cache_get_filename (EFileCache *cache)
 	g_return_val_if_fail (E_IS_FILE_CACHE (cache), NULL);
 	return (const char *) cache-&gt;priv-&gt;filename;
 }
-</diff>
      <filename>libebackend/e-file-cache.c</filename>
    </modified>
    <modified>
      <diff>@@ -31,6 +31,7 @@ G_BEGIN_DECLS
 #define E_FILE_CACHE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_FILE_CACHE, EFileCacheClass))
 #define E_IS_FILE_CACHE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_FILE_CACHE))
 #define E_IS_FILE_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_FILE_CACHE))
+#define E_FILE_CACHE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_FILE_CACHE, EFileCacheClass))
 
 typedef struct _EFileCachePrivate EFileCachePrivate;
 
@@ -41,6 +42,7 @@ typedef struct {
 
 typedef struct {
 	GObjectClass parent_class;
+	void (*cache_reloaded_callback) (EFileCache *self);
 } EFileCacheClass;
 
 GType       e_file_cache_get_type (void);
@@ -59,7 +61,6 @@ gboolean    e_file_cache_remove_object (EFileCache *cache, const char *key);
 void        e_file_cache_freeze_changes (EFileCache *cache);
 void        e_file_cache_thaw_changes (EFileCache *cache);
 const char *e_file_cache_get_filename (EFileCache *cache);
-
 G_END_DECLS
 
 #endif</diff>
      <filename>libebackend/e-file-cache.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>de2890881d06cd77c9e9207a175a3dbd9287731e</id>
    </parent>
  </parents>
  <author>
    <name>Stanislav Slusny</name>
    <email>stanislav.slusny@zonio.net</email>
  </author>
  <url>http://github.com/slusnys/evolution-data-server/commit/0aec94389f53190c18a14611ae7566d8e3f26544</url>
  <id>0aec94389f53190c18a14611ae7566d8e3f26544</id>
  <committed-date>2008-08-18T14:20:04-07:00</committed-date>
  <authored-date>2008-08-18T11:17:10-07:00</authored-date>
  <message>Using interval trees in ECalBackendCache

Speeding up calendar-backend queries methods by using interval
trees.</message>
  <tree>780c13ea855d4f312c8b033ab92686d7f252f759</tree>
  <committer>
    <name>Stanislav Slusny</name>
    <email>stanislav.slusny@zonio.net</email>
  </committer>
</commit>
