diff --git a/exec/imapservice.js b/exec/imapservice.js
index ad608bb2b9cff519cfd92c46c0233c349d23b888..f0677b4bafb8c0dae7a927cbc1fa76b7691b09a6 100644
--- a/exec/imapservice.js
+++ b/exec/imapservice.js
@@ -28,7 +28,7 @@ var readonly=true;
 var orig_ptrs={};
 var msg_ptrs={};
 var curr_status={exists:0,recent:0,unseen:0,uidnext:0,uidvalidity:0};
-var saved_config={'__config_epoch__':0, mail:{scan_ptr:0}};
+var saved_config={'__config_epoch__':0, mail:{scan_ptr:0, subscribed:true}};
 var scan_ptr;
 var cfgfile;
 var applied_epoch = -1;
@@ -293,7 +293,7 @@ function send_fetch_response(msgnum, fmat, uid)
 		}
 		else {
 			if(saved_config[index.code] == undefined)
-				saved_config[index.code] = {};
+				saved_config[index.code] = {subscribed:false};
 			if(saved_config[index.code].Seen == undefined)
 				saved_config[index.code].Seen = {};
 			if(saved_config[index.code].Seen[msgnum] != 1) {
@@ -575,7 +575,7 @@ function parse_data_items(obj)
 				obj=["FLAGS","INTERNALDATE","RFC822.SIZE","ENVELOPE","BODY"];
 				break;
 			default:
-				obj=[];
+				obj=[obj];
 		}
 	}
 	return(obj);
@@ -1192,7 +1192,7 @@ function sublist(group, match, subscribed)
 
 		for(sub in msg_area.grp_list[grp].sub_list) {
 			if(re.test(msg_area.grp_list[grp].description+sepchar+msg_area.grp_list[grp].sub_list[sub].description)) {
-				if((!subscribed) || (msg_area.grp_list[grp].sub_list[sub].scan_cfg&SCAN_CFG_NEW && (!(msg_area.grp_list[grp].sub_list[sub].scan_cfg&SCAN_CFG_YONLY)))) {
+				if((!subscribed) || (saved_config.hasOwnProperty(msg_area.grp_list[grp].sub_list[sub].code) && saved_config[msg_area.grp_list[grp].sub_list[sub].code].hasOwnProperty('subscribed') && saved_config[msg_area.grp_list[grp].sub_list[sub].code].subscribed)) {
 					base=new MsgBase(msg_area.grp_list[grp].sub_list[sub].code);
 					if(base == undefined || sub=="NONE!!!" || (!base.open()))
 						continue;
@@ -1355,6 +1355,8 @@ function apply_seen(index)
 
 	if (index.code == 'mail')
 		return;
+	if (index === undefined)
+		return;
 	if (applied_epoch == saved_config.__config_epoch__)
 		return;
 	for(i in index.idx) {
@@ -1381,11 +1383,11 @@ function open_cfg(usr)
 		if (ch != '{') {
 			// INI file, convert...
 			read_old_cfg();
-			save_cfg();
+			save_cfg(false);
 		}
 	}
 	else {
-		save_cfg();
+		save_cfg(false);
 	}
 	unlock_cfg();
 	return true;
@@ -1488,15 +1490,17 @@ function save_cfg(lck)
 				if (saved_config[sub].Seen !== undefined) {
 					scpy = JSON.parse(JSON.stringify(saved_config[sub].Seen));
 				}
+				new_cfg[sub] = {};
 				if(scpy !== undefined) {
 					var bin = binify(scpy);
-					if (bin !== undefined || scpy !== undefined) {
-						new_cfg[sub] = {};
-					}
 					if (bin !== undefined)
 						new_cfg[sub].bseen = bin;
 					new_cfg[sub].seen = scpy;
 				}
+				if (saved_config[sub].subscribed === undefined || saved_config[sub].subscribed === false)
+					new_cfg[sub].subscribed = false;
+				else
+					new_cfg[sub].subscribed = true;
 			}
 		}
 		if (lck)
@@ -1654,8 +1658,12 @@ var authenticated_command_handlers = {
 			var sub=getsub(args[1]);
 
 			if(msg_area.sub[sub]!=undefined && msg_area.sub[sub].can_read) {
+				lock_cfg();
+				read_cfg(sub, false);
+				saved_config[sub].subscribed = true;
+				save_cfg(false);
+				unlock_cfg();
 				tagged(tag, "OK", "Subscribed...");
-				msg_area.sub[sub].scan_cfg|=SCAN_CFG_NEW;
 			}
 			else
 				tagged(tag, "NO", "Can't subscribe to that sub (what is it?)");
@@ -1668,9 +1676,12 @@ var authenticated_command_handlers = {
 			var sub=getsub(args[1]);
 
 			if(msg_area.sub[sub]!=undefined && msg_area.sub[sub].can_read) {
+				lock_cfg();
+				read_cfg(sub, false);
+				saved_config[sub].subscribed = false;
+				save_cfg(false);
+				unlock_cfg();
 				tagged(tag, "OK", "Unsubscribed...");
-				// This may leave the to you only bit set... yay.
-				msg_area.sub[sub].scan_cfg&=~SCAN_CFG_NEW;
 			}
 			else
 				tagged(tag, "NO", "Can't unsubscribe that sub (what is it?)");
@@ -1792,7 +1803,6 @@ function do_store(seq, uid, item, data)
 
 	lock_cfg();
 	read_cfg(index.code, false);
-	apply_seen(index);
 	for(i in seq) {
 		idx=index.idx[seq[i]];
 		hdr=base.get_msg_header(seq[i], /* expand_fields: */false);
@@ -1838,15 +1848,18 @@ function do_store(seq, uid, item, data)
 		lock_cfg();
 		read_cfg(base.cfg.code, false);
 		if(saved_config[base.cfg.code] == undefined) {
-			saved_config[base.cfg.code] = {};
+			saved_config[base.cfg.code] = {subscribed:false};
 		}
 		if(saved_config[base.cfg.code].Seen == undefined) {
 			saved_config[base.cfg.code].Seen = {};
 			saved_config[base.cfg.code].Seen[header.number]=0;
 		}
 		saved_config[base.cfg.code].Seen[seq[i]] ^= 1;
+		if (saved_config[base.cfg.code].Seen[seq[i]])
+			index.idx[seq[i]].attr |= MSG_READ;
+		else
+			index.idx[seq[i]].attr &= ~MSG_READ;
 		save_cfg(false);
-		apply_seen(index);
 		unlock_cfg();
 	}
 	if(changed)
@@ -2213,7 +2226,6 @@ var selected_command_handlers = {
 
 			lock_cfg();
 			read_cfg(get_base_code(base), false);
-			apply_seen(index);
 			for(i in seq) {
 				send_fetch_response(seq[i], data_items, false);
 				if (!client.socket.is_connected)
@@ -2269,7 +2281,6 @@ var selected_command_handlers = {
 					data_items=parse_data_items(args[3]);
 					lock_cfg();
 					read_cfg(get_base_code(base), false);
-					apply_seen(index);
 					for(i in seq) {
 						send_fetch_response(seq[i], data_items, true);
 						if (!client.socket.is_connected)
@@ -2330,7 +2341,7 @@ function read_old_cfg()
 		if(secs[sec].search(/\.seen$/)!=-1) {
 			this_sec = secs[sec].replace(/(?:\.seen)+$/,'');
 			if(saved_config[this_sec]==undefined)
-				saved_config[this_sec]={};
+				saved_config[this_sec]={subscribed:false};
 			saved_config[this_sec].Seen=cfgfile.iniGetObject(secs[sec]);
 			if(saved_config[this_sec].Seen==null)
 				saved_config[this_sec].Seen={};
@@ -2339,7 +2350,7 @@ function read_old_cfg()
 			got_bseen.push(secs[sec]);
 			this_sec = secs[sec].replace(/(?:\.bseen)+$/,'');
 			if(saved_config[this_sec]==undefined)
-				saved_config[this_sec]={};
+				saved_config[this_sec]={subscribed:false};
 			if(saved_config[this_sec].Seen==undefined)
 				saved_config[this_sec].Seen={};
 		}
@@ -2389,7 +2400,7 @@ function read_cfg(sub, lck)
 	if (lck)
 		lock_cfg();
 	if(saved_config[sub]==undefined)
-		saved_config[sub]={};
+		saved_config[sub]={subscribed:false};
 
 	cfgfile.rewind();
 	newfile = JSON.parse(cfgfile.read());
@@ -2403,6 +2414,10 @@ function read_cfg(sub, lck)
 				saved_config[newsub].Seen = newfile[newsub].seen;
 			else
 				saved_config[newsub].Seen = newfile[newsub].seen = {};
+			if (newfile[newsub].hasOwnProperty('subscribed'))
+				saved_config[newsub].subscribed = newfile[newsub].subscribed;
+			else
+				saved_config[newsub].subscribed = false;
 			if (newfile[newsub].hasOwnProperty('bseen')) {
 				for (i in newfile[newsub].bseen) {
 					basemsg = parseInt(i, 10);
@@ -2432,6 +2447,7 @@ function read_cfg(sub, lck)
 		if(saved_config[sub].Seen==undefined)
 			saved_config[sub].Seen={};
 	}
+	apply_seen(index);
 }
 
 js.on_exit("exit_func()");