diff --git a/src/libexchangemapi/exchange-mapi-cal-recur-utils.c b/src/libexchangemapi/exchange-mapi-cal-recur-utils.c
index 452a235..5040296 100644
--- a/src/libexchangemapi/exchange-mapi-cal-recur-utils.c
+++ b/src/libexchangemapi/exchange-mapi-cal-recur-utils.c
@@ -76,6 +76,18 @@ struct ExceptionInfo {
 };
 #endif
 
+/* Override flags defining what fields might be found in ExceptionInfo */
+#define ARO_SUBJECT 0x0001
+#define ARO_MEETINGTYPE 0x0002
+#define ARO_REMINDERDELTA 0x0004
+#define ARO_REMINDER 0x0008
+#define ARO_LOCATION 0x0010
+#define ARO_BUSYSTATUS 0x0020
+#define ARO_ATTACHMENT 0x0040
+#define ARO_SUBTYPE 0x0080
+#define ARO_APPTCOLOR 0x0100
+#define ARO_EXCEPTIONAL_BODY 0x0200
+
 static icalrecurrencetype_weekday
 get_ical_weekstart (uint32_t fdow)
 {
@@ -632,7 +644,9 @@ exchange_mapi_cal_util_bin_to_rrule (GByteArray *ba, ECalComponent *comp)
 	/* number of changed exceptions */
 	flag32 = *((guint32 *)ptr);
 	ptr += sizeof (guint32);
-	/* FIXME: Parse modified instances */
+	/* For each changed exception, there will be a corresponding
+       ExceptionInfo below.  So at present we don't need to do
+       anything with the information here beyond skipping it */
 	if (flag32)
 		ptr += flag32 * sizeof (guint32);
 
@@ -669,14 +683,124 @@ exchange_mapi_cal_util_bin_to_rrule (GByteArray *ba, ECalComponent *comp)
 	flag32 = *((guint32 *)ptr);
 	ptr += sizeof (guint32);
 
-	/* modified exceptions */
+	/* modified exceptions, an ExceptionCount sized list of
+	   ExceptionInfo instances */
 	flag16 = *((guint16 *)ptr);
 	ptr += sizeof (guint16);
-    /* FIXME: there are flag16 count modified exceptions here, which
-              are variable in size, followed by a ReservedBlock1{Size,}
-              and ReservedBlock2{Size,}.  However, since we have nothing 
-              else to do until we are able to parse these modified
-              instances, we just stop now. */
+	if (flag16) {
+		for (i = 0; i < flag16; ++i) {
+			uint32_t starttime, endtime;
+			guint16 overrideflags;
+			struct icaltimetype tt, *val;
+			ECalComponent *detached = NULL;
+			ECalComponentDateTime *dtstart, *dtend;
+			dtstart = g_new0 (ECalComponentDateTime, 1);
+			dtend = g_new0 (ECalComponentDateTime, 1);
+			starttime = *((guint32 *)ptr);
+			ptr += sizeof (guint32);
+
+			tt = icaltime_from_timet_with_zone (convert_recurrence_minutes_to_timet (starttime), 0, 0);
+			val = g_new0(struct icaltimetype, 1);
+			memcpy (val, &tt, sizeof(struct icaltimetype));
+
+			dtstart->value = val;
+			dtstart->tzid = g_strdup ("UTC");
+
+			/* ExceptionInfo.EndTime */
+			endtime = *((guint32 *)ptr);
+			ptr += sizeof (guint32);
+
+			tt = icaltime_from_timet_with_zone (convert_recurrence_minutes_to_timet (endtime), 0, 0);
+			val = g_new0(struct icaltimetype, 1);
+			memcpy (val, &tt, sizeof(struct icaltimetype));
+
+			dtend->value = val;
+			dtend->tzid = g_strdup ("UTC");
+
+			/* make a shallow clone of comp */
+			detached = e_cal_component_clone(comp);
+			e_cal_component_set_rdate_list (detached, NULL);
+			e_cal_component_set_rrule_list (detached, NULL);
+			e_cal_component_set_exdate_list (detached, NULL);
+			e_cal_component_set_exrule_list (detached, NULL);
+			e_cal_component_set_dtstart(detached, dtstart);
+			e_cal_component_set_dtend(detached, dtend);
+
+			/* continue parsing stuff we don't need, because we need to
+			   get to the next ExceptionInfo object or back out to the
+			   containing AppointmentRecurrencePattern object */
+			/* ExceptionInfo.OriginalStartDate */
+			ptr += sizeof (guint32);
+
+			/* ExceptionInfo.OverrideFlags */
+			overrideflags = *((guint16 *) ptr);
+			ptr += sizeof (guint16);
+
+			if (overrideflags&ARO_SUBJECT) {
+				/* ExceptionInfo.SubjectLength, ExceptionInfo.SubjectLength2
+				   and ExceptionInfo.Subject */
+				ptr += sizeof (guint16);
+				flag16 = *(guint16 *)ptr; /* use SubjectLength2 */
+				ptr += sizeof (guint16);
+				/* note a discrepency in MS-OXOCAL here, which suggests that
+				   Subject is actually 2 bytes */
+
+				/* FIXME: copy flag16 bytes from ptr to an EcalComponentText,
+				   null terminate it, and then call
+				   e_cal_component_set_summary() */
+				ptr += flag16;
+			} if (overrideflags&ARO_MEETINGTYPE) {
+				/* ExceptionInfo.MeetingType */
+				ptr += sizeof (guint32);
+			} if (overrideflags&ARO_REMINDERDELTA) {
+				/* ExceptionInfo.ReminderDelta */
+				ptr += sizeof (guint32);
+			} if (overrideflags&ARO_REMINDER) {
+				/* ExceptionInfo.ReminderSet */
+				ptr += sizeof (guint32);
+			} if (overrideflags&ARO_LOCATION) {
+				/* ExceptionInfo.LocationLength, ExceptionInfo.LocationLength2
+				   and ExceptionInfo.Location */
+				ptr += sizeof (guint16);
+				flag16 = *(guint16 *)ptr; /* use LocationLength2 */
+				ptr += sizeof (guint16);
+				/* note a discrepency in MS-OXOCAL here, which suggests that
+				   Location is actually 4 bytes */
+
+				/* FIXME: copy flag16 bytes from ptr to an EcalComponentText,
+				   null terminate it, and then call
+				   e_cal_component_set_location() */
+				ptr += flag16;
+			} if (overrideflags&ARO_BUSYSTATUS) {
+				/* ExceptionInfo.BusyStatus */
+				ptr += sizeof (guint32);
+			} if (overrideflags&ARO_ATTACHMENT) {
+				/* ExceptionInfo.Attachment */
+				ptr += sizeof (guint32);
+			} if (overrideflags&ARO_SUBTYPE) {
+				/* ExceptionInfo.Subtype */
+				ptr += sizeof (guint32);
+			} if (overrideflags&ARO_APPTCOLOR) {
+				/* ExceptionInfo.AppointmentColor */
+				ptr += sizeof (guint32);
+			}
+
+			/* FIXME: okay, now what do we do with detached? :) */
+
+			/* ExceptionInfo.ReservedBlock1Size */
+			flag32 = *((guint32 *)ptr);
+			ptr += sizeof (guint32);
+			/* The spec is self-contradicting regarding ReservedBlock1Size
+			   And Reserved1Block here.  Observations are that the former
+			   exists as a 4 byte integer which "MUST" be but isn't always
+			   set to 0, and ReservedBlock1 simply doesn't exist.
+			 */
+		}
+	}
+
+	/* in case anyone ever needs to traverse further, from this point ptr 
+	   should be pointing at AppointmentRecurrencePattern.ReservedBlock1Size */
+
 
 	/* Set the recurrence */
 	{
