diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
index b07a9ee..ea122d4 100644
--- a/calendar/gui/e-calendar-view.c
+++ b/calendar/gui/e-calendar-view.c
@@ -75,6 +75,7 @@ struct _ECalendarViewPrivate {
 
 	/* The default category */
 	gchar *default_category;
+	GSList *selected_cut_list;
 };
 
 static void e_calendar_view_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
@@ -263,7 +264,7 @@ e_calendar_view_class_init (ECalendarViewClass *klass)
 	e_cal_view_a11y_init ();
 }
 
-void
+gboolean
 e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart,
 		      icaltimezone *default_zone, icalcomponent *icalcomp, gboolean in_top_canvas)
 {
@@ -275,6 +276,7 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart
 	gint start_offset, end_offset;
 	gboolean all_day_event = FALSE;
 	GnomeCalendarViewType view_type;
+	gboolean ret = TRUE;
 	GError *error = NULL;
 
 	start_offset = 0;
@@ -336,7 +338,7 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart
 		}
 		break;
 	default:
-		g_return_if_reached ();
+		g_return_val_if_reached (FALSE);
 	}
 
 	itime = icaltime_from_timet_with_zone (new_dtstart, FALSE, old_dtstart.zone ? old_dtstart.zone : default_zone);
@@ -382,7 +384,9 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart
 		if (error)
 			g_error_free (error);
+		ret = FALSE;
 	}
 
 	g_object_unref (comp);
+	return ret;
 }
 
@@ -651,11 +655,13 @@ e_calendar_view_update_query (ECalendarView *cal_view)
 void
 e_calendar_view_cut_clipboard (ECalendarView *cal_view)
 {
+	ECalendarViewPrivate *priv;
 	GList *selected, *l;
-	const gchar *uid;
 
 	g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 
+	priv = cal_view->priv;
+
 	selected = e_calendar_view_get_selected_events (cal_view);
 	if (!selected)
 		return;
@@ -663,46 +669,9 @@ e_calendar_view_cut_clipboard (ECalendarView *cal_view)
 	e_calendar_view_set_status_message (cal_view, _("Deleting selected objects"), -1);
 
 	e_calendar_view_copy_clipboard (cal_view);
-	for (l = selected; l != NULL; l = l->next) {
-		ECalComponent *comp;
+	for (l = selected; l != NULL; l = g_list_next (l)) {
 		ECalendarViewEvent *event = (ECalendarViewEvent *) l->data;
-		GError *error = NULL;
-
-		if (!event)
-			continue;
-
-		comp = e_cal_component_new ();
-		e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
-		if ((itip_organizer_is_user (comp, event->comp_data->client) || itip_sentby_is_user (comp, event->comp_data->client))
-		    && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
-						event->comp_data->client, comp, TRUE))
-			itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp,
-					event->comp_data->client, NULL, NULL, NULL, TRUE, FALSE);
-
-		e_cal_component_get_uid (comp, &uid);
-		if (e_cal_component_is_instance (comp)) {
-			gchar *rid = NULL;
-			icalcomponent *icalcomp;
-
-			/* when cutting detached instances, only cut that instance */
-			rid = e_cal_component_get_recurid_as_string (comp);
-			if (e_cal_get_object (event->comp_data->client, uid, rid, &icalcomp, NULL)) {
-				e_cal_remove_object_with_mod (event->comp_data->client, uid,
-							      rid, CALOBJ_MOD_THIS,
-							      &error);
-				icalcomponent_free (icalcomp);
-			} else
-				e_cal_remove_object_with_mod (event->comp_data->client, uid, NULL,
-						CALOBJ_MOD_ALL, &error);
-			g_free (rid);
-		} else
-			e_cal_remove_object (event->comp_data->client, uid, &error);
-		delete_error_dialog (error, E_CAL_COMPONENT_EVENT);
-
-		g_clear_error (&error);
-
-		g_object_unref (comp);
+		priv->selected_cut_list = g_slist_prepend (priv->selected_cut_list, g_object_ref (event->comp_data));
 	}
 
 	e_calendar_view_set_status_message (cal_view, NULL, -1);
@@ -787,6 +756,7 @@ add_related_timezones (icalcomponent *des_icalcomp, icalcomponent *src_icalcomp,
 void
 e_calendar_view_copy_clipboard (ECalendarView *cal_view)
 {
+	ECalendarViewPrivate *priv;
 	GList *selected, *l;
 	gchar *comp_str;
 	icalcomponent *vcal_comp;
@@ -796,10 +766,18 @@ e_calendar_view_copy_clipboard (ECalendarView *cal_view)
 
 	g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 
+	priv = cal_view->priv;
+
 	selected = e_calendar_view_get_selected_events (cal_view);
 	if (!selected)
 		return;
 
+	if (priv->selected_cut_list) {
+		g_slist_foreach (priv->selected_cut_list, (GFunc) g_object_unref, NULL);
+		g_slist_free (priv->selected_cut_list);
+		priv->selected_cut_list = NULL;
+	}
+
 	/* create top-level VCALENDAR component and add VTIMEZONE's */
 	vcal_comp = e_cal_util_new_top_level ();
 	for (l = selected; l != NULL; l = l->next) {
@@ -849,24 +827,24 @@ e_calendar_view_copy_clipboard (ECalendarView *cal_view)
 	g_list_free (selected);
 }
 
-static void
-clipboard_get_calendar_data (ECalendarView *cal_view, const gchar *text)
+static gboolean 
+clipboard_get_calendar_data (ECalendarView *cal_view, const gchar *text, GSList **copied_list)
 {
 	icalcomponent *icalcomp;
 	icalcomponent_kind kind;
 	time_t selected_time_start, selected_time_end;
 	icaltimezone *default_zone;
 	ECal *client;
-	gboolean in_top_canvas;
+	gboolean in_top_canvas, ret;
 
-	g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
+	g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), FALSE);
 
 	if (!text || !*text)
-		return;
+		return FALSE;
 
 	icalcomp = icalparser_parse_string ((const gchar *) text);
 	if (!icalcomp)
-		return;
+		return FALSE;
 
 	default_zone = calendar_config_get_icaltimezone ();
 	client = e_cal_model_get_default_client (cal_view->priv->model);
@@ -875,7 +853,7 @@ clipboard_get_calendar_data (ECalendarView *cal_view, const gchar *text)
 	/* FIXME An error dialog if we return? */
 	kind = icalcomponent_isa (icalcomp);
 	if (kind != ICAL_VCALENDAR_COMPONENT && kind != ICAL_VEVENT_COMPONENT)
-		return;
+		return FALSE;
 
 	e_calendar_view_set_status_message (cal_view, _("Updating objects"), -1);
 	e_calendar_view_get_selected_time_range (cal_view, &selected_time_start, &selected_time_end);
@@ -917,15 +895,23 @@ clipboard_get_calendar_data (ECalendarView *cal_view, const gchar *text)
 					icalproperty_remove_parameter_by_name (icalprop, "X-EVOLUTION-ENDDATE");
 			}
 
-			e_calendar_view_add_event (cal_view, client, selected_time_start, default_zone, subcomp, in_top_canvas);
+			ret = e_calendar_view_add_event (cal_view, client, selected_time_start, default_zone, subcomp, in_top_canvas);
+			if (!ret)
+				break;
+
+			if (copied_list)
+				*copied_list = g_slist_prepend (*copied_list, g_strdup (icalcomponent_get_uid (subcomp)));
 		}
 
 		icalcomponent_free (icalcomp);
 	} else {
-		e_calendar_view_add_event (cal_view, client, selected_time_start, default_zone, icalcomp, in_top_canvas);
+		ret = e_calendar_view_add_event (cal_view, client, selected_time_start, default_zone, icalcomp, in_top_canvas);
+		if (ret && copied_list)
+			*copied_list = g_slist_prepend (*copied_list, g_strdup (icalcomponent_get_uid (icalcomp)));
 	}
 
 	e_calendar_view_set_status_message (cal_view, NULL, -1);
+	return TRUE;
 }
 
 static void
@@ -942,15 +927,80 @@ clipboard_paste_received_cb (GtkClipboard *clipboard,
 			     GtkSelectionData *selection_data,
 			     gpointer data)
 {
+	ECalendarView *cal_view = E_CALENDAR_VIEW (data);
+	ECalendarViewPrivate *priv;
+
+	priv = cal_view->priv;
+
 	if (gtk_clipboard_wait_is_text_available (clipboard)) {
-		e_calendar_view_paste_text (E_CALENDAR_VIEW (data));
+		e_calendar_view_paste_text (cal_view);
 	} else {
 		GdkAtom type = selection_data->type;
 		if (type == gdk_atom_intern (target_types[TARGET_TYPE_VCALENDAR].target, TRUE)) {
 			gchar *result = NULL;
+			GSList *copied_list = NULL, *l;
 			result = g_strndup ((const gchar *) selection_data->data,
 					    selection_data->length);
-			clipboard_get_calendar_data (E_CALENDAR_VIEW (data), result);
+			if (priv->selected_cut_list)
+				clipboard_get_calendar_data (E_CALENDAR_VIEW (data), result, &copied_list);
+			else
+				clipboard_get_calendar_data (E_CALENDAR_VIEW (data), result, NULL);
+			
+			if (copied_list && priv->selected_cut_list) {
+				for (l = priv->selected_cut_list; l != NULL; l = l->next) {
+					ECalComponent *comp;
+					ECalModelComponent *comp_data = (ECalModelComponent *) l->data;
+					const gchar *uid;
+					GError *error = NULL;
+					GSList *found = NULL;
+
+					/* Remove them one by one after ensuring it has been copied to the destination successfully */
+					found = g_slist_find_custom (copied_list, icalcomponent_get_uid (comp_data->icalcomp), (GCompareFunc) strcmp);
+					if (!found)
+						continue;
+
+					g_free (found->data);
+					copied_list = g_slist_delete_link (copied_list, found);
+
+					comp = e_cal_component_new ();
+					e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
+
+					if ((itip_organizer_is_user (comp, comp_data->client) ||
+								itip_sentby_is_user (comp, comp_data->client))
+								&& cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (data)),
+								comp_data->client, comp, TRUE))
+						itip_send_comp (
+								E_CAL_COMPONENT_METHOD_CANCEL,
+								comp, comp_data->client, NULL, NULL,
+								NULL, TRUE, FALSE);
+
+						e_cal_component_get_uid (comp, &uid);
+						if (e_cal_component_is_instance (comp)) {
+							gchar *rid = NULL;
+							icalcomponent *icalcomp;
+
+						/* when cutting detached instances, only cut that instance */
+						rid = e_cal_component_get_recurid_as_string (comp);
+						if (e_cal_client_get_object_sync (comp_data->client, uid, rid, &icalcomp, NULL, NULL)) {
+							e_cal_client_remove_object_sync (comp_data->client, uid, rid, CALOBJ_MOD_THIS, NULL, &error);
+							icalcomponent_free (icalcomp);
+						} else
+							e_cal_client_remove_object_sync (comp_data->client, uid, NULL, CALOBJ_MOD_ALL, NULL, &error);
+						g_free (rid);
+					} else
+						e_cal_client_remove_object_sync (comp_data->client, uid, NULL, CALOBJ_MOD_ALL, NULL, &error);
+					delete_error_dialog (error, E_CAL_COMPONENT_EVENT);
+
+					g_clear_error (&error);
+					g_object_unref (comp);
+				}
+			}
+
+			if (priv->selected_cut_list) {
+				g_slist_foreach (priv->selected_cut_list, (GFunc) g_object_unref, NULL);
+				g_slist_free (priv->selected_cut_list);
+			}
+			priv->selected_cut_list = NULL;
 			g_free (result);
 		}
 	}
@@ -961,7 +1011,7 @@ void
 e_calendar_view_paste_clipboard (ECalendarView *cal_view)
 {
 	GtkClipboard *clipboard;
-
+	
 	g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 
 	clipboard = gtk_widget_get_clipboard (GTK_WIDGET (cal_view), GDK_SELECTION_CLIPBOARD);
diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h
index 22ad127..06b0a5c 100644
--- a/calendar/gui/e-calendar-view.h
+++ b/calendar/gui/e-calendar-view.h
@@ -158,7 +158,7 @@ CompEditor*    e_calendar_view_open_event_with_flags (ECalendarView *cal_view, E
 
 GtkMenu       *e_calendar_view_create_popup_menu (ECalendarView *cal_view);
 
-void           e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart,
+gboolean           e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart,
 				     icaltimezone *default_zone, icalcomponent *icalcomp, gboolean in_top_canvas);
 void           e_calendar_view_new_appointment_for (ECalendarView *cal_view,
 						    time_t dtstart,
