diff --git a/exec/importcfg.js b/exec/importcfg.js
new file mode 100755
index 0000000000000000000000000000000000000000..e069997f5a2cf1d14d47c60f24cad49156031940
--- /dev/null
+++ b/exec/importcfg.js
@@ -0,0 +1,173 @@
+// *****************************************************************
+// Import a list of configuration items (e.g. msg areas, file areas)
+// from a line-delimited JSON file (e.g. exported via exportcfg.js -json
+// *****************************************************************
+
+"use strict";
+
+var cnflib = load({}, "cnflib.js");
+var file_cnf = cnflib.read("file.cnf");
+
+var cfgtype;
+var cfgtypes = {
+	'msg-grps': 	msg_area.grp,
+	'msg-subs':		msg_area.sub,
+	'file-libs': 	file_area.lib,
+	'file-dirs':	file_area.dir,
+	'file-prots':	file_cnf.prot,
+	'file-extrs':   file_cnf.fextr,
+	'file-comps':   file_cnf.fcomp,
+	'file-viewers': file_cnf.fview,
+	'file-testers': file_cnf.ftest,
+	'file-dlevents':file_cnf.dlevent,
+	'text-secs':	file_cnf.txtsec,
+	'xtrn-secs': 	xtrn_area.sec,
+	'xtrn-progs': 	xtrn_area.prog,
+	'xtrn-events': 	xtrn_area.event,
+	'xtrn-editors':	xtrn_area.editor,
+};
+
+var cnf_fnames = {
+	'msg-grps': 	'msgs.cnf',
+	'msg-subs':		'msgs.cnf',
+	'file-libs': 	'file.cnf',
+	'file-dirs':	'file.cnf',
+	'file-prots':	'file.cnf',
+	'file-extrs':   'file.cnf',
+	'file-comps':   'file.cnf',
+	'file-viewers': 'file.cnf',
+	'file-testers': 'file.cnf',
+	'file-dlevents':'file.cnf',
+	'text-secs':	'file.cnf',
+	'xtrn-secs': 	'xtrn.cnf',
+	'xtrn-progs': 	'xtrn.cnf',
+	'xtrn-events': 	'xtrn.cnf',
+	'xtrn-editors':	'xtrn.cnf',
+};
+
+var cnf_objs = {
+	'msg-grps': 	'grp',
+	'msg-subs':		'sub',
+	'file-libs': 	'lib',
+	'file-dirs':	'dir',
+	'file-prots':	'prot',
+	'file-extrs':   'fextr',
+	'file-comps':   'fcomp',
+	'file-viewers': 'fview',
+	'file-testers': 'ftext',
+	'file-dlevents':'dlevent',
+	'text-secs':	'txtsec',
+	'xtrn-secs': 	'xtrnsec',
+	'xtrn-progs': 	'xtrn',
+	'xtrn-events': 	'event',
+	'xtrn-editors':	'xedit',
+};
+
+var filename;
+
+function usage(msg)
+{
+	if(msg) {
+		writeln();
+		alert(msg);
+		writeln();
+	}
+	writeln("usage: importcfg.js [-overwrite] [-debug] <cfg-type> <filename>");
+	writeln();
+	writeln("cfg-types (choose one):");
+	for(var c in cfgtypes)
+		writeln("\t" + c);
+	writeln();
+	exit(0);
+}
+
+var options = {};
+for(var i = 0; i < argc; i++) {
+	var arg = argv[i];
+	if(arg.charAt(0) == '-')
+		options[arg.slice(1)] = true;
+	else {
+		if(cfgtype === undefined) {
+			if(cfgtypes[arg] === undefined)
+				usage("unsupported cfg-type: " + arg);
+			cfgtype = arg;
+		} else
+			filename = arg;
+	}
+}
+
+if(!cfgtype)
+	usage("cfg-type not specified");
+
+var file;
+if(filename) {
+	file = new File(filename);
+	writeln("Opening " + filename);
+	if(!file.open("r")) {
+		alert("ERROR " + file.error + " opening " + file.name);
+		exit(1);
+	}
+}
+else {
+	writeln("Reading from stdin");
+	file = stdin;
+}
+
+var text = file.readAll(64*1024);
+var list = [];
+for(var i in text) {
+	var obj;
+	try {
+		obj = JSON.parse(text[i]);
+	} catch(e) {
+		alert("line " + (Number(i) + 1));
+		alert(e);
+		exit(1);
+	}
+	list.push(obj);
+}
+
+/* Add list of imported objects into the .cnf file */
+const cnf_obj = cnf_objs[cfgtype];
+const cnf_fname = system.ctrl_dir + cnf_fnames[cfgtype];
+var cnf = cnflib.read(cnf_fname);
+if(!cnf) {
+	alert("Failed to read " + cnf_fname);
+	exit(-1);
+}
+
+for(var i in list) {
+	var obj = list[i];
+	var j;
+	for(j = 0; j < cnf[cnf_obj].length; j++) {
+		if(cnf[cnf_obj][j].code !== undefined) {
+			if(cnf[cnf_obj][j].code == obj.code)
+				break;
+		} else {
+			if(cnf[cnf_obj][j].name == obj.name)
+				break;
+		}
+	}
+	if(j < cnf[cnf_obj].length) {
+		if(!options.overwrite) {
+			writeln("Already exists: " + (obj.name || obj.code));
+			continue;
+		}
+		writeln("Overwriting: " + (obj.name || obj.code));
+		cnf[cnf_obj][j] = obj;
+	} else {
+		writeln("Adding: " + (obj.name || obj.code));
+		cnf[cnf_obj].push(obj);
+	}
+}
+
+if(options.debug)
+	writeln(JSON.stringify(cnf[cnf_obj], null, 4));
+else {
+	writln("Saving changes to " + cnf_fname);
+	if(!cnflib.write(cnf_fname, undefined, cnf)) {
+		alert("Failed to write " + cnf_fname);
+		exit(-1);
+	}
+}
+exit(0);