diff --git a/exec/imapservice.js b/exec/imapservice.js
index 6a7f4f57bf7ba3bc7c0886a001b060374a0b9056..56769fc26088e38366677ebbfd398b62d2a715fe 100644
--- a/exec/imapservice.js
+++ b/exec/imapservice.js
@@ -289,9 +289,6 @@ function send_fetch_response(msgnum, fmat, uid)
 			}
 		}
 		else {
-			lock_cfg();
-			read_cfg(index.code, false);
-			apply_seen(index);
 			if(saved_config[index.code] == undefined)
 				saved_config[index.code] = {};
 			if(saved_config[index.code].Seen == undefined)
@@ -300,10 +297,8 @@ function send_fetch_response(msgnum, fmat, uid)
 				seen_changed=true;
 				saved_config[index.code].Seen[msgnum]=1;
 				applied_epoch = saved_config.__config_epoch__ + 1;
-				save_cfg(false);
 				index.idx[msgnum].attr |= MSG_READ;
 			}
-			unlock_cfg();
 			idx.attr |= MSG_READ;
 		}
 	}
@@ -1792,6 +1787,9 @@ function do_store(seq, uid, item, data)
 	var idx;
 	var changed=false;
 
+	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);
@@ -1831,6 +1829,8 @@ function do_store(seq, uid, item, data)
 			break;
 		js.gc();
 	}
+	save_cfg(false);
+	unlock_cfg();
 	if(mod_seen && base.cfg != undefined) {
 		lock_cfg();
 		read_cfg(base.cfg.code, false);
@@ -2208,6 +2208,7 @@ var selected_command_handlers = {
 			var data_items=parse_data_items(args[2]);
 			var i;
 
+			lock_cfg();
 			read_cfg(get_base_code(base), true);
 			apply_seen(index);
 			for(i in seq) {
@@ -2215,6 +2216,8 @@ var selected_command_handlers = {
 				if (!client.socket.is_connected)
 					break;
 			}
+			save_cfg(false);
+			unlock_cfg();
 			js.gc();
 			tagged(tag, "OK", "There they are!");
 		},
@@ -2261,6 +2264,7 @@ var selected_command_handlers = {
 					}
 					seq=parse_seq_set(args[2],true);
 					data_items=parse_data_items(args[3]);
+					lock_cfg();
 					read_cfg(get_base_code(base), true);
 					apply_seen(index);
 					for(i in seq) {
@@ -2268,6 +2272,8 @@ var selected_command_handlers = {
 						if (!client.socket.is_connected)
 							break;
 					}
+					save_cfg(false);
+					lock_cfg();
 					js.gc();
 					tagged(tag, "OK", "There they are (with UIDs)!");
 					break;