diff --git a/exec/automsg.js b/exec/automsg.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5cde80904580a8bfffc72a16ddb1e25ba056cba
--- /dev/null
+++ b/exec/automsg.js
@@ -0,0 +1,67 @@
+// $Id$
+// vi: tabstop=4
+
+"use strict";
+
+require("text.js", 'AutoMsg');
+require("userdefs.js", 'UFLAG_W');
+require("sbbsdefs.js", 'P_NOABORT');
+
+function automsg()
+{
+	const quote_fmt=" > %.*s\r\n";
+	var automsg = system.data_dir + "msgs/auto.msg";
+	while(bbs.online && !js.termiated) {
+		bbs.nodesync();
+		console.mnemonics(bbs.text(AutoMsg));
+		switch(console.getkeys("RWQ",0)) {
+			case 'R':
+				console.printfile(automsg,P_NOABORT|P_NOATCODES|P_WORDWRAP);
+				break;
+			case 'W':
+				if(user.security.restrictions&UFLAG_W) {
+					console.print(text[R_AutoMsg]);
+					break;
+				}
+				bbs.action=NODE_AMSG;
+				bbs.nodesync();
+				console.print("\r\nMaximum of 3 lines:\r\n");
+				var str = console.getstr(str, 76, K_WRAP|K_MSG);
+				if(!str)
+					break;
+				var buf = format(quote_fmt, 79, str);
+				str = console.getstr(str, 76, K_WRAP|K_MSG);
+				if(str) {
+					buf += format(quote_fmt, 79, str);
+					str = console.getstr(str, 76, K_MSG);
+					if(str) {
+						buf += format(quote_fmt, 79, str);
+					}
+				}
+				if(console.yesno(bbs.text(OK))) {
+					var anon = false;
+					if(user.security.exemptions&UFLAG_A) {
+						if(!console.noyes(bbs.text(AnonymousQ)))
+							anon = true;
+					}
+					var file = new File(automsg);
+					if(!file.open("w")) {
+						alert("Error " + file.error + " opening " + file.name);
+						return;
+					}
+					var tmp = format("%s #%d", user.alias, user.number);
+					if(anon)
+						tmp = bbs.text(Anonymous);
+					str = format(bbs.text(AutoMsgBy), tmp, system.timestr());
+					file.write(str);
+					file.write(buf);
+					file.close();
+				}
+				break;
+			case 'Q':
+				return;
+		}
+	}
+}
+
+automsg();