diff --git a/exec/scrubmsgs.js b/exec/scrubmsgs.js
new file mode 100644
index 0000000000000000000000000000000000000000..6d62ec9121468e091ea650a811dde7c08855dc44
--- /dev/null
+++ b/exec/scrubmsgs.js
@@ -0,0 +1,85 @@
+// $Id$
+
+// Scrub msg headers of invalid control characters (sign of corruption) in one or more message bases
+
+var debug = false;
+var scan_only = false;
+
+var hfields_to_scrub = [
+	"subject",
+	"id",
+	"reply_id",
+	"ftn_msgid",
+	"ftn_reply",
+	"to",
+	"to_ext",
+	"to_net_addr",
+	"from",
+	"from_ext",
+	"from_org",
+	"from_net_addr",
+];
+
+function scrub_base(msgbase)
+{
+	var count = 0;
+	var total_msgs = msgbase.total_msgs;
+	for(var n = 0; n < total_msgs && !js.terminated; n++) {
+		var hdr = msgbase.get_msg_header(/* by_offset: */true, n, /* expand_fields: */false);
+		if(!hdr) {
+			if(debug)
+				alert("Error " + msgbase.last_error + " reading message #" + (n+1));
+			continue;
+		}
+		var copy = JSON.stringify(hdr);
+//		print(copy);
+		for(var f in hfields_to_scrub) {
+			if(hdr[hfields_to_scrub[f]] != undefined)
+				hdr[hfields_to_scrub[f]] = strip_ctrl(hdr[hfields_to_scrub[f]]);
+		}
+		if(JSON.stringify(hdr) != copy) {
+			print("Corrupted message header #" + (n + 1));
+			print(JSON.stringify(hdr, null, 4));
+			if(scan_only)
+				count++;
+			else {
+				if(!msgbase.put_msg_header(/* by_offset: */true, n, hdr)) {
+					alert(msgbase.last_error);
+				} else {
+					count++;
+				}
+			}
+		}
+	}
+	return count;
+}
+
+function open_and_scrub_base(code)
+{
+	var msgbase = new MsgBase(code);
+
+	if(!msgbase.open()) {
+		alert("Error opening " + code + " " + msgbase.last_error);
+		return false;
+	}
+	print("Scanning " + msgbase.file);
+	var result = scrub_base(msgbase);
+	msgbase.close();
+	if(result > 0)
+		print(result + " corrupted messages headers found");
+	return result;
+}
+
+for(var i in argv) {
+	switch(argv[i]) {
+		case '-debug':
+			debug = true;
+			break;
+		case '-scan':
+			scan_only = true;
+			break;
+		default:
+			open_and_scrub_base(argv[i]);
+			break;
+	}
+}