Index: evolution-2.28.2/plugins/itip-formatter/itip-formatter.c
===================================================================
--- evolution-2.28.2.orig/plugins/itip-formatter/itip-formatter.c
+++ evolution-2.28.2/plugins/itip-formatter/itip-formatter.c
@@ -2328,7 +2328,7 @@ format_itip_object (EMFormatHTML *efh, G
 
 		start_tm = icaltimetype_to_tm_with_zone (datetime.value, from_zone, to_zone);
 
-		itip_view_set_start (ITIP_VIEW (info->view), &start_tm);
+		itip_view_set_start (ITIP_VIEW (info->view), &start_tm, datetime.value->is_date);
 		info->start_time = icaltime_as_timet_with_zone (*datetime.value, from_zone);
 	}
 
@@ -2362,9 +2362,16 @@ format_itip_object (EMFormatHTML *efh, G
 		else
 			from_zone = NULL;
 
+		if (datetime.value->is_date) {
+			/* RFC says the DTEND is not inclusive, thus subtract one day
+			   if we have a date */
+
+			icaltime_adjust (datetime.value, -1, 0, 0, 0);
+		}
+
 		end_tm = icaltimetype_to_tm_with_zone (datetime.value, from_zone, to_zone);
 
-		itip_view_set_end (ITIP_VIEW (info->view), &end_tm);
+		itip_view_set_end (ITIP_VIEW (info->view), &end_tm, datetime.value->is_date);
 		info->end_time = icaltime_as_timet_with_zone (*datetime.value, from_zone);
 	}
 	e_cal_component_free_datetime (&datetime);
Index: evolution-2.28.2/plugins/itip-formatter/itip-view.c
===================================================================
--- evolution-2.28.2.orig/plugins/itip-formatter/itip-view.c
+++ evolution-2.28.2/plugins/itip-formatter/itip-view.c
@@ -85,10 +85,12 @@ struct _ItipViewPrivate {
 	GtkWidget *start_header;
 	GtkWidget *start_label;
 	struct tm *start_tm;
+	gboolean start_tm_is_date;
 
 	GtkWidget *end_header;
 	GtkWidget *end_label;
 	struct tm *end_tm;
+	gboolean end_tm_is_date;
 
 	GtkWidget *upper_info_box;
 	GSList *upper_info_items;
@@ -145,6 +147,7 @@ format_date_and_time_x		(struct tm	*date
 				 gboolean	 use_24_hour_format,
 				 gboolean	 show_midnight,
 				 gboolean	 show_zero_seconds,
+				 gboolean	 is_date,
 				 gchar		*buffer,
 				 gint		 buffer_size)
 {
@@ -185,8 +188,8 @@ format_date_and_time_x		(struct tm	*date
 	if (date_tm->tm_mday == current_tm->tm_mday &&
 	    date_tm->tm_mon == current_tm->tm_mon &&
 	    date_tm->tm_year == current_tm->tm_year) {
-		if (!show_midnight && date_tm->tm_hour == 0
-		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0) {
+		if (is_date || (!show_midnight && date_tm->tm_hour == 0
+		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0)) {
 			/* strftime format of a weekday and a date. */
 			format = _("Today");
 		} else if (use_24_hour_format) {
@@ -213,8 +216,8 @@ format_date_and_time_x		(struct tm	*date
 	} else if (date_tm->tm_mday == tomorrow_tm.tm_mday &&
 		   date_tm->tm_mon == tomorrow_tm.tm_mon &&
 		   date_tm->tm_year == tomorrow_tm.tm_year) {
-		if (!show_midnight && date_tm->tm_hour == 0
-		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0) {
+		if (is_date || (!show_midnight && date_tm->tm_hour == 0
+		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0)) {
 			/* strftime format of a weekday and a date. */
 			format = _("Tomorrow");
 		} else if (use_24_hour_format) {
@@ -250,8 +253,8 @@ format_date_and_time_x		(struct tm	*date
 		   (date_tm->tm_year == week_tm.tm_year &&
 		    date_tm->tm_mon == week_tm.tm_mon &&
 		    date_tm->tm_mday < week_tm.tm_mday))) {
-		if (!show_midnight && date_tm->tm_hour == 0
-		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0) {
+		if (is_date || (!show_midnight && date_tm->tm_hour == 0
+		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0)) {
 			/* strftime format of a weekday. */
 			format = _("%A");
 		} else if (use_24_hour_format) {
@@ -276,8 +279,8 @@ format_date_and_time_x		(struct tm	*date
 
 	/* This Year */
 	} else if (date_tm->tm_year == current_tm->tm_year) {
-		if (!show_midnight && date_tm->tm_hour == 0
-		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0) {
+		if (is_date || (!show_midnight && date_tm->tm_hour == 0
+		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0)) {
 			/* strftime format of a weekday and a date
 			   without a year. */
 			format = _("%A, %B %e");
@@ -302,8 +305,8 @@ format_date_and_time_x		(struct tm	*date
 				format = _("%A, %B %e %l:%M:%S %p");
 		}
 	} else {
-		if (!show_midnight && date_tm->tm_hour == 0
-		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0) {
+		if (is_date || (!show_midnight && date_tm->tm_hour == 0
+		    && date_tm->tm_min == 0 && date_tm->tm_sec == 0)) {
 			/* strftime format of a weekday and a date. */
 			format = _("%A, %B %e, %Y");
 		} else if (use_24_hour_format) {
@@ -652,7 +655,7 @@ set_description_text (ItipView *view)
 }
 
 static void
-set_start_text (ItipView *view)
+update_start_end_times (ItipView *view)
 {
 	ItipViewPrivate *priv;
 	gchar buffer[256];
@@ -664,39 +667,45 @@ set_start_text (ItipView *view)
 	now = time (NULL);
 	now_tm = localtime (&now);
 
-	if (priv->start_tm) {
-		format_date_and_time_x (priv->start_tm, now_tm, FALSE, TRUE, FALSE, buffer, 256);
+	#define is_same(_member) (priv->start_tm->_member == priv->end_tm->_member)
+	if (priv->start_tm && priv->end_tm && priv->start_tm_is_date && priv->end_tm_is_date
+	    && is_same (tm_mday) && is_same (tm_mon) && is_same (tm_year)) {
+		/* it's an all day event in one particular day */
+		format_date_and_time_x (priv->start_tm, now_tm, FALSE, TRUE, FALSE, priv->start_tm_is_date, buffer, 256);
 		gtk_label_set_text (GTK_LABEL (priv->start_label), buffer);
-	} else {
-		gtk_label_set_text (GTK_LABEL (priv->start_label), NULL);
-	}
-
-	priv->start_tm ? gtk_widget_show (priv->start_header) : gtk_widget_hide (priv->start_header);
-	priv->start_tm ? gtk_widget_show (priv->start_label) : gtk_widget_hide (priv->start_label);
-}
-
-static void
-set_end_text (ItipView *view)
-{
-	ItipViewPrivate *priv;
-	gchar buffer[256];
-	time_t now;
-	struct tm *now_tm;
-
-	priv = view->priv;
+		gtk_label_set_text (GTK_LABEL (priv->start_header), _("All day:"));
 
-	now = time (NULL);
-	now_tm = localtime (&now);
-
-	if (priv->end_tm) {
-		format_date_and_time_x (priv->end_tm, now_tm, FALSE, TRUE, FALSE, buffer, 256);
-		gtk_label_set_text (GTK_LABEL (priv->end_label), buffer);
+		gtk_widget_show (priv->start_header);
+		gtk_widget_show (priv->start_label);
+		gtk_widget_hide (priv->end_header);
+		gtk_widget_hide (priv->end_label);
 	} else {
-		gtk_label_set_text (GTK_LABEL (priv->end_label), NULL);
+		if (priv->start_tm) {
+			format_date_and_time_x (priv->start_tm, now_tm, FALSE, TRUE, FALSE, priv->start_tm_is_date, buffer, 256);
+			gtk_label_set_text (GTK_LABEL (priv->start_label), buffer);
+			gtk_label_set_text (GTK_LABEL (priv->start_header), priv->start_tm_is_date ? _("Start day:") : _("Start time:"));
+			gtk_widget_show (priv->start_header);
+			gtk_widget_show (priv->start_label);
+		} else {
+			gtk_label_set_text (GTK_LABEL (priv->start_label), NULL);
+			gtk_widget_hide (priv->start_header);
+			gtk_widget_hide (priv->start_label);
+		}
+
+		if (priv->end_tm) {
+			format_date_and_time_x (priv->end_tm, now_tm, FALSE, TRUE, FALSE, priv->end_tm_is_date, buffer, 256);
+			gtk_label_set_text (GTK_LABEL (priv->end_label), buffer);
+			gtk_label_set_text (GTK_LABEL (priv->end_header), priv->end_tm_is_date ? _("End day:") : _("End time:"));
+			gtk_widget_show (priv->end_header);
+			gtk_widget_show (priv->end_label);
+		} else {
+			gtk_label_set_text (GTK_LABEL (priv->end_label), NULL);
+			gtk_widget_hide (priv->end_header);
+			gtk_widget_hide (priv->end_label);
+		}
 	}
 
-	priv->end_tm ? gtk_widget_show (priv->end_header) : gtk_widget_hide (priv->end_header);
-	priv->end_tm ? gtk_widget_show (priv->end_label) : gtk_widget_hide (priv->end_label);
+	#undef is_same
 }
 
 static void
@@ -1599,7 +1608,7 @@ itip_view_get_description (ItipView *vie
 }
 
 void
-itip_view_set_start (ItipView *view, struct tm *start)
+itip_view_set_start (ItipView *view, struct tm *start, gboolean is_date)
 {
 	ItipViewPrivate *priv;
 
@@ -1618,11 +1627,13 @@ itip_view_set_start (ItipView *view, str
 		*priv->start_tm = *start;
 	}
 
-	set_start_text (view);
+	priv->start_tm_is_date = is_date && start;
+
+	update_start_end_times (view);
 }
 
 const struct tm *
-itip_view_get_start (ItipView *view)
+itip_view_get_start (ItipView *view, gboolean *is_date)
 {
 	ItipViewPrivate *priv;
 
@@ -1631,11 +1642,14 @@ itip_view_get_start (ItipView *view)
 
 	priv = view->priv;
 
+	if (is_date)
+		*is_date = priv->start_tm_is_date;
+
 	return priv->start_tm;
 }
 
 void
-itip_view_set_end (ItipView *view, struct tm *end)
+itip_view_set_end (ItipView *view, struct tm *end, gboolean is_date)
 {
 	ItipViewPrivate *priv;
 
@@ -1654,11 +1668,13 @@ itip_view_set_end (ItipView *view, struc
 		*priv->end_tm = *end;
 	}
 
-	set_end_text (view);
+	priv->end_tm_is_date = is_date && end;
+
+	update_start_end_times (view);
 }
 
 const struct tm *
-itip_view_get_end (ItipView *view)
+itip_view_get_end (ItipView *view, gboolean *is_date)
 {
 	ItipViewPrivate *priv;
 
@@ -1667,6 +1683,9 @@ itip_view_get_end (ItipView *view)
 
 	priv = view->priv;
 
+	if (is_date)
+		*is_date = priv->end_tm_is_date;
+
 	return priv->end_tm;
 }
 
Index: evolution-2.28.2/plugins/itip-formatter/itip-view.h
===================================================================
--- evolution-2.28.2.orig/plugins/itip-formatter/itip-view.h
+++ evolution-2.28.2/plugins/itip-formatter/itip-view.h
@@ -132,11 +132,11 @@ const gchar *itip_view_get_comment (Itip
 void itip_view_set_description (ItipView *view, const gchar *description);
 const gchar *itip_view_get_description (ItipView *view);
 
-void itip_view_set_start (ItipView *view, struct tm *start);
-const struct tm *itip_view_get_start (ItipView *view);
+void itip_view_set_start (ItipView *view, struct tm *start, gboolean is_date);
+const struct tm *itip_view_get_start (ItipView *view, gboolean *is_date);
 
-void itip_view_set_end (ItipView *view, struct tm *end);
-const struct tm *itip_view_get_end (ItipView *view);
+void itip_view_set_end (ItipView *view, struct tm *end, gboolean is_date);
+const struct tm *itip_view_get_end (ItipView *view, gboolean *is_date);
 
 guint itip_view_add_upper_info_item (ItipView *view, ItipViewInfoItemType type, const gchar *message);
 guint itip_view_add_upper_info_item_printf (ItipView *view, ItipViewInfoItemType, const gchar *format, ...) G_GNUC_PRINTF (3, 4);
