diff --git a/calendar/backends/groupwise/e-cal-backend-groupwise-utils.c b/calendar/backends/groupwise/e-cal-backend-groupwise-utils.c
index 6a92f44..e92ed62 100644
--- a/calendar/backends/groupwise/e-cal-backend-groupwise-utils.c
+++ b/calendar/backends/groupwise/e-cal-backend-groupwise-utils.c
@@ -1020,7 +1020,7 @@ get_cn_from_display_name (gchar *display_name)
 	}
 }
 
-static void
+void
 sanitize_component (ECalComponent *comp, const gchar *server_uid, const char *container_id)
 {
 	icalproperty *icalprop;
@@ -1455,14 +1455,14 @@ e_gw_item_to_cal_component (EGwItem *item, ECalBackendGroupwise *cbgw)
 }
 
 EGwConnectionStatus
-e_gw_connection_send_appointment (ECalBackendGroupwise *cbgw, const gchar *container, ECalComponent *comp, icalproperty_method method, gboolean all_instances, ECalComponent **created_comp, icalparameter_partstat *pstatus)
+e_gw_connection_send_appointment (ECalBackendGroupwise *cbgw, const char *c_gw_id, ECalComponent *comp, icalproperty_method method, gboolean all_instances, ECalComponent **created_comp, icalparameter_partstat *pstatus, gboolean *is_import)
 {
 	EGwConnection *cnc;
 	EGwConnectionStatus status;
 	icalparameter_partstat partstat;
 	gchar *item_id = NULL;
 	const gchar *gw_id;
-	const gchar *recurrence_key = NULL;
+	const char *recurrence_key = NULL, *container;
 	gboolean need_to_get = FALSE, decline = FALSE;
 	ECalComponentVType type;
 
@@ -1472,25 +1472,29 @@ e_gw_connection_send_appointment (ECalBackendGroupwise *cbgw, const gchar *conta
 
 	e_cal_component_commit_sequence (comp);
 	type = e_cal_component_get_vtype (comp);
+	container = e_cal_backend_groupwise_get_container_id (cbgw);
 
 	gw_id = e_cal_component_get_gw_id (comp);
 
-	switch  (type) {
+	if (gw_id) {
+		switch  (type) {
 
-		case E_CAL_COMPONENT_EVENT:
-		case E_CAL_COMPONENT_TODO:
-		case E_CAL_COMPONENT_JOURNAL:
-			if (!g_str_has_suffix (gw_id, container)) {
-				item_id = g_strconcat (e_cal_component_get_gw_id (comp), GW_EVENT_TYPE_ID, container, NULL);
-				need_to_get = TRUE;
+			case E_CAL_COMPONENT_EVENT:
+			case E_CAL_COMPONENT_TODO:
+			case E_CAL_COMPONENT_JOURNAL:
+				if (!g_str_has_suffix (gw_id, container)) {
+					item_id = g_strconcat (e_cal_component_get_gw_id (comp), GW_EVENT_TYPE_ID, container, NULL);
+					need_to_get = TRUE;
 
-			}
-			else
-				item_id = g_strdup (gw_id);
-			break;
-		default:
-			return E_GW_CONNECTION_STATUS_INVALID_OBJECT;
-	}
+				}
+				else
+					item_id = g_strdup (gw_id);
+				break;
+			default:
+				return E_GW_CONNECTION_STATUS_INVALID_OBJECT;
+		}
+	} else if (c_gw_id)
+		item_id = g_strdup (c_gw_id);	
 
 	if (all_instances)
 		e_cal_component_get_uid (comp, &recurrence_key);
@@ -1562,6 +1566,13 @@ e_gw_connection_send_appointment (ECalBackendGroupwise *cbgw, const gchar *conta
 			break;
 		}
 		*pstatus = partstat;
+
+		/* The item is not in the calendar, so we need to import the item */
+		if (!item_id) {
+			*is_import = TRUE;
+			return E_GW_CONNECTION_STATUS_OK;			
+		}
+
 		switch (partstat) {
 		ECalComponentTransparency transp;
 
@@ -1605,6 +1616,13 @@ e_gw_connection_send_appointment (ECalBackendGroupwise *cbgw, const gchar *conta
 
 	case ICAL_METHOD_CANCEL:
 		status = e_gw_connection_retract_request (cnc, item_id, NULL, FALSE, FALSE);
+		if (status != E_GW_CONNECTION_STATUS_OK) {
+			*pstatus = ICAL_PARTSTAT_DECLINED; 
+			if (all_instances)
+				status = e_gw_connection_decline_request (cnc, item_id, NULL, recurrence_key);
+			else 
+				status = e_gw_connection_decline_request (cnc, item_id, NULL, NULL);
+		}
 		break;
 	case ICAL_METHOD_PUBLISH:
 		if (decline)
@@ -1620,42 +1638,21 @@ e_gw_connection_send_appointment (ECalBackendGroupwise *cbgw, const gchar *conta
 }
 
 EGwConnectionStatus
-e_gw_connection_create_appointment (EGwConnection *cnc, const gchar *container, ECalBackendGroupwise *cbgw, ECalComponent *comp, GSList **id_list)
+e_gw_connection_create_appointment (EGwConnection *cnc, const gchar *container, ECalBackendGroupwise *cbgw, ECalComponent *comp, GSList **id_list, gboolean personal)
 {
 	EGwItem *item;
 	EGwConnectionStatus status;
-	icalproperty *icalprop;
-	gboolean move_cal = FALSE;
-	icalcomponent *icalcomp;
-	gchar *id = NULL;
 
 	g_return_val_if_fail (E_IS_GW_CONNECTION (cnc), E_GW_CONNECTION_STATUS_INVALID_CONNECTION);
 	g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), E_GW_CONNECTION_STATUS_INVALID_OBJECT);
 
-	icalcomp = e_cal_component_get_icalcomponent (comp);
-
-	icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY);
-	while (icalprop) {
-		const gchar *x_name;
-
-		x_name = icalproperty_get_x_name (icalprop);
-		if (!strcmp (x_name, "X-EVOLUTION-MOVE-CALENDAR")) {
-			move_cal = TRUE;
-			break;
-		}
-
-		icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY);
-	}
-
 	item = e_gw_item_new_from_cal_component (container, cbgw, comp);
 	e_gw_item_set_container_id (item, container);
-	if (!move_cal)
+	if (!personal)
 		status = e_gw_connection_send_item (cnc, item, id_list);
-	else {
-		e_gw_item_set_source (item, "personal");
-		status = e_gw_connection_create_item (cnc, item, &id);
-		*id_list = g_slist_append (*id_list, id);
-	}
+	else
+		status = e_gw_connection_create_items (cnc, item, id_list);
+
 	g_object_unref (item);
 
 	return status;
diff --git a/calendar/backends/groupwise/e-cal-backend-groupwise-utils.h b/calendar/backends/groupwise/e-cal-backend-groupwise-utils.h
index 838f846..a520576 100644
--- a/calendar/backends/groupwise/e-cal-backend-groupwise-utils.h
+++ b/calendar/backends/groupwise/e-cal-backend-groupwise-utils.h
@@ -46,12 +46,13 @@ EGwItem       *e_gw_item_new_from_cal_component (const gchar *container, ECalBac
 EGwItem  *e_gw_item_new_for_delegate_from_cal (ECalBackendGroupwise *cbgw, ECalComponent *comp);
 ECalComponent *e_gw_item_to_cal_component (EGwItem *item, ECalBackendGroupwise *cbgw);
 void          e_gw_item_set_changes (EGwItem *item, EGwItem *cached_item);
+void	     sanitize_component (ECalComponent *comp, const gchar *server_uid, const char *container_id);
 
 /*
  * Connection-related utility functions
  */
-EGwConnectionStatus e_gw_connection_create_appointment (EGwConnection *cnc, const gchar *container, ECalBackendGroupwise *cbgw, ECalComponent *comp, GSList **id_list);
-EGwConnectionStatus e_gw_connection_send_appointment (ECalBackendGroupwise *cbgw, const gchar *container, ECalComponent *comp, icalproperty_method method, gboolean all_instances, ECalComponent **created_comp, icalparameter_partstat *pstatus);
+EGwConnectionStatus e_gw_connection_create_appointment (EGwConnection *cnc, const char *container, ECalBackendGroupwise *cbgw, ECalComponent *comp, GSList **id_list, gboolean personal);
+EGwConnectionStatus e_gw_connection_send_appointment (ECalBackendGroupwise *cbgw, const char *c_gw_id, ECalComponent *comp, icalproperty_method method, gboolean all_instances, ECalComponent **created_comp, icalparameter_partstat *pstatus, gboolean *import);
 EGwConnectionStatus e_gw_connection_get_freebusy_info (ECalBackendGroupwise *cbgw, GList *users, time_t start, time_t end, GList **freebusy);
 gboolean e_cal_backend_groupwise_store_settings (GwSettings *hold);
 gboolean e_cal_backend_groupwise_utils_check_delegate (ECalComponent *comp, const gchar *email);
diff --git a/calendar/backends/groupwise/e-cal-backend-groupwise.c b/calendar/backends/groupwise/e-cal-backend-groupwise.c
index e2ad2f4..95ed3d3 100644
--- a/calendar/backends/groupwise/e-cal-backend-groupwise.c
+++ b/calendar/backends/groupwise/e-cal-backend-groupwise.c
@@ -136,6 +136,15 @@ e_cal_backend_groupwise_get_categories_by_id (ECalBackendGroupwise *cbgw) {
 	return cbgw->priv->categories_by_id;
 }
 
+const char *
+e_cal_backend_groupwise_get_container_id (ECalBackendGroupwise *cbgw) 
+{
+
+	g_return_val_if_fail (E_IS_CAL_BACKEND_GROUPWISE (cbgw), NULL);
+
+	return cbgw->priv->container_id;
+}
+
 GHashTable *
 e_cal_backend_groupwise_get_categories_by_name (ECalBackendGroupwise *cbgw) {
 
@@ -152,12 +161,6 @@ e_cal_backend_groupwise_get_default_zone (ECalBackendGroupwise *cbgw) {
 	return cbgw->priv->default_zone;
 }
 
-const char *
-e_cal_backend_groupwise_get_container_id (ECalBackendGroupwise *cbgw) 
-{
-	return cbgw->priv->container_id;
-}
-
 void
 e_cal_backend_groupwise_priv_lock (ECalBackendGroupwise *cbgw)
 {
@@ -2006,6 +2009,30 @@ update_from_server (ECalBackendGroupwise *cbgw, GSList *uid_list, gchar **calobj
 	return E_GW_CONNECTION_STATUS_OK;
 }
 
+static gboolean
+check_for_move (ECalComponent *comp)
+{
+	gboolean personal = FALSE;
+	icalcomponent *icalcomp;
+ 	icalproperty *icalprop;
+
+	icalcomp = e_cal_component_get_icalcomponent (comp);
+	icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY);
+
+	while (icalprop) {
+		const char *x_name;
+
+		x_name = icalproperty_get_x_name (icalprop);
+		if (!strcmp (x_name, "X-EVOLUTION-MOVE-CALENDAR")) {
+			personal = TRUE;
+			break;
+		}
+		icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY);
+	}
+	
+	return personal;
+}
+
 static ECalBackendSyncStatus
 e_cal_backend_groupwise_create_object (ECalBackendSync *backend, EDataCal *cal, gchar **calobj, gchar **uid)
 {
@@ -2014,6 +2041,7 @@ e_cal_backend_groupwise_create_object (ECalBackendSync *backend, EDataCal *cal,
 	icalcomponent *icalcomp;
 	ECalComponent *comp;
 	EGwConnectionStatus status;
+	gboolean personal = FALSE;
 	GSList *uid_list = NULL;
 
 	cbgw = E_CAL_BACKEND_GROUPWISE (backend);
@@ -2044,11 +2072,12 @@ e_cal_backend_groupwise_create_object (ECalBackendSync *backend, EDataCal *cal,
 	switch (priv->mode) {
 	case CAL_MODE_ANY :
 	case CAL_MODE_REMOTE :
+		personal = check_for_move (comp);
 		/* when online, send the item to the server */
-		status = e_gw_connection_create_appointment (priv->cnc, priv->container_id, cbgw, comp, &uid_list);
+		status = e_gw_connection_create_appointment (priv->cnc, priv->container_id, cbgw, comp, &uid_list, personal);
 
 		if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
-			status = e_gw_connection_create_appointment (priv->cnc, priv->container_id, cbgw, comp, &uid_list);
+			status = e_gw_connection_create_appointment (priv->cnc, priv->container_id, cbgw, comp, &uid_list, personal);
 
 		if (status != E_GW_CONNECTION_STATUS_OK) {
 			g_object_unref (comp);
@@ -2514,6 +2543,91 @@ change_status (ECalComponent *comp, icalparameter_partstat status, const gchar *
 	}
 }
 
+
+static ECalBackendSyncStatus 
+import_items (ECalBackendGroupwise *cbgw, ECalComponent *comp)
+{
+	EGwConnectionStatus status;
+	ECalBackendGroupwisePrivate *priv;
+	GSList *uid_list = NULL;
+	gboolean personal = TRUE;
+	
+	priv = cbgw->priv;
+
+	status = e_gw_connection_create_appointment (priv->cnc, priv->container_id, cbgw, comp, &uid_list, personal);
+	if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
+		status = e_gw_connection_create_appointment (priv->cnc, priv->container_id, cbgw, comp, &uid_list, personal);
+
+	if (status != E_GW_CONNECTION_STATUS_OK) {
+		if (status == E_GW_CONNECTION_STATUS_UNKNOWN_USER)
+			return GNOME_Evolution_Calendar_UnknownUser;
+		else
+			return GNOME_Evolution_Calendar_OtherError;
+	}
+
+	if (g_slist_length (uid_list) == 1) {
+		char *server_uid=NULL, *temp;
+		const gchar *container_id=NULL;
+	
+		server_uid = (char *) uid_list->data;
+		container_id = e_cal_backend_groupwise_get_container_id (cbgw);
+		sanitize_component (comp, server_uid, container_id);
+		g_free (server_uid);
+		/* if successful, update the cache */
+		e_cal_backend_store_put_component (priv->store, comp);
+
+		temp = e_cal_component_get_as_string (comp);
+		e_cal_backend_notify_object_created (E_CAL_BACKEND (cbgw), temp);
+		g_free (temp);
+	} else {
+		EGwConnectionStatus stat;
+		GSList *l;
+		GList *list = NULL, *tmp;
+		GPtrArray *uid_array = g_ptr_array_new ();
+		guint i;
+
+		for (l = uid_list; l; l = g_slist_next (l)) {
+			g_ptr_array_add (uid_array, l->data);
+		}
+
+		/* convert uid_list to GPtrArray and get the items in a list */
+		stat = e_gw_connection_get_items_from_ids (priv->cnc,
+				priv->container_id,
+				"attachments recipients message recipientStatus default peek",
+				uid_array, &list);
+
+		if (stat != E_GW_CONNECTION_STATUS_OK || (list == NULL) || (g_list_length (list) == 0)) {
+			g_ptr_array_free (uid_array, TRUE);
+			return GNOME_Evolution_Calendar_OtherError;
+		}
+
+		comp = g_object_ref ( (ECalComponent *) list->data );
+		/* convert items into components and add them to the cache */
+		for (i=0, tmp = list; tmp ; tmp = g_list_next (tmp), i++) {
+			ECalComponent *e_cal_comp;
+			EGwItem *item;
+			char *temp;
+			const gchar *container_id = NULL;
+
+			item = (EGwItem *) tmp->data;
+			container_id = e_cal_backend_groupwise_get_container_id (cbgw);
+			e_cal_comp = e_gw_item_to_cal_component (item, cbgw);
+			e_cal_component_commit_sequence (e_cal_comp);
+			sanitize_component (e_cal_comp, g_ptr_array_index (uid_array, i), container_id);
+			e_cal_backend_store_put_component (priv->store, e_cal_comp);
+
+			temp = e_cal_component_get_as_string (e_cal_comp);
+			e_cal_backend_notify_object_created (E_CAL_BACKEND (cbgw), temp);
+			g_free (temp);
+
+			g_object_unref (e_cal_comp);
+		}
+		g_ptr_array_free (uid_array, TRUE);
+	}
+
+	return GNOME_Evolution_Calendar_Success;
+}
+
 static ECalBackendSyncStatus
 receive_object (ECalBackendGroupwise *cbgw, EDataCal *cal, icalcomponent *icalcomp)
 {
@@ -2524,6 +2638,9 @@ receive_object (ECalBackendGroupwise *cbgw, EDataCal *cal, icalcomponent *icalco
 	gboolean all_instances = FALSE;
 	icalparameter_partstat pstatus;
 	icalproperty *icalprop;
+	ECalComponent *cache_comp;
+	gboolean is_import = FALSE;
+	const char *uid, *c_gw_id = NULL;
 
 	priv = cbgw->priv;
 
@@ -2545,19 +2662,46 @@ receive_object (ECalBackendGroupwise *cbgw, EDataCal *cal, icalcomponent *icalco
 
 		icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY);
 	}
+	/* this is for appointments sent from (!groupwise calendars) */ 
+	icalprop = icalcomponent_get_first_property (icalcomp, ICAL_RRULE_PROPERTY); 
+	if (icalprop)
+		all_instances = TRUE;
 
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
 	method = icalcomponent_get_method (icalcomp);
 
+	e_cal_component_get_uid (comp, &uid);
+ 
+	cache_comp = e_cal_backend_store_get_component (priv->store, uid, NULL);
+	if (cache_comp) 
+		c_gw_id = e_cal_component_get_gw_id (cache_comp);
+
 	/* handle attachments */
 	if (e_cal_component_has_attachments (comp))
 		fetch_attachments (cbgw, comp);
 
-	status = e_gw_connection_send_appointment (cbgw, priv->container_id, comp, method, all_instances, &modif_comp, &pstatus);
+	status = e_gw_connection_send_appointment (cbgw, c_gw_id, comp, method, all_instances, &modif_comp, &pstatus, &is_import);
 
 	if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
-		status = e_gw_connection_send_appointment (cbgw, priv->container_id, comp, method, all_instances, &modif_comp, &pstatus);
+		status = e_gw_connection_send_appointment (cbgw, c_gw_id, comp, method, all_instances, &modif_comp, &pstatus, &is_import);
+
+	if (cache_comp)	{
+		g_object_unref (cache_comp);
+		cache_comp = NULL;
+		c_gw_id = NULL;
+	}
+
+	if (is_import) {
+		if (pstatus == ICAL_PARTSTAT_DECLINED) 
+			return GNOME_Evolution_Calendar_ObjectNotFound;
+
+		status = import_items (cbgw, comp); 
+		g_object_unref (comp);
+
+		return status;
+	}
+
 
 	if (!modif_comp)
 		modif_comp = g_object_ref (comp);
diff --git a/calendar/backends/groupwise/e-cal-backend-groupwise.h b/calendar/backends/groupwise/e-cal-backend-groupwise.h
index abcc1ef..50f7458 100644
--- a/calendar/backends/groupwise/e-cal-backend-groupwise.h
+++ b/calendar/backends/groupwise/e-cal-backend-groupwise.h
@@ -66,6 +66,7 @@ const gchar *e_cal_backend_groupwise_get_container_id (ECalBackendGroupwise *cbg
 const gchar * e_cal_backend_groupwise_get_local_attachments_store (ECalBackendGroupwise *cbgw);
 void e_cal_backend_groupwise_priv_lock (ECalBackendGroupwise *cbgw);
 void e_cal_backend_groupwise_priv_unlock (ECalBackendGroupwise *cbgw);
+const char *e_cal_backend_groupwise_get_container_id (ECalBackendGroupwise *cbgw);
 
 G_END_DECLS
 
diff --git a/servers/groupwise/e-gw-connection.c b/servers/groupwise/e-gw-connection.c
index 3dc41ab..ef67075 100644
--- a/servers/groupwise/e-gw-connection.c
+++ b/servers/groupwise/e-gw-connection.c
@@ -1364,11 +1364,24 @@ e_gw_connection_send_item (EGwConnection *cnc, EGwItem *item, GSList **id_list)
 }
 
 EGwConnectionStatus
-e_gw_connection_create_item (EGwConnection *cnc, EGwItem *item, gchar ** id)
+e_gw_connection_create_item (EGwConnection *cnc, EGwItem *item, char** id) 
+{
+	GSList *ids = NULL;
+	EGwConnectionStatus status;
+
+	status = e_gw_connection_create_items (cnc, item, &ids);
+	
+	if (status == E_GW_CONNECTION_STATUS_OK)
+		*id = ids->data;
+
+	return status;
+}
+
+EGwConnectionStatus
+e_gw_connection_create_items (EGwConnection *cnc, EGwItem *item, GSList **id_list)
 {
 	SoupSoapMessage *msg;
 	SoupSoapResponse *response;
-	SoupSoapParameter *param;
 	EGwConnectionStatus status = E_GW_CONNECTION_STATUS_UNKNOWN;
 
 	g_return_val_if_fail (E_IS_GW_CONNECTION (cnc), E_GW_CONNECTION_STATUS_INVALID_CONNECTION);
@@ -1398,9 +1411,16 @@ e_gw_connection_create_item (EGwConnection *cnc, EGwItem *item, gchar ** id)
 
 	status = e_gw_connection_parse_response_status (response);
 	if (status == E_GW_CONNECTION_STATUS_OK) {
-		param = soup_soap_response_get_first_parameter_by_name (response, "id");
-		if (param != NULL)
-			*id = soup_soap_parameter_get_string_value (param);
+		SoupSoapParameter *param;
+
+		*id_list = NULL;
+		/* get the generated ID from the SOAP response */
+		// for loop here to populate the list_ids.
+		for (param = soup_soap_response_get_first_parameter_by_name (response, "id");
+				param; param = soup_soap_response_get_next_parameter_by_name (response, param, "id")) {
+
+			*id_list = g_slist_append (*id_list, soup_soap_parameter_get_string_value (param));
+		}		
 	} else if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
 		reauthenticate (cnc);
 
diff --git a/servers/groupwise/e-gw-connection.h b/servers/groupwise/e-gw-connection.h
index 7bebdc3..a37804c 100644
--- a/servers/groupwise/e-gw-connection.h
+++ b/servers/groupwise/e-gw-connection.h
@@ -127,6 +127,7 @@ time_t              e_gw_connection_get_date_from_string (const gchar *dtstring)
 gchar               *e_gw_connection_format_date_string (const gchar *dtstring);
 
 EGwConnectionStatus e_gw_connection_create_item (EGwConnection *cnc, EGwItem *item, gchar ** id);
+EGwConnectionStatus e_gw_connection_create_items (EGwConnection *cnc, EGwItem *item, GSList **ids);
 EGwConnectionStatus e_gw_connection_get_item (EGwConnection *cnc, const gchar *container, const gchar *id, const gchar *view, EGwItem **item);
 EGwConnectionStatus e_gw_connection_modify_item (EGwConnection *cnc, const gchar *id, EGwItem *item);
 EGwConnectionStatus e_gw_connection_accept_request (EGwConnection *cnc, const gchar *id, const gchar *accept_level, const gchar *accept_comment, const gchar *recurrence_key);
