diff --git a/src/camel/camel-mapi-folder.c b/src/camel/camel-mapi-folder.c
index 42df562..359d27a 100644
--- a/src/camel/camel-mapi-folder.c
+++ b/src/camel/camel-mapi-folder.c
@@ -226,24 +226,39 @@ fetch_items_cb (FetchItemsCallbackData *item_data, gpointer data)
 		gconstpointer prop_data = get_mapi_SPropValue_data(&item_data->properties->lpProps[j]);
 
 		switch (item_data->properties->lpProps[j].ulPropTag) {
+		case PR_INTERNET_CPID: {
+			const uint32_t *ui32 = (const uint32_t *) prop_data;
+			if (ui32)
+				item->header.cpid = *ui32;
+			} break;
 		/* FIXME : Instead of duping. Use talloc_steal to reuse the memory */
 		case PR_NORMALIZED_SUBJECT:
+			item->header.subject = utf8tolinux (prop_data);
+			break;
 		case PR_NORMALIZED_SUBJECT_UNICODE :
 			item->header.subject = g_strdup (prop_data);
 			break;
 		case PR_DISPLAY_TO :
+			item->header.to = utf8tolinux (prop_data);
+			break;
 		case PR_DISPLAY_TO_UNICODE :
 			item->header.to = g_strdup (prop_data);
 			break;
 		case PR_DISPLAY_CC:
+			item->header.cc = utf8tolinux (prop_data);
+			break;
 		case PR_DISPLAY_CC_UNICODE:
 			item->header.cc = g_strdup (prop_data);
 			break;
 		case PR_DISPLAY_BCC:
+			item->header.bcc = utf8tolinux (prop_data);
+			break;
 		case PR_DISPLAY_BCC_UNICODE:
 			item->header.bcc = g_strdup (prop_data);
 			break;
 		case PR_SENT_REPRESENTING_NAME:
+			item->header.from = utf8tolinux (prop_data);
+			break;
 		case PR_SENT_REPRESENTING_NAME_UNICODE:
 			item->header.from = g_strdup (prop_data);
 			break;
@@ -675,6 +690,7 @@ mapi_refresh_folder(CamelFolder *folder, CamelException *ex)
 	const gchar *folder_id = NULL;
 
 	const guint32 summary_prop_list[] = {
+		PR_INTERNET_CPID,
 		PR_NORMALIZED_SUBJECT,
 		PR_MESSAGE_SIZE,
 		PR_MESSAGE_DELIVERY_TIME,
@@ -806,6 +822,7 @@ end1:
 static const uint32_t camel_GetPropsList[] = {
 	PR_FID, 
 	PR_MID, 
+	PR_INTERNET_CPID,
 
 	PR_MESSAGE_CLASS, 
 	PR_MESSAGE_CLASS_UNICODE, 
@@ -974,24 +991,39 @@ fetch_item_cb (FetchItemsCallbackData *item_data, gpointer data)
 		gconstpointer prop_data = get_mapi_SPropValue_data(&item_data->properties->lpProps[j]);
 
 		switch (item_data->properties->lpProps[j].ulPropTag) {
+		case PR_INTERNET_CPID: {
+			const uint32_t *ui32 = (const uint32_t *) prop_data;
+			if (ui32)
+				item->header.cpid = *ui32;
+			} break;
 		/*FIXME : Instead of duping. Use talloc_steal to reuse the memory*/
 		case PR_NORMALIZED_SUBJECT:
+			item->header.subject = utf8tolinux (prop_data);
+			break;
 		case PR_NORMALIZED_SUBJECT_UNICODE :
 			item->header.subject = g_strdup (prop_data);
 			break;
 		case PR_DISPLAY_TO :
+			item->header.to = utf8tolinux (prop_data);
+			break;
 		case PR_DISPLAY_TO_UNICODE :
 			item->header.to = g_strdup (prop_data);
 			break;
 		case PR_DISPLAY_CC:
+			item->header.cc = utf8tolinux (prop_data);
+			break;
 		case PR_DISPLAY_CC_UNICODE:
 			item->header.cc = g_strdup (prop_data);
 			break;
 		case PR_DISPLAY_BCC:
+			item->header.bcc = utf8tolinux (prop_data);
+			break;
 		case PR_DISPLAY_BCC_UNICODE:
 			item->header.bcc = g_strdup (prop_data);
 			break;
 		case PR_SENT_REPRESENTING_NAME:
+			item->header.from = utf8tolinux (prop_data);
+			break;
 		case PR_SENT_REPRESENTING_NAME_UNICODE:
 			item->header.from = g_strdup (prop_data);
 			break;
@@ -1184,15 +1216,24 @@ mapi_populate_msg_body_from_item (CamelMultipart *multipart, MapiItem *item, Exc
 	camel_mime_part_set_encoding(part, CAMEL_TRANSFER_ENCODING_8BIT);
 	
 	if (body) { 
+		char *buff = NULL;
+
 		if (item->is_cal)
-			camel_mime_part_set_content(part, (const char *) body->value->data, body->value->len, "text/calendar");
-		else {
+			type = "text/calendar";
+		else
 			type = (body->proptag == PR_BODY || body->proptag == PR_BODY_UNICODE) ? 
 				"text/plain" : "text/html";
 
-			/*NOTE : Last byte null mess up CRLF*. Probably needs a fix in e*fetch_items. */
-			camel_mime_part_set_content (part, (const char *) body->value->data, body->value->len - 1, type );
+		if (item->header.cpid) {
+			buff = g_strdup_printf ("%s; charset=\"CP%d\"", type, item->header.cpid);
+			type = buff;
 		}
+
+		/*NOTE : Last byte null mess up CRLF*. Probably needs a fix in e*fetch_items. */
+		camel_mime_part_set_content (part, (const char *) body->value->data, body->value->len - (item->is_cal ? 0 : 1), type);
+
+		g_free (buff);
+		type = NULL;
 	} else
 		camel_mime_part_set_content(part, " ", strlen(" "), "text/html");
 
diff --git a/src/camel/camel-mapi-folder.h b/src/camel/camel-mapi-folder.h
index 0fc6fa4..6afb0bc 100644
--- a/src/camel/camel-mapi-folder.h
+++ b/src/camel/camel-mapi-folder.h
@@ -74,6 +74,7 @@ typedef struct {
 	glong size;
 	time_t recieved_time;
 	time_t send_time;
+	guint cpid; /* codepage id */
 } MapiItemHeader;
 
 typedef struct {
diff --git a/src/libexchangemapi/exchange-mapi-utils.c b/src/libexchangemapi/exchange-mapi-utils.c
index 4805a8b..372a484 100644
--- a/src/libexchangemapi/exchange-mapi-utils.c
+++ b/src/libexchangemapi/exchange-mapi-utils.c
@@ -55,6 +55,8 @@ utf8tolinux (const char *wstring)
 
 	if (g_utf8_validate (newstr, -1, NULL)) 
 		retval = g_strdup (newstr);
+	else
+		retval = g_strdup (wstring);
 
 	talloc_free (mem_ctx);
 
