diff --git a/exec/chat_sec.js b/exec/chat_sec.js
index 30adad7bdbd7ac238d932d0eabc4078e5c697977..9f41eeff0273bbea06be5a2c2b092175df90cc46 100644
--- a/exec/chat_sec.js
+++ b/exec/chat_sec.js
@@ -1,35 +1,38 @@
-// chat_sec.js
+// $Id$
 
 // Chat Section for any/all Synchronet command shells
 
-// $Id$
+"use strict";
 
-load("sbbsdefs.js");
-load("nodedefs.js");
+require("sbbsdefs.js", 'USER_EXPERT');
+require("nodedefs.js", 'NODE_CHAT');
+require("text.js", 'R_Chat');
 
 // Over-ride these default values by creating/modifying the [chat_sec] section in your ctrl/modopts.ini file
-var irc_server = "irc.synchro.net 6667";
-var irc_channel = "#Synchronet"
-var irc_seclevel = 90;  // Minimum security level required to change the IRC server being connected to
-var finger = true;
 var options = load("modopts.js", "chat_sec");
-if (options) {
-    if (options.irc_server)
-        irc_server = options.irc_server;
-    if (options.irc_channel)
-        irc_channel = options.irc_channel;
-    if (options.irc_seclevel)
-        irc_seclevel = options.irc_seclevel;
-	if (options.finger != undefined)
-		finger = options.finger;
-}
-var cmdkey;
+if (!options)
+	options = {};
+if (options.irc === undefined)
+	options.irc = true;
+if (options.irc_server === undefined)
+	options.irc_server = "irc.synchro.net 6667";
+if (options.irc_channel === undefined)
+	options.irc_channel = "#Synchronet";
+if (options.irc_seclevel === undefined)
+	options.irc_seclevel = 90;
+if (options.finger === undefined)
+	options.finger = true;
 
-if(user.compare_ars("rest C")) {
-    write("\r\nYou can't chat.\r\n");
+if(user.security.restrictions & UFLAG_C) {
+    write(bbs.text(R_Chat));
 	exit(0);
 }
 
+function on_or_off(on)
+{
+	return bbs.text(on ? ON : OFF);
+}
+
 // Set continue point for main menu commands
 menu:
 while(1) {
@@ -41,57 +44,56 @@ while(1) {
 	}
 
 	// Update node status
-	bbs.node_action=NODE_CHAT;
+	bbs.node_action = NODE_CHAT;
 	bbs.nodesync();
-	write("\r\n\001_\1y\001hChat: \001n");
+	write("\r\n\x01_\x01y\x01hChat: \x01n");
 
-	var keys = "ACDIJPQRST?\r";
-	if(finger)
+	var keys = "ACDJLPQRST?\r";
+	if(options.irc)
+		keys += "I";
+	if(options.finger)
 		keys += "F";
-	switch(cmdkey=console.getkeys(keys,K_UPPER)) {
+	switch(console.getkeys(keys, K_UPPER)) {
 		case "S":
 			var val = user.chat_settings ^= CHAT_SPLITP;
-			write("\001n\r\nPrivate split-screen chat is now: \001h");
-			write((val & CHAT_SPLITP)?"ON\001n":"OFF\001n");
-			writeln("");
+			write("\x01n\r\nPrivate split-screen chat is now: \x01h");
+			writeln(on_or_off(val & CHAT_SPLITP));
 			break;
 		case "A":
 			var val = user.chat_settings ^= CHAT_NOACT;
-			write("\001n\r\nNode activity alerts are now: \001h");
-			write((val & CHAT_NOACT)?"OFF\001n":"ON\001n");
+			write("\x01n\r\nNode activity alerts are now: \x01h");
+			writeln(on_or_off(!(val & CHAT_NOACT)));
 			system.node_list[bbs.node_num-1].misc ^= NODE_AOFF;
-			writeln("");
 			break;
 		case 'D':
 			var val = user.chat_settings ^= CHAT_NOPAGE;
-			write("\001n\r\nNode chat-page ability is now: \001h");
-			write((val & CHAT_NOPAGE)?"OFF\001n":"ON\001n");
+			write("\x01n\r\nUser chat/messaging availability is now: \x01h");
+			writeln(on_or_off(!(val & CHAT_NOPAGE)));
 			system.node_list[bbs.node_num-1].misc ^= NODE_POFF;
-			writeln("");
 			break;
 		case 'F':
 			writeln("");
-			bbs.exec("?finger");
+			load("finger.js");
 			break;
 		case 'I':
 			writeln("");
-			bbs.exec("?sbbsimsg");
+			load("sbbsimsg.js");
 			break;
 		case 'R':
-			{
-                var server=irc_server;
-				if(user.security.level >= irc_seclevel || user.security.exemptions&UFLAG_C) {
-					write("\r\n\001n\001y\001hIRC Server: ");
-					server=console.getstr(irc_server, 40, K_EDIT|K_LINE|K_AUTODEL);
-					if(console.aborted)
-						break;
-				}
-				write("\r\n\001n\001y\001hIRC Channel: ");
-				var channel=console.getstr(irc_channel, 40, K_EDIT|K_LINE|K_AUTODEL);
-				if(!console.aborted)
-					bbs.exec("?irc -a " + server + " " + channel);
+		{
+			var server=options.irc_server;
+			if(user.security.level >= options.irc_seclevel || user.security.exemptions&UFLAG_C) {
+				write("\r\n\x01n\x01y\x01hIRC Server: ");
+				server=console.getstr(options.irc_server, 40, K_EDIT|K_LINE|K_AUTODEL);
+				if(console.aborted)
+					break;
 			}
+			write("\r\n\x01n\x01y\x01hIRC Channel: ");
+			var channel=console.getstr(options.irc_channel, 40, K_EDIT|K_LINE|K_AUTODEL);
+			if(!console.aborted)
+				bbs.exec("?irc -a " + server + " " + channel); // can't be load()ed because it calls exit()
 			break;
+		}
 		case 'J':
 			bbs.multinode_chat();
 			break;