Index: evolution-exchange/calendar/e-cal-backend-exchange.c
===================================================================
--- evolution-exchange/calendar/e-cal-backend-exchange.c	(revision 1633)
+++ evolution-exchange/calendar/e-cal-backend-exchange.c	(working copy)
@@ -1952,7 +1952,16 @@
 	return g_hash_table_lookup (cbex->priv->timezones, tzid);
 }
 
+icaltimezone *
+e_cal_backend_exchange_lookup_timezone (const char *tzid,
+					const void *custom,
+					GError **error)
+{
+	return internal_get_timezone (E_CAL_BACKEND ((ECalBackendExchange *)custom),
+				      tzid);
+}
 
+
 static void
 free_exchange_comp (gpointer value)
 {
Index: evolution-exchange/calendar/e-cal-backend-exchange.h
===================================================================
--- evolution-exchange/calendar/e-cal-backend-exchange.h	(revision 1633)
+++ evolution-exchange/calendar/e-cal-backend-exchange.h	(working copy)
@@ -80,6 +80,12 @@
 ECalBackendSyncStatus	get_timezone 	(ECalBackendSync *backend,
 							EDataCal *cal, const char *tzid, char **object);
 
+/** lookup function for e_cal_check_timezones() */
+icaltimezone *
+e_cal_backend_exchange_lookup_timezone (const char *tzid,
+					const void *custom,
+					GError **error);
+
 ECalBackendExchangeComponent * get_exchange_comp (ECalBackendExchange *cbex,
 						  const char *uid);
 
Index: evolution-exchange/calendar/e-cal-backend-exchange-calendar.c
===================================================================
--- evolution-exchange/calendar/e-cal-backend-exchange-calendar.c	(revision 1633)
+++ evolution-exchange/calendar/e-cal-backend-exchange-calendar.c	(working copy)
@@ -25,6 +25,8 @@
 #include <sys/stat.h>
 #include <sys/fcntl.h>
 
+#include <libecal/e-cal-check-timezones.h>
+
 #include "e-cal-backend-exchange-calendar.h"
 
 #include "e2k-cal-utils.h"
@@ -64,6 +66,8 @@
 gboolean check_for_send_options (icalcomponent *icalcomp, E2kProperties *props);
 static void update_x_properties (ECalBackendExchange *cbex, ECalComponent *comp);
 
+
+
 static void
 add_timezones_from_comp (ECalBackendExchange *cbex, icalcomponent *icalcomp)
 {
@@ -196,6 +200,8 @@
 	GSList *attachment_list = NULL;
 	gboolean status;
 	ECalBackend *backend = E_CAL_BACKEND (cbex);
+	GError *error = NULL;
+	gboolean retval = TRUE;
 
 	/* Check for attachments */
 	if (uid)
@@ -243,14 +249,22 @@
 		icalcomponent_free (icalcomp);
 		return status;
 	} else if (kind != ICAL_VCALENDAR_COMPONENT) {
-		icalcomponent_free (icalcomp);
-		if (attachment_list) {
-			g_slist_foreach (attachment_list, (GFunc) g_free, NULL);
-			g_slist_free (attachment_list);
-		}
-		return FALSE;
+		retval = FALSE;
+		goto cleanup;
 	}
 
+	/* map time zones against system time zones and handle conflicting definitions */
+	if (!e_cal_check_timezones (icalcomp,
+				    NULL,
+				    e_cal_backend_exchange_lookup_timezone,
+				    cbex,
+				    &error)) {
+		g_warning ("checking timezones failed: %s", error->message);
+		g_clear_error (&error);
+		retval = FALSE;
+		goto cleanup;
+	}
+
 	add_timezones_from_comp (cbex, icalcomp);
 
 	subcomp = icalcomponent_get_first_component (
@@ -280,13 +294,15 @@
 		subcomp = icalcomponent_get_next_component (
 				icalcomp, ICAL_VEVENT_COMPONENT);
 	}
+
+ cleanup:
 	icalcomponent_free (icalcomp);
 
 	if (attachment_list) {
 		g_slist_foreach (attachment_list, (GFunc) g_free, NULL);
 		g_slist_free (attachment_list);
 	}
-	return TRUE;
+	return retval;
 }
 
 static const char *event_properties[] = {
@@ -1558,6 +1574,7 @@
 	icalproperty_method method;
 	icalcomponent *subcomp, *icalcomp;
 	ECalBackendSyncStatus status = GNOME_Evolution_Calendar_Success;
+	GError *error = NULL;
 
 	d(printf ("ecbexc_modify_object(%p, %p, %s)", backend, cal, calobj ? calobj : NULL));
 	cbexc =	E_CAL_BACKEND_EXCHANGE_CALENDAR (backend);
@@ -1577,6 +1594,20 @@
 		return GNOME_Evolution_Calendar_InvalidObject;
 
 	icalcomp = icalparser_parse_string (calobj);
+
+	/* map time zones against system time zones and handle conflicting definitions */
+	if (icalcomp &&
+	    !e_cal_check_timezones (icalcomp,
+				    comps,
+				    e_cal_backend_exchange_lookup_timezone,
+				    cbex,
+				    &error)) {
+		g_warning ("checking timezones failed: %s", error->message);
+		icalcomponent_free (icalcomp);
+		g_clear_error (&error);
+		return GNOME_Evolution_Calendar_InvalidObject;
+	}
+
 	add_timezones_from_comp (E_CAL_BACKEND_EXCHANGE (backend), icalcomp);
 	icalcomponent_free (icalcomp);
 
@@ -1972,10 +2003,11 @@
 	ECalBackendExchange *cbex = (ECalBackendExchange *) backend;
 	ECalBackendSyncStatus retval = GNOME_Evolution_Calendar_Success;
 	ECalBackendExchangeBookingResult result;
-	ECalComponent *comp;
-	icalcomponent *top_level, *icalcomp, *tzcomp;
+	ECalComponent *comp = NULL;
+	icalcomponent *top_level = NULL, *icalcomp, *tzcomp;
 	icalproperty *prop;
 	icalproperty_method method;
+	GError *error = NULL;
 
 	g_return_val_if_fail (E_IS_CAL_BACKEND_EXCHANGE (cbex),
 				GNOME_Evolution_Calendar_InvalidObject);
@@ -1988,6 +2020,20 @@
 	*modified_calobj = NULL;
 
 	top_level = icalparser_parse_string (calobj);
+
+	/* map time zones against system time zones and handle conflicting definitions */
+	if (top_level &&
+	    !e_cal_check_timezones (top_level,
+				    NULL,
+				    e_cal_backend_exchange_lookup_timezone,
+				    cbex,
+				    &error)) {
+		g_warning ("checking timezones failed: %s", error->message);
+		g_clear_error (&error);
+		retval = FALSE;
+		goto cleanup;
+	}
+
 	icalcomp = icalcomponent_new_clone (icalcomponent_get_inner (top_level));
 
 	comp = e_cal_component_new ();
@@ -2003,13 +2049,7 @@
 	}
 
 	/* traverse all timezones to add them to the backend */
-	tzcomp = icalcomponent_get_first_component (top_level,
-						    ICAL_VTIMEZONE_COMPONENT);
-	while (tzcomp) {
-		e_cal_backend_exchange_add_timezone (cbex, tzcomp);
-		tzcomp = icalcomponent_get_next_component (top_level,
-							   ICAL_VTIMEZONE_COMPONENT);
-	}
+	add_timezones_from_comp (cbex, top_level);
 
 	for (prop = icalcomponent_get_first_property (icalcomp, ICAL_ATTENDEE_PROPERTY);
 	     prop != NULL;
@@ -2078,8 +2118,12 @@
 	*modified_calobj = g_strdup (e_cal_component_get_as_string (comp));
 
  cleanup:
-	icalcomponent_free (top_level);
-	g_object_unref (comp);
+	if (top_level) {
+		icalcomponent_free (top_level);
+	}
+	if (comp) {
+		g_object_unref (comp);
+	}
 
 	return retval;
 }
