diff --git a/src/addressbook/e-book-backend-mapi.c b/src/addressbook/e-book-backend-mapi.c
index 77c45fd..0842737 100644
--- a/src/addressbook/e-book-backend-mapi.c
+++ b/src/addressbook/e-book-backend-mapi.c
@@ -743,6 +743,7 @@ create_contact_item (FetchItemsCallbackData *item_data, gpointer data)
 {
 	EContact *contact;
 	char *suid;
+	GSList *recipients = item_data->recipients, *l = NULL;
 	
 	contact = emapidump_contact (item_data->properties);
 	suid = exchange_mapi_util_mapi_ids_to_uid (item_data->fid, item_data->mid);
@@ -753,6 +754,8 @@ create_contact_item (FetchItemsCallbackData *item_data, gpointer data)
 		data = contact;
 	}
 
+	exchange_mapi_util_free_recipient_list (&recipients);
+
 	g_free (suid);
 
 	return TRUE;
diff --git a/src/camel/camel-mapi-folder.c b/src/camel/camel-mapi-folder.c
index 47c0f58..61ac95f 100644
--- a/src/camel/camel-mapi-folder.c
+++ b/src/camel/camel-mapi-folder.c
@@ -1290,6 +1290,7 @@ mapi_folder_get_message( CamelFolder *folder, const char *uid, CamelException *e
 	mapi_id_t id_message;
 	MapiItem *item = NULL;
 	guint32 options = 0;
+	GSList *l = NULL;
 
 	/* see if it is there in cache */
 
@@ -1368,6 +1369,8 @@ mapi_folder_get_message( CamelFolder *folder, const char *uid, CamelException *e
 
 	msg = mapi_folder_item_to_msg (folder, item, ex);
 
+	exchange_mapi_util_free_recipient_list (&item->recipients);
+
 	g_free (item);
 
 	if (!msg) {
diff --git a/src/libexchangemapi/exchange-mapi-cal-utils.c b/src/libexchangemapi/exchange-mapi-cal-utils.c
index 9d31be8..dbf0866 100644
--- a/src/libexchangemapi/exchange-mapi-cal-utils.c
+++ b/src/libexchangemapi/exchange-mapi-cal-utils.c
@@ -1000,6 +1000,7 @@ fetch_server_data_cb (FetchItemsCallbackData *item_data, gpointer data)
 	GSList *streams = item_data->streams;
 	GSList *recipients = item_data->recipients;
 	GSList *attachments = item_data->attachments;
+	GSList *l = NULL;
 
 	icalcomponent_kind kind = ICAL_VEVENT_COMPONENT;
 	gchar *filename = g_build_filename (g_get_home_dir (), TEMP_ATTACH_STORE, NULL);
@@ -1022,6 +1023,8 @@ fetch_server_data_cb (FetchItemsCallbackData *item_data, gpointer data)
 
 	cbdata->comp = comp; 
 
+	exchange_mapi_util_free_recipient_list (&recipients);
+	
 	g_free (smid);
 	g_free (fileuri);
 	g_free (filename);
diff --git a/src/libexchangemapi/exchange-mapi-connection.c b/src/libexchangemapi/exchange-mapi-connection.c
index f81add6..c4dff77 100644
--- a/src/libexchangemapi/exchange-mapi-connection.c
+++ b/src/libexchangemapi/exchange-mapi-connection.c
@@ -706,16 +706,13 @@ static gboolean
 exchange_mapi_util_get_recipients (mapi_object_t *obj_message, GSList **recip_list)
 {
 	enum MAPISTATUS		retval;
-//	TALLOC_CTX 		*mem_ctx;
 	struct SPropTagArray	proptags;
 	struct SRowSet		rows_recip;
 	uint32_t		i_row_recip;
 	gboolean 		status = TRUE;
 
 	d(g_print("\n%s: Entering %s ", G_STRLOC, G_STRFUNC));
-
-//	mem_ctx = talloc_init ("ExchangeMAPI_GetRecipients");
-
+	
 	/* fetch recipient table */
 	retval = GetRecipientTable(obj_message, &rows_recip, &proptags);
 	if (retval != MAPI_E_SUCCESS) {
@@ -726,12 +723,14 @@ exchange_mapi_util_get_recipients (mapi_object_t *obj_message, GSList **recip_li
 	for (i_row_recip = 0; i_row_recip < rows_recip.cRows; i_row_recip++) {
 		ExchangeMAPIRecipient 	*recipient = g_new0 (ExchangeMAPIRecipient, 1);
 
-		recipient->email_id = (const char *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_SMTP_ADDRESS);
+		recipient->mem_ctx = talloc_init ("ExchangeMAPI_GetRecipients");
+
+		recipient->email_id = talloc_steal (recipient->mem_ctx, (const char *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_SMTP_ADDRESS));
 		/* fallback */
 		if (!recipient->email_id) {
-			const char *addrtype = (const char *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_ADDRTYPE);
+			const char *addrtype = talloc_steal (recipient->mem_ctx, (const char *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_ADDRTYPE));
 			if (addrtype && !g_ascii_strcasecmp(addrtype, "SMTP"))
-				recipient->email_id = (const char *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_EMAIL_ADDRESS);
+				recipient->email_id = talloc_steal (recipient->mem_ctx, (const char *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_EMAIL_ADDRESS));
 		}
 		/* fail */
 		if (!recipient->email_id) {
@@ -739,7 +738,7 @@ exchange_mapi_util_get_recipients (mapi_object_t *obj_message, GSList **recip_li
 			mapidump_SRow (&(rows_recip.aRow[i_row_recip]), " ");
 		}
 
-		recipient->out.all_lpProps = rows_recip.aRow[i_row_recip].lpProps;
+		recipient->out.all_lpProps = talloc_steal ((TALLOC_CTX *)recipient->mem_ctx, rows_recip.aRow[i_row_recip].lpProps);
 		recipient->out.all_cValues = rows_recip.aRow[i_row_recip].cValues;
 
 		*recip_list = g_slist_append (*recip_list, recipient);
@@ -748,7 +747,6 @@ exchange_mapi_util_get_recipients (mapi_object_t *obj_message, GSList **recip_li
 cleanup:
 	if (retval != MAPI_E_SUCCESS)
 		status = FALSE;
-//	talloc_free (mem_ctx);
 
 	d(g_print("\n%s: Leaving %s ", G_STRLOC, G_STRFUNC));
 
@@ -1169,7 +1167,7 @@ exchange_mapi_connection_fetch_items   (mapi_id_t fid,
 				for (k=0; k < prop_count; k++)
 					cast_mapi_SPropValue(&properties_array.lpProps[k], &lpProps[k]);
 
-				MAPIFreeBuffer(lpProps);
+//				MAPIFreeBuffer(lpProps);
 			} else
 				retval = GetPropsAll (&obj_message, &properties_array);
 
@@ -1346,7 +1344,7 @@ exchange_mapi_connection_fetch_item (mapi_id_t fid, mapi_id_t mid,
 		for (k=0; k < prop_count; k++)
 			cast_mapi_SPropValue(&properties_array.lpProps[k], &lpProps[k]);
 
-		MAPIFreeBuffer(lpProps);
+//		MAPIFreeBuffer(lpProps);
 	} else
 		retval = GetPropsAll (&obj_message, &properties_array);
 
diff --git a/src/libexchangemapi/exchange-mapi-connection.h b/src/libexchangemapi/exchange-mapi-connection.h
index 95b085d..fe64031 100644
--- a/src/libexchangemapi/exchange-mapi-connection.h
+++ b/src/libexchangemapi/exchange-mapi-connection.h
@@ -58,6 +58,7 @@ typedef struct {
 typedef struct {
 	/* MANDATORY */
 	const char *email_id;
+	TALLOC_CTX *mem_ctx;
 
 	/* It is ideal to set all these properties on all recipients 
 	 * as we never know if a recipient would be resolved or not. */ 
diff --git a/src/libexchangemapi/exchange-mapi-utils.c b/src/libexchangemapi/exchange-mapi-utils.c
index 2b47d73..4805a8b 100644
--- a/src/libexchangemapi/exchange-mapi-utils.c
+++ b/src/libexchangemapi/exchange-mapi-utils.c
@@ -262,6 +262,8 @@ exchange_mapi_util_free_recipient_list (GSList **recip_list)
 
 	for (; l != NULL; l = l->next) {
 		ExchangeMAPIRecipient *recipient = (ExchangeMAPIRecipient *) (l->data);
+
+		talloc_free (recipient->mem_ctx);
 		if (recipient->in.ext_cValues)
 			g_free (recipient->in.ext_lpProps);
 		if (recipient->in.req_cValues)

