[evolution/wip/mcrha/eds-libical-glib] src/calendar/gui/ - e-day-view* and e-week-view*



commit da4628a6e2cc1ca3c178a767d2ce5b4100722a1e
Author: Milan Crha <mcrha redhat com>
Date:   Thu Mar 21 15:31:45 2019 +0100

    src/calendar/gui/ - e-day-view* and e-week-view*

 src/calendar/gui/e-cal-model.c            |  18 +-
 src/calendar/gui/e-calendar-view.c        | 482 ++++++++++---------
 src/calendar/gui/e-calendar-view.h        |   2 +-
 src/calendar/gui/e-day-view-main-item.c   |  71 +--
 src/calendar/gui/e-day-view-time-item.c   |  68 +--
 src/calendar/gui/e-day-view-top-item.c    |  29 +-
 src/calendar/gui/e-day-view.c             | 756 ++++++++++++++++--------------
 src/calendar/gui/e-week-view-event-item.c |   6 +-
 src/calendar/gui/e-week-view-main-item.c  |  14 +-
 src/calendar/gui/e-week-view.c            | 367 ++++++++-------
 10 files changed, 962 insertions(+), 851 deletions(-)
---
diff --git a/src/calendar/gui/e-cal-model.c b/src/calendar/gui/e-cal-model.c
index f394ba6aca..5da5055c49 100644
--- a/src/calendar/gui/e-cal-model.c
+++ b/src/calendar/gui/e-cal-model.c
@@ -1920,18 +1920,14 @@ e_cal_model_get_component_index (ECalModel *model,
 
                if (comp_data) {
                        const gchar *uid;
-                       gchar *rid = NULL;
-                       ICalTimetype *iclrid;
+                       gchar *rid;
                        gboolean has_rid = e_cal_component_id_get_rid (id) != NULL;
 
                        uid = i_cal_component_get_uid (comp_data->icalcomp);
-                       iclrid = i_cal_component_get_recurrenceid (comp_data->icalcomp);
-                       if (!i_cal_time_is_null_time (iclrid))
-                               rid = i_cal_time_as_ical_string_r (iclrid);
-                       g_clear_object (&iclrid);
+                       rid = e_cal_util_component_get_recurid_as_string (comp_data->icalcomp);
 
                        if (uid && *uid) {
-                               if ((!client || comp_data->client == client) && strcmp 
(e_cal_component_id_get_uid (id), uid) == 0) {
+                               if ((!client || comp_data->client == client) && strcmp (uid, 
e_cal_component_id_get_uid (id)) == 0) {
                                        if (has_rid) {
                                                if (!(rid && *rid && strcmp (rid, e_cal_component_id_get_rid 
(id)) == 0)) {
                                                        g_free (rid);
@@ -3628,15 +3624,11 @@ search_by_id_and_client (ECalModelPrivate *priv,
 
                if (comp_data) {
                        const gchar *uid;
-                       gchar *rid = NULL;
-                       ICalTimetype *iclrid;
+                       gchar *rid;
                        gboolean has_rid = e_cal_component_id_get_rid (id) != NULL;
 
                        uid = i_cal_component_get_uid (comp_data->icalcomp);
-                       iclrid = i_cal_component_get_recurrenceid (comp_data->icalcomp);
-                       if (!i_cal_time_is_null_time (iclrid))
-                               rid = i_cal_time_as_ical_string_r (iclrid);
-                       g_clear_object (&iclrid);
+                       rid = e_cal_util_component_get_recurid_as_string (comp_data->icalcomp);
 
                        if (uid && *uid) {
                                if ((!client || comp_data->client == client) &&
diff --git a/src/calendar/gui/e-calendar-view.c b/src/calendar/gui/e-calendar-view.c
index c2cf72dcd2..2eb358388c 100644
--- a/src/calendar/gui/e-calendar-view.c
+++ b/src/calendar/gui/e-calendar-view.c
@@ -104,30 +104,30 @@ calendar_view_add_retract_data (ECalComponent *comp,
                                 const gchar *retract_comment,
                                 ECalObjModType mod)
 {
-       icalcomponent *icalcomp = NULL;
-       icalproperty *icalprop = NULL;
+       ICalComponent *icomp;
+       ICalProperty *prop;
 
-       icalcomp = e_cal_component_get_icalcomponent (comp);
+       icomp = e_cal_component_get_icalcomponent (comp);
        if (retract_comment && *retract_comment)
-               icalprop = icalproperty_new_x (retract_comment);
+               prop = i_cal_property_new_x (retract_comment);
        else
-               icalprop = icalproperty_new_x ("0");
-       icalproperty_set_x_name (icalprop, "X-EVOLUTION-RETRACT-COMMENT");
-       icalcomponent_add_property (icalcomp, icalprop);
+               prop = i_cal_property_new_x ("0");
+       i_cal_property_set_x_name (prop, "X-EVOLUTION-RETRACT-COMMENT");
+       i_cal_component_take_property (icomp, prop);
 
        if (mod == E_CAL_OBJ_MOD_ALL)
-               icalprop = icalproperty_new_x ("All");
+               prop = i_cal_property_new_x ("All");
        else
-               icalprop = icalproperty_new_x ("This");
-       icalproperty_set_x_name (icalprop, "X-EVOLUTION-RECUR-MOD");
-       icalcomponent_add_property (icalcomp, icalprop);
+               prop = i_cal_property_new_x ("This");
+       i_cal_property_set_x_name (prop, "X-EVOLUTION-RECUR-MOD");
+       i_cal_component_take_property (icomp, prop);
 }
 
 static gboolean
 calendar_view_check_for_retract (ECalComponent *comp,
                                  ECalClient *client)
 {
-       ECalComponentOrganizer organizer;
+       ECalComponentOrganizer *organizer;
        const gchar *strip;
        gchar *email = NULL;
        gboolean ret_val;
@@ -138,8 +138,11 @@ calendar_view_check_for_retract (ECalComponent *comp,
        if (!e_cal_client_check_save_schedules (client))
                return FALSE;
 
-       e_cal_component_get_organizer (comp, &organizer);
-       strip = itip_strip_mailto (organizer.value);
+       organizer = e_cal_component_get_organizer (comp);
+       if (!organizer)
+               return FALSE;
+
+       strip = itip_strip_mailto (e_cal_component_organizer_get_value (organizer));
 
        ret_val =
                e_client_get_backend_property_sync (E_CLIENT (client), 
E_CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &email, NULL, NULL) &&
@@ -147,6 +150,8 @@ calendar_view_check_for_retract (ECalComponent *comp,
 
        g_free (email);
 
+       e_cal_component_organizer_free (organizer);
+
        return ret_val;
 }
 
@@ -168,7 +173,7 @@ calendar_view_delete_event (ECalendarView *cal_view,
        registry = e_cal_model_get_registry (model);
 
        comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       e_cal_component_set_icalcomponent (comp, i_cal_component_new_clone (event->comp_data->icalcomp));
        vtype = e_cal_component_get_vtype (comp);
 
        /*FIXME remove it once the we dont set the recurrence id for all the generated instances */
@@ -182,13 +187,13 @@ calendar_view_delete_event (ECalendarView *cal_view,
 
                delete = e_cal_dialogs_prompt_retract (GTK_WIDGET (cal_view), comp, &retract_comment, 
&retract);
                if (retract) {
-                       icalcomponent *icalcomp;
+                       ICalComponent *icomp;
 
                        calendar_view_add_retract_data (comp, retract_comment, E_CAL_OBJ_MOD_ALL);
-                       icalcomp = e_cal_component_get_icalcomponent (comp);
-                       icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL);
+                       icomp = e_cal_component_get_icalcomponent (comp);
+                       i_cal_component_set_method (icomp, I_CAL_METHOD_CANCEL);
 
-                       e_cal_ops_send_component (model, event->comp_data->client, icalcomp);
+                       e_cal_ops_send_component (model, event->comp_data->client, icomp);
                }
        } else if (e_cal_model_get_confirm_delete (model))
                delete = e_cal_dialogs_delete_component (
@@ -207,15 +212,17 @@ calendar_view_delete_event (ECalendarView *cal_view,
                                                event->comp_data->client,
                                                comp, TRUE)) {
                        if (only_occurrence && !e_cal_component_is_instance (comp)) {
-                               ECalComponentRange range;
+                               ECalComponentRange *range;
+                               ECalComponentDateTime *dtstart;
+
+                               dtstart = e_cal_component_get_dtstart (comp);
+                               i_cal_timetype_set_is_date (e_cal_component_datetime_get_value (dtstart), 1);
 
                                /* set the recurrence ID of the object we send */
-                               range.type = E_CAL_COMPONENT_RANGE_SINGLE;
-                               e_cal_component_get_dtstart (comp, &range.datetime);
-                               range.datetime.value->is_date = 1;
-                               e_cal_component_set_recurid (comp, &range);
+                               range = e_cal_component_range_new_take (E_CAL_COMPONENT_RANGE_SINGLE, 
dtstart);
+                               e_cal_component_set_recurid (comp, range);
 
-                               e_cal_component_free_datetime (&range.datetime);
+                               e_cal_component_range_free (range);
                        }
 
                        itip_send_component_with_model (model, E_CAL_COMPONENT_METHOD_CANCEL,
@@ -223,7 +230,7 @@ calendar_view_delete_event (ECalendarView *cal_view,
                                NULL, TRUE, FALSE, FALSE);
                }
 
-               e_cal_component_get_uid (comp, &uid);
+               uid = e_cal_component_get_uid (comp);
                if (!uid || !*uid) {
                        g_object_unref (comp);
                        g_free (rid);
@@ -234,16 +241,19 @@ calendar_view_delete_event (ECalendarView *cal_view,
                        if (e_cal_component_is_instance (comp)) {
                                e_cal_ops_remove_component (model, event->comp_data->client, uid, rid, 
E_CAL_OBJ_MOD_THIS, FALSE);
                        } else {
-                               struct icaltimetype instance_rid;
-                               ECalComponentDateTime dt;
-                               icaltimezone *zone = NULL;
+                               ICalTimetype *instance_rid;
+                               ICalTimezone *zone = NULL;
+                               ECalComponentDateTime *dt;
 
-                               e_cal_component_get_dtstart (comp, &dt);
+                               dt = e_cal_component_get_dtstart (comp);
 
-                               if (dt.tzid) {
+                               if (dt && e_cal_component_datetime_get_tzid (dt)) {
                                        GError *local_error = NULL;
 
-                                       e_cal_client_get_timezone_sync (event->comp_data->client, dt.tzid, 
&zone, NULL, &local_error);
+                                       if (!e_cal_client_get_timezone_sync (event->comp_data->client,
+                                               e_cal_component_datetime_get_tzid (dt), &zone, NULL, 
&local_error))
+                                               zone = NULL;
+
                                        if (local_error != NULL) {
                                                zone = e_calendar_view_get_timezone (cal_view);
                                                g_clear_error (&local_error);
@@ -252,14 +262,16 @@ calendar_view_delete_event (ECalendarView *cal_view,
                                        zone = e_calendar_view_get_timezone (cal_view);
                                }
 
-                               e_cal_component_free_datetime (&dt);
+                               e_cal_component_datetime_free (dt);
 
-                               instance_rid = icaltime_from_timet_with_zone (
+                               instance_rid = i_cal_time_from_timet_with_zone (
                                        event->comp_data->instance_start,
-                                       TRUE, zone ? zone : icaltimezone_get_utc_timezone ());
+                                       TRUE, zone ? zone : i_cal_timezone_get_utc_timezone ());
                                e_cal_util_remove_instances (event->comp_data->icalcomp, instance_rid, 
E_CAL_OBJ_MOD_THIS);
                                e_cal_ops_modify_component (model, event->comp_data->client, 
event->comp_data->icalcomp,
                                        E_CAL_OBJ_MOD_THIS, E_CAL_OPS_SEND_FLAG_DONT_SEND);
+
+                               g_clear_object (&instance_rid);
                        }
                } else if (e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
                           e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
@@ -437,19 +449,19 @@ calendar_view_update_actions (ESelectable *selectable,
        for (iter = list; iter != NULL; iter = iter->next) {
                ECalendarViewEvent *event = iter->data;
                ECalClient *client;
-               icalcomponent *icalcomp;
+               ICalComponent *icomp;
 
                if (event == NULL || event->comp_data == NULL)
                        continue;
 
                client = event->comp_data->client;
-               icalcomp = event->comp_data->icalcomp;
+               icomp = event->comp_data->icalcomp;
 
                sources_are_editable = sources_are_editable && !e_client_is_readonly (E_CLIENT (client));
 
                recurring |=
-                       e_cal_util_component_is_instance (icalcomp) ||
-                       e_cal_util_component_has_recurrences (icalcomp);
+                       e_cal_util_component_is_instance (icomp) ||
+                       e_cal_util_component_has_recurrences (icomp);
        }
 
        g_list_free (list);
@@ -510,52 +522,64 @@ calendar_view_cut_clipboard (ESelectable *selectable)
 }
 
 static void
-add_related_timezones (icalcomponent *des_icalcomp,
-                       icalcomponent *src_icalcomp,
-                       ECalClient *client)
+add_related_timezones (ICalComponent *des_icomp,
+                      ICalComponent *src_icomp,
+                      ECalClient *client)
 {
-       icalproperty_kind look_in[] = {
-               ICAL_DTSTART_PROPERTY,
-               ICAL_DTEND_PROPERTY,
-               ICAL_NO_PROPERTY
+       ICalPropertyKind look_in[] = {
+               I_CAL_DTSTART_PROPERTY,
+               I_CAL_DTEND_PROPERTY,
+               I_CAL_NO_PROPERTY
        };
-       gint i;
+       gint ii;
 
-       g_return_if_fail (des_icalcomp != NULL);
-       g_return_if_fail (src_icalcomp != NULL);
+       g_return_if_fail (des_icomp != NULL);
+       g_return_if_fail (src_icomp != NULL);
        g_return_if_fail (client != NULL);
 
-       for (i = 0; look_in[i] != ICAL_NO_PROPERTY; i++) {
-               icalproperty *prop = icalcomponent_get_first_property (src_icalcomp, look_in[i]);
+       for (ii = 0; look_in[ii] != I_CAL_NO_PROPERTY; ii++) {
+               ICalProperty *prop = i_cal_component_get_first_property (src_icomp, look_in[ii]);
 
                if (prop) {
-                       icalparameter *par = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER);
+                       ICalParameter *par = i_cal_property_get_first_parameter (prop, I_CAL_TZID_PARAMETER);
 
                        if (par) {
-                               const gchar *tzid = icalparameter_get_tzid (par);
+                               const gchar *tzid = i_cal_parameter_get_tzid (par);
 
                                if (tzid) {
                                        GError *error = NULL;
-                                       icaltimezone *zone = NULL;
+                                       ICalTimezone *zone = NULL;
 
-                                       e_cal_client_get_timezone_sync (
-                                               client, tzid, &zone, NULL, &error);
+                                       if (!e_cal_client_get_timezone_sync (client, tzid, &zone, NULL, 
&error))
+                                               zone = NULL;
                                        if (error != NULL) {
                                                g_warning (
                                                        "%s: Cannot get timezone for '%s'. %s",
                                                        G_STRFUNC, tzid, error->message);
                                                g_error_free (error);
-                                       } else if (zone &&
-                                               icalcomponent_get_timezone (des_icalcomp, 
icaltimezone_get_tzid (zone)) == NULL) {
-                                               /* do not duplicate timezones in the component */
-                                               icalcomponent *vtz_comp;
+                                       } else if (zone) {
+                                               ICalTimezone *existing_zone;
 
-                                               vtz_comp = icaltimezone_get_component (zone);
-                                               if (vtz_comp)
-                                                       icalcomponent_add_component (des_icalcomp, 
icalcomponent_new_clone (vtz_comp));
+                                               /* do not duplicate timezones in the component */
+                                               existing_zone = i_cal_component_get_timezone (des_icomp, 
i_cal_timezone_get_tzid (zone));
+                                               if (existing_zone) {
+                                                       g_object_unref (existing_zone);
+                                               } else {
+                                                       ICalComponent *vtz_comp;
+
+                                                       vtz_comp = i_cal_timezone_get_component (zone);
+                                                       if (vtz_comp) {
+                                                               i_cal_component_take_component (des_icomp, 
i_cal_component_new_clone (vtz_comp));
+                                                               g_object_unref (vtz_comp);
+                                                       }
+                                               }
                                        }
                                }
+
+                               g_object_unref (par);
                        }
+
+                       g_object_unref (prop);
                }
        }
 }
@@ -567,8 +591,7 @@ calendar_view_copy_clipboard (ESelectable *selectable)
        ECalendarViewPrivate *priv;
        GList *selected, *l;
        gchar *comp_str;
-       icalcomponent *vcal_comp;
-       icalcomponent *new_icalcomp;
+       ICalComponent *vcal_comp;
        ECalendarViewEvent *event;
        GtkClipboard *clipboard;
 
@@ -598,18 +621,20 @@ calendar_view_copy_clipboard (ESelectable *selectable)
        }
 
        for (l = selected; l != NULL; l = l->next) {
+               ICalComponent *new_icomp;
+
                event = (ECalendarViewEvent *) l->data;
 
                if (!is_comp_data_valid (event))
                        continue;
 
-               new_icalcomp = icalcomponent_new_clone (event->comp_data->icalcomp);
+               new_icomp = i_cal_component_new_clone (event->comp_data->icalcomp);
 
                /* do not remove RECURRENCE-IDs from copied objects */
-               icalcomponent_add_component (vcal_comp, new_icalcomp);
+               i_cal_component_take_component (vcal_comp, new_icomp);
        }
 
-       comp_str = icalcomponent_as_ical_string_r (vcal_comp);
+       comp_str = i_cal_component_as_ical_string_r (vcal_comp);
 
        /* copy the VCALENDAR to the clipboard */
        clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
@@ -617,7 +642,7 @@ calendar_view_copy_clipboard (ESelectable *selectable)
        gtk_clipboard_store (clipboard);
 
        /* free memory */
-       icalcomponent_free (vcal_comp);
+       g_object_unref (vcal_comp);
        g_free (comp_str);
        g_list_free (selected);
 }
@@ -625,7 +650,7 @@ calendar_view_copy_clipboard (ESelectable *selectable)
 static void
 calendar_view_component_created_cb (ECalModel *model,
                                    ECalClient *client,
-                                   icalcomponent *original_icalcomp,
+                                   ICalComponent *original_icomp,
                                    const gchar *new_uid,
                                    gpointer user_data)
 {
@@ -634,7 +659,7 @@ calendar_view_component_created_cb (ECalModel *model,
        ESourceRegistry *registry;
        GtkWidget *toplevel = user_data;
 
-       comp = e_cal_component_new_from_icalcomponent (icalcomponent_new_clone (original_icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone (original_icomp));
        g_return_if_fail (comp != NULL);
 
        registry = e_cal_model_get_registry (model);
@@ -657,17 +682,18 @@ static void
 e_calendar_view_add_event_sync (ECalModel *model,
                                ECalClient *client,
                                time_t dtstart,
-                               icaltimezone *default_zone,
-                               icalcomponent *icalcomp,
+                               ICalTimezone *default_zone,
+                               ICalComponent *icomp,
                                gboolean all_day,
                                gboolean is_day_view,
                                gint time_division,
                                GtkWidget *top_level)
 {
        ECalComponent *comp;
-       struct icaltimetype itime, old_dtstart, old_dtend;
+       ICalTimetype *itime, *btime, *old_dtstart, *old_dtend;
+       ICalDurationType *ic_dur, *ic_oneday;
+       ICalTimezone *old_dtstart_zone;
        time_t tt_start, tt_end, new_dtstart = 0;
-       struct icaldurationtype ic_dur, ic_oneday;
        gchar *uid;
        gint start_offset, end_offset;
        gboolean all_day_event = FALSE;
@@ -675,30 +701,36 @@ e_calendar_view_add_event_sync (ECalModel *model,
        start_offset = 0;
        end_offset = 0;
 
-       old_dtstart = icalcomponent_get_dtstart (icalcomp);
-       tt_start = icaltime_as_timet (old_dtstart);
-       old_dtend = icalcomponent_get_dtend (icalcomp);
-       tt_end = icaltime_as_timet (old_dtend);
-       ic_dur = icaldurationtype_from_int (tt_end - tt_start);
+       old_dtstart = i_cal_component_get_dtstart (icomp);
+       tt_start = i_cal_time_as_timet (old_dtstart);
+       old_dtend = i_cal_component_get_dtend (icomp);
+       tt_end = i_cal_time_as_timet (old_dtend);
+       ic_dur = i_cal_duration_type_from_int (tt_end - tt_start);
 
-       if (icaldurationtype_as_int (ic_dur) > 60 *60 *24) {
+       if (i_cal_duration_type_as_int (ic_dur) > 60 * 60 * 24) {
                /* This is a long event */
-               start_offset = old_dtstart.hour * 60 + old_dtstart.minute;
-               end_offset = old_dtstart.hour * 60 + old_dtend.minute;
+               start_offset = i_cal_timetype_get_hour (old_dtstart) * 60 + i_cal_timetype_get_minute 
(old_dtstart);
+               end_offset = i_cal_timetype_get_hour (old_dtstart) * 60 + i_cal_timetype_get_minute 
(old_dtend);
        }
 
-       ic_oneday = icaldurationtype_null_duration ();
-       ic_oneday.days = 1;
+       ic_oneday = i_cal_duration_type_null_duration ();
+       i_cal_duration_type_set_days (ic_oneday, 1);
+
+       old_dtstart_zone = i_cal_time_get_timezone (old_dtstart);
+       if (!old_dtstart_zone)
+               old_dtstart_zone = default_zone;
 
        if (is_day_view) {
                if (start_offset == 0 && end_offset == 0 && all_day)
                        all_day_event = TRUE;
 
                if (all_day_event) {
-                       ic_dur = ic_oneday;
-               } else if (icaldurationtype_as_int (ic_dur) >= 60 *60 *24 && !all_day) {
+                       g_clear_object (&ic_dur);
+                       ic_dur = g_object_ref (ic_oneday);
+               } else if (i_cal_duration_type_as_int (ic_dur) >= 60 * 60 * 24 && !all_day) {
+                       g_clear_object (&ic_dur);
                        /* copy & paste from top canvas to main canvas */
-                       ic_dur = icaldurationtype_from_int (time_division * 60);
+                       ic_dur = i_cal_duration_type_from_int (time_division * 60);
                }
 
                if (all_day)
@@ -706,39 +738,46 @@ e_calendar_view_add_event_sync (ECalModel *model,
                else
                        new_dtstart = dtstart;
        } else {
-               if (old_dtstart.is_date && old_dtend.is_date
-                       && memcmp (&ic_dur, &ic_oneday, sizeof (ic_dur)) == 0) {
+               if (i_cal_time_is_date (old_dtstart) && i_cal_time_is_date (old_dtend) &&
+                   i_cal_duration_type_as_int (ic_dur) == i_cal_duration_type_as_int (ic_oneday)) {
                        all_day_event = TRUE;
                        new_dtstart = dtstart;
                } else {
-                       icaltimetype new_time = icaltime_from_timet_with_zone (dtstart, FALSE, default_zone);
+                       ICalTimetype *new_time = i_cal_time_from_timet_with_zone (dtstart, FALSE, 
default_zone);
 
-                       new_time.hour = old_dtstart.hour;
-                       new_time.minute = old_dtstart.minute;
-                       new_time.second = old_dtstart.second;
+                       i_cal_timetype_set_hour (new_time, i_cal_timetype_get_hour (old_dtstart));
+                       i_cal_timetype_set_minute (new_time, i_cal_timetype_get_minute (old_dtstart));
+                       i_cal_timetype_set_second (new_time, i_cal_timetype_get_second (old_dtstart));
 
-                       new_dtstart = icaltime_as_timet_with_zone (new_time, old_dtstart.zone ? 
old_dtstart.zone : default_zone);
+                       new_dtstart = i_cal_time_as_timet_with_zone (new_time, old_dtstart_zone);
+
+                       g_clear_object (&new_time);
                }
        }
 
-       itime = icaltime_from_timet_with_zone (new_dtstart, FALSE, old_dtstart.zone ? old_dtstart.zone : 
default_zone);
+       itime = i_cal_time_from_timet_with_zone (new_dtstart, FALSE, old_dtstart_zone);
        /* set the timezone properly */
-       itime.zone = old_dtstart.zone ? old_dtstart.zone : default_zone;
+       i_cal_time_set_timezone (itime, old_dtstart_zone);
        if (all_day_event)
-               itime.is_date = TRUE;
-       icalcomponent_set_dtstart (icalcomp, itime);
+               i_cal_timetype_set_is_date (itime, TRUE);
+       i_cal_component_set_dtstart (icomp, itime);
 
-       itime.is_date = FALSE;
-       itime = icaltime_add (itime, ic_dur);
+       i_cal_timetype_set_is_date (itime, FALSE);
+       btime = i_cal_time_add (itime, ic_dur);
        if (all_day_event)
-               itime.is_date = TRUE;
-       icalcomponent_set_dtend (icalcomp, itime);
+               i_cal_timetype_set_is_date (itime, TRUE);
+       i_cal_component_set_dtend (icomp, itime);
+
+       g_clear_object (&itime);
+       g_clear_object (&btime);
+       g_clear_object (&old_dtstart);
+       g_clear_object (&old_dtend);
+       g_clear_object (&ic_dur);
+       g_clear_object (&ic_oneday);
 
        /* The new uid stuff can go away once we actually set it in the backend */
        uid = e_util_generate_uid ();
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (
-               comp, icalcomponent_new_clone (icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone (icomp));
        e_cal_component_set_uid (comp, uid);
        g_free (uid);
 
@@ -785,15 +824,14 @@ paste_clipboard_data_free (gpointer ptr)
                                GSList *found = NULL;
 
                                /* Remove them one by one after ensuring it has been copied to the 
destination successfully */
-                               found = g_slist_find_custom (pcd->copied_uids, icalcomponent_get_uid 
(comp_data->icalcomp), (GCompareFunc) strcmp);
+                               found = g_slist_find_custom (pcd->copied_uids, i_cal_component_get_uid 
(comp_data->icalcomp), (GCompareFunc) strcmp);
                                if (!found)
                                        continue;
 
                                g_free (found->data);
                                pcd->copied_uids = g_slist_delete_link (pcd->copied_uids, found);
 
-                               comp = e_cal_component_new ();
-                               e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone 
(comp_data->icalcomp));
+                               comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(comp_data->icalcomp));
 
                                if (itip_has_any_attendees (comp) &&
                                    (itip_organizer_is_user (registry, comp, comp_data->client) ||
@@ -802,7 +840,7 @@ paste_clipboard_data_free (gpointer ptr)
                                        itip_send_component_with_model (model, E_CAL_COMPONENT_METHOD_CANCEL,
                                                comp, comp_data->client, NULL, NULL, NULL, TRUE, FALSE, TRUE);
 
-                               e_cal_component_get_uid (comp, &uid);
+                               uid = e_cal_component_get_uid (comp);
                                if (e_cal_component_is_instance (comp)) {
                                        gchar *rid = NULL;
 
@@ -842,9 +880,9 @@ cal_view_paste_clipboard_thread (EAlertSinkThreadJobData *job_data,
                                 GError **error)
 {
        PasteClipboardData *pcd = user_data;
-       icalcomponent *icalcomp;
-       icalcomponent_kind kind;
-       icaltimezone *default_zone;
+       ICalComponent *icomp;
+       ICalComponentKind kind;
+       ICalTimezone *default_zone;
        ECalModel *model;
        ESourceRegistry *registry;
        ESource *source = NULL, *default_source = NULL;
@@ -860,8 +898,8 @@ cal_view_paste_clipboard_thread (EAlertSinkThreadJobData *job_data,
 
        g_return_if_fail (pcd != NULL);
 
-       icalcomp = icalparser_parse_string (pcd->ical_str);
-       if (!icalcomp) {
+       icomp = i_cal_parser_parse_string (pcd->ical_str);
+       if (!icomp) {
                g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA,
                        _("Pasted text doesn’t contain valid iCalendar data"));
                return;
@@ -871,17 +909,17 @@ cal_view_paste_clipboard_thread (EAlertSinkThreadJobData *job_data,
        registry = e_cal_model_get_registry (model);
 
        switch (e_cal_model_get_component_kind (model)) {
-               case ICAL_VEVENT_COMPONENT:
+               case I_CAL_VEVENT_COMPONENT:
                        default_source = e_source_registry_ref_default_calendar (registry);
                        extension_name = E_SOURCE_EXTENSION_CALENDAR;
                        message = _("Default calendar not found");
                        break;
-               case ICAL_VJOURNAL_COMPONENT:
+               case I_CAL_VJOURNAL_COMPONENT:
                        default_source = e_source_registry_ref_default_memo_list (registry);
                        extension_name = E_SOURCE_EXTENSION_MEMO_LIST;
                        message = _("Default memo list not found");
                        break;
-               case ICAL_VTODO_COMPONENT:
+               case I_CAL_VTODO_COMPONENT:
                        default_source = e_source_registry_ref_default_task_list (registry);
                        extension_name = E_SOURCE_EXTENSION_TASK_LIST;
                        message = _("Default task list not found");
@@ -918,38 +956,41 @@ cal_view_paste_clipboard_thread (EAlertSinkThreadJobData *job_data,
        }
 
        client = E_CAL_CLIENT (e_client);
-       kind = icalcomponent_isa (icalcomp);
+       kind = i_cal_component_isa (icomp);
        default_zone = e_cal_model_get_timezone (model);
        all_day = pcd->selection_end - pcd->selection_start == 60 * 60 * 24;
        copied_components = 0;
 
-       if (kind == ICAL_VCALENDAR_COMPONENT) {
-               icalcomponent *subcomp;
+       if (kind == I_CAL_VCALENDAR_COMPONENT) {
+               ICalComponent *subcomp;
 
                /* add timezones first, to have them ready */
-               for (subcomp = icalcomponent_get_first_component (icalcomp, ICAL_VTIMEZONE_COMPONENT);
+               for (subcomp = i_cal_component_get_first_component (icomp, I_CAL_VTIMEZONE_COMPONENT);
                     subcomp;
-                    subcomp = icalcomponent_get_next_component (icalcomp, ICAL_VTIMEZONE_COMPONENT)) {
-                       icaltimezone *zone;
+                    g_object_unref (subcomp), subcomp = i_cal_component_get_next_component (icomp, 
I_CAL_VTIMEZONE_COMPONENT)) {
+                       ICalTimezone *zone;
 
-                       zone = icaltimezone_new ();
-                       icaltimezone_set_component (zone, subcomp);
+                       zone = i_cal_timezone_new ();
+                       i_cal_timezone_set_component (zone, i_cal_component_new_clone (subcomp));
 
                        if (!e_cal_client_add_timezone_sync (client, zone, cancellable, error)) {
-                               icaltimezone_free (zone, 1);
+                               g_object_unref (subcomp);
+                               g_object_unref (zone);
                                goto out;
                        }
 
-                       icaltimezone_free (zone, 1);
+                       g_object_unref (zone);
                }
 
-               for (subcomp = icalcomponent_get_first_component (icalcomp, ICAL_VEVENT_COMPONENT);
+               for (subcomp = i_cal_component_get_first_component (icomp, I_CAL_VEVENT_COMPONENT);
                     subcomp;
-                    subcomp = icalcomponent_get_next_component (icalcomp, ICAL_VEVENT_COMPONENT)) {
+                    g_object_unref (subcomp), subcomp = i_cal_component_get_next_component (icomp, 
I_CAL_VEVENT_COMPONENT)) {
                        if (e_cal_util_component_has_recurrences (subcomp)) {
-                               icalproperty *icalprop = icalcomponent_get_first_property (subcomp, 
ICAL_RRULE_PROPERTY);
-                               if (icalprop)
-                                       icalproperty_remove_parameter_by_name (icalprop, 
"X-EVOLUTION-ENDDATE");
+                               ICalProperty *prop = i_cal_component_get_first_property (subcomp, 
I_CAL_RRULE_PROPERTY);
+                               if (prop) {
+                                       i_cal_property_remove_parameter_by_name (prop, "X-EVOLUTION-ENDDATE");
+                                       g_object_unref (prop);
+                               }
                        }
 
                        e_calendar_view_add_event_sync (model, client, pcd->selection_start, default_zone, 
subcomp, all_day,
@@ -957,15 +998,15 @@ cal_view_paste_clipboard_thread (EAlertSinkThreadJobData *job_data,
 
                        copied_components++;
                        if (pcd->selected_cut_list)
-                               pcd->copied_uids = g_slist_prepend (pcd->copied_uids, g_strdup 
(icalcomponent_get_uid (subcomp)));
+                               pcd->copied_uids = g_slist_prepend (pcd->copied_uids, g_strdup 
(i_cal_component_get_uid (subcomp)));
                }
        } else if (kind == e_cal_model_get_component_kind (model)) {
-               e_calendar_view_add_event_sync (model, client, pcd->selection_start, default_zone, icalcomp, 
all_day,
+               e_calendar_view_add_event_sync (model, client, pcd->selection_start, default_zone, icomp, 
all_day,
                        pcd->is_day_view, pcd->time_division, pcd->top_level);
 
                copied_components++;
                if (pcd->selected_cut_list)
-                       pcd->copied_uids = g_slist_prepend (pcd->copied_uids, g_strdup (icalcomponent_get_uid 
(icalcomp)));
+                       pcd->copied_uids = g_slist_prepend (pcd->copied_uids, g_strdup 
(i_cal_component_get_uid (icomp)));
        }
 
        pcd->success = !g_cancellable_is_cancelled (cancellable);
@@ -975,7 +1016,7 @@ cal_view_paste_clipboard_thread (EAlertSinkThreadJobData *job_data,
        if (!copied_components && !g_cancellable_is_cancelled (cancellable) && error && !*error)
                g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, _("No suitable component 
found"));
 
-       icalcomponent_free (icalcomp);
+       g_clear_object (&icomp);
        g_clear_object (&source);
        g_clear_object (&default_source);
        g_clear_object (&client);
@@ -1191,10 +1232,10 @@ e_calendar_view_class_init (ECalendarViewClass *class)
                G_SIGNAL_RUN_LAST,
                G_STRUCT_OFFSET (ECalendarViewClass, timezone_changed),
                NULL, NULL,
-               e_marshal_VOID__POINTER_POINTER,
+               e_marshal_VOID__OBJECT_OBJECT,
                G_TYPE_NONE, 2,
-               G_TYPE_POINTER,
-               G_TYPE_POINTER);
+               I_CAL_TYPE_TIMEZONE,
+               I_CAL_TYPE_TIMEZONE);
 
        signals[EVENT_CHANGED] = g_signal_new (
                "event-changed",
@@ -1293,18 +1334,19 @@ e_calendar_view_get_model (ECalendarView *cal_view)
        return cal_view->priv->model;
 }
 
-icaltimezone *
+ICalTimezone *
 e_calendar_view_get_timezone (ECalendarView *cal_view)
 {
        g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), NULL);
+
        return e_cal_model_get_timezone (cal_view->priv->model);
 }
 
 void
 e_calendar_view_set_timezone (ECalendarView *cal_view,
-                              icaltimezone *zone)
+                             const ICalTimezone *zone)
 {
-       icaltimezone *old_zone;
+       ICalTimezone *old_zone;
 
        g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 
@@ -1312,10 +1354,15 @@ e_calendar_view_set_timezone (ECalendarView *cal_view,
        if (old_zone == zone)
                return;
 
+       if (old_zone)
+               g_object_ref (old_zone);
+
        e_cal_model_set_timezone (cal_view->priv->model, zone);
        g_signal_emit (
                cal_view, signals[TIMEZONE_CHANGED], 0,
                old_zone, zone);
+
+       g_clear_object (&old_zone);
 }
 
 GtkTargetList *
@@ -1576,9 +1623,9 @@ object_created_cb (ECompEditor *comp_editor,
 
 ECompEditor *
 e_calendar_view_open_event_with_flags (ECalendarView *cal_view,
-                                       ECalClient *client,
-                                       icalcomponent *icalcomp,
-                                       guint32 flags)
+                                      ECalClient *client,
+                                      ICalComponent *icomp,
+                                      guint32 flags)
 {
        ECompEditor *comp_editor;
        EShell *shell;
@@ -1586,7 +1633,7 @@ e_calendar_view_open_event_with_flags (ECalendarView *cal_view,
        /* FIXME ECalendarView should own an EShell pointer. */
        shell = e_shell_get_default ();
 
-       comp_editor = e_comp_editor_find_existing_for (e_client_get_source (E_CLIENT (client)), icalcomp);
+       comp_editor = e_comp_editor_find_existing_for (e_client_get_source (E_CLIENT (client)), icomp);
        if (!comp_editor) {
                GtkWidget *toplevel;
 
@@ -1595,7 +1642,7 @@ e_calendar_view_open_event_with_flags (ECalendarView *cal_view,
                        toplevel = NULL;
 
                comp_editor = e_comp_editor_open_for_component (GTK_WINDOW (toplevel),
-                       shell, e_client_get_source (E_CLIENT (client)), icalcomp, flags);
+                       shell, e_client_get_source (E_CLIENT (client)), icomp, flags);
 
                g_signal_connect (
                        comp_editor, "object-created",
@@ -1611,7 +1658,7 @@ e_calendar_view_open_event_with_flags (ECalendarView *cal_view,
  * e_calendar_view_edit_appointment
  * @cal_view: A calendar view.
  * @client: Calendar client.
- * @icalcomp: The object to be edited.
+ * @icomp: The object to be edited.
  * @mode: one of #EEditEventMode
  *
  * Opens an editor window to allow the user to edit the selected
@@ -1619,9 +1666,9 @@ e_calendar_view_open_event_with_flags (ECalendarView *cal_view,
  */
 void
 e_calendar_view_edit_appointment (ECalendarView *cal_view,
-                                  ECalClient *client,
-                                  icalcomponent *icalcomp,
-                                  EEditEventMode mode)
+                                 ECalClient *client,
+                                 ICalComponent *icomp,
+                                 EEditEventMode mode)
 {
        ECalModel *model;
        ESourceRegistry *registry;
@@ -1629,15 +1676,14 @@ e_calendar_view_edit_appointment (ECalendarView *cal_view,
 
        g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
        g_return_if_fail (E_IS_CAL_CLIENT (client));
-       g_return_if_fail (icalcomp != NULL);
+       g_return_if_fail (icomp != NULL);
 
        model = e_calendar_view_get_model (cal_view);
        registry = e_cal_model_get_registry (model);
 
-       if ((mode == EDIT_EVENT_AUTODETECT && icalcomponent_get_first_property (icalcomp, 
ICAL_ATTENDEE_PROPERTY) != NULL)
+       if ((mode == EDIT_EVENT_AUTODETECT && e_cal_util_component_has_attendee (icomp))
            || mode == EDIT_EVENT_FORCE_MEETING) {
-               ECalComponent *comp = e_cal_component_new ();
-               e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
+               ECalComponent *comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(icomp));
                flags |= E_COMP_EDITOR_FLAG_WITH_ATTENDEES;
                if (itip_organizer_is_user (registry, comp, client) ||
                    itip_sentby_is_user (registry, comp, client) ||
@@ -1646,7 +1692,7 @@ e_calendar_view_edit_appointment (ECalendarView *cal_view,
                g_object_unref (comp);
        }
 
-       e_calendar_view_open_event_with_flags (cal_view, client, icalcomp, flags);
+       e_calendar_view_open_event_with_flags (cal_view, client, icomp, flags);
 }
 
 static void
@@ -1682,15 +1728,15 @@ tooltip_key_event (GtkWidget *tooltip,
 }
 
 static gchar *
-get_label (struct icaltimetype *tt,
-           icaltimezone *f_zone,
-           icaltimezone *t_zone)
+get_label (ICalTimetype *tt,
+          ICalTimezone *f_zone,
+          ICalTimezone *t_zone)
 {
        struct tm tmp_tm;
 
        tmp_tm = icaltimetype_to_tm_with_zone (tt, f_zone, t_zone);
 
-       return e_datetime_format_format_tm ("calendar", "table", tt->is_date ? DTFormatKindDate : 
DTFormatKindDateTime, &tmp_tm);
+       return e_datetime_format_format_tm ("calendar", "table", i_cal_time_is_date (tt) ? DTFormatKindDate : 
DTFormatKindDateTime, &tmp_tm);
 }
 
 void
@@ -1764,11 +1810,9 @@ gboolean
 e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
 {
        GtkWidget *label, *box, *hbox, *ebox, *frame, *toplevel;
-       const gchar *str;
        gchar *tmp, *tmp1 = NULL, *tmp2 = NULL;
-       ECalComponentOrganizer organiser;
-       ECalComponentDateTime dtstart, dtend;
-       icalcomponent *clone_comp;
+       ECalComponentOrganizer *organizer;
+       ECalComponentDateTime *dtstart, *dtend;
        time_t t_start, t_end;
        ECalendarViewEvent *pevent;
        GtkWidget *widget;
@@ -1777,8 +1821,8 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
        GdkDeviceManager *device_manager;
        GdkRGBA bg_rgba, fg_rgba;
        GQueue *grabbed_keyboards;
-       ECalComponent *newcomp = e_cal_component_new ();
-       icaltimezone *zone, *default_zone;
+       ECalComponent *newcomp;
+       ICalTimezone *zone, *default_zone;
        ECalModel *model;
        ECalClient *client = NULL;
        GList *list, *link;
@@ -1799,7 +1843,7 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
        if (GTK_IS_WIDGET (widget))
                gtk_widget_destroy (widget);
 
-       default_zone = e_calendar_view_get_timezone  (data->cal_view);
+       default_zone = e_calendar_view_get_timezone (data->cal_view);
        pevent = data->get_view_event (data->cal_view, data->day, data->event_num);
 
        if (!is_comp_data_valid (pevent))
@@ -1807,9 +1851,11 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
 
        client = pevent->comp_data->client;
 
-       clone_comp = icalcomponent_new_clone (pevent->comp_data->icalcomp);
-       if (!e_cal_component_set_icalcomponent (newcomp, clone_comp))
+       newcomp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(pevent->comp_data->icalcomp));
+       if (!newcomp) {
                g_warning ("couldn't update calendar component with modified data from backend\n");
+               return FALSE;
+       }
 
        box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
 
@@ -1841,19 +1887,19 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
        gtk_box_pack_start ((GtkBox *) box, ebox, FALSE, FALSE, 0);
        g_free (tmp);
 
-       e_cal_component_get_organizer (newcomp, &organiser);
-       if (organiser.cn) {
-               gchar *ptr;
-               ptr = strchr (organiser.value, ':');
+       organizer = e_cal_component_get_organizer (newcomp);
+       if (organizer && e_cal_component_organizer_get_cn (organizer)) {
+               const gchar *email;
+
+               email = itip_strip_mailto (e_cal_component_organizer_get_value (organizer));
 
-               if (ptr) {
-                       ptr++;
+               if (email) {
                        /* To Translators: It will display "Organiser: NameOfTheUser <email ofuser com>" */
-                       tmp = g_strdup_printf (_("Organizer: %s <%s>"), organiser.cn, ptr);
-               }
-               else
+                       tmp = g_strdup_printf (_("Organizer: %s <%s>"), e_cal_component_organizer_get_cn 
(organizer), email);
+               } else {
                        /* With SunOne accouts, there may be no ':' in organiser.value*/
-                       tmp = g_strdup_printf (_("Organizer: %s"), organiser.cn);
+                       tmp = g_strdup_printf (_("Organizer: %s"), e_cal_component_organizer_get_cn 
(organizer));
+               }
 
                label = gtk_label_new (tmp);
                hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
@@ -1865,11 +1911,13 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
                g_free (tmp);
        }
 
-       e_cal_component_get_location (newcomp, &str);
+       e_cal_component_organizer_free (organizer);
+
+       tmp1 = e_cal_component_get_location (newcomp);
 
-       if (str) {
+       if (tmp1) {
                /* Translators: It will display "Location: PlaceOfTheMeeting" */
-               tmp = g_markup_printf_escaped (_("Location: %s"), str);
+               tmp = g_markup_printf_escaped (_("Location: %s"), tmp1);
                label = gtk_label_new (NULL);
                gtk_widget_set_halign (label, GTK_ALIGN_START);
                gtk_misc_set_alignment ((GtkMisc *) label, 0.0, 0.0);
@@ -1883,13 +1931,18 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
                gtk_box_pack_start ((GtkBox *) box, ebox, FALSE, FALSE, 0);
                g_free (tmp);
        }
-       e_cal_component_get_dtstart (newcomp, &dtstart);
-       e_cal_component_get_dtend (newcomp, &dtend);
 
-       if (dtstart.tzid) {
-               zone = icalcomponent_get_timezone (e_cal_component_get_icalcomponent (newcomp), dtstart.tzid);
-               if (!zone)
-                       e_cal_client_get_timezone_sync (client, dtstart.tzid, &zone, NULL, NULL);
+       g_free (tmp1);
+       tmp1 = NULL;
+
+       dtstart = e_cal_component_get_dtstart (newcomp);
+       dtend = e_cal_component_get_dtend (newcomp);
+
+       if (dtstart && e_cal_component_datetime_get_tzid (dtstart)) {
+               zone = i_cal_component_get_timezone (e_cal_component_get_icalcomponent (newcomp), 
e_cal_component_datetime_get_tzid (dtstart));
+               if (!zone &&
+                   !e_cal_client_get_timezone_sync (client, e_cal_component_datetime_get_tzid (dtstart), 
&zone, NULL, NULL))
+                       zone = NULL;
 
                if (!zone)
                        zone = default_zone;
@@ -1898,14 +1951,14 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
                zone = NULL;
        }
 
-       if (dtstart.value) {
-               t_start = icaltime_as_timet_with_zone (*dtstart.value, zone);
-               if (dtend.value)
-                       t_end = icaltime_as_timet_with_zone (*dtend.value, zone);
+       if (dtstart && e_cal_component_datetime_get_value (dtstart)) {
+               t_start = i_cal_time_as_timet_with_zone (e_cal_component_datetime_get_value (dtstart), zone);
+               if (dtend && e_cal_component_datetime_get_value (dtend))
+                       t_end = i_cal_time_as_timet_with_zone (e_cal_component_datetime_get_value (dtend), 
zone);
                else
                        t_end = t_start;
 
-               tmp1 = get_label (dtstart.value, zone, default_zone);
+               tmp1 = get_label (e_cal_component_datetime_get_value (dtstart), zone, default_zone);
                tmp = calculate_time (t_start, t_end);
 
                /* To Translators: It will display "Time: ActualStartDateAndTime (DurationOfTheMeeting)"*/
@@ -1914,8 +1967,8 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
                        g_free (tmp);
                        g_free (tmp1);
 
-                       tmp1 = get_label (dtstart.value, zone, zone);
-                       tmp = g_strconcat (tmp2, "\n\t[ ", tmp1, " ", icaltimezone_get_display_name (zone), " 
]", NULL);
+                       tmp1 = get_label (e_cal_component_datetime_get_value (dtstart), zone, zone);
+                       tmp = g_strconcat (tmp2, "\n\t[ ", tmp1, " ", i_cal_timezone_get_display_name (zone), 
" ]", NULL);
                } else {
                        g_free (tmp);
                        tmp = tmp2;
@@ -1925,8 +1978,8 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
                tmp = NULL;
        }
 
-       e_cal_component_free_datetime (&dtstart);
-       e_cal_component_free_datetime (&dtend);
+       e_cal_component_datetime_free (dtstart);
+       e_cal_component_datetime_free (dtend);
 
        hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
        gtk_box_pack_start ((GtkBox *) hbox, gtk_label_new_with_mnemonic (tmp), FALSE, FALSE, 0);
@@ -2077,7 +2130,7 @@ e_calendar_view_dup_component_summary (ICalComponent *icomp)
                        gint since_year;
                        gchar *res = NULL;
 
-                       since_year = atoi (since_year_str) : 0;
+                       since_year = atoi (since_year_str);
 
                        dtstart = i_cal_component_get_dtstart (icomp);
 
@@ -2104,7 +2157,7 @@ e_calendar_view_dup_component_summary (ICalComponent *icomp)
 void
 e_calendar_view_component_created_cb (ECalModel *model,
                                      ECalClient *client,
-                                     icalcomponent *original_icalcomp,
+                                     ICalComponent *original_icomp,
                                      const gchar *new_uid,
                                      gpointer user_data)
 {
@@ -2115,7 +2168,6 @@ e_calendar_view_component_created_cb (ECalModel *model,
        e_cal_model_emit_object_created (model, client);
 }
 
-
 void
 draw_curved_rectangle (cairo_t *cr,
                        gdouble x0,
@@ -2261,8 +2313,8 @@ e_calendar_view_get_description_text (ECalendarView *cal_view)
 {
        time_t start_time, end_time;
        struct tm start_tm, end_tm;
-       struct icaltimetype start_tt, end_tt;
-       icaltimezone *zone;
+       ICalTimetype *tt;
+       ICalTimezone *zone;
        gchar start_buffer[512] = { 0 };
        gchar end_buffer[512] = { 0 };
 
@@ -2273,26 +2325,14 @@ e_calendar_view_get_description_text (ECalendarView *cal_view)
 
        zone = e_cal_model_get_timezone (cal_view->priv->model);
 
-       start_tt = icaltime_from_timet_with_zone (start_time, FALSE, zone);
-       start_tm.tm_year = start_tt.year - 1900;
-       start_tm.tm_mon = start_tt.month - 1;
-       start_tm.tm_mday = start_tt.day;
-       start_tm.tm_hour = start_tt.hour;
-       start_tm.tm_min = start_tt.minute;
-       start_tm.tm_sec = start_tt.second;
-       start_tm.tm_isdst = -1;
-       start_tm.tm_wday = time_day_of_week (start_tt.day, start_tt.month - 1, start_tt.year);
+       tt = i_cal_time_from_timet_with_zone (start_time, FALSE, zone);
+       start_tm = icaltimetype_to_tm (tt);
+       g_clear_object (&tt);
 
        /* Subtract one from end_time so we don't get an extra day. */
-       end_tt = icaltime_from_timet_with_zone (end_time - 1, FALSE, zone);
-       end_tm.tm_year = end_tt.year - 1900;
-       end_tm.tm_mon = end_tt.month - 1;
-       end_tm.tm_mday = end_tt.day;
-       end_tm.tm_hour = end_tt.hour;
-       end_tm.tm_min = end_tt.minute;
-       end_tm.tm_sec = end_tt.second;
-       end_tm.tm_isdst = -1;
-       end_tm.tm_wday = time_day_of_week (end_tt.day, end_tt.month - 1, end_tt.year);
+       tt = i_cal_time_from_timet_with_zone (end_time - 1, FALSE, zone);
+       end_tm = icaltimetype_to_tm (tt);
+       g_clear_object (&tt);
 
        if (E_IS_MONTH_VIEW (cal_view) || E_IS_CAL_LIST_VIEW (cal_view)) {
                if (start_tm.tm_year == end_tm.tm_year) {
diff --git a/src/calendar/gui/e-calendar-view.h b/src/calendar/gui/e-calendar-view.h
index a70043dd29..7455d6db3b 100644
--- a/src/calendar/gui/e-calendar-view.h
+++ b/src/calendar/gui/e-calendar-view.h
@@ -181,7 +181,7 @@ GType               e_calendar_view_get_type        (void);
 ECalModel *    e_calendar_view_get_model       (ECalendarView *cal_view);
 ICalTimezone * e_calendar_view_get_timezone    (ECalendarView *cal_view);
 void           e_calendar_view_set_timezone    (ECalendarView *cal_view,
-                                                ICalTimezone *zone);
+                                                const ICalTimezone *zone);
 gint           e_calendar_view_get_time_divisions
                                                (ECalendarView *cal_view);
 void           e_calendar_view_set_time_divisions
diff --git a/src/calendar/gui/e-day-view-main-item.c b/src/calendar/gui/e-day-view-main-item.c
index 05f9f2e795..91f2f2a7f1 100644
--- a/src/calendar/gui/e-day-view-main-item.c
+++ b/src/calendar/gui/e-day-view-main-item.c
@@ -72,18 +72,20 @@ can_draw_in_region (cairo_region_t *draw_region,
 }
 
 static gboolean
-icalcomp_is_transparent (icalcomponent *icalcomp)
+icomp_is_transparent (ICalComponent *icomp)
 {
-       icalproperty *transp_prop;
-       icalproperty_transp ical_transp = ICAL_TRANSP_NONE;
+       ICalProperty *transp_prop;
+       ICalPropertyTransp transp = I_CAL_TRANSP_NONE;
 
-       g_return_val_if_fail (icalcomp != NULL, TRUE);
+       g_return_val_if_fail (icomp != NULL, TRUE);
 
-       transp_prop = icalcomponent_get_first_property (icalcomp, ICAL_TRANSP_PROPERTY);
-       if (transp_prop)
-               ical_transp = icalproperty_get_transp (transp_prop);
+       transp_prop = i_cal_component_get_first_property (icomp, I_CAL_TRANSP_PROPERTY);
+       if (transp_prop) {
+               transp = i_cal_property_get_transp (transp_prop);
+               g_object_unref (transp_prop);
+       }
 
-       return transp_prop && (ical_transp == ICAL_TRANSP_TRANSPARENT || ical_transp == 
ICAL_TRANSP_TRANSPARENTNOCONFLICT);
+       return transp_prop && (transp == I_CAL_TRANSP_TRANSPARENT || transp == 
I_CAL_TRANSP_TRANSPARENTNOCONFLICT);
 }
 
 static void
@@ -114,7 +116,7 @@ day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *main_item,
                        continue;
 
                /* If the event is TRANSPARENT, skip it. */
-               if (icalcomp_is_transparent (event->comp_data->icalcomp)) {
+               if (icomp_is_transparent (event->comp_data->icalcomp)) {
                        continue;
                }
 
@@ -198,14 +200,12 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
        gdouble date_fraction;
        gboolean short_event = FALSE, resize_flag = FALSE, is_editing;
        const gchar *end_resize_suffix;
-       gchar *end_regsizeime;
        gint start_hour, start_display_hour, start_minute, start_suffix_width;
        gint end_hour, end_display_hour, end_minute, end_suffix_width;
        gboolean show_span = FALSE, format_time;
        gint offset, interval;
        const gchar *start_suffix;
        const gchar *end_suffix;
-       gchar *text = NULL;
        gint scroll_flag = 0;
        gint row_y;
        PangoLayout *layout;
@@ -547,6 +547,7 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
 
                else if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_BOTTOM_EDGE) {
                        GdkRGBA fg_rgba;
+                       gchar *end_regsizeime;
 
                        bar_y2 = item_y + item_h - 1;
 
@@ -590,6 +591,7 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
                        pango_cairo_update_layout (cr, layout);
                        pango_cairo_show_layout (cr, layout);
                        g_object_unref (layout);
+                       g_free (end_regsizeime);
 
                        cairo_close_path (cr);
                        cairo_restore (cr);
@@ -599,11 +601,12 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
        else if (bar_y2 < scroll_flag)
                event->end_minute -= time_divisions;
 
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp)
+               return;
 
        /* Only fill it in if the event isn't TRANSPARENT. */
-       e_cal_component_get_transparency (comp, &transparency);
+       transparency = e_cal_component_get_transparency (comp);
        if (transparency != E_CAL_COMPONENT_TRANSP_TRANSPARENT) {
                cairo_save (cr);
                pat = cairo_pattern_create_linear (
@@ -745,6 +748,7 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
 
        if (!short_event) {
                GdkRGBA fg_rgba;
+               gchar *text;
 
                if (event->start_minute % time_divisions != 0
                        || (day_view->show_event_end_times
@@ -833,12 +837,12 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
                pango_cairo_update_layout (cr, layout);
                pango_cairo_show_layout (cr, layout);
                g_object_unref (layout);
+               g_free (text);
 
                cairo_close_path (cr);
                cairo_restore (cr);
        }
 
-       g_free (text);
        g_object_unref (comp);
 }
 
@@ -912,7 +916,7 @@ day_view_main_item_draw_events_in_vbars (EDayViewMainItem *main_item,
                }
 
                /* If the event is TRANSPARENT, skip it. */
-               if (icalcomp_is_transparent (event->comp_data->icalcomp)) {
+               if (icomp_is_transparent (event->comp_data->icalcomp)) {
                        continue;
                }
 
@@ -1019,7 +1023,7 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
        gint day_x, day_w;
        gint start_row, end_row, rect_x, rect_y, rect_width, rect_height;
        gint days_shown;
-       struct icaltimetype day_start_tt, today_tt;
+       ICalTimetype *day_start_tt, *today_tt;
        gboolean today = FALSE;
        cairo_region_t *draw_region;
        GdkRectangle rect;
@@ -1050,18 +1054,18 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
 
        /* Paint the background colors. */
 
-       today_tt = icaltime_from_timet_with_zone (
+       today_tt = i_cal_time_from_timet_with_zone (
                time (NULL), FALSE,
                e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
 
        for (day = 0; day < days_shown; day++) {
                GDateWeekday weekday;
 
-               day_start_tt = icaltime_from_timet_with_zone (
+               day_start_tt = i_cal_time_from_timet_with_zone (
                        day_view->day_starts[day], FALSE,
                        e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
 
-               switch (icaltime_day_of_week (day_start_tt)) {
+               switch (i_cal_time_day_of_week (day_start_tt)) {
                        case 1:
                                weekday = G_DATE_SUNDAY;
                                break;
@@ -1118,9 +1122,7 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
 
                        if (days_shown > 1) {
                                /* Check if we are drawing today */
-                               today = day_start_tt.year == today_tt.year
-                                       && day_start_tt.month == today_tt.month
-                                       && day_start_tt.day == today_tt.day;
+                               today = i_cal_time_compare_date_only (day_start_tt, today_tt) == 0;
                        } else {
                                today = FALSE;
                        }
@@ -1147,8 +1149,12 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
                        cairo_fill (cr);
                        cairo_restore (cr);
                }
+
+               g_clear_object (&day_start_tt);
        }
 
+       g_clear_object (&today_tt);
+
        /* Paint the selection background. */
        if (day_view->selection_start_day != -1
            && !day_view->selection_in_top_canvas) {
@@ -1257,8 +1263,8 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
                        width, height, day, draw_region);
 
        if (e_day_view_marcus_bains_get_show_line (day_view)) {
-               icaltimezone *zone;
-               struct icaltimetype time_now, day_start;
+               ICalTimezone *zone;
+               ICalTimetype *time_now, *day_start;
                const gchar *marcus_bains_day_view_color;
                gint marcus_bains_y;
                GdkColor mb_color;
@@ -1277,25 +1283,26 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
                        gdk_cairo_set_source_color (cr, &mb_color);
 
                zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view));
-               time_now = icaltime_current_time_with_zone (zone);
+               time_now = i_cal_time_current_time_with_zone (zone);
 
                for (day = 0; day < days_shown; day++) {
-                       day_start = icaltime_from_timet_with_zone (day_view->day_starts[day], FALSE, zone);
-
-                       if ((day_start.year == time_now.year) &&
-                           (day_start.month == time_now.month) &&
-                           (day_start.day == time_now.day)) {
+                       day_start = i_cal_time_from_timet_with_zone (day_view->day_starts[day], FALSE, zone);
 
+                       if (i_cal_time_compare_date_only (day_start, time_now) == 0) {
                                grid_x1 = day_view->day_offsets[day] - x + E_DAY_VIEW_BAR_WIDTH;
                                grid_x2 = day_view->day_offsets[day + 1] - x - 1;
-                               marcus_bains_y = (time_now.hour * 60 + time_now.minute) * 
day_view->row_height / time_divisions - y;
+                               marcus_bains_y = (i_cal_timetype_get_hour (time_now) * 60 + 
i_cal_timetype_get_minute (time_now)) * day_view->row_height / time_divisions - y;
                                cairo_set_line_width (cr, 1.5);
                                cairo_move_to (cr, grid_x1, marcus_bains_y);
                                cairo_line_to (cr, grid_x2, marcus_bains_y);
                                cairo_stroke (cr);
                        }
+
+                       g_clear_object (&day_start);
                }
                cairo_restore (cr);
+
+               g_clear_object (&time_now);
        }
        cairo_region_destroy (draw_region);
 }
diff --git a/src/calendar/gui/e-day-view-time-item.c b/src/calendar/gui/e-day-view-time-item.c
index 91758968d8..0df2450c84 100644
--- a/src/calendar/gui/e-day-view-time-item.c
+++ b/src/calendar/gui/e-day-view-time-item.c
@@ -64,7 +64,7 @@ struct _EDayViewTimeItemPrivate {
        gboolean dragging_selection;
 
        /* The second timezone if shown, or else NULL. */
-       icaltimezone *second_zone;
+       ICalTimezone *second_zone;
 };
 
 static void    e_day_view_time_item_update     (GnomeCanvasItem *item,
@@ -229,7 +229,7 @@ e_day_view_time_item_init (EDayViewTimeItem *time_item)
        if (last) {
                if (*last)
                        time_item->priv->second_zone =
-                               icaltimezone_get_builtin_timezone (last);
+                               i_cal_timezone_get_builtin_timezone (last);
                g_free (last);
        }
 
@@ -258,13 +258,13 @@ e_day_view_time_item_update (GnomeCanvasItem *item,
  */
 static void
 edvti_draw_zone (GnomeCanvasItem *canvas_item,
-                 cairo_t *cr,
-                 gint x,
-                 gint y,
-                 gint width,
-                 gint height,
-                 gint x_offset,
-                 icaltimezone *use_zone)
+                cairo_t *cr,
+                gint x,
+                gint y,
+                gint width,
+                gint height,
+                gint x_offset,
+                ICalTimezone *use_zone)
 {
        EDayView *day_view;
        EDayViewTimeItem *time_item;
@@ -351,31 +351,37 @@ edvti_draw_zone (GnomeCanvasItem *canvas_item,
        if (use_zone) {
                /* shift time with a difference between
                 * local time and the other timezone */
-               icaltimezone *cal_zone;
-               struct icaltimetype tt;
+               ICalTimezone *cal_zone;
+               ICalTimetype *tt,*tt2;
                gint diff;
                struct tm mn;
 
                cal_zone = e_calendar_view_get_timezone (
                        E_CALENDAR_VIEW (day_view));
-               tt = icaltime_from_timet_with_zone (
+               tt = i_cal_time_from_timet_with_zone (
                        day_view->day_starts[0], 0, cal_zone);
 
                /* diff is number of minutes */
-               diff =(icaltimezone_get_utc_offset (use_zone, &tt, NULL) -
-                       icaltimezone_get_utc_offset (cal_zone, &tt, NULL)) / 60;
+               diff = (i_cal_timezone_get_utc_offset (use_zone, tt, NULL) -
+                       i_cal_timezone_get_utc_offset (cal_zone, tt, NULL)) / 60;
 
-               tt = icaltime_from_timet_with_zone (day_view->day_starts[0], 0, cal_zone);
-               tt.is_date = FALSE;
-               icaltime_set_timezone (&tt, cal_zone);
-               tt = icaltime_convert_to_zone (tt, use_zone);
+               g_clear_object (&tt);
+
+               tt = i_cal_time_from_timet_with_zone (day_view->day_starts[0], 0, cal_zone);
+               i_cal_timetype_set_is_date (tt, FALSE);
+               i_cal_time_set_timezone (tt, cal_zone);
+               tt2 = i_cal_time_convert_to_zone (tt, use_zone);
+               g_object_unref (tt);
+               tt = tt2;
 
                if (diff != 0) {
                        /* shows the next midnight */
-                       icaltime_adjust (&tt, 1, 0, 0, 0);
+                       i_cal_time_adjust (tt, 1, 0, 0, 0);
                }
 
-               mn = icaltimetype_to_tm (&tt);
+               mn = icaltimetype_to_tm (tt);
+
+               g_clear_object (&tt);
 
                /* up to two characters/numbers */
                e_utf8_strftime (buffer, sizeof (buffer), "%d", &mn);
@@ -412,7 +418,7 @@ edvti_draw_zone (GnomeCanvasItem *canvas_item,
 
        /* Draw the Marcus Bains Line first, so it appears under other elements. */
        if (e_day_view_marcus_bains_get_show_line (day_view)) {
-               struct icaltimetype time_now;
+               ICalTimetype *time_now;
                const gchar *marcus_bains_time_bar_color;
                gint marcus_bains_y;
 
@@ -431,11 +437,11 @@ edvti_draw_zone (GnomeCanvasItem *canvas_item,
                        mb_color = day_view->colors[E_DAY_VIEW_COLOR_MARCUS_BAINS_LINE];
                }
 
-               time_now = icaltime_current_time_with_zone (
+               time_now = i_cal_time_current_time_with_zone (
                        e_calendar_view_get_timezone (
                        E_CALENDAR_VIEW (day_view)));
                marcus_bains_y =
-                       (time_now.hour * 60 + time_now.minute) *
+                       (i_cal_timetype_get_hour (time_now) * 60 + i_cal_timetype_get_minute (time_now)) *
                        day_view->row_height / time_divisions - y;
                cairo_set_line_width (cr, 1.5);
                cairo_move_to (
@@ -445,6 +451,8 @@ edvti_draw_zone (GnomeCanvasItem *canvas_item,
                cairo_line_to (cr, long_line_x2, marcus_bains_y);
                cairo_stroke (cr);
                cairo_restore (cr);
+
+               g_clear_object (&time_now);
        } else {
                const gchar *marcus_bains_time_bar_color;
 
@@ -724,14 +732,14 @@ edvti_second_zone_changed_cb (GSettings *settings,
 {
        EDayViewTimeItem *time_item = user_data;
        EDayView *day_view;
-       icaltimezone *second_zone;
+       ICalTimezone *second_zone;
        gchar *location;
 
        g_return_if_fail (user_data != NULL);
        g_return_if_fail (E_IS_DAY_VIEW_TIME_ITEM (time_item));
 
        location = calendar_config_get_day_second_zone ();
-       second_zone = location ? icaltimezone_get_builtin_timezone (location) : NULL;
+       second_zone = location ? i_cal_timezone_get_builtin_timezone (location) : NULL;
        g_free (location);
 
        if (second_zone == time_item->priv->second_zone)
@@ -777,7 +785,7 @@ e_day_view_time_item_show_popup_menu (EDayViewTimeItem *time_item,
        gchar buffer[256];
        GSList *group = NULL, *recent_zones, *s;
        gint current_divisions, i;
-       icaltimezone *zone;
+       ICalTimezone *zone;
 
        day_view = e_day_view_time_item_get_day_view (time_item);
        g_return_if_fail (day_view != NULL);
@@ -833,7 +841,7 @@ e_day_view_time_item_show_popup_menu (EDayViewTimeItem *time_item,
 
        zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view));
        if (zone)
-               item = gtk_menu_item_new_with_label (icaltimezone_get_display_name (zone));
+               item = gtk_menu_item_new_with_label (i_cal_timezone_get_display_name (zone));
        else
                item = gtk_menu_item_new_with_label ("---");
        gtk_widget_set_sensitive (item, FALSE);
@@ -854,12 +862,12 @@ e_day_view_time_item_show_popup_menu (EDayViewTimeItem *time_item,
 
        recent_zones = calendar_config_get_day_second_zones ();
        for (s = recent_zones; s != NULL; s = s->next) {
-               zone = icaltimezone_get_builtin_timezone (s->data);
+               zone = i_cal_timezone_get_builtin_timezone (s->data);
                if (!zone)
                        continue;
 
                item = gtk_radio_menu_item_new_with_label (
-                       group, icaltimezone_get_display_name (zone));
+                       group, i_cal_timezone_get_display_name (zone));
                group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (item));
                /* both comes from builtin, thus no problem to compare pointers */
                if (zone == time_item->priv->second_zone)
@@ -1128,7 +1136,7 @@ e_day_view_time_item_get_column_width (EDayViewTimeItem *time_item)
        return time_item->priv->column_width;
 }
 
-icaltimezone *
+ICalTimezone *
 e_day_view_time_item_get_second_zone (EDayViewTimeItem *time_item)
 {
        g_return_val_if_fail (E_IS_DAY_VIEW_TIME_ITEM (time_item), NULL);
diff --git a/src/calendar/gui/e-day-view-top-item.c b/src/calendar/gui/e-day-view-top-item.c
index 0586681335..05017d0d80 100644
--- a/src/calendar/gui/e-day-view-top-item.c
+++ b/src/calendar/gui/e-day-view-top-item.c
@@ -178,9 +178,9 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
        if (!is_comp_data_valid (event))
                return;
 
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (
-               comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp)
+               return;
 
        if (!e_cal_model_get_rgba_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), 
event->comp_data, &bg_rgba)) {
                bg_rgba.red = day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].red / 65535.0;
@@ -453,7 +453,7 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
        }
 
        /* draw categories icons */
-       e_cal_component_get_categories_list (comp, &categories_list);
+       categories_list = e_cal_component_get_categories_list (comp);
        for (elem = categories_list; elem; elem = elem->next) {
                gchar *category;
                gchar *file;
@@ -483,7 +483,7 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
                }
        }
 
-       e_cal_component_free_categories_list (categories_list);
+       g_slist_free_full (categories_list, g_free);
        g_object_unref (comp);
 }
 
@@ -831,25 +831,18 @@ e_day_view_top_item_get_day_label (EDayView *day_view,
                                    gint buffer_len)
 {
        ECalendarView *view;
-       struct icaltimetype day_start_tt;
-       const icaltimezone *zone;
-       struct tm day_start = { 0 };
+       ICalTimetype *day_start_tt;
+       ICalTimezone *zone;
+       struct tm day_start;
        const gchar *format;
 
        view = E_CALENDAR_VIEW (day_view);
        zone = e_calendar_view_get_timezone (view);
 
-       day_start_tt = icaltime_from_timet_with_zone (
+       day_start_tt = i_cal_time_from_timet_with_zone (
                day_view->day_starts[day], FALSE, zone);
-       day_start.tm_year = day_start_tt.year - 1900;
-       day_start.tm_mon = day_start_tt.month - 1;
-       day_start.tm_mday = day_start_tt.day;
-       day_start.tm_isdst = -1;
-
-       day_start.tm_wday = time_day_of_week (
-               day_start_tt.day,
-               day_start_tt.month - 1,
-               day_start_tt.year);
+       day_start = icaltimetype_to_tm (day_start_tt);
+       g_clear_object (&day_start_tt);
 
        if (day_view->date_format == E_DAY_VIEW_DATE_FULL)
                /* strftime format %A = full weekday name, %d = day of month,
diff --git a/src/calendar/gui/e-day-view.c b/src/calendar/gui/e-day-view.c
index 06c8f9b596..025db92730 100644
--- a/src/calendar/gui/e-day-view.c
+++ b/src/calendar/gui/e-day-view.c
@@ -575,12 +575,12 @@ e_day_view_get_work_day_range_for_day (EDayView *day_view,
 
        if (day >= 0 && day < e_day_view_get_days_shown (day_view)) {
                GDateWeekday weekday;
-               struct icaltimetype tt;
+               ICalTimetype *tt;
 
-               tt = icaltime_from_timet_with_zone (day_view->day_starts[day], FALSE,
+               tt = i_cal_time_from_timet_with_zone (day_view->day_starts[day], FALSE,
                        e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
 
-               switch (icaltime_day_of_week (tt)) {
+               switch (i_cal_time_day_of_week (tt)) {
                        case 1:
                                weekday = G_DATE_SUNDAY;
                                break;
@@ -607,6 +607,8 @@ e_day_view_get_work_day_range_for_day (EDayView *day_view,
                                break;
                }
 
+               g_clear_object (&tt);
+
                e_cal_model_get_work_day_range_for (model, weekday,
                        start_hour, start_minute,
                        end_hour, end_minute);
@@ -750,18 +752,18 @@ new_event_in_rage_data_free (gpointer ptr)
 static void
 day_view_new_event_in_selected_range_cb (ECalModel *model,
                                         ECalClient *client,
-                                        icalcomponent *default_component,
+                                        ICalComponent *default_component,
                                         gpointer user_data)
 {
        NewEventInRangeData *ned = user_data;
        ECalComponent *comp = NULL;
        gint day, event_num;
-       ECalComponentDateTime start_dt, end_dt;
-       struct icaltimetype start_tt, end_tt;
-       const gchar *uid;
+       ECalComponentDateTime *start_dt, *end_dt;
+       ICalTimetype *start_tt, *end_tt;
+       const gchar *uid, *use_tzid;
        AddEventData add_event_data;
        ESourceRegistry *registry;
-       icaltimezone *zone;
+       ICalTimezone *zone;
 
        g_return_if_fail (ned != NULL);
        g_return_if_fail (E_IS_CAL_MODEL (model));
@@ -774,33 +776,36 @@ day_view_new_event_in_selected_range_cb (ECalModel *model,
 
        registry = e_cal_model_get_registry (model);
        zone = e_cal_model_get_timezone (model);
-       uid = icalcomponent_get_uid (default_component);
+       uid = i_cal_component_get_uid (default_component);
 
-       comp = e_cal_component_new_from_icalcomponent (icalcomponent_new_clone (default_component));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone (default_component));
        g_return_if_fail (comp != NULL);
 
-       start_tt = icaltime_from_timet_with_zone (ned->dtstart, FALSE, zone);
-       end_tt = icaltime_from_timet_with_zone (ned->dtend, FALSE, zone);
+       start_tt = i_cal_time_from_timet_with_zone (ned->dtstart, FALSE, zone);
+       end_tt = i_cal_time_from_timet_with_zone (ned->dtend, FALSE, zone);
 
        if (ned->in_top_canvas) {
-               start_dt.tzid = NULL;
-               start_tt.is_date = 1;
-               end_tt.is_date = 1;
+               use_tzid = NULL;
+               i_cal_timetype_set_is_date (start_tt, 1);
+               i_cal_timetype_set_is_date (end_tt, 1);
 
                /* Editor default in day/work-week view - top canvas */
                e_cal_component_set_transparency (comp, E_CAL_COMPONENT_TRANSP_TRANSPARENT);
        } else {
-               start_dt.tzid = icaltimezone_get_tzid (zone);
+               use_tzid = i_cal_timezone_get_tzid (zone);
 
                /* Editor default in day/work-week view - main canvas */
                e_cal_component_set_transparency (comp, E_CAL_COMPONENT_TRANSP_OPAQUE);
        }
 
-       start_dt.value = &start_tt;
-       end_dt.value = &end_tt;
-       end_dt.tzid = start_dt.tzid;
-       e_cal_component_set_dtstart (comp, &start_dt);
-       e_cal_component_set_dtend (comp, &end_dt);
+       start_dt = e_cal_component_datetime_new_take (start_tt, g_strdup (use_tzid));
+       end_dt = e_cal_component_datetime_new_take (end_tt, g_strdup (use_tzid));
+
+       e_cal_component_set_dtstart (comp, start_dt);
+       e_cal_component_set_dtend (comp, end_dt);
+
+       e_cal_component_datetime_free (start_dt);
+       e_cal_component_datetime_free (end_dt);
 
        /* We add the event locally and start editing it. We don't send it
         * to the server until the user finishes editing it. */
@@ -2534,7 +2539,7 @@ e_day_view_precalc_visible_time_range (ECalendarView *cal_view,
        EDayView *day_view;
        gint days_shown;
        time_t lower;
-       icaltimezone *zone;
+       ICalTimezone *zone;
 
        g_return_if_fail (E_IS_DAY_VIEW (cal_view));
        g_return_if_fail (out_start_time != NULL);
@@ -2622,8 +2627,6 @@ static void
 process_component (EDayView *day_view,
                    ECalModelComponent *comp_data)
 {
-       const gchar *uid;
-       gchar *rid = NULL;
        ECalModel *model;
        ECalComponent *comp;
        ESourceRegistry *registry;
@@ -2636,21 +2639,12 @@ process_component (EDayView *day_view,
        if (day_view->lower == 0 && day_view->upper == 0)
                return;
 
-       comp = e_cal_component_new ();
-       if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp))) {
-               g_object_unref (comp);
-
-               g_message (G_STRLOC ": Could not set icalcomponent on ECalComponent");
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone (comp_data->icalcomp));
+       if (!comp) {
+               g_message (G_STRLOC ": Could not set ICalComponent on ECalComponent");
                return;
        }
 
-       e_cal_component_get_uid (comp, &uid);
-       if (e_cal_component_is_instance (comp))
-               rid = e_cal_component_get_recurid_as_string (comp);
-       else
-               rid = NULL;
-       /* rid is never used below here, why? */
-
        /* Add the object */
        add_event_data.day_view = day_view;
        add_event_data.comp_data = comp_data;
@@ -2659,7 +2653,6 @@ process_component (EDayView *day_view,
                comp_data->instance_end, &add_event_data);
 
        g_object_unref (comp);
-       g_free (rid);
 }
 
 static void
@@ -2670,8 +2663,8 @@ update_row (EDayView *day_view,
        ECalModelComponent *comp_data;
        ECalModel *model;
        gint day, event_num;
-       const gchar *uid = NULL;
-       gchar *rid = NULL;
+       const gchar *uid;
+       gchar *rid;
 
        if (do_cancel_editing)
                cancel_editing (day_view);
@@ -2682,14 +2675,8 @@ update_row (EDayView *day_view,
        comp_data = e_cal_model_get_component_at (model, row);
        g_return_if_fail (comp_data != NULL);
 
-       uid = icalcomponent_get_uid (comp_data->icalcomp);
-       if (e_cal_util_component_is_instance (comp_data->icalcomp)) {
-               icalproperty *prop;
-
-               prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_RECURRENCEID_PROPERTY);
-               if (prop)
-                       rid = icaltime_as_ical_string_r (icalcomponent_get_recurrenceid 
(comp_data->icalcomp));
-       }
+       uid = i_cal_component_get_uid (comp_data->icalcomp);
+       rid = e_cal_util_component_get_recurid_as_string (comp_data->icalcomp);
 
        if (e_day_view_find_event_from_uid (day_view, comp_data->client, uid, rid, &day, &event_num))
                e_day_view_remove_event_cb (day_view, day, event_num, NULL);
@@ -2791,17 +2778,11 @@ model_comps_deleted_cb (ETableModel *etm,
        for (l = list; l != NULL; l = g_slist_next (l)) {
                ECalModelComponent *comp_data = l->data;
                gint day, event_num;
-               const gchar *uid = NULL;
-               gchar *rid = NULL;
-
-               uid = icalcomponent_get_uid (comp_data->icalcomp);
-               if (e_cal_util_component_is_instance (comp_data->icalcomp)) {
-                       icalproperty *prop;
+               const gchar *uid;
+               gchar *rid;
 
-                       prop = icalcomponent_get_first_property (comp_data->icalcomp, 
ICAL_RECURRENCEID_PROPERTY);
-                       if (prop)
-                               rid = icaltime_as_ical_string_r (icalcomponent_get_recurrenceid 
(comp_data->icalcomp));
-               }
+               uid = i_cal_component_get_uid (comp_data->icalcomp);
+               rid = e_cal_util_component_get_recurid_as_string (comp_data->icalcomp);
 
                if (e_day_view_find_event_from_uid (day_view, comp_data->client, uid, rid, &day, &event_num))
                        e_day_view_remove_event_cb (day_view, day, event_num, NULL);
@@ -2816,11 +2797,11 @@ model_comps_deleted_cb (ETableModel *etm,
 
 static void
 timezone_changed_cb (ECalModel *cal_model,
-                     icaltimezone *old_zone,
-                     icaltimezone *new_zone,
-                     gpointer user_data)
+                    ICalTimezone *old_zone,
+                    ICalTimezone *new_zone,
+                    gpointer user_data)
 {
-       struct icaltimetype tt;
+       ICalTimetype *tt;
        time_t lower;
        EDayView *day_view = (EDayView *) user_data;
        ECalendarView *cal_view = (ECalendarView *) day_view;
@@ -2839,11 +2820,13 @@ timezone_changed_cb (ECalModel *cal_model,
 
        /* Recalculate the new start of the first day. We just use exactly
         * the same time, but with the new timezone. */
-       tt = icaltime_from_timet_with_zone (
+       tt = i_cal_time_from_timet_with_zone (
                day_view->lower, FALSE,
                old_zone);
 
-       lower = icaltime_as_timet_with_zone (tt, new_zone);
+       lower = i_cal_time_as_timet_with_zone (tt, new_zone);
+
+       g_clear_object (&tt);
 
        e_day_view_recalc_day_starts (day_view, lower);
        e_day_view_update_query (day_view);
@@ -3167,7 +3150,7 @@ e_day_view_foreach_event_with_uid (EDayView *day_view,
                        if (!is_comp_data_valid (event))
                                continue;
 
-                       u = icalcomponent_get_uid (event->comp_data->icalcomp);
+                       u = i_cal_component_get_uid (event->comp_data->icalcomp);
                        if (u && !strcmp (uid, u)) {
                                if (!(*callback) (day_view, day, event_num, data))
                                        return;
@@ -3184,7 +3167,7 @@ e_day_view_foreach_event_with_uid (EDayView *day_view,
                if (!is_comp_data_valid (event))
                        continue;
 
-               u = icalcomponent_get_uid (event->comp_data->icalcomp);
+               u = i_cal_component_get_uid (event->comp_data->icalcomp);
                if (u && !strcmp (uid, u)) {
                        if (!(*callback) (day_view, E_DAY_VIEW_LONG_EVENT, event_num, data))
                                return;
@@ -3308,42 +3291,52 @@ set_style_from_attendee (EDayViewEvent *event,
        ECalComponent *comp;
        GSList *attendees = NULL, *l;
        gchar *address;
-       ECalComponentAttendee *at = NULL;
+       ICalParameterPartstat partstat = I_CAL_PARTSTAT_NONE;
 
        if (!is_comp_data_valid (event))
                return;
 
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-       address = itip_get_comp_attendee (
-               registry, comp, event->comp_data->client);
-       e_cal_component_get_attendee_list (comp, &attendees);
-       for (l = attendees; l; l = l->next) {
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp)
+               return;
+
+       address = itip_get_comp_attendee (registry, comp, event->comp_data->client);
+       attendees = e_cal_component_get_attendees (comp);
+       for (l = attendees; l && address; l = l->next) {
                ECalComponentAttendee *attendee = l->data;
+               const gchar *value, *sentby;
+
+               value = e_cal_component_attendee_get_value (attendee);
+               if (value)
+                       value = itip_strip_mailto (value);
+
+               sentby = e_cal_component_attendee_get_sentby (attendee);
+               if (sentby)
+                       value = itip_strip_mailto (sentby);
 
-               if ((attendee->value && g_strcmp0 (itip_strip_mailto (attendee->value), address) == 0)
-                || (attendee->sentby && g_strcmp0 (itip_strip_mailto (attendee->sentby), address) == 0)) {
-                       at = attendee;
+               if ((value && g_ascii_strcasecmp (value, address) == 0) ||
+                   (sentby && g_ascii_strcasecmp (sentby, address) == 0)) {
+                       partstat = e_cal_component_attendee_get_partstat (attendee);
                        break;
                }
        }
 
-       if (icalcomponent_get_status (event->comp_data->icalcomp) == ICAL_STATUS_CANCELLED)
+       if (i_cal_component_get_status (event->comp_data->icalcomp) == I_CAL_STATUS_CANCELLED)
                gnome_canvas_item_set (event->canvas_item, "strikeout", TRUE, NULL);
 
        /* The attendee has not yet accepted the meeting, display the summary as bolded.
         * If the attendee is not present, it might have come through a mailing list.
         * In that case, we never show the meeting as bold even if it is unaccepted. */
-       if (at && (at->status == ICAL_PARTSTAT_NEEDSACTION))
+       if (partstat == I_CAL_PARTSTAT_NEEDSACTION)
                gnome_canvas_item_set (event->canvas_item, "bold", TRUE, NULL);
-       else if (at && at->status == ICAL_PARTSTAT_DECLINED)
+       else if (partstat == I_CAL_PARTSTAT_DECLINED)
                gnome_canvas_item_set (event->canvas_item, "strikeout", TRUE, NULL);
-       else if (at && at->status == ICAL_PARTSTAT_TENTATIVE)
+       else if (partstat == I_CAL_PARTSTAT_TENTATIVE)
                gnome_canvas_item_set (event->canvas_item, "italic", TRUE, NULL);
-       else if (at && at->status == ICAL_PARTSTAT_DELEGATED)
+       else if (partstat == I_CAL_PARTSTAT_DELEGATED)
                gnome_canvas_item_set (event->canvas_item, "italic", TRUE, "strikeout", TRUE, NULL);
 
-       e_cal_component_free_attendee_list (attendees);
+       g_slist_free_full (attendees, e_cal_component_attendee_free);
        g_free (address);
        g_object_unref (comp);
 }
@@ -3374,7 +3367,7 @@ e_day_view_update_event_label (EDayView *day_view,
        if (!event->canvas_item || !is_comp_data_valid (event))
                return;
 
-       summary = icalcomponent_get_summary (event->comp_data->icalcomp);
+       summary = i_cal_component_get_summary (event->comp_data->icalcomp);
        text = summary ? (gchar *) summary : (gchar *) "";
 
        if (day_view->editing_event_day == day
@@ -3405,8 +3398,8 @@ e_day_view_update_event_label (EDayView *day_view,
                        gint days_shown;
 
                        days_shown = e_day_view_get_days_shown (day_view);
-                       description = icalcomponent_get_description (event->comp_data->icalcomp);
-                       location = icalcomponent_get_location (event->comp_data->icalcomp);
+                       description = i_cal_component_get_description (event->comp_data->icalcomp);
+                       location = i_cal_component_get_location (event->comp_data->icalcomp);
 
                        if (description && *description) {
                                if (location && *location)
@@ -3429,7 +3422,7 @@ e_day_view_update_event_label (EDayView *day_view,
 
        if (e_cal_util_component_has_attendee (event->comp_data->icalcomp))
                set_style_from_attendee (event, registry);
-       else if (icalcomponent_get_status (event->comp_data->icalcomp) == ICAL_STATUS_CANCELLED)
+       else if (i_cal_component_get_status (event->comp_data->icalcomp) == I_CAL_STATUS_CANCELLED)
                gnome_canvas_item_set (event->canvas_item, "strikeout", TRUE, NULL);
 
        if (free_text)
@@ -3472,7 +3465,7 @@ e_day_view_update_long_event_label (EDayView *day_view,
 
        if (e_cal_util_component_has_attendee (event->comp_data->icalcomp))
                set_style_from_attendee (event, registry);
-       else if (icalcomponent_get_status (event->comp_data->icalcomp) == ICAL_STATUS_CANCELLED)
+       else if (i_cal_component_get_status (event->comp_data->icalcomp) == I_CAL_STATUS_CANCELLED)
                gnome_canvas_item_set (event->canvas_item, "strikeout", TRUE, NULL);
 }
 
@@ -3556,16 +3549,16 @@ e_day_view_find_event_from_uid (EDayView *day_view,
                        if (event->comp_data->client != client)
                                continue;
 
-                       u = icalcomponent_get_uid (event->comp_data->icalcomp);
+                       u = i_cal_component_get_uid (event->comp_data->icalcomp);
                        if (u && !strcmp (uid, u)) {
                                if (rid && *rid) {
-                                       r = icaltime_as_ical_string_r (icalcomponent_get_recurrenceid 
(event->comp_data->icalcomp));
-                                       if (!r || !*r)
-                                               continue;
-                                       if (strcmp (rid, r) != 0) {
+                                       r = e_cal_util_component_get_recurid_as_string 
(event->comp_data->icalcomp);
+
+                                       if (!r || !*r || strcmp (rid, r) != 0) {
                                                g_free (r);
                                                continue;
                                        }
+
                                        g_free (r);
                                }
 
@@ -3587,7 +3580,7 @@ e_day_view_find_event_from_uid (EDayView *day_view,
                if (event->comp_data->client != client)
                        continue;
 
-               u = icalcomponent_get_uid (event->comp_data->icalcomp);
+               u = i_cal_component_get_uid (event->comp_data->icalcomp);
                if (u && !strcmp (uid, u)) {
                        *day_return = E_DAY_VIEW_LONG_EVENT;
                        *event_num_return = event_num;
@@ -3724,8 +3717,9 @@ e_day_view_find_work_week_start (EDayView *day_view,
        guint offset;
        GDateWeekday weekday;
        GDateWeekday first_work_day;
-       struct icaltimetype tt = icaltime_null_time ();
-       icaltimezone *zone;
+       ICalTimetype *tt = NULL;
+       ICalTimezone *zone;
+       time_t res;
 
        model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
        zone = e_cal_model_get_timezone (model);
@@ -3752,11 +3746,18 @@ e_day_view_find_work_week_start (EDayView *day_view,
        if (offset > 0)
                g_date_subtract_days (&date, offset);
 
-       tt.year = g_date_get_year (&date);
-       tt.month = g_date_get_month (&date);
-       tt.day = g_date_get_day (&date);
+       tt = i_cal_time_null_time ();
+
+       i_cal_timetype_set_date (tt,
+               g_date_get_year (&date),
+               g_date_get_month (&date),
+               g_date_get_day (&date));
+
+       res = i_cal_time_as_timet_with_zone (tt, zone);
+
+       g_clear_object (&tt);
 
-       return icaltime_as_timet_with_zone (tt, zone);
+       return res;
 }
 
 static void
@@ -3766,7 +3767,7 @@ e_day_view_recalc_day_starts (EDayView *day_view,
        gint day;
        gchar *str;
        gint days_shown;
-       struct icaltimetype tt;
+       ICalTimetype *tt;
        GDate dt;
 
        days_shown = e_day_view_get_days_shown (day_view);
@@ -3781,15 +3782,17 @@ e_day_view_recalc_day_starts (EDayView *day_view,
        day_view->lower = start_time;
        day_view->upper = day_view->day_starts[days_shown];
 
-       tt = icaltime_from_timet_with_zone (day_view->day_starts[0], FALSE, e_calendar_view_get_timezone 
(E_CALENDAR_VIEW (day_view)));
+       tt = i_cal_time_from_timet_with_zone (day_view->day_starts[0], FALSE, e_calendar_view_get_timezone 
(E_CALENDAR_VIEW (day_view)));
        g_date_clear (&dt, 1);
-       g_date_set_dmy (&dt, tt.day, tt.month, tt.year);
+       g_date_set_dmy (&dt, i_cal_timetype_get_day (tt), i_cal_timetype_get_month (tt), 
i_cal_timetype_get_year (tt));
        /* To Translators: the %d stands for a week number, it's value between 1 and 52/53 */
        str = g_strdup_printf (_("Week %d"), g_date_get_iso8601_week_of_year (&dt));
        gtk_label_set_text (GTK_LABEL (day_view->week_number_label), str);
        g_free (str);
 
        e_day_view_recalc_work_week (day_view);
+
+       g_clear_object (&tt);
 }
 
 /* Whether we are displaying a work-week, in which case the display always
@@ -5406,13 +5409,13 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
        EDayViewEvent *event;
        gint event_num;
        ECalComponent *comp;
-       ECalComponentDateTime date;
-       struct icaltimetype itt;
+       ECalComponentDateTime *date = NULL;
        time_t dt;
        ECalModel *model;
        ECalClient *client;
        ESourceRegistry *registry;
        ECalObjModType mod = E_CAL_OBJ_MOD_ALL;
+       ICalTimezone *zone;
        gint is_date;
 
        model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
@@ -5434,8 +5437,9 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
        /* We use a temporary copy of the comp since we don't want to
         * change the original comp here. Otherwise we would not detect that
         * the event's time had changed in the "update_event" callback. */
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp)
+               return;
 
        if (e_cal_component_has_attendees (comp) &&
            !itip_organizer_is_user (registry, comp, client)) {
@@ -5444,35 +5448,42 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
                return;
        }
 
-       date.value = &itt;
-       date.tzid = NULL;
+       zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view));
 
        if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_LEFT_EDGE) {
-               ECalComponentDateTime ecdt;
+               ECalComponentDateTime *ecdt;
+
+               ecdt = e_cal_component_get_dtstart (comp);
+               is_date = ecdt && e_cal_component_datetime_get_value (ecdt) &&
+                         i_cal_time_is_date (e_cal_component_datetime_get_value (ecdt));
 
-               e_cal_component_get_dtstart (comp, &ecdt);
-               is_date = ecdt.value && ecdt.value->is_date;
-               if (!is_date)
-                       date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
                dt = day_view->day_starts[day_view->resize_start_row];
-               *date.value = icaltime_from_timet_with_zone (dt, is_date,
-                                                            e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
-               cal_comp_set_dtstart_with_oldzone (client, comp, &date);
-               e_cal_component_free_datetime (&ecdt);
-               date.tzid = NULL; /* do not reuse it later */
+               date = e_cal_component_datetime_new_take (
+                       i_cal_time_from_timet_with_zone (dt, is_date, zone),
+                       (zone && !is_date) ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
+               cal_comp_set_dtstart_with_oldzone (client, comp, date);
+
+               e_cal_component_datetime_free (ecdt);
+
+               /* do not reuse it later */
+               e_cal_component_datetime_set_tzid (date, NULL);
        } else {
-               ECalComponentDateTime ecdt;
+               ECalComponentDateTime *ecdt;
+
+               ecdt = e_cal_component_get_dtend (comp);
+               is_date = ecdt && e_cal_component_datetime_get_value (ecdt) &&
+                         i_cal_time_is_date (e_cal_component_datetime_get_value (ecdt));
 
-               e_cal_component_get_dtend (comp, &ecdt);
-               is_date = ecdt.value && ecdt.value->is_date;
-               if (!is_date)
-                       date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
                dt = day_view->day_starts[day_view->resize_end_row + 1];
-               *date.value = icaltime_from_timet_with_zone (dt, is_date,
-                                                            e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
-               cal_comp_set_dtend_with_oldzone (client, comp, &date);
-               e_cal_component_free_datetime (&ecdt);
-               date.tzid = NULL; /* do not reuse it later */
+               date = e_cal_component_datetime_new_take (
+                       i_cal_time_from_timet_with_zone (dt, is_date, zone),
+                       (zone && !is_date) ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
+               cal_comp_set_dtend_with_oldzone (client, comp, date);
+
+               e_cal_component_datetime_free (ecdt);
+
+               /* do not reuse it later */
+               e_cal_component_datetime_set_tzid (date, NULL);
        }
 
        e_cal_component_commit_sequence (comp);
@@ -5485,24 +5496,23 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
                if (mod == E_CAL_OBJ_MOD_THIS) {
                        /* set the correct DTSTART/DTEND on the individual recurrence */
                        if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) {
-                               *date.value = icaltime_from_timet_with_zone (
-                                       event->comp_data->instance_end, FALSE,
-                                       e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-                               cal_comp_set_dtend_with_oldzone (client, comp, &date);
+                               e_cal_component_datetime_take_value (date,
+                                       i_cal_time_from_timet_with_zone (event->comp_data->instance_end, 
FALSE, zone));
+                               cal_comp_set_dtend_with_oldzone (client, comp, date);
                        } else {
-                               *date.value = icaltime_from_timet_with_zone (
-                                       event->comp_data->instance_start, FALSE,
-                                       e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-                               cal_comp_set_dtstart_with_oldzone (client, comp, &date);
+                               e_cal_component_datetime_take_value (date,
+                                       i_cal_time_from_timet_with_zone (event->comp_data->instance_start, 
FALSE, zone));
+                               cal_comp_set_dtstart_with_oldzone (client, comp, date);
                        }
 
-                       e_cal_component_set_rdate_list (comp, NULL);
-                       e_cal_component_set_rrule_list (comp, NULL);
-                       e_cal_component_set_exdate_list (comp, NULL);
-                       e_cal_component_set_exrule_list (comp, NULL);
+                       e_cal_component_set_rdates (comp, NULL);
+                       e_cal_component_set_rrules (comp, NULL);
+                       e_cal_component_set_exdates (comp, NULL);
+                       e_cal_component_set_exrules (comp, NULL);
                }
-       } else if (e_cal_component_is_instance (comp))
+       } else if (e_cal_component_is_instance (comp)) {
                mod = E_CAL_OBJ_MOD_THIS;
+       }
 
        e_cal_component_commit_sequence (comp);
 
@@ -5512,6 +5522,7 @@ e_day_view_finish_long_event_resize (EDayView *day_view)
  out:
        day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE;
 
+       e_cal_component_datetime_free (date);
        g_object_unref (comp);
 }
 
@@ -5523,8 +5534,8 @@ e_day_view_finish_resize (EDayView *day_view)
        EDayViewEvent *event;
        gint day, event_num;
        ECalComponent *comp;
-       ECalComponentDateTime date;
-       struct icaltimetype itt;
+       ECalComponentDateTime *date = NULL;
+       ICalTimezone *zone;
        time_t dt;
        ECalModel *model;
        ECalClient *client;
@@ -5558,8 +5569,9 @@ e_day_view_finish_resize (EDayView *day_view)
        /* We use a temporary shallow copy of the ico since we don't want to
         * change the original ico here. Otherwise we would not detect that
         * the event's time had changed in the "update_event" callback. */
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp)
+               return;
 
        if (e_cal_component_has_attendees (comp) &&
            !itip_organizer_is_user (registry, comp, client)) {
@@ -5581,19 +5593,20 @@ e_day_view_finish_resize (EDayView *day_view)
                goto out;
        }
 
-       date.value = &itt;
-       date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
+       zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view));
 
        if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) {
                dt = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_start_row);
-               *date.value = icaltime_from_timet_with_zone (dt, FALSE,
-                                                            e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
-               cal_comp_set_dtstart_with_oldzone (client, comp, &date);
+               date = e_cal_component_datetime_new_take (
+                       i_cal_time_from_timet_with_zone (dt, FALSE, zone),
+                       zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
+               cal_comp_set_dtstart_with_oldzone (client, comp, date);
        } else {
                dt = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_end_row + 1);
-               *date.value = icaltime_from_timet_with_zone (dt, FALSE,
-                                                            e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
-               cal_comp_set_dtend_with_oldzone (client, comp, &date);
+               date = e_cal_component_datetime_new_take (
+                       i_cal_time_from_timet_with_zone (dt, FALSE, zone),
+                       zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
+               cal_comp_set_dtend_with_oldzone (client, comp, date);
        }
 
        e_cal_component_commit_sequence (comp);
@@ -5620,24 +5633,23 @@ e_day_view_finish_resize (EDayView *day_view)
                if (mod == E_CAL_OBJ_MOD_THIS) {
                        /* set the correct DTSTART/DTEND on the individual recurrence */
                        if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) {
-                               *date.value = icaltime_from_timet_with_zone (
-                                       event->comp_data->instance_end, FALSE,
-                                       e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-                               cal_comp_set_dtend_with_oldzone (client, comp, &date);
+                               e_cal_component_datetime_take_value (date,
+                                       i_cal_time_from_timet_with_zone (event->comp_data->instance_end, 
FALSE, zone));
+                               cal_comp_set_dtend_with_oldzone (client, comp, date);
                        } else {
-                               *date.value = icaltime_from_timet_with_zone (
-                                       event->comp_data->instance_start, FALSE,
-                                       e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-                               cal_comp_set_dtstart_with_oldzone (client, comp, &date);
+                               e_cal_component_datetime_take_value (date,
+                                       i_cal_time_from_timet_with_zone (event->comp_data->instance_start, 
FALSE, zone));
+                               cal_comp_set_dtstart_with_oldzone (client, comp, date);
                        }
 
-                       e_cal_component_set_rdate_list (comp, NULL);
-                       e_cal_component_set_rrule_list (comp, NULL);
-                       e_cal_component_set_exdate_list (comp, NULL);
-                       e_cal_component_set_exrule_list (comp, NULL);
+                       e_cal_component_set_rdates (comp, NULL);
+                       e_cal_component_set_rrules (comp, NULL);
+                       e_cal_component_set_exdates (comp, NULL);
+                       e_cal_component_set_exrules (comp, NULL);
                }
-       } else if (e_cal_component_is_instance (comp))
+       } else if (e_cal_component_is_instance (comp)) {
                mod = E_CAL_OBJ_MOD_THIS;
+       }
 
        e_cal_component_commit_sequence (comp);
 
@@ -5648,6 +5660,7 @@ e_day_view_finish_resize (EDayView *day_view)
 
  out:
        g_object_unref (comp);
+       g_clear_object (&date);
 }
 
 static void
@@ -5746,9 +5759,9 @@ e_day_view_add_event (ESourceRegistry *registry,
        EDayViewEvent event;
        gint day, offset;
        gint days_shown;
-       struct icaltimetype start_tt, end_tt;
+       ICalTimetype *start_tt, *end_tt;
+       ICalTimezone *zone;
        AddEventData *add_event_data;
-       icaltimezone *zone;
 
        add_event_data = data;
 
@@ -5768,8 +5781,8 @@ e_day_view_add_event (ESourceRegistry *registry,
                g_return_if_fail (end > add_event_data->day_view->lower);
 
        zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->day_view));
-       start_tt = icaltime_from_timet_with_zone (start, FALSE, zone);
-       end_tt = icaltime_from_timet_with_zone (end, FALSE, zone);
+       start_tt = i_cal_time_from_timet_with_zone (start, FALSE, zone);
+       end_tt = i_cal_time_from_timet_with_zone (end, FALSE, zone);
 
        if (add_event_data->comp_data) {
                event.comp_data = g_object_ref (add_event_data->comp_data);
@@ -5778,7 +5791,7 @@ e_day_view_add_event (ESourceRegistry *registry,
                event.comp_data->is_new_component = TRUE;
                event.comp_data->client = g_object_ref (client);
                e_cal_component_abort_sequence (comp);
-               event.comp_data->icalcomp = icalcomponent_new_clone (e_cal_component_get_icalcomponent 
(comp));
+               event.comp_data->icalcomp = i_cal_component_new_clone (e_cal_component_get_icalcomponent 
(comp));
        }
 
        event.start = start;
@@ -5794,8 +5807,11 @@ e_day_view_add_event (ESourceRegistry *registry,
         * display. */
        offset = add_event_data->day_view->first_hour_shown * 60
                + add_event_data->day_view->first_minute_shown;
-       event.start_minute = start_tt.hour * 60 + start_tt.minute - offset;
-       event.end_minute = end_tt.hour * 60 + end_tt.minute - offset;
+       event.start_minute = i_cal_timetype_get_hour (start_tt) * 60 + i_cal_timetype_get_minute (start_tt) - 
offset;
+       event.end_minute = i_cal_timetype_get_hour (end_tt) * 60 + i_cal_timetype_get_minute (end_tt) - 
offset;
+
+       g_clear_object (&start_tt);
+       g_clear_object (&end_tt);
 
        event.start_row_or_col = 0;
        event.num_columns = 0;
@@ -6013,8 +6029,9 @@ e_day_view_reshape_long_event (EDayView *day_view,
        /* We don't show the icons while resizing, since we'd have to
         * draw them on top of the resize rect. Nor when editing. */
        num_icons = 0;
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp)
+               return;
 
        /* Set up Pango prerequisites */
        pango_context = gtk_widget_get_pango_context (GTK_WIDGET (day_view));
@@ -6164,7 +6181,7 @@ e_day_view_reshape_day_events (EDayView *day_view,
                if (!is_comp_data_valid (event))
                        continue;
 
-               current_comp_string = icalcomponent_as_ical_string_r (event->comp_data->icalcomp);
+               current_comp_string = i_cal_component_as_ical_string_r (event->comp_data->icalcomp);
                if (day_view->last_edited_comp_string == NULL) {
                        g_free (current_comp_string);
                        continue;
@@ -6219,22 +6236,22 @@ e_day_view_reshape_day_event (EDayView *day_view,
                    || day_view->resize_event_num != event_num)) {
                        ECalComponent *comp;
 
-                       comp = e_cal_component_new ();
-                       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone 
(event->comp_data->icalcomp));
-
-                       if (e_cal_component_has_alarms (comp))
-                               num_icons++;
-                       if (e_cal_component_has_recurrences (comp) || e_cal_component_is_instance (comp))
-                               num_icons++;
-                       if (e_cal_component_has_attachments (comp))
-                               num_icons++;
-                       if (event->different_timezone)
-                               num_icons++;
-                       if (e_cal_component_has_attendees (comp))
-                               num_icons++;
-
-                       num_icons += cal_comp_util_get_n_icons (comp, NULL);
-                       g_object_unref (comp);
+                       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+                       if (comp) {
+                               if (e_cal_component_has_alarms (comp))
+                                       num_icons++;
+                               if (e_cal_component_has_recurrences (comp) || e_cal_component_is_instance 
(comp))
+                                       num_icons++;
+                               if (e_cal_component_has_attachments (comp))
+                                       num_icons++;
+                               if (event->different_timezone)
+                                       num_icons++;
+                               if (e_cal_component_has_attendees (comp))
+                                       num_icons++;
+
+                               num_icons += cal_comp_util_get_n_icons (comp, NULL);
+                               g_object_unref (comp);
+                       }
                }
 
                if (num_icons > 0) {
@@ -7330,7 +7347,7 @@ cancel_editing (EDayView *day_view)
 
        /* Reset the text to what was in the component */
 
-       summary = icalcomponent_get_summary (event->comp_data->icalcomp);
+       summary = i_cal_component_get_summary (event->comp_data->icalcomp);
        g_object_set (
                event->canvas_item,
                "text", summary ? summary : "",
@@ -7591,7 +7608,7 @@ e_day_view_event_move (ECalendarView *cal_view,
        gint time_divisions;
        gint day, event_num, resize_start_row, resize_end_row;
        time_t start_dt, end_dt;
-       struct icaltimetype start_time, end_time;
+       ICalTimetype *start_time, *end_time;
 
        day_view = E_DAY_VIEW (cal_view);
        day = day_view->editing_event_day;
@@ -7638,24 +7655,28 @@ e_day_view_event_move (ECalendarView *cal_view,
                        return TRUE;
                start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
                end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1);
-               start_time = icaltime_from_timet_with_zone (start_dt, 0, NULL);
-               end_time = icaltime_from_timet_with_zone (end_dt, 0, NULL);
-               icaltime_adjust (&start_time ,-1,0,0,0);
-               icaltime_adjust (&end_time ,-1,0,0,0);
-               start_dt = icaltime_as_timet (start_time);
-               end_dt = icaltime_as_timet (end_time);
+               start_time = i_cal_time_from_timet_with_zone (start_dt, 0, NULL);
+               end_time = i_cal_time_from_timet_with_zone (end_dt, 0, NULL);
+               i_cal_time_adjust (start_time, -1, 0, 0, 0);
+               i_cal_time_adjust (end_time, -1, 0, 0, 0);
+               start_dt = i_cal_time_as_timet (start_time);
+               end_dt = i_cal_time_as_timet (end_time);
+               g_clear_object (&start_time);
+               g_clear_object (&end_time);
                break;
        case E_CAL_VIEW_MOVE_RIGHT:
                if (day + 1 >= e_day_view_get_days_shown (day_view))
                        return TRUE;
                start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
                end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1);
-               start_time = icaltime_from_timet_with_zone (start_dt, 0, NULL);
-               end_time = icaltime_from_timet_with_zone (end_dt, 0, NULL);
-               icaltime_adjust (&start_time ,1,0,0,0);
-               icaltime_adjust (&end_time ,1,0,0,0);
-               start_dt = icaltime_as_timet (start_time);
-               end_dt = icaltime_as_timet (end_time);
+               start_time = i_cal_time_from_timet_with_zone (start_dt, 0, NULL);
+               end_time = i_cal_time_from_timet_with_zone (end_dt, 0, NULL);
+               i_cal_time_adjust (start_time ,1,0,0,0);
+               i_cal_time_adjust (end_time ,1,0,0,0);
+               start_dt = i_cal_time_as_timet (start_time);
+               end_dt = i_cal_time_as_timet (end_time);
+               g_clear_object (&start_time);
+               g_clear_object (&end_time);
                break;
        default:
                return FALSE;
@@ -7675,8 +7696,8 @@ e_day_view_change_event_time (EDayView *day_view,
        EDayViewEvent *event;
        gint day, event_num;
        ECalComponent *comp;
-       ECalComponentDateTime date;
-       struct icaltimetype itt;
+       ECalComponentDateTime *date;
+       ICalTimezone *zone;
        ECalModel *model;
        ECalClient *client;
        ESourceRegistry *registry;
@@ -7702,8 +7723,7 @@ e_day_view_change_event_time (EDayView *day_view,
        /* We use a temporary shallow copy of the ico since we don't want to
         * change the original ico here. Otherwise we would not detect that
         * the event's time had changed in the "update_event" callback. */
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
 
        if (e_cal_component_has_attendees (comp) &&
            !itip_organizer_is_user (registry, comp, client)) {
@@ -7711,17 +7731,18 @@ e_day_view_change_event_time (EDayView *day_view,
                return;
        }
 
-       date.value = &itt;
-       /* FIXME: Should probably keep the timezone of the original start
-        * and end times. */
-       date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
+       zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view));
+
+       date = e_cal_component_datetime_new_take (
+               i_cal_time_from_timet_with_zone (start_dt, FALSE, zone),
+               zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
+       cal_comp_set_dtstart_with_oldzone (client, comp, date);
+
+       e_cal_component_datetime_take_value (date,
+               i_cal_time_from_timet_with_zone (end_dt, FALSE, zone));
+       cal_comp_set_dtend_with_oldzone (client, comp, date);
 
-       *date.value = icaltime_from_timet_with_zone (start_dt, FALSE,
-                                                    e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
-       cal_comp_set_dtstart_with_oldzone (client, comp, &date);
-       *date.value = icaltime_from_timet_with_zone (end_dt, FALSE,
-                                                    e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
-       cal_comp_set_dtend_with_oldzone (client, comp, &date);
+       e_cal_component_datetime_free (date);
 
        e_cal_component_commit_sequence (comp);
 
@@ -7741,10 +7762,10 @@ e_day_view_change_event_time (EDayView *day_view,
                }
 
                if (mod == E_CAL_OBJ_MOD_THIS) {
-                       e_cal_component_set_rdate_list (comp, NULL);
-                       e_cal_component_set_rrule_list (comp, NULL);
-                       e_cal_component_set_exdate_list (comp, NULL);
-                       e_cal_component_set_exrule_list (comp, NULL);
+                       e_cal_component_set_rdates (comp, NULL);
+                       e_cal_component_set_rrules (comp, NULL);
+                       e_cal_component_set_exdates (comp, NULL);
+                       e_cal_component_set_exrules (comp, NULL);
                }
        } else if (e_cal_component_is_instance (comp))
                mod = E_CAL_OBJ_MOD_THIS;
@@ -7901,7 +7922,7 @@ e_day_view_on_editing_stopped (EDayView *day_view,
        gint day, event_num;
        EDayViewEvent *event;
        gchar *text = NULL;
-       ECalComponentText summary;
+       ECalComponentText *summary = NULL;
        ECalComponent *comp;
        ECalClient *client;
        gboolean on_server;
@@ -7948,8 +7969,11 @@ e_day_view_on_editing_stopped (EDayView *day_view,
                NULL);
        g_return_if_fail (text != NULL);
 
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (comp) {
+               g_free (text);
+               return;
+       }
 
        client = event->comp_data->client;
        on_server = !event->comp_data->is_new_component;
@@ -7957,7 +7981,7 @@ e_day_view_on_editing_stopped (EDayView *day_view,
        if (string_is_empty (text) && !on_server) {
                const gchar *uid;
 
-               e_cal_component_get_uid (comp, &uid);
+               uid = e_cal_component_get_uid (comp);
 
                e_day_view_foreach_event_with_uid (day_view, uid,
                                                   e_day_view_remove_event_cb, NULL);
@@ -7968,24 +7992,25 @@ e_day_view_on_editing_stopped (EDayView *day_view,
        }
 
        /* Only update the summary if necessary. */
-       e_cal_component_get_summary (comp, &summary);
-       if (summary.value && !strcmp (text, summary.value)) {
+       summary = e_cal_component_get_summary (comp);
+       if (summary && !g_strcmp0 (text, e_cal_component_text_get_value (summary))) {
                if (day == E_DAY_VIEW_LONG_EVENT)
                        e_day_view_reshape_long_event (day_view, event_num);
                else
                        e_day_view_update_event_label (
                                day_view, day,
                                event_num);
-       } else if (summary.value || !string_is_empty (text)) {
-               icalcomponent *icalcomp = e_cal_component_get_icalcomponent (comp);
+       } else if ((summary && e_cal_component_text_get_value (summary)) || !string_is_empty (text)) {
+               ICalComponent *icomp = e_cal_component_get_icalcomponent (comp);
 
-               summary.value = text;
-               summary.altrep = NULL;
-               e_cal_component_set_summary (comp, &summary);
+               if (summary)
+                       e_cal_component_text_free (summary);
+               summary = e_cal_component_text_new (text, NULL);
+               e_cal_component_set_summary (comp, summary);
                e_cal_component_commit_sequence (comp);
 
                if (!on_server) {
-                       e_cal_ops_create_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), 
client, icalcomp,
+                       e_cal_ops_create_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), 
client, icomp,
                                e_calendar_view_component_created_cb, g_object_ref (day_view), 
g_object_unref);
 
                        /* we remove the object since we either got the update from the server or failed */
@@ -7999,49 +8024,70 @@ e_day_view_on_editing_stopped (EDayView *day_view,
                                }
 
                                if (mod == E_CAL_OBJ_MOD_THIS) {
-                                       ECalComponentDateTime olddt, dt;
-                                       icaltimetype itt;
+                                       ECalComponentDateTime *olddt, *dt;
+
+                                       olddt = e_cal_component_get_dtstart (comp);
 
-                                       dt.value = &itt;
+                                       if (olddt && e_cal_component_datetime_get_value (olddt) &&
+                                           i_cal_time_get_timezone (e_cal_component_datetime_get_value 
(olddt))) {
+                                               ICalTimetype *itt;
 
-                                       e_cal_component_get_dtstart (comp, &olddt);
-                                       if (olddt.value->zone) {
-                                               *dt.value = icaltime_from_timet_with_zone (
-                                                       event->comp_data->instance_start,
-                                                       olddt.value->is_date,
-                                                       olddt.value->zone);
+                                               itt = e_cal_component_datetime_get_value (olddt);
+
+                                               dt = e_cal_component_datetime_new_take (
+                                                       i_cal_time_from_timet_with_zone 
(event->comp_data->instance_start,
+                                                               i_cal_time_is_date (itt), 
i_cal_time_get_timezone (itt)),
+                                                       g_strdup (e_cal_component_datetime_get_tzid (olddt)));
                                        } else {
-                                               *dt.value = icaltime_from_timet_with_zone (
-                                                       event->comp_data->instance_start,
-                                                       olddt.value->is_date,
-                                                       e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
+                                               ICalTimetype *itt;
+                                               ICalTimezone *zone;
+
+                                               zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view));
+                                               itt = olddt ? e_cal_component_datetime_get_value (olddt) : 
NULL;
+
+                                               dt = e_cal_component_datetime_new_take (
+                                                       i_cal_time_from_timet_with_zone 
(event->comp_data->instance_start,
+                                                               itt ? i_cal_time_is_date (itt) : FALSE, zone),
+                                                       zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : 
NULL);
                                        }
-                                       dt.tzid = olddt.tzid;
-                                       e_cal_component_set_dtstart (comp, &dt);
-                                       dt.tzid = NULL;
-                                       e_cal_component_free_datetime (&olddt);
-
-                                       e_cal_component_get_dtend (comp, &olddt);
-                                       if (olddt.value->zone) {
-                                               *dt.value = icaltime_from_timet_with_zone (
-                                                       event->comp_data->instance_end,
-                                                       olddt.value->is_date,
-                                                       olddt.value->zone);
+                                       e_cal_component_set_dtstart (comp, dt);
+
+                                       e_cal_component_datetime_free (olddt);
+                                       e_cal_component_datetime_free (dt);
+
+                                       olddt = e_cal_component_get_dtend (comp);
+
+                                       if (olddt && e_cal_component_datetime_get_value (olddt) &&
+                                           i_cal_time_get_timezone (e_cal_component_datetime_get_value 
(olddt))) {
+                                               ICalTimetype *itt;
+
+                                               itt = e_cal_component_datetime_get_value (olddt);
+
+                                               dt = e_cal_component_datetime_new_take (
+                                                       i_cal_time_from_timet_with_zone 
(event->comp_data->instance_end,
+                                                               i_cal_time_is_date (itt), 
i_cal_time_get_timezone (itt)),
+                                                       g_strdup (e_cal_component_datetime_get_tzid (olddt)));
                                        } else {
-                                               *dt.value = icaltime_from_timet_with_zone (
-                                                       event->comp_data->instance_end,
-                                                       olddt.value->is_date,
-                                                       e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
+                                               ICalTimetype *itt;
+                                               ICalTimezone *zone;
+
+                                               zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view));
+                                               itt = olddt ? e_cal_component_datetime_get_value (olddt) : 
NULL;
+
+                                               dt = e_cal_component_datetime_new_take (
+                                                       i_cal_time_from_timet_with_zone 
(event->comp_data->instance_end,
+                                                               itt ? i_cal_time_is_date (itt) : FALSE, zone),
+                                                       zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : 
NULL);
                                        }
-                                       dt.tzid = olddt.tzid;
-                                       e_cal_component_set_dtend (comp, &dt);
-                                       dt.tzid = NULL;
-                                       e_cal_component_free_datetime (&olddt);
+                                       e_cal_component_set_dtend (comp, dt);
+
+                                       e_cal_component_datetime_free (olddt);
+                                       e_cal_component_datetime_free (dt);
 
-                                       e_cal_component_set_rdate_list (comp, NULL);
-                                       e_cal_component_set_rrule_list (comp, NULL);
-                                       e_cal_component_set_exdate_list (comp, NULL);
-                                       e_cal_component_set_exrule_list (comp, NULL);
+                                       e_cal_component_set_rdates (comp, NULL);
+                                       e_cal_component_set_rrules (comp, NULL);
+                                       e_cal_component_set_exdates (comp, NULL);
+                                       e_cal_component_set_exrules (comp, NULL);
 
                                        e_cal_component_commit_sequence (comp);
                                }
@@ -8057,6 +8103,7 @@ e_day_view_on_editing_stopped (EDayView *day_view,
 
  out:
 
+       e_cal_component_text_free (summary);
        g_object_unref (comp);
        g_free (text);
 
@@ -8075,7 +8122,7 @@ e_day_view_convert_grid_position_to_time (EDayView *day_view,
 {
        ECalendarView *cal_view;
        gint time_divisions;
-       struct icaltimetype tt;
+       ICalTimetype *tt;
        time_t val;
        gint minutes;
 
@@ -8092,15 +8139,18 @@ e_day_view_convert_grid_position_to_time (EDayView *day_view,
        if (minutes == 60 * 24)
                return day_view->day_starts[col + 1];
 
-       /* Create an icaltimetype and convert to a time_t. */
-       tt = icaltime_from_timet_with_zone (
+       /* Create an ICalTimetype and convert to a time_t. */
+       tt = i_cal_time_from_timet_with_zone (
                day_view->day_starts[col],
                FALSE, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
-       tt.hour = minutes / 60;
-       tt.minute = minutes % 60;
-       tt.second = 0;
+       i_cal_timetype_set_hour (tt, minutes / 60);
+       i_cal_timetype_set_minute (tt, minutes % 60);
+       i_cal_timetype_set_second (tt, 0);
+
+       val = i_cal_time_as_timet_with_zone (tt, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
+
+       g_clear_object (&tt);
 
-       val = icaltime_as_timet_with_zone (tt, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
        return val;
 }
 
@@ -8111,7 +8161,7 @@ e_day_view_convert_time_to_grid_position (EDayView *day_view,
                                           gint *row)
 {
        ECalendarView *cal_view;
-       struct icaltimetype tt;
+       ICalTimetype *tt;
        gint time_divisions;
        gint day, minutes;
        gint days_shown;
@@ -8134,14 +8184,16 @@ e_day_view_convert_time_to_grid_position (EDayView *day_view,
                }
        }
 
-       /* To find the row we need to convert the time to an icaltimetype,
+       /* To find the row we need to convert the time to an ICalTimetype,
         * calculate the offset in minutes from the top of the display and
         * divide it by the mins per row setting. */
-       tt = icaltime_from_timet_with_zone (time, FALSE, e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
+       tt = i_cal_time_from_timet_with_zone (time, FALSE, e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
 
-       minutes = tt.hour * 60 + tt.minute;
+       minutes = i_cal_timetype_get_hour (tt) * 60 + i_cal_timetype_get_minute (tt);
        minutes -= day_view->first_hour_shown * 60 + day_view->first_minute_shown;
 
+       g_clear_object (&tt);
+
        *row = minutes / time_divisions;
 
        if (*row < 0 || *row >= day_view->rows)
@@ -8735,7 +8787,7 @@ e_day_view_update_top_canvas_drag (EDayView *day_view,
                const gchar *summary;
 
                if (event && is_comp_data_valid (event)) {
-                       summary = icalcomponent_get_summary (event->comp_data->icalcomp);
+                       summary = i_cal_component_get_summary (event->comp_data->icalcomp);
                        text = g_strdup (summary);
                } else {
                        text = NULL;
@@ -8912,7 +8964,7 @@ e_day_view_update_main_canvas_drag (EDayView *day_view,
                const gchar *summary;
 
                if (event && is_comp_data_valid (event)) {
-                       summary = icalcomponent_get_summary (event->comp_data->icalcomp);
+                       summary = i_cal_component_get_summary (event->comp_data->icalcomp);
                        text = g_strdup (summary);
                } else {
                        text = NULL;
@@ -9048,7 +9100,7 @@ e_day_view_on_drag_data_get (GtkWidget *widget,
                              EDayView *day_view)
 {
        EDayViewEvent *event;
-       icalcomponent *vcal;
+       ICalComponent *vcal;
        gint day, event_num;
        gchar *comp_str;
 
@@ -9083,10 +9135,10 @@ e_day_view_on_drag_data_get (GtkWidget *widget,
        vcal = e_cal_util_new_top_level ();
        e_cal_util_add_timezones_from_component (
                vcal, event->comp_data->icalcomp);
-       icalcomponent_add_component (
-               vcal, icalcomponent_new_clone (event->comp_data->icalcomp));
+       i_cal_component_take_component (
+               vcal, i_cal_component_new_clone (event->comp_data->icalcomp));
 
-       comp_str = icalcomponent_as_ical_string_r (vcal);
+       comp_str = i_cal_component_as_ical_string_r (vcal);
        if (comp_str) {
                ESource *source;
                const gchar *source_uid;
@@ -9105,7 +9157,7 @@ e_day_view_on_drag_data_get (GtkWidget *widget,
                g_free (tmp);
        }
 
-       icalcomponent_free (vcal);
+       g_clear_object (&vcal);
        g_free (comp_str);
 }
 
@@ -9124,9 +9176,7 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
        gint day, start_day, end_day, num_days;
        gint start_offset, end_offset;
        ECalComponent *comp;
-       ECalComponentDateTime date;
        ESourceRegistry *registry;
-       struct icaltimetype itt;
        time_t dt;
        gboolean all_day_event;
        ECalModel *model;
@@ -9164,9 +9214,12 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
                        x, y, &day,
                        NULL);
                if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) {
+                       ECalComponentDateTime *date;
                        ECalObjModType mod = E_CAL_OBJ_MOD_ALL;
                        ECalClient *client;
                        GtkWindow *toplevel;
+                       ICalTimetype *itt;
+                       ICalTimezone *zone;
 
                        num_days = 1;
                        start_offset = 0;
@@ -9216,8 +9269,9 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
                         * Otherwise we would not detect that the event's time
                         * had changed in the "update_event" callback. */
 
-                       comp = e_cal_component_new ();
-                       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone 
(event->comp_data->icalcomp));
+                       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+                       if (!comp)
+                               return;
 
                        if (e_cal_component_has_attendees (comp) &&
                            !itip_organizer_is_user (registry, comp, client)) {
@@ -9244,38 +9298,32 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
                        else
                                all_day_event = FALSE;
 
-                       date.value = &itt;
-
+                       zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view));
                        dt = day_view->day_starts[day] + start_offset * 60;
-                       itt = icaltime_from_timet_with_zone (
-                               dt, FALSE,
-                               e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
+                       itt = i_cal_time_from_timet_with_zone (dt, FALSE, zone);
                        if (all_day_event) {
-                               itt.is_date = TRUE;
-                               date.tzid = NULL;
+                               i_cal_timetype_set_is_date (itt, TRUE);
+                               date = e_cal_component_datetime_new_take (itt, NULL);
                        } else {
-                               /* FIXME: Should probably keep the timezone of
-                                * the original start and end times. */
-                               date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone 
(E_CALENDAR_VIEW (day_view)));
+                               date = e_cal_component_datetime_new_take (itt,
+                                       zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
                        }
-                       cal_comp_set_dtstart_with_oldzone (client, comp, &date);
+                       cal_comp_set_dtstart_with_oldzone (client, comp, date);
+                       e_cal_component_datetime_free (date);
 
                        if (end_offset == 0)
                                dt = day_view->day_starts[day + num_days];
                        else
                                dt = day_view->day_starts[day + num_days - 1] + end_offset * 60;
-                       itt = icaltime_from_timet_with_zone (
-                               dt, FALSE,
-                               e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
+                       itt = i_cal_time_from_timet_with_zone (dt, FALSE, zone);
                        if (all_day_event) {
-                               itt.is_date = TRUE;
-                               date.tzid = NULL;
+                               i_cal_timetype_set_is_date (itt, TRUE);
+                               date = e_cal_component_datetime_new_take (itt, NULL);
                        } else {
-                               /* FIXME: Should probably keep the timezone of
-                                * the original start and end times. */
-                               date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone 
(E_CALENDAR_VIEW (day_view)));
+                               date = e_cal_component_datetime_new_take (itt,
+                                       zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
                        }
-                       cal_comp_set_dtend_with_oldzone (client, comp, &date);
+                       cal_comp_set_dtend_with_oldzone (client, comp, date);
 
                        gtk_drag_finish (context, TRUE, TRUE, time);
 
@@ -9297,10 +9345,10 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
                                }
 
                                if (mod == E_CAL_OBJ_MOD_THIS) {
-                                       e_cal_component_set_rdate_list (comp, NULL);
-                                       e_cal_component_set_rrule_list (comp, NULL);
-                                       e_cal_component_set_exdate_list (comp, NULL);
-                                       e_cal_component_set_exrule_list (comp, NULL);
+                                       e_cal_component_set_rdates (comp, NULL);
+                                       e_cal_component_set_rrules (comp, NULL);
+                                       e_cal_component_set_exdates (comp, NULL);
+                                       e_cal_component_set_exrules (comp, NULL);
                                }
                        } else if (e_cal_component_is_instance (comp))
                                mod = E_CAL_OBJ_MOD_THIS;
@@ -9320,8 +9368,8 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
 
        if (length >= 0 && format == 8 && !drag_from_same_window) {
                /* We are dragging between different window */
-               icalcomponent *icalcomp;
-               icalcomponent_kind kind;
+               ICalComponent *icomp;
+               ICalComponentKind kind;
 
                pos = e_day_view_convert_position_in_top_canvas (
                        day_view,
@@ -9330,15 +9378,15 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget,
                if (pos == E_CALENDAR_VIEW_POS_OUTSIDE)
                        goto error;
 
-               icalcomp = icalparser_parse_string ((const gchar *) data);
-               if (!icalcomp)
+               icomp = i_cal_parser_parse_string ((const gchar *) data);
+               if (!icomp)
                        goto error;
 
                /* check the type of the component */
-               kind = icalcomponent_isa (icalcomp);
-               icalcomponent_free (icalcomp);
+               kind = i_cal_component_isa (icomp);
+               g_clear_object (&icomp);
 
-               if (kind != ICAL_VCALENDAR_COMPONENT && kind != ICAL_VEVENT_COMPONENT)
+               if (kind != I_CAL_VCALENDAR_COMPONENT && kind != I_CAL_VEVENT_COMPONENT)
                        goto error;
 
                e_cal_ops_paste_components (model, (const gchar *) data);
@@ -9369,9 +9417,7 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
        gint start_offset, end_offset;
        ECalModel *model;
        ECalComponent *comp;
-       ECalComponentDateTime date;
        ESourceRegistry *registry;
-       struct icaltimetype itt;
        time_t dt;
        gboolean drag_from_same_window;
        const guchar *data;
@@ -9410,9 +9456,11 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
                        x, y, &day,
                        &row, NULL);
                if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) {
+                       ECalComponentDateTime *date;
                        ECalObjModType mod = E_CAL_OBJ_MOD_ALL;
                        ECalClient *client;
                        GtkWindow *toplevel;
+                       ICalTimezone *zone;
 
                        num_rows = 1;
                        start_offset = 0;
@@ -9460,8 +9508,9 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
                         * don't want to change the original comp here.
                         * Otherwise we would not detect that the event's time
                         * had changed in the "update_event" callback. */
-                       comp = e_cal_component_new ();
-                       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone 
(event->comp_data->icalcomp));
+                       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+                       if (!comp)
+                               return;
 
                        if (e_cal_component_has_attendees (comp) &&
                            !itip_organizer_is_user (registry, comp, client)) {
@@ -9483,17 +9532,22 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
                                return;
                        }
 
-                       date.value = &itt;
-                       date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(day_view)));
+                       zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view));
 
                        dt = e_day_view_convert_grid_position_to_time (day_view, day, row) + start_offset * 
60;
-                       *date.value = icaltime_from_timet_with_zone (dt, FALSE,
-                                                                    e_calendar_view_get_timezone 
(E_CALENDAR_VIEW (day_view)));
-                       cal_comp_set_dtstart_with_oldzone (client, comp, &date);
+                       date = e_cal_component_datetime_new_take (
+                               i_cal_time_from_timet_with_zone (dt, FALSE, zone),
+                               zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
+                       cal_comp_set_dtstart_with_oldzone (client, comp, date);
+                       e_cal_component_datetime_free (date);
+
                        dt = e_day_view_convert_grid_position_to_time (day_view, day, row + num_rows) - 
end_offset * 60;
-                       *date.value = icaltime_from_timet_with_zone (dt, FALSE,
-                                                                    e_calendar_view_get_timezone 
(E_CALENDAR_VIEW (day_view)));
-                       cal_comp_set_dtend_with_oldzone (client, comp, &date);
+                       date = e_cal_component_datetime_new_take (
+                               i_cal_time_from_timet_with_zone (dt, FALSE, zone),
+                               zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
+                       cal_comp_set_dtend_with_oldzone (client, comp, date);
+                       e_cal_component_datetime_free (date);
+
                        e_cal_component_abort_sequence (comp);
 
                        gtk_drag_finish (context, TRUE, TRUE, time);
@@ -9516,10 +9570,10 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
                                }
 
                                if (mod == E_CAL_OBJ_MOD_THIS) {
-                                       e_cal_component_set_rdate_list (comp, NULL);
-                                       e_cal_component_set_rrule_list (comp, NULL);
-                                       e_cal_component_set_exdate_list (comp, NULL);
-                                       e_cal_component_set_exrule_list (comp, NULL);
+                                       e_cal_component_set_rdates (comp, NULL);
+                                       e_cal_component_set_rrules (comp, NULL);
+                                       e_cal_component_set_exdates (comp, NULL);
+                                       e_cal_component_set_exrules (comp, NULL);
                                }
                        } else if (e_cal_component_is_instance (comp))
                                mod = E_CAL_OBJ_MOD_THIS;
@@ -9539,8 +9593,8 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
 
        if (length >= 0 && format == 8 && !drag_from_same_window) {
                /* We are dragging between different window */
-               icalcomponent *icalcomp;
-               icalcomponent_kind kind;
+               ICalComponent *icomp;
+               ICalComponentKind kind;
 
                pos = e_day_view_convert_position_in_main_canvas (
                        day_view,
@@ -9549,15 +9603,15 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget,
                if (pos == E_CALENDAR_VIEW_POS_OUTSIDE)
                        goto error;
 
-               icalcomp = icalparser_parse_string ((const gchar *) data);
-               if (!icalcomp)
+               icomp = i_cal_parser_parse_string ((const gchar *) data);
+               if (!icomp)
                        goto error;
 
                /* check the type of the component */
-               kind = icalcomponent_isa (icalcomp);
-               icalcomponent_free (icalcomp);
+               kind = i_cal_component_isa (icomp);
+               g_object_unref (&icomp);
 
-               if (kind != ICAL_VCALENDAR_COMPONENT && kind != ICAL_VEVENT_COMPONENT)
+               if (kind != I_CAL_VCALENDAR_COMPONENT && kind != I_CAL_VEVENT_COMPONENT)
                        goto error;
 
                e_cal_ops_paste_components (model, (const gchar *) data);
@@ -9675,7 +9729,7 @@ e_day_view_is_editing (EDayView *day_view)
 
 static void
 day_view_update_timezone_name_label (GtkWidget *label,
-                                    icaltimezone *zone)
+                                    ICalTimezone *zone)
 {
        const gchar *location, *dash;
        gchar *markup;
@@ -9685,11 +9739,11 @@ day_view_update_timezone_name_label (GtkWidget *label,
        if (!zone) {
                location = NULL;
        } else {
-               location = icaltimezone_get_location (zone);
+               location = i_cal_timezone_get_location (zone);
                if (location && *location)
                        location = _(location);
                if (!location || !*location)
-                       location = icaltimezone_get_tzid (zone);
+                       location = i_cal_timezone_get_tzid (zone);
        }
 
        if (!location)
@@ -9709,7 +9763,7 @@ day_view_update_timezone_name_label (GtkWidget *label,
 void
 e_day_view_update_timezone_name_labels (EDayView *day_view)
 {
-       icaltimezone *zone;
+       ICalTimezone *zone;
 
        g_return_if_fail (E_IS_DAY_VIEW (day_view));
 
diff --git a/src/calendar/gui/e-week-view-event-item.c b/src/calendar/gui/e-week-view-event-item.c
index b651b8a278..4193a3b25e 100644
--- a/src/calendar/gui/e-week-view-event-item.c
+++ b/src/calendar/gui/e-week-view-event-item.c
@@ -446,9 +446,9 @@ week_view_event_item_draw_icons (EWeekViewEventItem *event_item,
        if (!is_comp_data_valid (event))
                return;
 
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (
-               comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp)
+               return;
 
        if (e_cal_component_has_alarms (comp)) {
                draw_reminder_icon = TRUE;
diff --git a/src/calendar/gui/e-week-view-main-item.c b/src/calendar/gui/e-week-view-main-item.c
index e09606735c..cb290a85fd 100644
--- a/src/calendar/gui/e-week-view-main-item.c
+++ b/src/calendar/gui/e-week-view-main-item.c
@@ -94,18 +94,18 @@ week_view_main_item_draw_day (EWeekViewMainItem *main_item,
 
        if (!today) {
                ECalendarView *view;
-               struct icaltimetype tt;
-               const icaltimezone *zone;
+               ICalTimetype *tt;
+               ICalTimezone *zone;
 
                view = E_CALENDAR_VIEW (week_view);
                zone = e_calendar_view_get_timezone (view);
 
                /* Check if we are drawing today */
-               tt = icaltime_from_timet_with_zone (
-                       time (NULL), FALSE, zone);
-               today = g_date_get_year (date) == tt.year
-                       && g_date_get_month (date) == tt.month
-                       && g_date_get_day (date) == tt.day;
+               tt = i_cal_time_from_timet_with_zone (time (NULL), FALSE, zone);
+               today = g_date_get_year (date) == i_cal_timetype_get_year (tt) &&
+                       g_date_get_month (date) == i_cal_timetype_get_month (tt) &&
+                       g_date_get_day (date) == i_cal_timetype_get_day (tt);
+               g_clear_object (&tt);
        }
 
        /* Draw the background of the day. In the month view odd months are
diff --git a/src/calendar/gui/e-week-view.c b/src/calendar/gui/e-week-view.c
index c6f9d821d1..9cab73811b 100644
--- a/src/calendar/gui/e-week-view.c
+++ b/src/calendar/gui/e-week-view.c
@@ -214,35 +214,23 @@ week_view_process_component (EWeekView *week_view,
 {
        ECalComponent *comp = NULL;
        AddEventData add_event_data;
-       /* rid is never used in this function? */
-       const gchar *uid;
-       gchar *rid = NULL;
 
        /* If we don't have a valid date set yet, just return. */
        if (!g_date_valid (&week_view->priv->first_day_shown))
                return;
 
-       comp = e_cal_component_new ();
-       if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp))) {
-               g_object_unref (comp);
-
-               g_message (G_STRLOC ": Could not set icalcomponent on ECalComponent");
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone (comp_data->icalcomp));
+       if (!comp) {
+               g_message (G_STRLOC ": Could not set ICalComponent on ECalComponent");
                return;
        }
 
-       e_cal_component_get_uid (comp, &uid);
-       if (e_cal_component_is_instance (comp))
-               rid = e_cal_component_get_recurid_as_string (comp);
-       else
-               rid = NULL;
-
        /* Add the object */
        add_event_data.week_view = week_view;
        add_event_data.comp_data = comp_data;
        e_week_view_add_event (comp_data->client, comp, comp_data->instance_start, comp_data->instance_end, 
FALSE, &add_event_data);
 
        g_object_unref (comp);
-       g_free (rid);
 }
 
 static void
@@ -253,20 +241,14 @@ week_view_update_row (EWeekView *week_view,
        ECalModel *model;
        gint event_num;
        const gchar *uid;
-       gchar *rid = NULL;
+       gchar *rid;
 
        model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_view));
        comp_data = e_cal_model_get_component_at (model, row);
        g_return_if_fail (comp_data != NULL);
 
-       uid = icalcomponent_get_uid (comp_data->icalcomp);
-       if (e_cal_util_component_is_instance (comp_data->icalcomp)) {
-               icalproperty *prop;
-
-               prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_RECURRENCEID_PROPERTY);
-               if (prop)
-                       rid = icaltime_as_ical_string_r (icalcomponent_get_recurrenceid 
(comp_data->icalcomp));
-       }
+       uid = i_cal_component_get_uid (comp_data->icalcomp);
+       rid = e_cal_util_component_get_recurid_as_string (comp_data->icalcomp);
 
        if (e_week_view_find_event_from_uid (week_view, comp_data->client, uid, rid, &event_num))
                e_week_view_remove_event_cb (week_view, event_num, NULL);
@@ -309,20 +291,15 @@ week_view_model_comps_deleted_cb (EWeekView *week_view,
        for (l = list; l != NULL; l = g_slist_next (l)) {
                gint event_num;
                const gchar *uid;
-               gchar *rid = NULL;
+               gchar *rid;
                ECalModelComponent *comp_data = l->data;
 
-               uid = icalcomponent_get_uid (comp_data->icalcomp);
-               if (e_cal_util_component_is_instance (comp_data->icalcomp)) {
-                       icalproperty *prop;
-
-                       prop = icalcomponent_get_first_property (comp_data->icalcomp, 
ICAL_RECURRENCEID_PROPERTY);
-                       if (prop)
-                               rid = icaltime_as_ical_string_r (icalcomponent_get_recurrenceid 
(comp_data->icalcomp));
-               }
+               uid = i_cal_component_get_uid (comp_data->icalcomp);
+               rid = e_cal_util_component_get_recurid_as_string (comp_data->icalcomp);
 
                if (e_week_view_find_event_from_uid (week_view, comp_data->client, uid, rid, &event_num))
                        e_week_view_remove_event_cb (week_view, event_num, NULL);
+
                g_free (rid);
        }
 
@@ -387,7 +364,7 @@ e_week_view_precalc_visible_time_range (ECalendarView *cal_view,
        GDateWeekday display_start_day;
        guint day_offset, week_start_offset;
        gint num_days;
-       icaltimezone *zone;
+       ICalTimezone *zone;
 
        g_return_if_fail (E_IS_WEEK_VIEW (cal_view));
        g_return_if_fail (out_start_time != NULL);
@@ -396,7 +373,7 @@ e_week_view_precalc_visible_time_range (ECalendarView *cal_view,
        week_view = E_WEEK_VIEW (cal_view);
        zone = e_calendar_view_get_timezone (cal_view);
 
-       time_to_gdate_with_zone (&date, in_start_time, e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(week_view)));
+       time_to_gdate_with_zone (&date, in_start_time, zone);
 
        weekday = g_date_get_weekday (&date);
        display_start_day = e_week_view_get_display_start_day (week_view);
@@ -425,7 +402,7 @@ e_week_view_precalc_visible_time_range (ECalendarView *cal_view,
                g_date_add_days (&end_date, num_days);
                g_date_subtract_days (&end_date, day_offset);
 
-               time_to_gdate_with_zone (&in_end_date, in_end_time, e_calendar_view_get_timezone 
(E_CALENDAR_VIEW (week_view)));
+               time_to_gdate_with_zone (&in_end_date, in_end_time, zone);
 
                while (g_date_days_between (&end_date, &in_end_date) >= 6) {
                        g_date_add_days (&end_date, 7);
@@ -532,13 +509,13 @@ week_view_time_range_changed_cb (EWeekView *week_view,
 
 static void
 timezone_changed_cb (ECalModel *cal_model,
-                     icaltimezone *old_zone,
-                     icaltimezone *new_zone,
-                     gpointer user_data)
+                    ICalTimezone *old_zone,
+                    ICalTimezone *new_zone,
+                    gpointer user_data)
 {
        ECalendarView *cal_view = (ECalendarView *) user_data;
        GDate *first_day_shown;
-       struct icaltimetype tt = icaltime_null_time ();
+       ICalTimetype *tt = NULL;
        time_t lower;
        EWeekView *week_view = (EWeekView *) cal_view;
 
@@ -556,13 +533,18 @@ timezone_changed_cb (ECalModel *cal_model,
        if (!g_date_valid (first_day_shown))
                return;
 
+       tt = i_cal_time_null_time ();
+
        /* Recalculate the new start of the first week. We just use exactly
         * the same time, but with the new timezone. */
-       tt.year = g_date_get_year (first_day_shown);
-       tt.month = g_date_get_month (first_day_shown);
-       tt.day = g_date_get_day (first_day_shown);
+       i_cal_timetype_set_date (tt,
+               g_date_get_year (first_day_shown),
+               g_date_get_month (first_day_shown),
+               g_date_get_day (first_day_shown));
+
+       lower = i_cal_time_as_timet_with_zone (tt, new_zone);
 
-       lower = icaltime_as_timet_with_zone (tt, new_zone);
+       g_clear_object (&tt);
 
        e_week_view_recalc_day_starts (week_view, lower);
        e_week_view_update_query (week_view);
@@ -659,43 +641,41 @@ new_event_in_rage_data_free (gpointer ptr)
 static void
 week_view_new_event_in_selected_range_cb (ECalModel *model,
                                          ECalClient *client,
-                                         icalcomponent *default_component,
+                                         ICalComponent *default_component,
                                          gpointer user_data)
 {
        NewEventInRangeData *ned = user_data;
        ECalComponent *comp = NULL;
        gint event_num;
-       ECalComponentDateTime date;
-       struct icaltimetype itt;
+       ECalComponentDateTime *date;
        const gchar *uid;
        AddEventData add_event_data;
        EWeekViewEvent *wvevent;
        EWeekViewEventSpan *span;
-       icaltimezone *zone;
+       ICalTimezone *zone;
 
        /* Check if the client is read only */
        if (e_client_is_readonly (E_CLIENT (client)))
                goto exit;
 
        /* Add a new event covering the selected range. */
-       comp = e_cal_component_new_from_icalcomponent (icalcomponent_new_clone (default_component));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone (default_component));
        g_return_if_fail (comp != NULL);
 
-       uid = icalcomponent_get_uid (default_component);
-
-       date.value = &itt;
-       date.tzid = NULL;
+       uid = i_cal_component_get_uid (default_component);
 
        zone = e_cal_model_get_timezone (model);
 
        /* We use DATE values now, so we don't need the timezone. */
        /*date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));*/
 
-       *date.value = icaltime_from_timet_with_zone (ned->dtstart, TRUE, zone);
-       e_cal_component_set_dtstart (comp, &date);
+       date = e_cal_component_datetime_new_take (i_cal_time_from_timet_with_zone (ned->dtstart, TRUE, zone), 
NULL);
+       e_cal_component_set_dtstart (comp, date);
+       e_cal_component_datetime_free (date);
 
-       *date.value = icaltime_from_timet_with_zone (ned->dtend, TRUE, zone);
-       e_cal_component_set_dtend (comp, &date);
+       date = e_cal_component_datetime_new_take (i_cal_time_from_timet_with_zone (ned->dtend, TRUE, zone), 
NULL);
+       e_cal_component_set_dtend (comp, date);
+       e_cal_component_datetime_free (date);
 
        /* Editor default in week/month view */
        e_cal_component_set_transparency (comp, E_CAL_COMPONENT_TRANSP_TRANSPARENT);
@@ -2225,8 +2205,6 @@ e_week_view_set_first_day_shown (EWeekView *week_view,
        gint num_days;
        gboolean update_adjustment_value = FALSE;
        guint32 old_selection_start_julian = 0, old_selection_end_julian = 0;
-       struct icaltimetype start_tt = icaltime_null_time ();
-       time_t start_time;
 
        g_return_if_fail (E_IS_WEEK_VIEW (week_view));
 
@@ -2261,16 +2239,23 @@ e_week_view_set_first_day_shown (EWeekView *week_view,
        /* See if we need to update the first day shown. */
        if (!g_date_valid (&week_view->priv->first_day_shown)
            || g_date_compare (&week_view->priv->first_day_shown, &base_date)) {
+               ICalTimetype *start_tt;
+               time_t start_time;
+
                week_view->priv->first_day_shown = base_date;
 
-               start_tt.year = g_date_get_year (&base_date);
-               start_tt.month = g_date_get_month (&base_date);
-               start_tt.day = g_date_get_day (&base_date);
+               start_tt = i_cal_time_null_time ();
+               i_cal_timetype_set_date (start_tt,
+                       g_date_get_year (&base_date),
+                       g_date_get_month (&base_date),
+                       g_date_get_day (&base_date));
 
-               start_time = icaltime_as_timet_with_zone (
+               start_time = i_cal_time_as_timet_with_zone (
                        start_tt,
                        e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
 
+               g_clear_object (&start_tt);
+
                e_week_view_recalc_day_starts (week_view, start_time);
                e_week_view_update_query (week_view);
        }
@@ -2672,42 +2657,54 @@ set_style_from_attendee (EWeekViewEvent *event,
        ECalComponent *comp;
        GSList *attendees = NULL, *l;
        gchar *address;
-       ECalComponentAttendee *at = NULL;
+       ICalParameterPartstat partstat = I_CAL_PARTSTAT_NONE;
 
        if (!is_comp_data_valid (event))
                return;
 
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp)
+               return;
+
        address = itip_get_comp_attendee (
                registry, comp, event->comp_data->client);
-       e_cal_component_get_attendee_list (comp, &attendees);
-       for (l = attendees; l; l = l->next) {
+       attendees = e_cal_component_get_attendees (comp);
+       for (l = attendees; l && address; l = l->next) {
                ECalComponentAttendee *attendee = l->data;
+               const gchar *value, *sentby;
+
+               if (!attendee)
+                       continue;
 
-               if ((attendee->value && g_strcmp0 (itip_strip_mailto (attendee->value), address) == 0)
-                || (attendee->sentby && g_strcmp0 (itip_strip_mailto (attendee->sentby), address) == 0)) {
-                       at = attendee;
+               value = e_cal_component_attendee_get_value (attendee);
+               if (value)
+                       value = itip_strip_mailto (value);
+               sentby = e_cal_component_attendee_get_sentby (attendee);
+               if (sentby)
+                       sentby = itip_strip_mailto (sentby);
+               if ((value && g_ascii_strcasecmp (value, address) == 0) ||
+                   (sentby && g_ascii_strcasecmp (sentby, address) == 0)) {
+                       partstat = e_cal_component_attendee_get_partstat (attendee);
                        break;
                }
        }
 
-       if (icalcomponent_get_status (event->comp_data->icalcomp) == ICAL_STATUS_CANCELLED)
+       if (i_cal_component_get_status (event->comp_data->icalcomp) == I_CAL_STATUS_CANCELLED)
                gnome_canvas_item_set (span->text_item, "strikeout", TRUE, NULL);
 
        /* The attendee has not yet accepted the meeting, display the summary as bolded.
         * If the attendee is not present, it might have come through a mailing list.
         * In that case, we never show the meeting as bold even if it is unaccepted. */
-       if (at && at->status == ICAL_PARTSTAT_NEEDSACTION)
+       if (partstat == I_CAL_PARTSTAT_NEEDSACTION)
                gnome_canvas_item_set (span->text_item, "bold", TRUE, NULL);
-       else if (at && at->status == ICAL_PARTSTAT_DECLINED)
+       else if (partstat == I_CAL_PARTSTAT_DECLINED)
                gnome_canvas_item_set (span->text_item, "strikeout", TRUE, NULL);
-       else if (at && at->status == ICAL_PARTSTAT_TENTATIVE)
+       else if (partstat == I_CAL_PARTSTAT_TENTATIVE)
                gnome_canvas_item_set (span->text_item, "italic", TRUE, NULL);
-       else if (at && at->status == ICAL_PARTSTAT_DELEGATED)
+       else if (partstat == I_CAL_PARTSTAT_DELEGATED)
                gnome_canvas_item_set (span->text_item, "italic", TRUE, "strikeout", TRUE, NULL);
 
-       e_cal_component_free_attendee_list (attendees);
+       g_slist_free_full (attendees, e_cal_component_attendee_free);
        g_free (address);
        g_object_unref (comp);
 }
@@ -2735,7 +2732,7 @@ e_week_view_foreach_event_with_uid (EWeekView *week_view,
                if (!is_comp_data_valid (event))
                        continue;
 
-               u = icalcomponent_get_uid (event->comp_data->icalcomp);
+               u = i_cal_component_get_uid (event->comp_data->icalcomp);
                if (u && !strcmp (uid, u)) {
                        if (!(*callback) (week_view, event_num, data))
                                return;
@@ -3344,7 +3341,7 @@ e_week_view_add_event (ECalClient *client,
        AddEventData *add_event_data;
        EWeekViewEvent event;
        gint num_days;
-       struct icaltimetype start_tt, end_tt;
+       ICalTimetype *start_tt, *end_tt;
 
        add_event_data = data;
 
@@ -3357,10 +3354,10 @@ e_week_view_add_event (ECalClient *client,
        if (end != start || end < add_event_data->week_view->day_starts[0])
                g_return_if_fail (end > add_event_data->week_view->day_starts[0]);
 
-       start_tt = icaltime_from_timet_with_zone (
+       start_tt = i_cal_time_from_timet_with_zone (
                start, FALSE,
                e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->week_view)));
-       end_tt = icaltime_from_timet_with_zone (
+       end_tt = i_cal_time_from_timet_with_zone (
                end, FALSE,
                e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->week_view)));
 
@@ -3371,8 +3368,9 @@ e_week_view_add_event (ECalClient *client,
                event.comp_data->is_new_component = TRUE;
                event.comp_data->client = g_object_ref (client);
                e_cal_component_abort_sequence (comp);
-               event.comp_data->icalcomp = icalcomponent_new_clone (e_cal_component_get_icalcomponent 
(comp));
+               event.comp_data->icalcomp = i_cal_component_new_clone (e_cal_component_get_icalcomponent 
(comp));
        }
+
        event.start = start;
        event.end = end;
        event.tooltip = NULL;
@@ -3383,8 +3381,8 @@ e_week_view_add_event (ECalClient *client,
        event.comp_data->instance_start = start;
        event.comp_data->instance_end = end;
 
-       event.start_minute = start_tt.hour * 60 + start_tt.minute;
-       event.end_minute = end_tt.hour * 60 + end_tt.minute;
+       event.start_minute = i_cal_timetype_get_hour (start_tt) * 60 + i_cal_timetype_get_minute (start_tt);
+       event.end_minute = i_cal_timetype_get_hour (end_tt) * 60 + i_cal_timetype_get_minute (end_tt);
        if (event.end_minute == 0 && start != end)
                event.end_minute = 24 * 60;
 
@@ -3401,6 +3399,9 @@ e_week_view_add_event (ECalClient *client,
                g_array_append_val (add_event_data->week_view->events, event);
        add_event_data->week_view->events_sorted = FALSE;
        add_event_data->week_view->events_need_layout = TRUE;
+
+       g_clear_object (&start_tt);
+       g_clear_object (&end_tt);
 }
 
 /* This lays out the events, or reshapes them, as necessary. */
@@ -3492,8 +3493,8 @@ e_week_view_reshape_events (EWeekView *week_view)
                                week_view, event_num, span_num);
                        if (week_view->last_edited_comp_string == NULL)
                                continue;
-                       current_comp_string = icalcomponent_as_ical_string_r (event->comp_data->icalcomp);
-                       if (strncmp (current_comp_string, week_view->last_edited_comp_string,50) == 0) {
+                       current_comp_string = i_cal_component_as_ical_string_r (event->comp_data->icalcomp);
+                       if (strncmp (current_comp_string, week_view->last_edited_comp_string, 50) == 0) {
                                EWeekViewEventSpan *span;
 
                                if (!is_array_index_in_bounds (week_view->spans, event->spans_index + 
span_num)) {
@@ -3768,8 +3769,9 @@ e_week_view_reshape_event_span (EWeekView *week_view,
 
        span = &g_array_index (week_view->spans, EWeekViewEventSpan,
                               event->spans_index + span_num);
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp)
+               return;
 
        one_day_event = e_week_view_is_one_day_event (week_view, event_num);
 
@@ -3866,7 +3868,7 @@ e_week_view_reshape_event_span (EWeekView *week_view,
 
                if (e_cal_util_component_has_attendee (event->comp_data->icalcomp))
                        set_style_from_attendee (event, span, registry);
-               else if (icalcomponent_get_status (event->comp_data->icalcomp) == ICAL_STATUS_CANCELLED)
+               else if (i_cal_component_get_status (event->comp_data->icalcomp) == I_CAL_STATUS_CANCELLED)
                        gnome_canvas_item_set (span->text_item, "strikeout", TRUE, NULL);
 
                g_signal_connect (
@@ -4093,7 +4095,7 @@ e_week_view_start_editing_event (EWeekView *week_view,
                        return FALSE;
        }
 
-       summary = icalcomponent_get_summary (event->comp_data->icalcomp);
+       summary = i_cal_component_get_summary (event->comp_data->icalcomp);
        if (!summary)
                summary = "";
 
@@ -4189,7 +4191,7 @@ cancel_editing (EWeekView *week_view)
 
        /* Reset the text to what was in the component */
 
-       summary = icalcomponent_get_summary (event->comp_data->icalcomp);
+       summary = i_cal_component_get_summary (event->comp_data->icalcomp);
        g_object_set (span->text_item, "text", summary ? summary : "", NULL);
 
        /* Stop editing */
@@ -4423,7 +4425,7 @@ e_week_view_event_move (ECalendarView *cal_view,
        EWeekViewEvent *event;
        gint event_num, adjust_days, current_start_day, current_end_day;
        time_t start_dt, end_dt;
-       struct icaltimetype start_time,end_time;
+       ICalTimetype *start_time, *end_time;
        EWeekView *week_view = E_WEEK_VIEW (cal_view);
        gboolean is_all_day = FALSE;
 
@@ -4443,10 +4445,10 @@ e_week_view_event_move (ECalendarView *cal_view,
                return FALSE;
 
        end_dt = event->end;
-       start_time = icalcomponent_get_dtstart (event->comp_data->icalcomp);
-       end_time = icalcomponent_get_dtend (event->comp_data->icalcomp);
+       start_time = i_cal_component_get_dtstart (event->comp_data->icalcomp);
+       end_time = i_cal_component_get_dtend (event->comp_data->icalcomp);
 
-       if (start_time.is_date && end_time.is_date)
+       if (i_cal_timetype_get_is_date (start_time) && i_cal_timetype_get_is_date (end_time))
                is_all_day = TRUE;
 
        current_end_day = e_week_view_get_day_offset_of_event (week_view,end_dt);
@@ -4468,15 +4470,18 @@ e_week_view_event_move (ECalendarView *cal_view,
                break;
        }
 
-       icaltime_adjust (&start_time ,adjust_days,0,0,0);
-       icaltime_adjust (&end_time ,adjust_days,0,0,0);
-       start_dt = icaltime_as_timet_with_zone (
+       i_cal_time_adjust (start_time, adjust_days, 0, 0, 0);
+       i_cal_time_adjust (end_time, adjust_days, 0, 0, 0);
+       start_dt = i_cal_time_as_timet_with_zone (
                start_time,
                e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
-       end_dt = icaltime_as_timet_with_zone (
+       end_dt = i_cal_time_as_timet_with_zone (
                end_time,
                e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
 
+       g_clear_object (&start_time);
+       g_clear_object (&end_time);
+
        current_start_day = e_week_view_get_day_offset_of_event (week_view,start_dt);
        current_end_day = e_week_view_get_day_offset_of_event (week_view,end_dt);
        if (is_all_day)
@@ -4557,10 +4562,10 @@ e_week_view_change_event_time (EWeekView *week_view,
        EWeekViewEvent *event;
        gint event_num;
        ECalComponent *comp;
-       ECalComponentDateTime date;
-       struct icaltimetype itt;
+       ECalComponentDateTime *date;
        ECalClient *client;
        ECalObjModType mod = E_CAL_OBJ_MOD_ALL;
+       ICalTimezone *zone;
 
        event_num = week_view->editing_event_num;
 
@@ -4581,19 +4586,19 @@ e_week_view_change_event_time (EWeekView *week_view,
        /* We use a temporary shallow copy of the ico since we don't want to
         * change the original ico here. Otherwise we would not detect that
         * the event's time had changed in the "update_event" callback. */
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-       date.value = &itt;
-       /* FIXME: Should probably keep the timezone of the original start
-        * and end times. */
-       date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view)));
-
-       *date.value = icaltime_from_timet_with_zone (start_dt, is_all_day,
-                                                    e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(week_view)));
-       cal_comp_set_dtstart_with_oldzone (client, comp, &date);
-       *date.value = icaltime_from_timet_with_zone (end_dt, is_all_day,
-                                                    e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(week_view)));
-       cal_comp_set_dtend_with_oldzone (client, comp, &date);
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+
+       zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (week_view));
+
+       date = e_cal_component_datetime_new_take (i_cal_time_from_timet_with_zone (start_dt, is_all_day, 
zone),
+               zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
+       cal_comp_set_dtstart_with_oldzone (client, comp, date);
+       e_cal_component_datetime_free (date);
+
+       date = e_cal_component_datetime_new_take (i_cal_time_from_timet_with_zone (end_dt, is_all_day, zone),
+               zone ? g_strdup (i_cal_timezone_get_tzid (zone)) : NULL);
+       cal_comp_set_dtend_with_oldzone (client, comp, date);
+       e_cal_component_datetime_free (date);
 
        e_cal_component_commit_sequence (comp);
 
@@ -4611,10 +4616,10 @@ e_week_view_change_event_time (EWeekView *week_view,
                }
 
                if (mod == E_CAL_OBJ_MOD_THIS) {
-                       e_cal_component_set_rdate_list (comp, NULL);
-                       e_cal_component_set_rrule_list (comp, NULL);
-                       e_cal_component_set_exdate_list (comp, NULL);
-                       e_cal_component_set_exrule_list (comp, NULL);
+                       e_cal_component_set_rdates (comp, NULL);
+                       e_cal_component_set_rrules (comp, NULL);
+                       e_cal_component_set_exdates (comp, NULL);
+                       e_cal_component_set_exrules (comp, NULL);
                }
        } else if (e_cal_component_is_instance (comp))
                mod = E_CAL_OBJ_MOD_THIS;
@@ -4663,7 +4668,7 @@ e_week_view_on_editing_started (EWeekView *week_view,
                                span = &g_array_index (week_view->spans, EWeekViewEventSpan,
                                                       event->spans_index + span_num);
 
-                               summary = icalcomponent_get_summary (event->comp_data->icalcomp);
+                               summary = i_cal_component_get_summary (event->comp_data->icalcomp);
 
                                gnome_canvas_item_set (
                                        span->text_item,
@@ -4687,7 +4692,7 @@ e_week_view_on_editing_stopped (EWeekView *week_view,
        EWeekViewEventSpan *span;
        gchar *text = NULL;
        ECalComponent *comp;
-       ECalComponentText summary;
+       ECalComponentText *summary = NULL;
        ECalClient *client;
        const gchar *uid;
        gboolean on_server;
@@ -4720,7 +4725,7 @@ e_week_view_on_editing_stopped (EWeekView *week_view,
        week_view->editing_event_num = -1;
 
        /* Check that the event is still valid. */
-       uid = icalcomponent_get_uid (event->comp_data->icalcomp);
+       uid = i_cal_component_get_uid (event->comp_data->icalcomp);
        if (!uid) {
                g_object_notify (G_OBJECT (week_view), "is-editing");
                return;
@@ -4730,14 +4735,18 @@ e_week_view_on_editing_stopped (EWeekView *week_view,
        g_object_set (span->text_item, "handle_popup", FALSE, NULL);
        g_object_get (span->text_item, "text", &text, NULL);
 
-       comp = e_cal_component_new ();
-       e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+       comp = e_cal_component_new_from_icalcomponent (i_cal_component_new_clone 
(event->comp_data->icalcomp));
+       if (!comp) {
+               g_free (text);
+               g_object_notify (G_OBJECT (week_view), "is-editing");
+               return;
+       }
 
        client = event->comp_data->client;
        on_server = !event->comp_data->is_new_component;
 
        if (string_is_empty (text) && !on_server) {
-               e_cal_component_get_uid (comp, &uid);
+               uid = e_cal_component_get_uid (comp);
                g_signal_handlers_disconnect_by_func (item, e_week_view_on_text_item_event, week_view);
                e_week_view_foreach_event_with_uid (week_view, uid,
                                                    e_week_view_remove_event_cb, NULL);
@@ -4748,27 +4757,31 @@ e_week_view_on_editing_stopped (EWeekView *week_view,
        }
 
        /* Only update the summary if necessary. */
-       e_cal_component_get_summary (comp, &summary);
-       if (summary.value && !strcmp (text, summary.value)) {
-               gchar *summary;
+       summary = e_cal_component_get_summary (comp);
+       if (summary && !g_strcmp0 (e_cal_component_text_get_value (summary), text)) {
+               gchar *summary_txt;
 
-               summary = dup_comp_summary (event->comp_data->client, event->comp_data->icalcomp);
-               g_object_set (span->text_item, "text", summary ? summary : "", NULL);
+               summary_txt = dup_comp_summary (event->comp_data->client, event->comp_data->icalcomp);
+               g_object_set (span->text_item, "text", summary_txt ? summary_txt : "", NULL);
 
-               g_free (summary);
+               g_free (summary_txt);
 
                if (!e_week_view_is_one_day_event (week_view, event_num))
                        e_week_view_reshape_event_span (week_view, event_num, span_num);
-       } else if (summary.value || !string_is_empty (text)) {
-               icalcomponent *icalcomp = e_cal_component_get_icalcomponent (comp);
+       } else if ((summary && e_cal_component_text_get_value (summary)) || !string_is_empty (text)) {
+               ICalComponent *icomp = e_cal_component_get_icalcomponent (comp);
 
-               summary.value = text;
-               summary.altrep = NULL;
-               e_cal_component_set_summary (comp, &summary);
+               e_cal_component_text_free (summary);
+               summary = e_cal_component_text_new (text, NULL);
+
+               e_cal_component_set_summary (comp, summary);
                e_cal_component_commit_sequence (comp);
 
+               e_cal_component_text_free (summary);
+               summary = NULL;
+
                if (!on_server) {
-                       e_cal_ops_create_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), 
client, icalcomp,
+                       e_cal_ops_create_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), 
client, icomp,
                                e_calendar_view_component_created_cb, g_object_ref (week_view), 
g_object_unref);
 
                        /* we remove the object since we either got the update from the server or failed */
@@ -4782,52 +4795,56 @@ e_week_view_on_editing_stopped (EWeekView *week_view,
                                }
 
                                if (mod == E_CAL_OBJ_MOD_THIS) {
-                                       ECalComponentDateTime dt;
-                                       struct icaltimetype tt;
+                                       ECalComponentDateTime *dt;
+                                       ICalTimetype *tt = NULL;
                                        gchar *tzid;
 
-                                       e_cal_component_get_dtstart (comp, &dt);
-                                       if (dt.value->zone) {
-                                               tt = icaltime_from_timet_with_zone (
+                                       dt = e_cal_component_get_dtstart (comp);
+                                       if (dt)
+                                               tt = e_cal_component_datetime_get_value (dt);
+                                       if (dt && tt && i_cal_time_get_timezone (tt)) {
+                                               tt = i_cal_time_from_timet_with_zone (
                                                        event->comp_data->instance_start,
-                                                       dt.value->is_date,
-                                                       dt.value->zone);
+                                                       i_cal_time_is_date (tt),
+                                                       i_cal_time_get_timezone (tt));
                                        } else {
-                                               tt = icaltime_from_timet_with_zone (
+                                               tt = i_cal_time_from_timet_with_zone (
                                                        event->comp_data->instance_start,
-                                                       dt.value->is_date,
+                                                       (dt && tt) ? i_cal_time_is_date (tt) : FALSE,
                                                        e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(week_view)));
                                        }
-                                       tzid = g_strdup (dt.tzid);
-                                       e_cal_component_free_datetime (&dt);
-                                       dt.value = &tt;
-                                       dt.tzid = tzid;
-                                       e_cal_component_set_dtstart (comp, &dt);
-                                       g_free (tzid);
-
-                                       e_cal_component_get_dtend (comp, &dt);
-                                       if (dt.value->zone) {
-                                               tt = icaltime_from_timet_with_zone (
+                                       tzid = dt ? g_strdup (e_cal_component_datetime_get_tzid (dt)) : NULL;
+                                       e_cal_component_datetime_free (dt);
+
+                                       dt = e_cal_component_datetime_new_take (tt, tzid);
+                                       e_cal_component_set_dtstart (comp, dt);
+                                       e_cal_component_datetime_free (dt);
+
+                                       dt = e_cal_component_get_dtend (comp);
+                                       if (dt)
+                                               tt = e_cal_component_datetime_get_value (dt);
+                                       if (dt && tt && i_cal_time_get_timezone (tt)) {
+                                               tt = i_cal_time_from_timet_with_zone (
                                                        event->comp_data->instance_end,
-                                                       dt.value->is_date,
-                                                       dt.value->zone);
+                                                       i_cal_time_is_date (tt),
+                                                       i_cal_time_get_timezone (tt));
                                        } else {
-                                               tt = icaltime_from_timet_with_zone (
+                                               tt = i_cal_time_from_timet_with_zone (
                                                        event->comp_data->instance_end,
-                                                       dt.value->is_date,
+                                                       (dt && tt) ? i_cal_time_is_date (tt) : FALSE,
                                                        e_calendar_view_get_timezone (E_CALENDAR_VIEW 
(week_view)));
                                        }
-                                       tzid = g_strdup (dt.tzid);
-                                       e_cal_component_free_datetime (&dt);
-                                       dt.value = &tt;
-                                       dt.tzid = tzid;
-                                       e_cal_component_set_dtend (comp, &dt);
-                                       g_free (tzid);
-
-                                       e_cal_component_set_rdate_list (comp, NULL);
-                                       e_cal_component_set_rrule_list (comp, NULL);
-                                       e_cal_component_set_exdate_list (comp, NULL);
-                                       e_cal_component_set_exrule_list (comp, NULL);
+                                       tzid = dt ? g_strdup (e_cal_component_datetime_get_tzid (dt)) : NULL;
+                                       e_cal_component_datetime_free (dt);
+
+                                       dt = e_cal_component_datetime_new_take (tt, tzid);
+                                       e_cal_component_set_dtend (comp, dt);
+                                       e_cal_component_datetime_free (dt);
+
+                                       e_cal_component_set_rdates (comp, NULL);
+                                       e_cal_component_set_rrules (comp, NULL);
+                                       e_cal_component_set_exdates (comp, NULL);
+                                       e_cal_component_set_exrules (comp, NULL);
                                }
                        } else if (e_cal_component_is_instance (comp))
                                mod = E_CAL_OBJ_MOD_THIS;
@@ -4840,6 +4857,7 @@ e_week_view_on_editing_stopped (EWeekView *week_view,
 
  out:
 
+       e_cal_component_text_free (summary);
        g_free (text);
        g_object_unref (comp);
 
@@ -4914,16 +4932,15 @@ e_week_view_find_event_from_uid (EWeekView *week_view,
                if (event->comp_data->client != client)
                        continue;
 
-               u = icalcomponent_get_uid (event->comp_data->icalcomp);
+               u = i_cal_component_get_uid (event->comp_data->icalcomp);
                if (u && !strcmp (uid, u)) {
                        if (rid && *rid) {
-                               r = icaltime_as_ical_string_r (icalcomponent_get_recurrenceid 
(event->comp_data->icalcomp));
-                               if (!r || !*r)
-                                       continue;
-                               if (strcmp (rid, r) != 0) {
+                               r = e_cal_util_component_get_recurid_as_string (event->comp_data->icalcomp);
+                               if (!r || !*r || strcmp (rid, r) != 0) {
                                        g_free (r);
                                        continue;
                                }
+
                                g_free (r);
                        }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]