--- src/isync.h	2013-04-29 22:06:01.000000000 +0200
+++ src/isync.h	2013-05-06 03:27:07.000000000 +0200
@@ -246,6 +246,7 @@
 	char *data;
 	int len;
 	unsigned char flags;
+	char *idate;
 } msg_data_t;
 
 #define DRV_OK          0

--- src/sync.c	2013-04-29 22:06:01.000000000 +0200
+++ src/sync.c	2013-05-06 10:00:30.000000000 +0200
@@ -302,6 +302,7 @@
 		}
 
 		vars->msg->flags = vars->data.flags;
+		debug ("msg_fetched - vars->data.len (%d) vars->data.idate (%d): %s\n", vars->data.len, strlen (vars->data.idate), vars->data.idate );
 
 		scr = (svars->drv[1-t]->flags / DRV_CRLF) & 1;
 		tcr = (svars->drv[t]->flags / DRV_CRLF) & 1;

--- src/drv_imap.c	2013-04-29 22:06:01.000000000 +0200
+++ src/drv_imap.c	2013-05-06 11:11:49.000000000 +0200
@@ -654,7 +654,7 @@
 parse_fetch( imap_store_t *ctx, list_t *list )
 {
 	list_t *tmp, *flags;
-	char *body = 0, *tuid = 0;
+	char *body = 0, *tuid = 0, *idate = 0;
 	imap_message_t *cur;
 	msg_data_t *msgdata;
 	struct imap_cmd *cmdp;
@@ -701,6 +701,13 @@
 					status |= M_FLAGS;
 				} else
 					error( "IMAP error: unable to parse FLAGS\n" );
+			} else if (!strcmp( "INTERNALDATE", tmp->val )) {
+				tmp = tmp->next;
+				debug ("parse_fetch - internaldate atom (%d): %s\n", tmp->len, tmp->val);
+				if (is_atom( tmp ))
+					idate = tmp->val;
+				else
+					error( "IMAP error: unable to parse INTERNALDATE\n" );
 			} else if (!strcmp( "RFC822.SIZE", tmp->val )) {
 				tmp = tmp->next;
 				if (is_atom( tmp ))
@@ -746,6 +753,10 @@
 		msgdata->len = size;
 		if (status & M_FLAGS)
 			msgdata->flags = mask;
+		if (idate) {
+			msgdata->idate = idate;
+			debug ("parse_fetch - msgdata->len (%d) msgdata->idate (%d): %s\n", msgdata->len, strlen (msgdata->idate), msgdata->idate );
+		}
 	} else if (uid) { /* ignore async flag updates for now */
 		/* XXX this will need sorting for out-of-order (multiple queries) */
 		cur = nfcalloc( sizeof(*cur) );
@@ -1648,7 +1659,7 @@
 	cmd->gen.gen.param.uid = msg->uid;
 	cmd->msg_data = data;
 	imap_exec( (imap_store_t *)ctx, &cmd->gen.gen, imap_done_simple_msg,
-	           "UID FETCH %d (%sBODY.PEEK[])",
+	           "UID FETCH %d (%sINTERNALDATE BODY.PEEK[])",
 	           msg->uid, (msg->status & M_FLAGS) ? "" : "FLAGS " );
 }
 
@@ -1798,7 +1809,7 @@
 	imap_store_t *ctx = (imap_store_t *)gctx;
 	struct imap_cmd_out_uid *cmd;
 	int d;
-	char flagstr[128], buf[1024];
+	char flagstr[128], buf[1024], idatestr[32];
 
 	d = 0;
 	if (data->flags) {
@@ -1807,6 +1818,13 @@
 	}
 	flagstr[d] = 0;
 
+	debug ( "imap_store_message - data->len (%d), data->idate (%d): %s\n", data->len, strlen (data->idate), data->idate );
+	if (strlen (data->idate) != 26) {
+		error ( "Error: INTERNALDATE invalid (len=%d)\n", strlen (data->idate));
+		data->idate = "NOT WITHOUT DATE!";
+	}
+	sprintf ( idatestr, "\"%s\" ", data->idate );
+
 	INIT_IMAP_CMD(imap_cmd_out_uid, cmd, cb, aux)
 	cmd->gen.param.data_len = data->len;
 	cmd->gen.param.data = data->data;
@@ -1826,7 +1844,7 @@
 		}
 	}
 	imap_exec( ctx, &cmd->gen, imap_store_msg_p2,
-	           "APPEND \"%s\" %s", buf, flagstr );
+	           "APPEND \"%s\" %s%s", buf, flagstr, idatestr );
 }
 
 static void
