diff --git a/.evolution-ews.metadata b/.evolution-ews.metadata
index 9ab02f0..a1d024b 100644
--- a/.evolution-ews.metadata
+++ b/.evolution-ews.metadata
@@ -1 +1 @@
-91e3751daa5f9fd1e410c7d930e956ba50bc9148 SOURCES/evolution-ews-3.22.6.tar.xz
+22caa0a3798f51757f88fd19c9ca74284f62b0d3 SOURCES/evolution-ews-3.28.5.tar.xz
diff --git a/.gitignore b/.gitignore
index 268a645..87291d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/evolution-ews-3.22.6.tar.xz
+SOURCES/evolution-ews-3.28.5.tar.xz
diff --git a/SOURCES/evolution-ews-3.22.6-free-busy-calendar.patch b/SOURCES/evolution-ews-3.22.6-free-busy-calendar.patch
deleted file mode 100644
index 0e1f71f..0000000
--- a/SOURCES/evolution-ews-3.22.6-free-busy-calendar.patch
+++ /dev/null
@@ -1,1648 +0,0 @@
-diff -up evolution-ews-3.22.6/src/calendar/e-cal-backend-ews.c.free-busy-calendar evolution-ews-3.22.6/src/calendar/e-cal-backend-ews.c
---- evolution-ews-3.22.6/src/calendar/e-cal-backend-ews.c.free-busy-calendar	2017-02-06 14:06:19.000000000 +0100
-+++ evolution-ews-3.22.6/src/calendar/e-cal-backend-ews.c	2017-05-24 15:38:44.189519188 +0200
-@@ -43,6 +43,7 @@
- #include <calendar/gui/itip-utils.h>
- 
- #include "server/e-source-ews-folder.h"
-+#include "server/e-ews-calendar-utils.h"
- #include "server/e-ews-connection-utils.h"
- 
- #include "utils/ews-camel-common.h"
-@@ -87,6 +88,7 @@ struct _ECalBackendEwsPrivate {
- 
- 	guint subscription_key;
- 	gboolean listen_notifications;
-+	gboolean is_freebusy_calendar;
- };
- 
- #define PRIV_LOCK(p)   (g_rec_mutex_lock (&(p)->rec_mutex))
-@@ -735,7 +737,7 @@ cbews_listen_notifications_cb (ECalBacke
- 		return;
- 	}
- 
--	cbews->priv->listen_notifications = camel_ews_settings_get_listen_notifications (ews_settings);
-+	cbews->priv->listen_notifications = !cbews->priv->is_freebusy_calendar && camel_ews_settings_get_listen_notifications (ews_settings);
- 	PRIV_UNLOCK (cbews->priv);
- 
- 	thread = g_thread_new (NULL, handle_notifications_thread, g_object_ref (cbews));
-@@ -819,6 +821,7 @@ e_cal_backend_ews_open (ECalBackend *bac
- 		extension_name = E_SOURCE_EXTENSION_EWS_FOLDER;
- 		extension = e_source_get_extension (source, extension_name);
- 		priv->folder_id = e_source_ews_folder_dup_id (extension);
-+		priv->is_freebusy_calendar = g_strcmp0 (priv->folder_id, "freebusy-calendar") == 0;
- 
- 		priv->storage_path = g_build_filename (cache_dir, priv->folder_id, NULL);
- 
-@@ -848,11 +851,11 @@ e_cal_backend_ews_open (ECalBackend *bac
- 		ret = cal_backend_ews_ensure_connected (cbews, cancellable, &error);
- 
- 	if (ret) {
--		e_cal_backend_set_writable (backend, TRUE);
-+		e_cal_backend_set_writable (backend, !priv->is_freebusy_calendar);
- 
- 		PRIV_LOCK (priv);
- 		if (priv->cnc != NULL) {
--			priv->listen_notifications = camel_ews_settings_get_listen_notifications (ews_settings);
-+			priv->listen_notifications = !priv->is_freebusy_calendar && camel_ews_settings_get_listen_notifications (ews_settings);
- 
- 			if (priv->listen_notifications)
- 				cbews_listen_notifications_cb (cbews, NULL, ews_settings);
-@@ -3857,6 +3860,34 @@ cbews_forget_all_components (ECalBackend
- 	g_slist_free_full (ids, (GDestroyNotify) e_cal_component_free_id);
- }
- 
-+static gboolean
-+ews_freebusy_ecomp_changed (ECalComponent *ecomp,
-+			    icalcomponent *vevent)
-+{
-+	icalcomponent *icomp;
-+	gboolean changed = FALSE;
-+
-+	g_return_val_if_fail (vevent != NULL, FALSE);
-+
-+	if (!ecomp)
-+		return TRUE;
-+
-+	icomp = e_cal_component_get_icalcomponent (ecomp);
-+	if (!icomp)
-+		return TRUE;
-+
-+	if (!changed)
-+		changed = g_strcmp0 (icalcomponent_get_summary (icomp), icalcomponent_get_summary (vevent)) != 0;
-+	if (!changed)
-+		changed = g_strcmp0 (icalcomponent_get_location (icomp), icalcomponent_get_location (vevent)) != 0;
-+	if (!changed)
-+		changed = icaltime_compare (icalcomponent_get_dtstart (icomp), icalcomponent_get_dtstart (vevent)) != 0;
-+	if (!changed)
-+		changed = icaltime_compare (icalcomponent_get_dtend (icomp), icalcomponent_get_dtend (vevent)) != 0;
-+
-+	return changed;
-+}
-+
- static gpointer
- ews_start_sync_thread (gpointer data)
- {
-@@ -3877,95 +3908,288 @@ ews_start_sync_thread (gpointer data)
- 
- 	cancellable = cal_backend_ews_ref_cancellable (cbews);
- 
--	old_sync_state = g_strdup (e_cal_backend_store_get_key_value (priv->store, SYNC_KEY));
--	do {
--		EEwsAdditionalProps *add_props;
--		GCancellable *cancellable;
-+	if (priv->is_freebusy_calendar) {
-+		ESourceEwsFolder *ews_folder;
-+		EEWSFreeBusyData fbdata;
-+		GSList *free_busy = NULL, *link;
-+		gboolean success;
-+		time_t today;
-+
-+		ews_folder = e_source_get_extension (e_backend_get_source (E_BACKEND (cbews)), E_SOURCE_EXTENSION_EWS_FOLDER);
-+
-+		today = time_day_begin (time (NULL));
-+
-+		fbdata.period_start = time_add_week (today, -e_source_ews_folder_get_freebusy_weeks_before (ews_folder));
-+		fbdata.period_end = time_day_end (time_add_week (today, e_source_ews_folder_get_freebusy_weeks_after (ews_folder)));
-+		fbdata.user_mails = g_slist_prepend (NULL, e_source_ews_folder_dup_foreign_mail (ews_folder));
-+
-+		success = e_ews_connection_get_free_busy_sync (priv->cnc, G_PRIORITY_DEFAULT,
-+			e_ews_cal_utils_prepare_free_busy_request, &fbdata,
-+			&free_busy, cancellable, &error);
-+
-+		if (success) {
-+			icaltimezone *utc_zone = icaltimezone_get_utc_timezone ();
-+			GSList *ids;
-+			GHashTable *known;
-+			GHashTableIter iter;
-+			gpointer key;
-+
-+			known = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
-+
-+			ids = e_cal_backend_store_get_component_ids (priv->store);
-+			for (link = ids; link; link = g_slist_next (link)) {
-+				ECalComponentId *id = link->data;
- 
--		includes_last_item = TRUE;
-+				if (id && id->uid && *id->uid)
-+					g_hash_table_insert (known, g_strdup (id->uid), NULL);
-+			}
-+			g_slist_free_full (ids, (GDestroyNotify) e_cal_component_free_id);
- 
--		add_props = e_ews_additional_props_new ();
--		add_props->field_uri = g_strdup ("item:ItemClass");
-+			for (link = free_busy; link; link = g_slist_next (link)) {
-+				icalcomponent *fbcomp = link->data;
-+				icalproperty *fbprop;
-+				icalparameter *param;
-+				struct icalperiodtype fb;
-+				icalparameter_fbtype fbtype;
-+
-+				if (!fbcomp || icalcomponent_isa (fbcomp) != ICAL_VFREEBUSY_COMPONENT)
-+					continue;
-+
-+				for (fbprop = icalcomponent_get_first_property (fbcomp, ICAL_FREEBUSY_PROPERTY);
-+				     fbprop;
-+				     fbprop = icalcomponent_get_next_property (fbcomp, ICAL_FREEBUSY_PROPERTY)) {
-+					icalcomponent *vevent;
-+					const gchar *id, *summary, *location;
-+
-+					param = icalproperty_get_first_parameter (fbprop, ICAL_FBTYPE_PARAMETER);
-+					if (!param)
-+						continue;
-+
-+					fbtype = icalparameter_get_fbtype (param);
-+
-+					if (fbtype != ICAL_FBTYPE_FREE &&
-+					    fbtype != ICAL_FBTYPE_BUSY &&
-+					    fbtype != ICAL_FBTYPE_BUSYUNAVAILABLE &&
-+					    fbtype != ICAL_FBTYPE_BUSYTENTATIVE)
-+						continue;
-+
-+					fb = icalproperty_get_freebusy (fbprop);
-+					id = icalproperty_get_parameter_as_string (fbprop, "X-EWS-ID");
-+					summary = icalproperty_get_parameter_as_string (fbprop, "X-SUMMARY");
-+					location = icalproperty_get_parameter_as_string (fbprop, "X-LOCATION");
- 
--		cancellable = cal_backend_ews_ref_cancellable (cbews);
-+					vevent = icalcomponent_new_vevent ();
- 
--		ret = e_ews_connection_sync_folder_items_sync (
--			priv->cnc,
--			EWS_PRIORITY_MEDIUM,
--			old_sync_state,
--			priv->folder_id,
--			"IdOnly",
--			add_props,
--			EWS_MAX_FETCH_COUNT,
--			&new_sync_state,
--			&includes_last_item,
--			&items_created,
--			&items_updated,
--			&items_deleted,
--			cancellable,
--			&error);
-+					if (id && *id) {
-+						icalcomponent_set_uid (vevent, id);
-+					} else {
-+						gchar *uid;
- 
--		e_ews_additional_props_free (add_props);
--		g_clear_object (&cancellable);
--		g_free (old_sync_state);
--		old_sync_state = NULL;
-+						uid = g_strdup_printf ("%s-%s-%d",
-+							icaltime_as_ical_string (fb.start),
-+							icaltime_as_ical_string (fb.end),
-+							(gint) fbtype);
-+
-+						icalcomponent_set_uid (vevent, uid);
-+
-+						g_free (uid);
-+					}
- 
--		if (!ret) {
--			if (g_error_matches (error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_INVALIDSYNCSTATEDATA)) {
--				g_clear_error (&error);
--				e_cal_backend_store_put_key_value (priv->store, SYNC_KEY, NULL);
--				cbews_forget_all_components (cbews);
--
--				if (!e_ews_connection_sync_folder_items_sync (
--							priv->cnc,
--							EWS_PRIORITY_MEDIUM,
--							NULL,
--							priv->folder_id,
--							"IdOnly",
--							NULL,
--							EWS_MAX_FETCH_COUNT,
--							&new_sync_state,
--							&includes_last_item,
--							&items_created,
--							&items_updated,
--							&items_deleted,
--							cancellable,
--							&error)) {
--					if (!g_error_matches (
--							error,
--							EWS_CONNECTION_ERROR,
--							EWS_CONNECTION_ERROR_AUTHENTICATION_FAILED)) {
--						e_cal_backend_set_writable (E_CAL_BACKEND (cbews), TRUE);
--						break;
-+					fb.start.zone = utc_zone;
-+					fb.start.is_utc = 1;
-+					fb.end.zone = utc_zone;
-+					fb.end.is_utc = 1;
-+
-+					icalcomponent_set_dtstart (vevent, fb.start);
-+					icalcomponent_set_dtend (vevent, fb.end);
-+
-+					icalcomponent_add_property (vevent, icalproperty_new_created (icaltime_current_time_with_zone (utc_zone)));
-+
-+					if (fbtype == ICAL_FBTYPE_FREE) {
-+						icalcomponent_set_summary (vevent, C_("FreeBusyType", "Free"));
-+						icalcomponent_add_property (vevent, icalproperty_new_transp (ICAL_TRANSP_TRANSPARENT));
-+					} else if (fbtype == ICAL_FBTYPE_BUSY) {
-+						icalcomponent_set_summary (vevent, C_("FreeBusyType", "Busy"));
-+					} else if (fbtype == ICAL_FBTYPE_BUSYUNAVAILABLE) {
-+						icalcomponent_set_summary (vevent, C_("FreeBusyType", "Out of Office"));
-+					} else if (fbtype == ICAL_FBTYPE_BUSYTENTATIVE) {
-+						icalcomponent_set_summary (vevent, C_("FreeBusyType", "Tentative"));
-+					}
-+
-+					if (summary && *summary)
-+						icalcomponent_set_summary (vevent, summary);
-+
-+					if (location && *location)
-+						icalcomponent_set_location (vevent, location);
-+
-+					PRIV_LOCK (priv);
-+					if (g_hash_table_remove (known, icalcomponent_get_uid (vevent))) {
-+						ECalComponent *ecomp = g_hash_table_lookup (priv->item_id_hash, icalcomponent_get_uid (vevent));
-+
-+						g_object_ref (ecomp);
-+
-+						PRIV_UNLOCK (priv);
-+
-+						if (ews_freebusy_ecomp_changed (ecomp, vevent)) {
-+							ECalComponent *new_ecomp;
-+							gchar *uid = g_strdup (icalcomponent_get_uid (vevent));
-+
-+							new_ecomp = e_cal_component_new_from_icalcomponent (vevent);
-+							if (new_ecomp) {
-+								PRIV_LOCK (priv);
-+								g_hash_table_insert (priv->item_id_hash, uid, g_object_ref (new_ecomp));
-+								PRIV_UNLOCK (priv);
-+
-+								put_component_to_store (cbews, new_ecomp);
-+								e_cal_backend_notify_component_modified (E_CAL_BACKEND (cbews), ecomp, new_ecomp);
-+
-+								g_object_unref (new_ecomp);
-+							} else {
-+								g_free (uid);
-+							}
-+						} else {
-+							icalcomponent_free (vevent);
-+						}
-+
-+						g_clear_object (&ecomp);
-+					} else {
-+						ECalComponent *ecomp;
-+						gchar *uid = g_strdup (icalcomponent_get_uid (vevent));
-+
-+						ecomp = e_cal_component_new_from_icalcomponent (vevent);
-+						if (ecomp)
-+							g_hash_table_insert (priv->item_id_hash, uid, g_object_ref (ecomp));
-+						else
-+							g_free (uid);
-+
-+						PRIV_UNLOCK (priv);
-+
-+						if (ecomp) {
-+							put_component_to_store (cbews, ecomp);
-+							e_cal_backend_notify_component_created (E_CAL_BACKEND (cbews), ecomp);
-+						}
-+
-+						g_clear_object (&ecomp);
- 					}
- 				}
--			} else {
--				break;
- 			}
-+
-+			g_hash_table_iter_init (&iter, known);
-+			while (g_hash_table_iter_next (&iter, &key, NULL)) {
-+				ECalComponentId id = { 0 };
-+
-+				id.uid = key;
-+				id.rid = NULL;
-+
-+				if (e_cal_backend_store_remove_component (priv->store, id.uid, id.rid)) {
-+					e_cal_backend_notify_component_removed (E_CAL_BACKEND (cbews), &id, NULL, NULL);
-+
-+					PRIV_LOCK (priv);
-+					g_hash_table_remove (priv->item_id_hash, id.uid);
-+					PRIV_UNLOCK (priv);
-+				}
-+			}
-+
-+			g_hash_table_destroy (known);
-+		} else if (g_error_matches (error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_NOFREEBUSYACCESS)) {
-+			cbews_forget_all_components (cbews);
-+			e_cal_backend_notify_error (E_CAL_BACKEND (cbews), error->message);
-+			g_clear_error (&error);
- 		}
- 
--		ret = cal_backend_ews_process_folder_items (
--				cbews,
--				new_sync_state,
--				items_created,
--				items_updated,
--				items_deleted);
-+		g_slist_free_full (free_busy, (GDestroyNotify) icalcomponent_free);
-+		g_slist_free_full (fbdata.user_mails, g_free);
-+	} else {
-+		old_sync_state = g_strdup (e_cal_backend_store_get_key_value (priv->store, SYNC_KEY));
-+		do {
-+			EEwsAdditionalProps *add_props;
-+			GCancellable *cancellable;
-+
-+			includes_last_item = TRUE;
- 
--		if (!ret)
--			break;
-+			add_props = e_ews_additional_props_new ();
-+			add_props->field_uri = g_strdup ("item:ItemClass");
- 
--		g_slist_free_full (items_created, g_object_unref);
--		g_slist_free_full (items_updated, g_object_unref);
--		g_slist_free_full (items_deleted, g_free);
--		items_created = NULL;
--		items_updated = NULL;
--		items_deleted = NULL;
--
--		e_cal_backend_store_put_key_value (priv->store, SYNC_KEY, new_sync_state);
--
--		old_sync_state = new_sync_state;
--		new_sync_state = NULL;
--	} while (!includes_last_item);
-+			cancellable = cal_backend_ews_ref_cancellable (cbews);
-+
-+			ret = e_ews_connection_sync_folder_items_sync (
-+				priv->cnc,
-+				EWS_PRIORITY_MEDIUM,
-+				old_sync_state,
-+				priv->folder_id,
-+				"IdOnly",
-+				add_props,
-+				EWS_MAX_FETCH_COUNT,
-+				&new_sync_state,
-+				&includes_last_item,
-+				&items_created,
-+				&items_updated,
-+				&items_deleted,
-+				cancellable,
-+				&error);
-+
-+			e_ews_additional_props_free (add_props);
-+			g_clear_object (&cancellable);
-+			g_free (old_sync_state);
-+			old_sync_state = NULL;
-+
-+			if (!ret) {
-+				if (g_error_matches (error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_INVALIDSYNCSTATEDATA)) {
-+					g_clear_error (&error);
-+					e_cal_backend_store_put_key_value (priv->store, SYNC_KEY, NULL);
-+					cbews_forget_all_components (cbews);
-+
-+					if (!e_ews_connection_sync_folder_items_sync (
-+								priv->cnc,
-+								EWS_PRIORITY_MEDIUM,
-+								NULL,
-+								priv->folder_id,
-+								"IdOnly",
-+								NULL,
-+								EWS_MAX_FETCH_COUNT,
-+								&new_sync_state,
-+								&includes_last_item,
-+								&items_created,
-+								&items_updated,
-+								&items_deleted,
-+								cancellable,
-+								&error)) {
-+						if (!g_error_matches (
-+								error,
-+								EWS_CONNECTION_ERROR,
-+								EWS_CONNECTION_ERROR_AUTHENTICATION_FAILED)) {
-+							e_cal_backend_set_writable (E_CAL_BACKEND (cbews), TRUE);
-+							break;
-+						}
-+					}
-+				} else {
-+					break;
-+				}
-+			}
-+
-+			ret = cal_backend_ews_process_folder_items (
-+					cbews,
-+					new_sync_state,
-+					items_created,
-+					items_updated,
-+					items_deleted);
-+
-+			if (!ret)
-+				break;
-+
-+			g_slist_free_full (items_created, g_object_unref);
-+			g_slist_free_full (items_updated, g_object_unref);
-+			g_slist_free_full (items_deleted, g_free);
-+			items_created = NULL;
-+			items_updated = NULL;
-+			items_deleted = NULL;
-+
-+			e_cal_backend_store_put_key_value (priv->store, SYNC_KEY, new_sync_state);
-+
-+			old_sync_state = new_sync_state;
-+			new_sync_state = NULL;
-+		} while (!includes_last_item);
-+	}
- 
- 	ews_refreshing_dec (cbews);
- 
-@@ -4163,7 +4387,7 @@ e_cal_backend_ews_get_free_busy (ECalBac
- 	ECalBackendEwsPrivate *priv = cbews->priv;
- 	GError *error = NULL;
- 	EwsCalendarAsyncData *free_busy_data;
--	EwsCalendarConvertData convert_data = { 0 };
-+	EEWSFreeBusyData fbdata = { 0 };
- 	GSList *users_copy = NULL;
- 
- 	/* make sure we're not offline */
-@@ -4193,15 +4417,15 @@ e_cal_backend_ews_get_free_busy (ECalBac
- 	free_busy_data->context = context;
- 	free_busy_data->users = users_copy;
- 
--	convert_data.users = users_copy;
--	convert_data.start = start;
--	convert_data.end = end;
-+	fbdata.period_start = start;
-+	fbdata.period_end = end;
-+	fbdata.user_mails = users_copy;
- 
- 	e_ews_connection_get_free_busy (
- 		priv->cnc,
- 		EWS_PRIORITY_MEDIUM,
--		e_cal_backend_ews_prepare_free_busy_request,
--		&convert_data,
-+		e_ews_cal_utils_prepare_free_busy_request,
-+		&fbdata,
- 		cancellable,
- 		ews_cal_get_free_busy_cb,
- 		free_busy_data);
-diff -up evolution-ews-3.22.6/src/calendar/e-cal-backend-ews-utils.c.free-busy-calendar evolution-ews-3.22.6/src/calendar/e-cal-backend-ews-utils.c
---- evolution-ews-3.22.6/src/calendar/e-cal-backend-ews-utils.c.free-busy-calendar	2016-12-16 12:36:06.000000000 +0100
-+++ evolution-ews-3.22.6/src/calendar/e-cal-backend-ews-utils.c	2017-05-24 15:38:44.189519188 +0200
-@@ -42,6 +42,7 @@
- #include <libecal/libecal.h>
- #include <libsoup/soup-misc.h>
- 
-+#include "server/e-ews-calendar-utils.h"
- #include "server/e-ews-connection.h"
- #include "server/e-ews-message.h"
- #include "server/e-ews-item-change.h"
-@@ -338,49 +339,6 @@ ews_set_alarm (ESoapMessage *msg,
- 
- }
- 
--void
--ewscal_set_time (ESoapMessage *msg,
--                 const gchar *name,
--                 icaltimetype *t,
--                 gboolean with_timezone)
--{
--	gchar *str;
--	gchar *tz_ident = NULL;
--
--	if (with_timezone) {
--		if (t->is_utc || !t->zone || t->zone == icaltimezone_get_utc_timezone ()) {
--			tz_ident = g_strdup ("Z");
--		} else {
--			gint offset, is_daylight, hrs, mins;
--
--			offset = icaltimezone_get_utc_offset (
--				icaltimezone_get_utc_timezone (), t, &is_daylight);
--
--			offset = offset * (-1);
--			hrs = offset / 60;
--			mins = offset % 60;
--
--			if (hrs < 0)
--				hrs *= -1;
--			if (mins < 0)
--				mins *= -1;
--
--			tz_ident = g_strdup_printf ("%s%02d:%02d", offset > 0 ? "+" : "-", hrs, mins);
--		}
--	}
--
--	str = g_strdup_printf (
--		"%04d-%02d-%02dT%02d:%02d:%02d%s",
--		t->year, t->month, t->day,
--		t->hour, t->minute, t->second,
--		tz_ident ? tz_ident : "");
--
--	e_ews_message_write_string_parameter (msg, name, NULL, str);
--
--	g_free (tz_ident);
--	g_free (str);
--}
--
- static void
- ewscal_set_date (ESoapMessage *msg,
-                  const gchar *name,
-@@ -713,136 +671,6 @@ ewscal_set_meeting_timezone (ESoapMessag
- 	e_soap_message_end_element (msg); /* "MeetingTimeZone" */
- }
- 
--static void
--ewscal_add_availability_rrule (ESoapMessage *msg,
--                               icalproperty *prop)
--{
--	struct icalrecurrencetype recur = icalproperty_get_rrule (prop);
--	gchar buffer[16];
--	gint dayorder;
--
--	dayorder = icalrecurrencetype_day_position (recur.by_day[0]);
--	dayorder = dayorder % 5;
--	if (dayorder < 0)
--		dayorder += 5;
--	dayorder += 1;
--
--	/* expected value is 1..5, inclusive */
--	snprintf (buffer, 16, "%d", dayorder);
--	e_ews_message_write_string_parameter (msg, "DayOrder", NULL, buffer);
--
--	snprintf (buffer, 16, "%d", recur.by_month[0]);
--	e_ews_message_write_string_parameter (msg, "Month", NULL, buffer);
--
--	e_ews_message_write_string_parameter (msg, "DayOfWeek", NULL, number_to_weekday (icalrecurrencetype_day_day_of_week (recur.by_day[0])));
--}
--
--static void
--ewscal_add_availability_default_timechange (ESoapMessage *msg)
--{
--
--	e_soap_message_start_element (msg, "StandardTime", NULL, NULL);
--	e_ews_message_write_string_parameter (msg, "Bias", NULL, "0");
--	e_ews_message_write_string_parameter (msg, "Time", NULL, "00:00:00");
--	e_ews_message_write_string_parameter (msg, "DayOrder", NULL, "0");
--	e_ews_message_write_string_parameter (msg, "Month", NULL, "0");
--	e_ews_message_write_string_parameter (msg, "DayOfWeek", NULL, "Sunday");
--	e_soap_message_end_element (msg);
--
--	e_soap_message_start_element (msg, "DaylightTime", NULL, NULL);
--	e_ews_message_write_string_parameter (msg, "Bias", NULL, "0");
--	e_ews_message_write_string_parameter (msg, "Time", NULL, "00:00:00");
--	e_ews_message_write_string_parameter (msg, "DayOrder", NULL, "0");
--	e_ews_message_write_string_parameter (msg, "Month", NULL, "0");
--	e_ews_message_write_string_parameter (msg, "DayOfWeek", NULL, "Sunday");
--	e_soap_message_end_element (msg);
--}
--
--static void
--ewscal_add_availability_timechange (ESoapMessage *msg,
--                                    icalcomponent *comp,
--                                    gint baseoffs)
--{
--	gchar buffer[16];
--	icalproperty *prop;
--	struct icaltimetype dtstart;
--	gint utcoffs;
--
--	/* Calculate zone Offset from BaseOffset */
--	prop = icalcomponent_get_first_property (comp, ICAL_TZOFFSETTO_PROPERTY);
--	if (prop) {
--		utcoffs = -icalproperty_get_tzoffsetto (prop) / 60;
--		utcoffs -= baseoffs;
--		snprintf (buffer, 16, "%d", utcoffs);
--		e_ews_message_write_string_parameter (msg, "Bias", NULL, buffer);
--	}
--
--	prop = icalcomponent_get_first_property (comp, ICAL_DTSTART_PROPERTY);
--	if (prop) {
--		dtstart = icalproperty_get_dtstart (prop);
--		snprintf (buffer, 16, "%02d:%02d:%02d", dtstart.hour, dtstart.minute, dtstart.second);
--		e_ews_message_write_string_parameter (msg, "Time", NULL, buffer);
--	}
--
--	prop = icalcomponent_get_first_property (comp, ICAL_RRULE_PROPERTY);
--	if (prop)
--		ewscal_add_availability_rrule (msg, prop);
--}
--
--void
--ewscal_set_availability_timezone (ESoapMessage *msg,
--                                  icaltimezone *icaltz)
--{
--	icalcomponent *comp;
--	icalproperty *prop;
--	icalcomponent *xstd, *xdaylight;
--	gint std_utcoffs;
--	gchar *offset;
--
--	if (!icaltz)
--		return;
--
--	comp = icaltimezone_get_component (icaltz);
--
--	xstd = icalcomponent_get_first_component (comp, ICAL_XSTANDARD_COMPONENT);
--	xdaylight = icalcomponent_get_first_component (comp, ICAL_XDAYLIGHT_COMPONENT);
--
--	/*TimeZone is the root element of GetUserAvailabilityRequest*/
--	e_soap_message_start_element (msg, "TimeZone", NULL, NULL);
--
--	/* Fetch the timezone offsets for the standard (or only) zone.
--	 * Negate it, because Exchange does it backwards */
--	if (xstd) {
--		prop = icalcomponent_get_first_property (xstd, ICAL_TZOFFSETTO_PROPERTY);
--		std_utcoffs = -icalproperty_get_tzoffsetto (prop) / 60;
--	} else
--		std_utcoffs = 0;
--
--	/* This is the overall BaseOffset tag, which the Standard and Daylight
--	 * zones are offset from. It's redundant, but Exchange always sets it
--	 * to the offset of the Standard zone, and the Offset in the Standard
--	 * zone to zero. So try to avoid problems by doing the same. */
--	offset = g_strdup_printf ("%d", std_utcoffs);
--	e_ews_message_write_string_parameter (msg, "Bias", NULL, offset);
--	g_free (offset);
--
--	if (xdaylight) {
--		/* Standard */
--		e_soap_message_start_element (msg, "StandardTime", NULL, NULL);
--		ewscal_add_availability_timechange (msg, xstd, std_utcoffs);
--		e_soap_message_end_element (msg); /* "StandardTime" */
--
--		/* DayLight */
--		e_soap_message_start_element (msg, "DaylightTime", NULL, NULL);
--		ewscal_add_availability_timechange (msg, xdaylight, std_utcoffs);
--		e_soap_message_end_element (msg); /* "DaylightTime" */
--	} else
--		/* Set default values*/
--		ewscal_add_availability_default_timechange (msg);
--
--	e_soap_message_end_element (msg); /* "TimeZone" */
--}
--
- void
- ewscal_set_reccurence (ESoapMessage *msg,
-                        icalproperty *rrule,
-@@ -1321,8 +1149,8 @@ convert_vevent_calcomp_to_xml (ESoapMess
- 			ical_location_end);
- 	}
- 
--	ewscal_set_time (msg, "Start", &dtstart, FALSE);
--	ewscal_set_time (msg, "End", &dtend, FALSE);
-+	e_ews_cal_utils_set_time (msg, "Start", &dtstart, FALSE);
-+	e_ews_cal_utils_set_time (msg, "End", &dtend, FALSE);
- 	/* We have to do the time zone(s) later, or the server rejects the request */
- 
- 	/* All day event ? */
-@@ -1424,7 +1252,7 @@ convert_vtodo_calcomp_to_xml (ESoapMessa
- 	prop = icalcomponent_get_first_property (icalcomp, ICAL_DUE_PROPERTY);
- 	if (prop) {
- 		dt = icalproperty_get_due (prop);
--		ewscal_set_time (msg, "DueDate", &dt, TRUE);
-+		e_ews_cal_utils_set_time (msg, "DueDate", &dt, TRUE);
- 	}
- 
- 	prop = icalcomponent_get_first_property (icalcomp, ICAL_PERCENTCOMPLETE_PROPERTY);
-@@ -1437,7 +1265,7 @@ convert_vtodo_calcomp_to_xml (ESoapMessa
- 	prop = icalcomponent_get_first_property (icalcomp, ICAL_DTSTART_PROPERTY);
- 	if (prop) {
- 		dt = icalproperty_get_dtstart (prop);
--		ewscal_set_time (msg, "StartDate", &dt, TRUE);
-+		e_ews_cal_utils_set_time (msg, "StartDate", &dt, TRUE);
- 	}
- 
- 	prop = icalcomponent_get_first_property (icalcomp, ICAL_STATUS_PROPERTY);
-@@ -1751,13 +1579,13 @@ convert_vevent_component_to_updatexml (E
- 
- 	if (dt_start_changed) {
- 		e_ews_message_start_set_item_field (msg, "Start", "calendar","CalendarItem");
--		ewscal_set_time (msg, "Start", &dtstart, FALSE);
-+		e_ews_cal_utils_set_time (msg, "Start", &dtstart, FALSE);
- 		e_ews_message_end_set_item_field (msg);
- 	}
- 
- 	if (dt_end_changed) {
- 		e_ews_message_start_set_item_field (msg, "End", "calendar", "CalendarItem");
--		ewscal_set_time (msg, "End", &dtend, FALSE);
-+		e_ews_cal_utils_set_time (msg, "End", &dtend, FALSE);
- 		e_ews_message_end_set_item_field (msg);
- 	}
- 
-@@ -1915,7 +1743,7 @@ convert_vtodo_component_to_updatexml (ES
- 	if (prop) {
- 		dt = icalproperty_get_due (prop);
- 		e_ews_message_start_set_item_field (msg, "DueDate", "task", "Task");
--		ewscal_set_time (msg, "DueDate", &dt, TRUE);
-+		e_ews_cal_utils_set_time (msg, "DueDate", &dt, TRUE);
- 		e_ews_message_end_set_item_field (msg);
- 	} else {
- 		e_ews_message_add_delete_item_field (msg, "DueDate", "task");
-@@ -1934,7 +1762,7 @@ convert_vtodo_component_to_updatexml (ES
- 	if (prop) {
- 		dt = icalproperty_get_dtstart (prop);
- 		e_ews_message_start_set_item_field (msg, "StartDate", "task", "Task");
--		ewscal_set_time (msg, "StartDate", &dt, TRUE);
-+		e_ews_cal_utils_set_time (msg, "StartDate", &dt, TRUE);
- 		e_ews_message_end_set_item_field (msg);
- 	} else {
- 		e_ews_message_add_delete_item_field (msg, "StartDate", "task");
-@@ -2100,49 +1928,6 @@ e_cal_backend_ews_clear_reminder_is_set
- }
- 
- void
--e_cal_backend_ews_prepare_free_busy_request (ESoapMessage *msg,
--					     gpointer user_data)
--{
--	EwsCalendarConvertData *convert_data = user_data;
--	GSList *addr;
--	icaltimetype t_start, t_end;
--	icaltimezone *utc_zone = icaltimezone_get_utc_timezone ();
--
--	ewscal_set_availability_timezone (msg, utc_zone);
--
--	e_soap_message_start_element (msg, "MailboxDataArray", "messages", NULL);
--
--	for (addr = convert_data->users; addr; addr = addr->next) {
--		e_soap_message_start_element (msg, "MailboxData", NULL, NULL);
--
--		e_soap_message_start_element (msg, "Email", NULL, NULL);
--		e_ews_message_write_string_parameter (msg, "Address", NULL, addr->data);
--		e_soap_message_end_element (msg); /* "Email" */
--
--		e_ews_message_write_string_parameter (msg, "AttendeeType", NULL, "Required");
--		e_ews_message_write_string_parameter (msg, "ExcludeConflicts", NULL, "false");
--
--		e_soap_message_end_element (msg); /* "MailboxData" */
--	}
--
--	e_soap_message_end_element (msg); /* "MailboxDataArray" */
--
--	e_soap_message_start_element (msg, "FreeBusyViewOptions", NULL, NULL);
--
--	e_soap_message_start_element (msg, "TimeWindow", NULL, NULL);
--	t_start = icaltime_from_timet_with_zone (convert_data->start, 0, utc_zone);
--	t_end = icaltime_from_timet_with_zone (convert_data->end, 0, utc_zone);
--	ewscal_set_time (msg, "StartTime", &t_start, FALSE);
--	ewscal_set_time (msg, "EndTime", &t_end, FALSE);
--	e_soap_message_end_element (msg); /* "TimeWindow" */
--
--	e_ews_message_write_string_parameter (msg, "MergedFreeBusyIntervalInMinutes", NULL, "60");
--	e_ews_message_write_string_parameter (msg, "RequestedView", NULL, "DetailedMerged");
--
--	e_soap_message_end_element (msg); /* "FreeBusyViewOptions" */
--}
--
--void
- e_cal_backend_ews_prepare_set_free_busy_status (ESoapMessage *msg,
- 						gpointer user_data)
- {
-diff -up evolution-ews-3.22.6/src/calendar/e-cal-backend-ews-utils.h.free-busy-calendar evolution-ews-3.22.6/src/calendar/e-cal-backend-ews-utils.h
---- evolution-ews-3.22.6/src/calendar/e-cal-backend-ews-utils.h.free-busy-calendar	2014-05-28 13:24:49.000000000 +0200
-+++ evolution-ews-3.22.6/src/calendar/e-cal-backend-ews-utils.h	2017-05-24 15:38:44.189519188 +0200
-@@ -57,10 +57,8 @@ typedef struct {
- const gchar *e_ews_collect_organizer (icalcomponent *comp);
- void e_ews_collect_attendees (icalcomponent *comp, GSList **required, GSList **optional, GSList **resource);
- 
--void ewscal_set_time (ESoapMessage *msg, const gchar *name, icaltimetype *t, gboolean with_timezone);
- void ewscal_set_timezone (ESoapMessage *msg, const gchar *name, EEwsCalendarTimeZoneDefinition *tzd);
- void ewscal_set_meeting_timezone (ESoapMessage *msg, icaltimezone *icaltz);
--void ewscal_set_availability_timezone (ESoapMessage *msg, icaltimezone *icaltz);
- void ewscal_set_reccurence (ESoapMessage *msg, icalproperty *rrule, icaltimetype *dtstart);
- void ewscal_set_reccurence_exceptions (ESoapMessage *msg, icalcomponent *comp);
- void ewscal_get_attach_differences (const GSList *original, const GSList *modified, GSList **removed, GSList **added);
-@@ -77,7 +75,6 @@ void e_cal_backend_ews_unref_windows_zon
- void e_cal_backend_ews_convert_calcomp_to_xml (ESoapMessage *msg, gpointer user_data);
- void e_cal_backend_ews_convert_component_to_updatexml (ESoapMessage *msg, gpointer user_data);
- void e_cal_backend_ews_clear_reminder_is_set (ESoapMessage *msg, gpointer user_data);
--void e_cal_backend_ews_prepare_free_busy_request (ESoapMessage *msg, gpointer user_data);
- void e_cal_backend_ews_prepare_set_free_busy_status (ESoapMessage *msg,gpointer user_data);
- void e_cal_backend_ews_prepare_accept_item_request (ESoapMessage *msg, gpointer user_data);
- 
-diff -up evolution-ews-3.22.6/src/configuration/e-ews-subscribe-foreign-folder.c.free-busy-calendar evolution-ews-3.22.6/src/configuration/e-ews-subscribe-foreign-folder.c
---- evolution-ews-3.22.6/src/configuration/e-ews-subscribe-foreign-folder.c.free-busy-calendar	2014-11-19 19:06:36.000000000 +0100
-+++ evolution-ews-3.22.6/src/configuration/e-ews-subscribe-foreign-folder.c	2017-05-24 15:38:44.190519183 +0200
-@@ -34,6 +34,8 @@
- #include "camel/camel-ews-store-summary.h"
- #include "camel/camel-ews-utils.h"
- 
-+#include "server/e-ews-calendar-utils.h"
-+
- #include "e-ews-config-utils.h"
- #include "e-ews-search-user.h"
- #include "e-ews-subscribe-foreign-folder.h"
-@@ -344,24 +346,53 @@ check_foreign_folder_thread (GObject *wi
- 		return;
- 	}
- 
--	fid.id = (gchar *) (cffd->use_foldername ? cffd->use_foldername : cffd->orig_foldername);
--	fid.change_key = NULL;
--	fid.is_distinguished_id = cffd->use_foldername != NULL;
--
--	if (!e_ews_connection_get_folder_info_sync (conn, G_PRIORITY_DEFAULT,
--		cffd->email, &fid, &folder, cancellable, &local_error)) {
--		if (g_error_matches (local_error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_ITEMNOTFOUND) ||
--		    g_error_matches (local_error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_FOLDERNOTFOUND)) {
--			g_clear_error (&local_error);
--			local_error = g_error_new (
--				EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_FOLDERNOTFOUND,
--				_("Folder '%s' not found. Either it does not exist or you do not have permission to access it."),
--				cffd->orig_foldername);
-+	if (g_strcmp0 (cffd->use_foldername, "freebusy-calendar") == 0) {
-+		EEWSFreeBusyData fbdata;
-+		GSList *free_busy = NULL;
-+		gboolean success;
-+
-+		fbdata.period_start = time (NULL);
-+		fbdata.period_end = fbdata.period_start + (60 * 60);
-+		fbdata.user_mails = g_slist_prepend (NULL, cffd->email);
-+
-+		success = e_ews_connection_get_free_busy_sync (conn, G_PRIORITY_DEFAULT,
-+			e_ews_cal_utils_prepare_free_busy_request, &fbdata,
-+			&free_busy, cancellable, perror);
-+
-+		g_slist_free_full (free_busy, (GDestroyNotify) icalcomponent_free);
-+		g_slist_free (fbdata.user_mails);
-+
-+		if (!success) {
-+			g_object_unref (conn);
-+			return;
- 		}
- 
--		g_propagate_error (perror, local_error);
--		g_object_unref (conn);
--		return;
-+		folder = g_object_new (E_TYPE_EWS_FOLDER, NULL);
-+		e_ews_folder_set_id (folder, e_ews_folder_id_new (cffd->use_foldername, NULL, FALSE));
-+		/* Translators: This is used as a calendar name; it constructs "User Name - Availability" string shown in UI */
-+		e_ews_folder_set_name (folder, _("Availability"));
-+		e_ews_folder_set_folder_type (folder, E_EWS_FOLDER_TYPE_CALENDAR);
-+		e_ews_folder_set_foreign_mail (folder, cffd->email);
-+	} else {
-+		fid.id = (gchar *) (cffd->use_foldername ? cffd->use_foldername : cffd->orig_foldername);
-+		fid.change_key = NULL;
-+		fid.is_distinguished_id = cffd->use_foldername != NULL;
-+
-+		if (!e_ews_connection_get_folder_info_sync (conn, G_PRIORITY_DEFAULT,
-+			cffd->email, &fid, &folder, cancellable, &local_error)) {
-+			if (g_error_matches (local_error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_ITEMNOTFOUND) ||
-+			    g_error_matches (local_error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_FOLDERNOTFOUND)) {
-+				g_clear_error (&local_error);
-+				local_error = g_error_new (
-+					EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_FOLDERNOTFOUND,
-+					_("Folder '%s' not found. Either it does not exist or you do not have permission to access it."),
-+					cffd->orig_foldername);
-+			}
-+
-+			g_propagate_error (perror, local_error);
-+			g_object_unref (conn);
-+			return;
-+		}
- 	}
- 
- 	if (g_cancellable_set_error_if_cancelled (cancellable, perror)) {
-@@ -518,6 +549,8 @@ subscribe_foreign_response_cb (GObject *
- 		use_foldername = g_strdup ("contacts");
- 	} else if (g_strcmp0 (orig_foldername, _("Calendar")) == 0) {
- 		use_foldername = g_strdup ("calendar");
-+	} else if (g_strcmp0 (orig_foldername, _("Free/Busy as Calendar")) == 0) {
-+		use_foldername = g_strdup ("freebusy-calendar");
- 	} else if (g_strcmp0 (orig_foldername, _("Memos")) == 0) {
- 		use_foldername = g_strdup ("notes");
- 	} else if (g_strcmp0 (orig_foldername, _("Tasks")) == 0) {
-@@ -723,6 +756,7 @@ e_ews_subscribe_foreign_folder (GtkWindo
- 	gtk_combo_box_text_append_text (combo_text, _("Inbox"));
- 	gtk_combo_box_text_append_text (combo_text, _("Contacts"));
- 	gtk_combo_box_text_append_text (combo_text, _("Calendar"));
-+	gtk_combo_box_text_append_text (combo_text, _("Free/Busy as Calendar"));
- 	gtk_combo_box_text_append_text (combo_text, _("Memos"));
- 	gtk_combo_box_text_append_text (combo_text, _("Tasks"));
- 	gtk_combo_box_set_active (GTK_COMBO_BOX (combo_text), 0);
-diff -up evolution-ews-3.22.6/src/server/e-ews-calendar-utils.c.free-busy-calendar evolution-ews-3.22.6/src/server/e-ews-calendar-utils.c
---- evolution-ews-3.22.6/src/server/e-ews-calendar-utils.c.free-busy-calendar	2017-05-24 15:38:44.190519183 +0200
-+++ evolution-ews-3.22.6/src/server/e-ews-calendar-utils.c	2017-05-24 15:38:44.190519183 +0200
-@@ -0,0 +1,260 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-+/*
-+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of version 2 of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
-+ * USA
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+
-+#include "e-ews-message.h"
-+
-+#include "e-ews-calendar-utils.h"
-+
-+static const gchar *
-+number_to_weekday (gint num)
-+{
-+	static const gchar *days[] = {
-+		"Sunday", "Monday", "Tuesday", "Wednesday",
-+		"Thursday", "Friday", "Saturday",
-+		"Day", "Weekday", "WeekendDay"
-+	};
-+
-+	return days[num - 1];
-+}
-+
-+static void
-+ewscal_add_availability_rrule (ESoapMessage *msg,
-+                               icalproperty *prop)
-+{
-+	struct icalrecurrencetype recur = icalproperty_get_rrule (prop);
-+	gchar buffer[16];
-+	gint dayorder;
-+
-+	dayorder = icalrecurrencetype_day_position (recur.by_day[0]);
-+	dayorder = dayorder % 5;
-+	if (dayorder < 0)
-+		dayorder += 5;
-+	dayorder += 1;
-+
-+	/* expected value is 1..5, inclusive */
-+	snprintf (buffer, 16, "%d", dayorder);
-+	e_ews_message_write_string_parameter (msg, "DayOrder", NULL, buffer);
-+
-+	snprintf (buffer, 16, "%d", recur.by_month[0]);
-+	e_ews_message_write_string_parameter (msg, "Month", NULL, buffer);
-+
-+	e_ews_message_write_string_parameter (msg, "DayOfWeek", NULL, number_to_weekday (icalrecurrencetype_day_day_of_week (recur.by_day[0])));
-+}
-+
-+static void
-+ewscal_add_availability_default_timechange (ESoapMessage *msg)
-+{
-+
-+	e_soap_message_start_element (msg, "StandardTime", NULL, NULL);
-+	e_ews_message_write_string_parameter (msg, "Bias", NULL, "0");
-+	e_ews_message_write_string_parameter (msg, "Time", NULL, "00:00:00");
-+	e_ews_message_write_string_parameter (msg, "DayOrder", NULL, "0");
-+	e_ews_message_write_string_parameter (msg, "Month", NULL, "0");
-+	e_ews_message_write_string_parameter (msg, "DayOfWeek", NULL, "Sunday");
-+	e_soap_message_end_element (msg);
-+
-+	e_soap_message_start_element (msg, "DaylightTime", NULL, NULL);
-+	e_ews_message_write_string_parameter (msg, "Bias", NULL, "0");
-+	e_ews_message_write_string_parameter (msg, "Time", NULL, "00:00:00");
-+	e_ews_message_write_string_parameter (msg, "DayOrder", NULL, "0");
-+	e_ews_message_write_string_parameter (msg, "Month", NULL, "0");
-+	e_ews_message_write_string_parameter (msg, "DayOfWeek", NULL, "Sunday");
-+	e_soap_message_end_element (msg);
-+}
-+
-+static void
-+ewscal_add_availability_timechange (ESoapMessage *msg,
-+                                    icalcomponent *comp,
-+                                    gint baseoffs)
-+{
-+	gchar buffer[16];
-+	icalproperty *prop;
-+	struct icaltimetype dtstart;
-+	gint utcoffs;
-+
-+	/* Calculate zone Offset from BaseOffset */
-+	prop = icalcomponent_get_first_property (comp, ICAL_TZOFFSETTO_PROPERTY);
-+	if (prop) {
-+		utcoffs = -icalproperty_get_tzoffsetto (prop) / 60;
-+		utcoffs -= baseoffs;
-+		snprintf (buffer, 16, "%d", utcoffs);
-+		e_ews_message_write_string_parameter (msg, "Bias", NULL, buffer);
-+	}
-+
-+	prop = icalcomponent_get_first_property (comp, ICAL_DTSTART_PROPERTY);
-+	if (prop) {
-+		dtstart = icalproperty_get_dtstart (prop);
-+		snprintf (buffer, 16, "%02d:%02d:%02d", dtstart.hour, dtstart.minute, dtstart.second);
-+		e_ews_message_write_string_parameter (msg, "Time", NULL, buffer);
-+	}
-+
-+	prop = icalcomponent_get_first_property (comp, ICAL_RRULE_PROPERTY);
-+	if (prop)
-+		ewscal_add_availability_rrule (msg, prop);
-+}
-+
-+static void
-+ewscal_set_availability_timezone (ESoapMessage *msg,
-+                                  icaltimezone *icaltz)
-+{
-+	icalcomponent *comp;
-+	icalproperty *prop;
-+	icalcomponent *xstd, *xdaylight;
-+	gint std_utcoffs;
-+	gchar *offset;
-+
-+	if (!icaltz)
-+		return;
-+
-+	comp = icaltimezone_get_component (icaltz);
-+
-+	xstd = icalcomponent_get_first_component (comp, ICAL_XSTANDARD_COMPONENT);
-+	xdaylight = icalcomponent_get_first_component (comp, ICAL_XDAYLIGHT_COMPONENT);
-+
-+	/*TimeZone is the root element of GetUserAvailabilityRequest*/
-+	e_soap_message_start_element (msg, "TimeZone", NULL, NULL);
-+
-+	/* Fetch the timezone offsets for the standard (or only) zone.
-+	 * Negate it, because Exchange does it backwards */
-+	if (xstd) {
-+		prop = icalcomponent_get_first_property (xstd, ICAL_TZOFFSETTO_PROPERTY);
-+		std_utcoffs = -icalproperty_get_tzoffsetto (prop) / 60;
-+	} else
-+		std_utcoffs = 0;
-+
-+	/* This is the overall BaseOffset tag, which the Standard and Daylight
-+	 * zones are offset from. It's redundant, but Exchange always sets it
-+	 * to the offset of the Standard zone, and the Offset in the Standard
-+	 * zone to zero. So try to avoid problems by doing the same. */
-+	offset = g_strdup_printf ("%d", std_utcoffs);
-+	e_ews_message_write_string_parameter (msg, "Bias", NULL, offset);
-+	g_free (offset);
-+
-+	if (xdaylight) {
-+		/* Standard */
-+		e_soap_message_start_element (msg, "StandardTime", NULL, NULL);
-+		ewscal_add_availability_timechange (msg, xstd, std_utcoffs);
-+		e_soap_message_end_element (msg); /* "StandardTime" */
-+
-+		/* DayLight */
-+		e_soap_message_start_element (msg, "DaylightTime", NULL, NULL);
-+		ewscal_add_availability_timechange (msg, xdaylight, std_utcoffs);
-+		e_soap_message_end_element (msg); /* "DaylightTime" */
-+	} else
-+		/* Set default values*/
-+		ewscal_add_availability_default_timechange (msg);
-+
-+	e_soap_message_end_element (msg); /* "TimeZone" */
-+}
-+
-+void
-+e_ews_cal_utils_prepare_free_busy_request (ESoapMessage *msg,
-+					   gpointer user_data)
-+{
-+	const EEWSFreeBusyData *fbdata = user_data;
-+	icaltimetype t_start, t_end;
-+	icaltimezone *utc_zone = icaltimezone_get_utc_timezone ();
-+	GSList *link;
-+
-+	g_return_if_fail (fbdata != NULL);
-+
-+	ewscal_set_availability_timezone (msg, utc_zone);
-+
-+	e_soap_message_start_element (msg, "MailboxDataArray", "messages", NULL);
-+
-+	for (link = (GSList *) fbdata->user_mails; link; link = g_slist_next (link)) {
-+		const gchar *mail = link->data;
-+
-+		e_soap_message_start_element (msg, "MailboxData", NULL, NULL);
-+
-+		e_soap_message_start_element (msg, "Email", NULL, NULL);
-+		e_ews_message_write_string_parameter (msg, "Address", NULL, mail);
-+		e_soap_message_end_element (msg); /* "Email" */
-+
-+		e_ews_message_write_string_parameter (msg, "AttendeeType", NULL, "Required");
-+		e_ews_message_write_string_parameter (msg, "ExcludeConflicts", NULL, "false");
-+
-+		e_soap_message_end_element (msg); /* "MailboxData" */
-+	}
-+
-+	e_soap_message_end_element (msg); /* "MailboxDataArray" */
-+
-+	e_soap_message_start_element (msg, "FreeBusyViewOptions", NULL, NULL);
-+
-+	e_soap_message_start_element (msg, "TimeWindow", NULL, NULL);
-+	t_start = icaltime_from_timet_with_zone (fbdata->period_start, 0, utc_zone);
-+	t_end = icaltime_from_timet_with_zone (fbdata->period_end, 0, utc_zone);
-+	e_ews_cal_utils_set_time (msg, "StartTime", &t_start, FALSE);
-+	e_ews_cal_utils_set_time (msg, "EndTime", &t_end, FALSE);
-+	e_soap_message_end_element (msg); /* "TimeWindow" */
-+
-+	e_ews_message_write_string_parameter (msg, "MergedFreeBusyIntervalInMinutes", NULL, "60");
-+	e_ews_message_write_string_parameter (msg, "RequestedView", NULL, "DetailedMerged");
-+
-+	e_soap_message_end_element (msg); /* "FreeBusyViewOptions" */
-+}
-+
-+void
-+e_ews_cal_utils_set_time (ESoapMessage *msg,
-+			  const gchar *name,
-+			  icaltimetype *tt,
-+			  gboolean with_timezone)
-+{
-+	gchar *str;
-+	gchar *tz_ident = NULL;
-+
-+	g_return_if_fail (tt != NULL);
-+
-+	if (with_timezone) {
-+		if (tt->is_utc || !tt->zone || tt->zone == icaltimezone_get_utc_timezone ()) {
-+			tz_ident = g_strdup ("Z");
-+		} else {
-+			gint offset, is_daylight, hrs, mins;
-+
-+			offset = icaltimezone_get_utc_offset (
-+				icaltimezone_get_utc_timezone (), tt, &is_daylight);
-+
-+			offset = offset * (-1);
-+			hrs = offset / 60;
-+			mins = offset % 60;
-+
-+			if (hrs < 0)
-+				hrs *= -1;
-+			if (mins < 0)
-+				mins *= -1;
-+
-+			tz_ident = g_strdup_printf ("%s%02d:%02d", offset > 0 ? "+" : "-", hrs, mins);
-+		}
-+	}
-+
-+	str = g_strdup_printf (
-+		"%04d-%02d-%02dT%02d:%02d:%02d%s",
-+		tt->year, tt->month, tt->day,
-+		tt->hour, tt->minute, tt->second,
-+		tz_ident ? tz_ident : "");
-+
-+	e_ews_message_write_string_parameter (msg, name, NULL, str);
-+
-+	g_free (tz_ident);
-+	g_free (str);
-+}
-diff -up evolution-ews-3.22.6/src/server/e-ews-calendar-utils.h.free-busy-calendar evolution-ews-3.22.6/src/server/e-ews-calendar-utils.h
---- evolution-ews-3.22.6/src/server/e-ews-calendar-utils.h.free-busy-calendar	2017-05-24 15:38:44.190519183 +0200
-+++ evolution-ews-3.22.6/src/server/e-ews-calendar-utils.h	2017-05-24 15:38:44.190519183 +0200
-@@ -0,0 +1,46 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-+/*
-+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of version 2 of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
-+ * USA
-+ */
-+
-+#ifndef E_EWS_CALENDAR_UTILS_H
-+#define E_EWS_CALENDAR_UTILS_H
-+
-+#include <time.h>
-+#include <libical/ical.h>
-+
-+#include "server/e-soap-message.h"
-+
-+G_BEGIN_DECLS
-+
-+typedef struct _EEWSFreeBusyData {
-+	time_t period_start;
-+	time_t period_end;
-+	GSList *user_mails; /* gchar * */
-+} EEWSFreeBusyData;
-+
-+void		e_ews_cal_utils_prepare_free_busy_request
-+						(ESoapMessage *msg,
-+						 gpointer user_data); /* EEWSFreeBusyData * */
-+void		e_ews_cal_utils_set_time	(ESoapMessage *msg,
-+						 const gchar *name,
-+						 icaltimetype *tt,
-+						 gboolean with_timezone);
-+
-+G_END_DECLS
-+
-+#endif /* E_EWS_CALENDAR_UTILS_H */
-diff -up evolution-ews-3.22.6/src/server/e-ews-connection.c.free-busy-calendar evolution-ews-3.22.6/src/server/e-ews-connection.c
---- evolution-ews-3.22.6/src/server/e-ews-connection.c.free-busy-calendar	2017-05-24 15:38:44.183519217 +0200
-+++ evolution-ews-3.22.6/src/server/e-ews-connection.c	2017-05-24 15:38:44.191519178 +0200
-@@ -7316,13 +7316,15 @@ ews_handle_free_busy_view (ESoapParamete
- 	ESoapParameter *viewparam, *eventarray, *event_param, *subparam;
- 	GTimeVal t_val;
- 	const gchar *name;
--	gchar *value, *new_val = NULL, *summary = NULL, *location = NULL;
-+	gchar *value, *new_val = NULL, *summary = NULL, *location = NULL, *id = NULL;
- 
- 	viewparam = e_soap_parameter_get_first_child_by_name (param, "FreeBusyView");
- 	if (!viewparam) return;
- 	vfb = icalcomponent_new_vfreebusy ();
- 	eventarray = e_soap_parameter_get_first_child_by_name (viewparam, "CalendarEventArray");
--	for (event_param = e_soap_parameter_get_first_child (eventarray); event_param != NULL; event_param = e_soap_parameter_get_next_child (event_param), icalprop = NULL) {
-+	for (event_param = eventarray ? e_soap_parameter_get_first_child (eventarray) : NULL;
-+	     event_param != NULL;
-+	     event_param = e_soap_parameter_get_next_child (event_param), icalprop = NULL) {
- 		for (subparam = e_soap_parameter_get_first_child (event_param); subparam != NULL; subparam = e_soap_parameter_get_next_child (subparam)) {
- 			name = e_soap_parameter_get_name (subparam);
- 
-@@ -7379,6 +7381,10 @@ ews_handle_free_busy_view (ESoapParamete
- 			} else if (!g_ascii_strcasecmp (name, "CalendarEventDetails")) {
- 				ESoapParameter *dparam;
- 
-+				dparam = e_soap_parameter_get_first_child_by_name (subparam, "ID");
-+				if (dparam)
-+					id = e_soap_parameter_get_string_value (dparam);
-+
- 				dparam = e_soap_parameter_get_first_child_by_name (subparam, "Subject");
- 				if (dparam)
- 					summary = e_soap_parameter_get_string_value (dparam);
-@@ -7389,6 +7395,8 @@ ews_handle_free_busy_view (ESoapParamete
- 			}
- 		}
- 		if (icalprop != NULL) {
-+			if (id)
-+				icalproperty_set_parameter_from_string (icalprop, "X-EWS-ID", id);
- 			if (summary)
- 				icalproperty_set_parameter_from_string (icalprop, "X-SUMMARY", summary);
- 			if (location)
-@@ -7396,10 +7404,9 @@ ews_handle_free_busy_view (ESoapParamete
- 			icalcomponent_add_property (vfb, icalprop);
- 		}
- 
--		g_free (summary);
--		g_free (location);
--		summary = NULL;
--		location = NULL;
-+		g_clear_pointer (&summary, g_free);
-+		g_clear_pointer (&location, g_free);
-+		g_clear_pointer (&id, g_free);
- 	}
- 
- 	async_data->items = g_slist_append (async_data->items, vfb);
-diff -up evolution-ews-3.22.6/src/server/e-ews-folder.c.free-busy-calendar evolution-ews-3.22.6/src/server/e-ews-folder.c
---- evolution-ews-3.22.6/src/server/e-ews-folder.c.free-busy-calendar	2015-05-22 13:47:17.000000000 +0200
-+++ evolution-ews-3.22.6/src/server/e-ews-folder.c	2017-05-24 15:38:44.192519174 +0200
-@@ -47,6 +47,7 @@ struct _EEwsFolderPrivate {
- 	guint32 child_count;
- 	guint64 size;
- 	gboolean foreign;
-+	gchar *foreign_mail;
- };
- 
- static void
-@@ -70,14 +71,9 @@ e_ews_folder_finalize (GObject *object)
- 	priv = folder->priv;
- 
- 	g_clear_error (&priv->error);
--
--	if (priv->name) {
--		g_free (priv->name);
--		priv->name = NULL;
--	}
--
--	g_free (priv->escaped_name);
--	priv->escaped_name = NULL;
-+	g_clear_pointer (&priv->name, g_free);
-+	g_clear_pointer (&priv->escaped_name, g_free);
-+	g_clear_pointer (&priv->foreign_mail, g_free);
- 
- 	if (priv->fid) {
- 		g_free (priv->fid->id);
-@@ -409,6 +405,16 @@ e_ews_folder_get_id (const EEwsFolder *f
- 	return (const EwsFolderId *) folder->priv->fid;
- }
- 
-+void
-+e_ews_folder_set_id (EEwsFolder *folder,
-+		     EwsFolderId *fid)
-+{
-+	g_return_if_fail (E_IS_EWS_FOLDER (folder));
-+
-+	e_ews_folder_id_free (folder->priv->fid);
-+	folder->priv->fid = fid;
-+}
-+
- const EwsFolderId *
- e_ews_folder_get_parent_id (const EEwsFolder *folder)
- {
-@@ -503,6 +509,24 @@ e_ews_folder_set_foreign (EEwsFolder *fo
- 	folder->priv->foreign = is_foreign;
- }
- 
-+const gchar *
-+e_ews_folder_get_foreign_mail (const EEwsFolder *folder)
-+{
-+	g_return_val_if_fail (E_IS_EWS_FOLDER (folder), NULL);
-+
-+	return folder->priv->foreign_mail;
-+}
-+
-+void
-+e_ews_folder_set_foreign_mail (EEwsFolder *folder,
-+			       const gchar *foreign_mail)
-+{
-+	g_return_if_fail (E_IS_EWS_FOLDER (folder));
-+
-+	g_free (folder->priv->foreign_mail);
-+	folder->priv->foreign_mail = g_strdup (foreign_mail);
-+}
-+
- /* escapes backslashes with \5C and forward slashes with \2F */
- gchar *
- e_ews_folder_utils_escape_name (const gchar *folder_name)
-@@ -678,6 +702,7 @@ e_ews_folder_utils_populate_esource (ESo
- 			e_source_ews_folder_set_change_key (folder_ext, NULL);
- 			e_source_ews_folder_set_foreign (folder_ext, e_ews_folder_get_foreign (folder));
- 			e_source_ews_folder_set_foreign_subfolders (folder_ext, (flags & E_EWS_ESOURCE_FLAG_INCLUDE_SUBFOLDERS) != 0);
-+			e_source_ews_folder_set_foreign_mail (folder_ext, e_ews_folder_get_foreign_mail (folder));
- 			e_source_ews_folder_set_public (folder_ext, (flags & E_EWS_ESOURCE_FLAG_PUBLIC_FOLDER) != 0);
- 
- 			offline_ext = e_source_get_extension (source, E_SOURCE_EXTENSION_OFFLINE);
-diff -up evolution-ews-3.22.6/src/server/e-ews-folder.h.free-busy-calendar evolution-ews-3.22.6/src/server/e-ews-folder.h
---- evolution-ews-3.22.6/src/server/e-ews-folder.h.free-busy-calendar	2014-11-19 19:06:36.000000000 +0100
-+++ evolution-ews-3.22.6/src/server/e-ews-folder.h	2017-05-24 15:38:44.192519174 +0200
-@@ -69,6 +69,7 @@ const EwsFolderId *
- 		e_ews_folder_get_parent_id (const EEwsFolder *folder);
- const EwsFolderId *
- 		e_ews_folder_get_id (const EEwsFolder *folder);
-+void		e_ews_folder_set_id (EEwsFolder *folder, EwsFolderId *fid);
- guint32		e_ews_folder_get_total_count (const EEwsFolder *folder);
- guint32		e_ews_folder_get_unread_count (const EEwsFolder *folder);
- guint32		e_ews_folder_get_child_count (const EEwsFolder *folder);
-@@ -79,6 +80,8 @@ EEwsFolderType	e_ews_folder_get_folder_t
- void		e_ews_folder_set_folder_type (EEwsFolder *folder, EEwsFolderType folder_type);
- gboolean	e_ews_folder_get_foreign (const EEwsFolder *folder);
- void		e_ews_folder_set_foreign (EEwsFolder *folder, gboolean is_foreign);
-+const gchar *	e_ews_folder_get_foreign_mail (const EEwsFolder *folder);
-+void		e_ews_folder_set_foreign_mail (EEwsFolder *folder, const gchar *foreign_mail);
- 
- EwsFolderId *	e_ews_folder_id_new (const gchar *id,
- 				     const gchar *change_key,
-diff -up evolution-ews-3.22.6/src/server/e-source-ews-folder.c.free-busy-calendar evolution-ews-3.22.6/src/server/e-source-ews-folder.c
---- evolution-ews-3.22.6/src/server/e-source-ews-folder.c.free-busy-calendar	2015-09-21 11:59:31.000000000 +0200
-+++ evolution-ews-3.22.6/src/server/e-source-ews-folder.c	2017-05-24 15:38:44.192519174 +0200
-@@ -31,7 +31,10 @@ struct _ESourceEwsFolderPrivate {
- 	gchar *id;
- 	gboolean foreign;
- 	gboolean foreign_subfolders;
-+	gchar *foreign_mail;
- 	gboolean is_public;
-+	guint freebusy_weeks_before;
-+	guint freebusy_weeks_after;
- };
- 
- enum {
-@@ -40,6 +43,9 @@ enum {
- 	PROP_ID,
- 	PROP_FOREIGN,
- 	PROP_FOREIGN_SUBFOLDERS,
-+	PROP_FOREIGN_MAIL,
-+	PROP_FREEBUSY_WEEKS_BEFORE,
-+	PROP_FREEBUSY_WEEKS_AFTER,
- 	PROP_PUBLIC
- };
- 
-@@ -79,6 +85,24 @@ source_ews_folder_set_property (GObject
- 				g_value_get_boolean (value));
- 			return;
- 
-+		case PROP_FOREIGN_MAIL:
-+			e_source_ews_folder_set_foreign_mail (
-+				E_SOURCE_EWS_FOLDER (object),
-+				g_value_get_string (value));
-+			return;
-+
-+		case PROP_FREEBUSY_WEEKS_BEFORE:
-+			e_source_ews_folder_set_freebusy_weeks_before (
-+				E_SOURCE_EWS_FOLDER (object),
-+				g_value_get_uint (value));
-+			return;
-+
-+		case PROP_FREEBUSY_WEEKS_AFTER:
-+			e_source_ews_folder_set_freebusy_weeks_after (
-+				E_SOURCE_EWS_FOLDER (object),
-+				g_value_get_uint (value));
-+			return;
-+
- 		case PROP_PUBLIC:
- 			e_source_ews_folder_set_public (
- 				E_SOURCE_EWS_FOLDER (object),
-@@ -124,6 +148,27 @@ source_ews_folder_get_property (GObject
- 				E_SOURCE_EWS_FOLDER (object)));
- 			return;
- 
-+		case PROP_FOREIGN_MAIL:
-+			g_value_take_string (
-+				value,
-+				e_source_ews_folder_dup_foreign_mail (
-+				E_SOURCE_EWS_FOLDER (object)));
-+			return;
-+
-+		case PROP_FREEBUSY_WEEKS_BEFORE:
-+			g_value_set_uint (
-+				value,
-+				e_source_ews_folder_get_freebusy_weeks_before (
-+				E_SOURCE_EWS_FOLDER (object)));
-+			return;
-+
-+		case PROP_FREEBUSY_WEEKS_AFTER:
-+			g_value_set_uint (
-+				value,
-+				e_source_ews_folder_get_freebusy_weeks_after (
-+				E_SOURCE_EWS_FOLDER (object)));
-+			return;
-+
- 		case PROP_PUBLIC:
- 			g_value_set_boolean (
- 				value,
-@@ -144,6 +189,7 @@ source_ews_folder_finalize (GObject *obj
- 
- 	g_free (priv->change_key);
- 	g_free (priv->id);
-+	g_free (priv->foreign_mail);
- 
- 	/* Chain up to parent's finalize() method. */
- 	G_OBJECT_CLASS (e_source_ews_folder_parent_class)->finalize (object);
-@@ -220,6 +266,45 @@ e_source_ews_folder_class_init (ESourceE
- 
- 	g_object_class_install_property (
- 		object_class,
-+		PROP_FOREIGN_MAIL,
-+		g_param_spec_string (
-+			"foreign-mail",
-+			"ForeignMail",
-+			"Other user's mail address",
-+			NULL,
-+			G_PARAM_READWRITE |
-+			G_PARAM_CONSTRUCT |
-+			G_PARAM_STATIC_STRINGS |
-+			E_SOURCE_PARAM_SETTING));
-+
-+	g_object_class_install_property (
-+		object_class,
-+		PROP_FREEBUSY_WEEKS_BEFORE,
-+		g_param_spec_uint (
-+			"freebusy-weeks-before",
-+			"FreeBusyWeeksBefore",
-+			"How many weeks to read Free/Busy before today",
-+			0, 5, 1,
-+			G_PARAM_READWRITE |
-+			G_PARAM_CONSTRUCT |
-+			G_PARAM_STATIC_STRINGS |
-+			E_SOURCE_PARAM_SETTING));
-+
-+	g_object_class_install_property (
-+		object_class,
-+		PROP_FREEBUSY_WEEKS_AFTER,
-+		g_param_spec_uint (
-+			"freebusy-weeks-after",
-+			"FreeBusyWeeksAfter",
-+			"How many weeks to read Free/Busy after today",
-+			1, 54, 5,
-+			G_PARAM_READWRITE |
-+			G_PARAM_CONSTRUCT |
-+			G_PARAM_STATIC_STRINGS |
-+			E_SOURCE_PARAM_SETTING));
-+
-+	g_object_class_install_property (
-+		object_class,
- 		PROP_PUBLIC,
- 		g_param_spec_boolean (
- 			"public",
-@@ -402,6 +487,97 @@ e_source_ews_folder_set_foreign_subfolde
- 	g_object_notify (G_OBJECT (extension), "foreign-subfolders");
- }
- 
-+const gchar *
-+e_source_ews_folder_get_foreign_mail (ESourceEwsFolder *extension)
-+{
-+	g_return_val_if_fail (E_IS_SOURCE_EWS_FOLDER (extension), NULL);
-+
-+	return extension->priv->foreign_mail;
-+}
-+
-+gchar *
-+e_source_ews_folder_dup_foreign_mail (ESourceEwsFolder *extension)
-+{
-+	const gchar *protected;
-+	gchar *duplicate;
-+
-+	g_return_val_if_fail (E_IS_SOURCE_EWS_FOLDER (extension), NULL);
-+
-+	e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
-+
-+	protected = e_source_ews_folder_get_foreign_mail (extension);
-+	duplicate = g_strdup (protected);
-+
-+	e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
-+
-+	return duplicate;
-+}
-+
-+void
-+e_source_ews_folder_set_foreign_mail (ESourceEwsFolder *extension,
-+				      const gchar *foreign_mail)
-+{
-+	g_return_if_fail (E_IS_SOURCE_EWS_FOLDER (extension));
-+
-+	e_source_extension_property_lock (E_SOURCE_EXTENSION (extension));
-+
-+	if (g_strcmp0 (extension->priv->foreign_mail, foreign_mail) == 0) {
-+		e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
-+		return;
-+	}
-+
-+	g_free (extension->priv->foreign_mail);
-+	extension->priv->foreign_mail = g_strdup (foreign_mail);
-+
-+	e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension));
-+
-+	g_object_notify (G_OBJECT (extension), "foreign-mail");
-+}
-+
-+guint
-+e_source_ews_folder_get_freebusy_weeks_before (ESourceEwsFolder *extension)
-+{
-+	g_return_val_if_fail (E_IS_SOURCE_EWS_FOLDER (extension), 0);
-+
-+	return extension->priv->freebusy_weeks_before;
-+}
-+
-+void
-+e_source_ews_folder_set_freebusy_weeks_before (ESourceEwsFolder *extension,
-+					       guint freebusy_weeks_before)
-+{
-+	g_return_if_fail (E_IS_SOURCE_EWS_FOLDER (extension));
-+
-+	if (extension->priv->freebusy_weeks_before == freebusy_weeks_before)
-+		return;
-+
-+	extension->priv->freebusy_weeks_before = freebusy_weeks_before;
-+
-+	g_object_notify (G_OBJECT (extension), "freebusy-weeks-before");
-+}
-+
-+guint
-+e_source_ews_folder_get_freebusy_weeks_after (ESourceEwsFolder *extension)
-+{
-+	g_return_val_if_fail (E_IS_SOURCE_EWS_FOLDER (extension), 0);
-+
-+	return extension->priv->freebusy_weeks_after;
-+}
-+
-+void
-+e_source_ews_folder_set_freebusy_weeks_after (ESourceEwsFolder *extension,
-+					      guint freebusy_weeks_after)
-+{
-+	g_return_if_fail (E_IS_SOURCE_EWS_FOLDER (extension));
-+
-+	if (extension->priv->freebusy_weeks_after == freebusy_weeks_after)
-+		return;
-+
-+	extension->priv->freebusy_weeks_after = freebusy_weeks_after;
-+
-+	g_object_notify (G_OBJECT (extension), "freebusy-weeks-after");
-+}
-+
- gboolean
- e_source_ews_folder_get_public (ESourceEwsFolder *extension)
- {
-diff -up evolution-ews-3.22.6/src/server/e-source-ews-folder.h.free-busy-calendar evolution-ews-3.22.6/src/server/e-source-ews-folder.h
---- evolution-ews-3.22.6/src/server/e-source-ews-folder.h.free-busy-calendar	2014-03-24 10:28:36.000000000 +0100
-+++ evolution-ews-3.22.6/src/server/e-source-ews-folder.h	2017-05-24 15:38:44.192519174 +0200
-@@ -84,6 +84,23 @@ gboolean	e_source_ews_folder_get_foreign
- void		e_source_ews_folder_set_foreign_subfolders
- 						(ESourceEwsFolder *extension,
- 						 gboolean foreign_subfolders);
-+const gchar *	e_source_ews_folder_get_foreign_mail
-+						(ESourceEwsFolder *extension);
-+gchar *		e_source_ews_folder_dup_foreign_mail
-+						(ESourceEwsFolder *extension);
-+void		e_source_ews_folder_set_foreign_mail
-+						(ESourceEwsFolder *extension,
-+						 const gchar *foreign_mail);
-+guint		e_source_ews_folder_get_freebusy_weeks_before
-+						(ESourceEwsFolder *extension);
-+void		e_source_ews_folder_set_freebusy_weeks_before
-+						(ESourceEwsFolder *extension,
-+						 guint freebusy_weeks_before);
-+guint		e_source_ews_folder_get_freebusy_weeks_after
-+						(ESourceEwsFolder *extension);
-+void		e_source_ews_folder_set_freebusy_weeks_after
-+						(ESourceEwsFolder *extension,
-+						 guint freebusy_weeks_after);
- gboolean	e_source_ews_folder_get_public	(ESourceEwsFolder *extension);
- void		e_source_ews_folder_set_public	(ESourceEwsFolder *extension,
- 						 gboolean is_public);
-diff -up evolution-ews-3.22.6/src/server/Makefile.am.free-busy-calendar evolution-ews-3.22.6/src/server/Makefile.am
---- evolution-ews-3.22.6/src/server/Makefile.am.free-busy-calendar	2016-09-26 23:54:19.000000000 +0200
-+++ evolution-ews-3.22.6/src/server/Makefile.am	2017-05-24 15:38:44.190519183 +0200
-@@ -41,6 +41,8 @@ libeews_1_2_la_SOURCES = \
- 	camel-ews-settings.c \
- 	ews-errors.h \
- 	ews-errors.c \
-+	e-ews-calendar-utils.c \
-+	e-ews-calendar-utils.h \
- 	e-ews-connection.c \
- 	e-ews-connection.h \
- 	e-ews-connection-utils.c \
diff --git a/SOURCES/evolution-ews-3.22.6-message-date-in-utc.patch b/SOURCES/evolution-ews-3.22.6-message-date-in-utc.patch
deleted file mode 100644
index fe84c38..0000000
--- a/SOURCES/evolution-ews-3.22.6-message-date-in-utc.patch
+++ /dev/null
@@ -1,183 +0,0 @@
-diff -up evolution-ews-3.22.6/src/camel/camel-ews-folder.c.message-date-in-utc evolution-ews-3.22.6/src/camel/camel-ews-folder.c
---- evolution-ews-3.22.6/src/camel/camel-ews-folder.c.message-date-in-utc	2017-01-13 14:13:51.000000000 +0100
-+++ evolution-ews-3.22.6/src/camel/camel-ews-folder.c	2017-03-17 10:16:38.925847814 +0100
-@@ -592,6 +592,7 @@ camel_ews_folder_get_message (CamelFolde
- 
- 	add_props = e_ews_additional_props_new ();
- 	add_props->field_uri = g_strdup ("item:MimeContent message:From message:Sender");
-+	add_props->indexed_furis = g_slist_prepend (NULL, e_ews_indexed_field_uri_new ("item:InternetMessageHeader", "Date"));
- 
- 	res = e_ews_connection_get_items_sync (
- 		cnc, pri, ids, "IdOnly", add_props,
-@@ -700,7 +701,8 @@ camel_ews_folder_get_message (CamelFolde
- 	message = camel_ews_folder_get_message_from_cache (ews_folder, uid, cancellable, error);
- 	if (message) {
- 		CamelInternetAddress *from;
--		const gchar *email = NULL;
-+		const gchar *email = NULL, *date_header;
-+		gboolean resave = FALSE;
- 
- 		from = camel_mime_message_get_from (message);
- 
-@@ -711,8 +713,6 @@ camel_ews_folder_get_message (CamelFolde
- 			if (!mailbox)
- 				mailbox = e_ews_item_get_sender (items->data);
- 			if (mailbox) {
--				CamelStream *cache_stream;
--
- 				email = NULL;
- 
- 				if (g_strcmp0 (mailbox->routing_type, "EX") == 0)
-@@ -723,15 +723,33 @@ camel_ews_folder_get_message (CamelFolde
- 				camel_mime_message_set_from (message, from);
- 				g_object_unref (from);
- 
--				g_rec_mutex_lock (&priv->cache_lock);
--				/* Ignore errors here, it's nothing fatal in this case */
--				cache_stream = ews_data_cache_get (ews_folder->cache, "cur", uid, NULL);
--				if (cache_stream) {
--					camel_data_wrapper_write_to_stream_sync (CAMEL_DATA_WRAPPER (message), cache_stream, cancellable, NULL);
--					g_object_unref (cache_stream);
--				}
--				g_rec_mutex_unlock (&priv->cache_lock);
-+				resave = TRUE;
-+			}
-+		}
-+
-+		date_header = e_ews_item_get_date_header (items->data);
-+		if (date_header && *date_header) {
-+			time_t tt;
-+			gint tz_offset;
-+
-+			tt = camel_header_decode_date (date_header, &tz_offset);
-+			if (tt > 0) {
-+				camel_mime_message_set_date (message, tt, tz_offset);
-+				resave = TRUE;
-+			}
-+		}
-+
-+		if (resave) {
-+			CamelStream *cache_stream;
-+
-+			g_rec_mutex_lock (&priv->cache_lock);
-+			/* Ignore errors here, it's nothing fatal in this case */
-+			cache_stream = ews_data_cache_get (ews_folder->cache, "cur", uid, NULL);
-+			if (cache_stream) {
-+				camel_data_wrapper_write_to_stream_sync (CAMEL_DATA_WRAPPER (message), cache_stream, cancellable, NULL);
-+				g_object_unref (cache_stream);
- 			}
-+			g_rec_mutex_unlock (&priv->cache_lock);
- 		}
- 	}
- 
-diff -up evolution-ews-3.22.6/src/server/e-ews-connection.c.message-date-in-utc evolution-ews-3.22.6/src/server/e-ews-connection.c
---- evolution-ews-3.22.6/src/server/e-ews-connection.c.message-date-in-utc	2017-01-13 14:13:51.000000000 +0100
-+++ evolution-ews-3.22.6/src/server/e-ews-connection.c	2017-03-17 10:16:38.926847814 +0100
-@@ -383,9 +383,16 @@ e_ews_extended_field_uri_free (EEwsExten
- }
- 
- EEwsIndexedFieldURI *
--e_ews_indexed_field_uri_new (void)
-+e_ews_indexed_field_uri_new (const gchar *uri,
-+			     const gchar *index)
- {
--	return g_new0 (EEwsIndexedFieldURI, 1);
-+	EEwsIndexedFieldURI *furi;
-+
-+	furi = g_new0 (EEwsIndexedFieldURI, 1);
-+	furi->field_uri = g_strdup (uri);
-+	furi->field_index = g_strdup (index);
-+
-+	return furi;
- }
- 
- void
-diff -up evolution-ews-3.22.6/src/server/e-ews-connection.h.message-date-in-utc evolution-ews-3.22.6/src/server/e-ews-connection.h
---- evolution-ews-3.22.6/src/server/e-ews-connection.h.message-date-in-utc	2017-01-13 14:13:51.000000000 +0100
-+++ evolution-ews-3.22.6/src/server/e-ews-connection.h	2017-03-17 10:16:38.927847814 +0100
-@@ -371,7 +371,8 @@ EEwsExtendedFieldURI *
- void		e_ews_extended_field_uri_free	(EEwsExtendedFieldURI *ex_field_uri);
- 
- EEwsIndexedFieldURI *
--		e_ews_indexed_field_uri_new	(void);
-+		e_ews_indexed_field_uri_new	(const gchar *uri,
-+						 const gchar *index);
- void		e_ews_indexed_field_uri_free	(EEwsIndexedFieldURI *id_field_uri);
- 
- EEwsAdditionalProps *
-diff -up evolution-ews-3.22.6/src/server/e-ews-item.c.message-date-in-utc evolution-ews-3.22.6/src/server/e-ews-item.c
---- evolution-ews-3.22.6/src/server/e-ews-item.c.message-date-in-utc	2016-06-14 15:29:01.000000000 +0200
-+++ evolution-ews-3.22.6/src/server/e-ews-item.c	2017-03-17 10:16:38.927847814 +0100
-@@ -108,6 +108,7 @@ struct _EEwsItemPrivate {
- 	gchar *subject;
- 	gchar *mime_content;
- 
-+	gchar *date_header;
- 	time_t date_received;
- 	time_t date_sent;
- 	time_t date_created;
-@@ -210,6 +211,9 @@ e_ews_item_dispose (GObject *object)
- 	g_free (priv->references);
- 	priv->references = NULL;
- 
-+	g_free (priv->date_header);
-+	priv->date_header = NULL;
-+
- 	g_free (priv->timezone);
- 	priv->timezone = NULL;
- 
-@@ -1043,6 +1047,20 @@ e_ews_item_set_from_soap_parameter (EEws
- 			priv->item_id->change_key = e_soap_parameter_get_property (subparam, "ChangeKey");
- 		} else if (!g_ascii_strcasecmp (name, "Subject")) {
- 			priv->subject = e_soap_parameter_get_string_value (subparam);
-+		} else if (!g_ascii_strcasecmp (name, "InternetMessageHeaders")) {
-+			for (subparam1 = e_soap_parameter_get_first_child_by_name (subparam, "InternetMessageHeader");
-+			     subparam1;
-+			     subparam1 = e_soap_parameter_get_next_child (subparam1)) {
-+				gchar *str = e_soap_parameter_get_property (subparam1, "HeaderName");
-+
-+				if (g_strcmp0 (str, "Date") == 0) {
-+					priv->date_header = e_soap_parameter_get_string_value (subparam1);
-+					g_free (str);
-+					break;
-+				}
-+
-+				g_free (str);
-+			}
- 		} else if (!g_ascii_strcasecmp (name, "DateTimeReceived")) {
- 			value = e_soap_parameter_get_string_value (subparam);
- 			priv->date_received = ews_item_parse_date (value);
-@@ -1309,6 +1327,7 @@ e_ews_item_get_in_replyto (EEwsItem *ite
- 
- 	return (const gchar *) item->priv->in_replyto;
- }
-+
- const gchar *
- e_ews_item_get_references (EEwsItem *item)
- {
-@@ -1317,6 +1336,14 @@ e_ews_item_get_references (EEwsItem *ite
- 	return (const gchar *) item->priv->references;
- }
- 
-+const gchar *
-+e_ews_item_get_date_header (EEwsItem *item)
-+{
-+	g_return_val_if_fail (E_IS_EWS_ITEM (item), NULL);
-+
-+	return item->priv->date_header;
-+}
-+
- time_t
- e_ews_item_get_date_received (EEwsItem *item)
- {
-diff -up evolution-ews-3.22.6/src/server/e-ews-item.h.message-date-in-utc evolution-ews-3.22.6/src/server/e-ews-item.h
---- evolution-ews-3.22.6/src/server/e-ews-item.h.message-date-in-utc	2016-04-27 18:57:55.000000000 +0200
-+++ evolution-ews-3.22.6/src/server/e-ews-item.h	2017-03-17 10:16:38.927847814 +0100
-@@ -185,6 +185,7 @@ const gchar *	e_ews_item_get_msg_id		(EE
- const gchar *	e_ews_item_get_uid		(EEwsItem *item);
- const gchar *	e_ews_item_get_in_replyto	(EEwsItem *item);
- const gchar *	e_ews_item_get_references	(EEwsItem *item);
-+const gchar *	e_ews_item_get_date_header	(EEwsItem *item);
- time_t		e_ews_item_get_date_received	(EEwsItem *item);
- time_t		e_ews_item_get_date_sent	(EEwsItem *item);
- time_t		e_ews_item_get_date_created	(EEwsItem *item);
diff --git a/SOURCES/evolution-ews-3.22.6-subsources-enabled-state.patch b/SOURCES/evolution-ews-3.22.6-subsources-enabled-state.patch
deleted file mode 100644
index 8d34cbe..0000000
--- a/SOURCES/evolution-ews-3.22.6-subsources-enabled-state.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-diff -up evolution-ews-3.22.6/src/collection/e-ews-backend.c.subsources-enabled-state evolution-ews-3.22.6/src/collection/e-ews-backend.c
---- evolution-ews-3.22.6/src/collection/e-ews-backend.c.subsources-enabled-state	2016-04-20 22:43:15.000000000 +0200
-+++ evolution-ews-3.22.6/src/collection/e-ews-backend.c	2017-03-24 14:50:15.159481455 +0100
-@@ -170,6 +170,38 @@ ews_backend_get_settings (EEwsBackend *b
- 	return CAMEL_EWS_SETTINGS (settings);
- }
- 
-+static void
-+ews_backend_update_enabled (ESource *data_source,
-+			    ESource *collection_source)
-+{
-+	ESourceCollection *collection_extension = NULL;
-+	gboolean part_enabled = TRUE;
-+
-+	g_return_if_fail (E_IS_SOURCE (data_source));
-+
-+	if (!collection_source || !e_source_get_enabled (collection_source)) {
-+		e_source_set_enabled (data_source, FALSE);
-+		return;
-+	}
-+
-+	if (e_source_has_extension (collection_source, E_SOURCE_EXTENSION_COLLECTION))
-+		collection_extension = e_source_get_extension (collection_source, E_SOURCE_EXTENSION_COLLECTION);
-+
-+	if (e_source_has_extension (data_source, E_SOURCE_EXTENSION_CALENDAR) ||
-+	    e_source_has_extension (data_source, E_SOURCE_EXTENSION_TASK_LIST) ||
-+	    e_source_has_extension (data_source, E_SOURCE_EXTENSION_MEMO_LIST)) {
-+		part_enabled = !collection_extension || e_source_collection_get_calendar_enabled (collection_extension);
-+	} else if (e_source_has_extension (data_source, E_SOURCE_EXTENSION_ADDRESS_BOOK)) {
-+		part_enabled = !collection_extension || e_source_collection_get_contacts_enabled (collection_extension);
-+	} else if (e_source_has_extension (data_source, E_SOURCE_EXTENSION_MAIL_ACCOUNT) ||
-+		   e_source_has_extension (data_source, E_SOURCE_EXTENSION_MAIL_IDENTITY) ||
-+		   e_source_has_extension (data_source, E_SOURCE_EXTENSION_MAIL_TRANSPORT)) {
-+		part_enabled = !collection_extension || e_source_collection_get_mail_enabled (collection_extension);
-+	}
-+
-+	e_source_set_enabled (data_source, part_enabled);
-+}
-+
- static ESource *
- ews_backend_new_child (EEwsBackend *backend,
-                        EEwsFolder *folder)
-@@ -188,7 +220,6 @@ ews_backend_new_child (EEwsBackend *back
- 
- 	display_name = e_ews_folder_get_name (folder);
- 	e_source_set_display_name (source, display_name);
--	e_source_set_enabled (source, TRUE);
- 
- 	switch (e_ews_folder_get_folder_type (folder)) {
- 		case E_EWS_FOLDER_TYPE_CALENDAR:
-@@ -210,6 +241,7 @@ ews_backend_new_child (EEwsBackend *back
- 	extension = e_source_get_extension (source, extension_name);
- 	e_source_backend_set_backend_name (
- 		E_SOURCE_BACKEND (extension), "ews");
-+	ews_backend_update_enabled (source, e_backend_get_source (E_BACKEND (backend)));
- 
- 	if (e_ews_folder_get_folder_type (folder) != E_EWS_FOLDER_TYPE_CONTACTS &&
- 	    !e_source_has_extension (source, E_SOURCE_EXTENSION_EWS_FOLDER) &&
-@@ -378,9 +410,22 @@ ews_backend_add_gal_source (EEwsBackend
- 	const gchar *oal_id = NULL;
- 	const gchar *uid;
- 	gchar *oal_selected;
-+	gboolean can_enable;
- 
- 	settings = ews_backend_get_settings (backend);
- 	collection_backend = E_COLLECTION_BACKEND (backend);
-+	source = e_backend_get_source (E_BACKEND (backend));
-+	if (source) {
-+		ESourceCollection *collection_extension = NULL;
-+
-+		if (e_source_has_extension (source, E_SOURCE_EXTENSION_COLLECTION))
-+			collection_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION);
-+
-+		can_enable = !collection_extension || (e_source_get_enabled (source) &&
-+			e_source_collection_get_contacts_enabled (collection_extension));
-+	} else {
-+		can_enable = FALSE;
-+	}
- 
- 	gal_uid = camel_ews_settings_get_gal_uid (settings);
- 
-@@ -390,7 +435,7 @@ ews_backend_add_gal_source (EEwsBackend
- 		g_object_unref (server);
- 
- 		if (source != NULL) {
--			e_source_set_enabled (source, TRUE);
-+			e_source_set_enabled (source, can_enable);
- 			g_object_unref (source);
- 			return;
- 		}
-@@ -427,7 +472,7 @@ ews_backend_add_gal_source (EEwsBackend
- 
- 	source = e_collection_backend_new_child (
- 		collection_backend, oal_id);
--	e_source_set_enabled (source, TRUE);
-+	e_source_set_enabled (source, can_enable);
- 
- 	e_source_set_display_name (source, display_name);
- 
-@@ -507,7 +552,7 @@ add_remote_sources (EEwsBackend *backend
- 				E_SERVER_SIDE_SOURCE (source), TRUE);
- 			e_server_side_source_set_remote_deletable (
- 				E_SERVER_SIDE_SOURCE (source), TRUE);
--			e_source_set_enabled (source, TRUE);
-+			ews_backend_update_enabled (source, e_backend_get_source (E_BACKEND (backend)));
- 			e_source_registry_server_add_source (registry, source);
- 		} else {
- 			GError *error = NULL;
-@@ -635,7 +680,7 @@ ews_backend_claim_old_resources (ECollec
- 	for (iter = old_resources; iter; iter = g_list_next (iter)) {
- 		ESource *source = iter->data;
- 
--		e_source_set_enabled (source, TRUE);
-+		ews_backend_update_enabled (source, e_backend_get_source (E_BACKEND (backend)));
- 		e_source_registry_server_add_source (registry, source);
- 	}
- 
diff --git a/SOURCES/evolution-ews-3.22.6-truncate-before-resave-mail.patch b/SOURCES/evolution-ews-3.22.6-truncate-before-resave-mail.patch
deleted file mode 100644
index c60f5f2..0000000
--- a/SOURCES/evolution-ews-3.22.6-truncate-before-resave-mail.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-diff -up evolution-ews-3.22.6/src/camel/camel-ews-folder.c.truncate-before-resave-mail evolution-ews-3.22.6/src/camel/camel-ews-folder.c
---- evolution-ews-3.22.6/src/camel/camel-ews-folder.c.truncate-before-resave-mail	2017-03-22 13:00:18.239073297 +0100
-+++ evolution-ews-3.22.6/src/camel/camel-ews-folder.c	2017-03-22 13:00:18.242073297 +0100
-@@ -746,6 +746,26 @@ camel_ews_folder_get_message (CamelFolde
- 			/* Ignore errors here, it's nothing fatal in this case */
- 			cache_stream = ews_data_cache_get (ews_folder->cache, "cur", uid, NULL);
- 			if (cache_stream) {
-+				GIOStream *iostream;
-+
-+				/* Truncate the stream first, in case the message will be shorter
-+				   than the one received from the server */
-+				iostream = camel_stream_ref_base_stream (cache_stream);
-+				if (iostream) {
-+					GOutputStream *output_stream;
-+
-+					output_stream = g_io_stream_get_output_stream (iostream);
-+					if (G_IS_SEEKABLE (output_stream)) {
-+						GSeekable *seekable = G_SEEKABLE (output_stream);
-+
-+						if (g_seekable_can_truncate (seekable)) {
-+							g_seekable_truncate (seekable, 0, NULL, NULL);
-+						}
-+					}
-+
-+					g_object_unref (iostream);
-+				}
-+
- 				camel_data_wrapper_write_to_stream_sync (CAMEL_DATA_WRAPPER (message), cache_stream, cancellable, NULL);
- 				g_object_unref (cache_stream);
- 			}
diff --git a/SOURCES/evolution-ews-3.28.2-cmake-version.patch b/SOURCES/evolution-ews-3.28.2-cmake-version.patch
new file mode 100644
index 0000000..e4582a5
--- /dev/null
+++ b/SOURCES/evolution-ews-3.28.2-cmake-version.patch
@@ -0,0 +1,36 @@
+diff -up evolution-ews-3.28.2/CMakeLists.txt.cmake-version evolution-ews-3.28.2/CMakeLists.txt
+--- evolution-ews-3.28.2/CMakeLists.txt.cmake-version	2018-06-01 04:36:37.121816899 -0400
++++ evolution-ews-3.28.2/CMakeLists.txt	2018-06-01 04:37:58.094454208 -0400
+@@ -1,11 +1,15 @@
+ # Evolution-EWS build script
+ 
+-cmake_minimum_required(VERSION 3.1)
+-cmake_policy(VERSION 3.1)
++cmake_minimum_required(VERSION 2.8)
++cmake_policy(VERSION 2.8)
++
++project(evolution-ews C)
++set(PROJECT_VERSION_MAJOR 3)
++set(PROJECT_VERSION_MINOR 28)
++set(PROJECT_VERSION_PATCH 5)
++set(PROJECT_VERSION_TWEAK 0)
++set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})
+ 
+-project(evolution-ews
+-	VERSION 3.28.5
+-	LANGUAGES C)
+ set(PROJECT_BUGREPORT "https://gitlab.gnome.org/GNOME/evolution-ews/issues/")
+ 
+ # Required for FindIntltool module
+diff -up evolution-ews-3.28.2/cmake/modules/FindIntltool.cmake.cmake-version evolution-ews-3.28.2/cmake/modules/FindIntltool.cmake
+--- evolution-ews-3.28.2/cmake/modules/FindIntltool.cmake.cmake-version	2018-05-07 04:34:12.000000000 -0400
++++ evolution-ews-3.28.2/cmake/modules/FindIntltool.cmake	2018-06-01 04:36:37.122816894 -0400
+@@ -92,7 +92,7 @@ macro(intltool_add_pot_file_target)
+ 	endif(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL GETTEXT_PO_DIR)
+ 
+ 	add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${GETTEXT_PACKAGE}.pot
+-		COMMAND ${CMAKE_COMMAND} -E env INTLTOOL_EXTRACT="${INTLTOOL_EXTRACT}" XGETTEXT="${XGETTEXT}" srcdir=${CMAKE_CURRENT_SOURCE_DIR} ${INTLTOOL_UPDATE} --gettext-package ${GETTEXT_PACKAGE} --pot
++		COMMAND env INTLTOOL_EXTRACT="${INTLTOOL_EXTRACT}" XGETTEXT="${XGETTEXT}" srcdir=${CMAKE_CURRENT_SOURCE_DIR} ${INTLTOOL_UPDATE} --gettext-package ${GETTEXT_PACKAGE} --pot
+ 	)
+ 
+ 	add_custom_target(pot-file
diff --git a/SPECS/evolution-ews.spec b/SPECS/evolution-ews.spec
index 7846dc8..3110901 100644
--- a/SPECS/evolution-ews.spec
+++ b/SPECS/evolution-ews.spec
@@ -1,95 +1,72 @@
-%global evo_base_version 3.22
-%global libmspack_version 0.5-0.5
-%global with_libmspack 1
+%global libmspack_version 0.4
 
 Name: evolution-ews
-Version: 3.22.6
-Release: 6%{?dist}
+Version: 3.28.5
+Release: 1%{?dist}
 Group: Applications/Productivity
 Summary: Evolution extension for Exchange Web Services
 License: LGPLv2
 URL: https://wiki.gnome.org/Apps/Evolution
-Source: http://download.gnome.org/sources/%{name}/3.22/%{name}-%{version}.tar.xz
+Source: http://download.gnome.org/sources/%{name}/3.28/%{name}-%{version}.tar.xz
 
-# RH bug #1433268
-Patch01: evolution-ews-3.22.6-message-date-in-utc.patch
+%global eds_evo_version %{version}
 
-# RH bug #1434758
-Patch02: evolution-ews-3.22.6-truncate-before-resave-mail.patch
+Patch01: evolution-ews-3.28.2-cmake-version.patch
 
-# RH bug #1435552
-Patch03: evolution-ews-3.22.6-subsources-enabled-state.patch
-
-# RH bug #1450022
-Patch04: evolution-ews-3.22.6-free-busy-calendar.patch
-
-Requires: evolution >= %{version}
-Requires: evolution-data-server >= %{version}
-%if %{with_libmspack}
+Requires: evolution >= %{eds_evo_version}
+Requires: evolution-data-server >= %{eds_evo_version}
+Requires: %{name}-langpacks = %{version}-%{release}
 Requires: libmspack >= %{libmspack_version}
-%endif
 
-BuildRequires: gettext
-BuildRequires: gnome-common
+BuildRequires: cmake
+BuildRequires: gcc
 BuildRequires: intltool
-BuildRequires: libtool
-BuildRequires: pkgconfig(camel-1.2) >= %{version}
-BuildRequires: pkgconfig(evolution-data-server-1.2) >= %{version}
-BuildRequires: pkgconfig(evolution-mail-3.0) >= %{version}
-BuildRequires: pkgconfig(evolution-shell-3.0) >= %{version}
+BuildRequires: pkgconfig(camel-1.2) >= %{eds_evo_version}
+BuildRequires: pkgconfig(evolution-data-server-1.2) >= %{eds_evo_version}
+BuildRequires: pkgconfig(evolution-mail-3.0) >= %{eds_evo_version}
+BuildRequires: pkgconfig(evolution-shell-3.0) >= %{eds_evo_version}
 BuildRequires: pkgconfig(glib-2.0)
 BuildRequires: pkgconfig(gtk+-3.0)
-BuildRequires: pkgconfig(libebackend-1.2) >= %{version}
-BuildRequires: pkgconfig(libebook-1.2) >= %{version}
-BuildRequires: pkgconfig(libecal-1.2) >= %{version}
-BuildRequires: pkgconfig(libedata-book-1.2) >= %{version}
-BuildRequires: pkgconfig(libedata-cal-1.2) >= %{version}
-BuildRequires: pkgconfig(libemail-engine) >= %{version}
+BuildRequires: pkgconfig(libebackend-1.2) >= %{eds_evo_version}
+BuildRequires: pkgconfig(libebook-1.2) >= %{eds_evo_version}
+BuildRequires: pkgconfig(libecal-1.2) >= %{eds_evo_version}
+BuildRequires: pkgconfig(libedata-book-1.2) >= %{eds_evo_version}
+BuildRequires: pkgconfig(libedata-cal-1.2) >= %{eds_evo_version}
+BuildRequires: pkgconfig(libemail-engine) >= %{eds_evo_version}
 BuildRequires: pkgconfig(libical)
-%if %{with_libmspack}
 BuildRequires: pkgconfig(libmspack) >= %{libmspack_version}
-%endif
 BuildRequires: pkgconfig(libsoup-2.4)
 
 %description
 This package allows Evolution to interact with Microsoft Exchange servers,
 versions 2007 and later, through its Exchange Web Services (EWS) interface.
 
+%package langpacks
+Summary: Translations for %{name}
+BuildArch: noarch
+Requires: %{name} = %{version}-%{release}
+
+%description langpacks
+This package contains translations for %{name}.
+
 %prep
 %setup -q
-%patch01 -p1 -b .message-date-in-utc
-%patch02 -p1 -b .truncate-before-resave-mail
-%patch03 -p1 -b .subsources-enabled-state
-%patch04 -p1 -b .free-busy-calendar
+%patch01 -p1 -b .cmake-version
 
 %build
 
-export CFLAGS="$RPM_OPT_FLAGS -Wno-deprecated-declarations"
+mkdir _build
+cd _build
 
-aclocal -I m4
-autoheader
-automake --add-missing
-libtoolize
-intltoolize --force
-autoconf
-
-%if %{with_libmspack}
-%configure
-%else
-%configure --with-internal-lzx
-%endif
+export CFLAGS="$RPM_OPT_FLAGS -Wno-deprecated-declarations"
+%cmake -G "Unix Makefiles" ..
 make %{?_smp_mflags}
 
 %install
 rm -rf $RPM_BUILD_ROOT
-make install DESTDIR=$RPM_BUILD_ROOT
 
-# Remove files we don't want packaged (no devel subpackage).
-rm -r $RPM_BUILD_ROOT%{_includedir}/evolution-data-server/
-rm $RPM_BUILD_ROOT%{_libdir}/evolution-data-server/*.la
-rm $RPM_BUILD_ROOT%{_libdir}/evolution-data-server/*.so
-rm $RPM_BUILD_ROOT%{_libdir}/evolution-data-server/*/*.la
-rm $RPM_BUILD_ROOT%{_libdir}/evolution/modules/*.la
+cd _build
+make install DESTDIR=$RPM_BUILD_ROOT
 
 %find_lang %{name}
 
@@ -97,21 +74,41 @@ rm $RPM_BUILD_ROOT%{_libdir}/evolution/modules/*.la
 
 %postun -p /sbin/ldconfig
 
-%files -f %{name}.lang
-%doc COPYING NEWS README
-%{_libdir}/evolution-data-server/libeews-1.2.so.*
-%{_libdir}/evolution-data-server/libewsutils.so.*
+%files
+%license COPYING
+%doc NEWS README
+%{_libdir}/evolution/modules/module-ews-configuration.so
 %{_libdir}/evolution-data-server/camel-providers/libcamelews.so
 %{_libdir}/evolution-data-server/camel-providers/libcamelews.urls
 %{_libdir}/evolution-data-server/addressbook-backends/libebookbackendews.so
 %{_libdir}/evolution-data-server/calendar-backends/libecalbackendews.so
 %{_libdir}/evolution-data-server/registry-modules/module-ews-backend.so
-%{_libdir}/evolution/modules/module-ews-configuration.so
-%{_datadir}/appdata/evolution-ews.metainfo.xml
+%{_libdir}/evolution-ews/libcamelews-priv.so
+%{_libdir}/evolution-ews/libevolution-ews.so
+%{_datadir}/metainfo/org.gnome.Evolution-ews.metainfo.xml
 %{_datadir}/evolution/errors/module-ews-configuration.error
 %{_datadir}/evolution-data-server/ews/windowsZones.xml
 
+%files langpacks -f _build/%{name}.lang
+
 %changelog
+* Mon Jul 30 2018 Milan Crha <mcrha@redhat.com> - 3.28.5-1
+- Update to 3.28.5
+
+* Mon Jul 16 2018 Milan Crha <mcrha@redhat.com> - 3.28.4-1
+- Update to 3.28.4
+- Remove patch for GNOME bug #796297 (fixed upstream)
+
+* Mon Jun 25 2018 Milan Crha <mcrha@redhat.com> - 3.28.3-2
+- Add patch for GNOME bug #796297 (Cannot modify existing meeting after fix for this bug)
+
+* Mon Jun 18 2018 Milan Crha <mcrha@redhat.com> - 3.28.3-1
+- Update to 3.28.3
+
+* Wed May 30 2018 Milan Crha <mcrha@redhat.com> - 3.28.2-1
+- Update to 3.28.2
+- Resolves: #1575499
+
 * Wed May 24 2017 Milan Crha <mcrha@redhat.com> - 3.22.6-6
 - Add patch for RH bug #1450022 (Allow adding Free/Busy as a foreign Calendar)