diff --git a/exec/logon.js b/exec/logon.js
index 6b90cd5196dcfd812d7b17ea91322f478c60d865..776f6e9b8b05b1efce39466b15845dda8f052048 100644
--- a/exec/logon.js
+++ b/exec/logon.js
@@ -138,73 +138,74 @@ if(user.security.exemptions&UFLAG_H)
 /******************************
 * Replaces the 2.1 Logon stuff
 ******************************/
+if (!(bbs.sys_status&SS_RLOGIN) || options.rlogin_xtrn_logon !== false) {
+	if(options.fast_logon !== true || !(bbs.sys_status&SS_FASTLOGON)
+		|| !user.compare_ars(options.fast_logon_requirements)) {
+
+		// Logon screens
+
+		// Print successively numbered logon screens (logon, logon1, logon2, etc.)
+		var highest_printed_logon_screen=-1;
+		for(var i=0;;i++) {
+			var fname="logon";
+			if(i)
+				fname+=i;
+			if(!bbs.menu_exists(fname)) {
+				if(i>1)
+					break;
+				continue;
+			}
+			bbs.menu(fname);
+			highest_printed_logon_screen = i;
+		}
 
-if(options.fast_logon !== true || !(bbs.sys_status&SS_FASTLOGON)
-	|| !user.compare_ars(options.fast_logon_requirements)) {
+		// Print logon screens based on security level
+		if(user.security.level > highest_printed_logon_screen
+			&& bbs.menu_exists("logon" + user.security.level))
+			bbs.menu("logon" + user.security.level);
 
-	// Logon screens
+		// Print one of text/menu/random*.*, picked at random
+		// e.g. random1.asc, random2.asc, random3.asc, etc.
+		bbs.menu("random*");
 
-	// Print successively numbered logon screens (logon, logon1, logon2, etc.)
-	var highest_printed_logon_screen=-1;
-	for(var i=0;;i++) {
-		var fname="logon";
-		if(i)
-			fname+=i;
-		if(!bbs.menu_exists(fname)) {
-			if(i>1)
-				break;
-			continue;
-		}
-		bbs.menu(fname);
-		highest_printed_logon_screen = i;
+		console.clear(LIGHTGRAY);
+		bbs.user_event(EVENT_LOGON);
 	}
 
-	// Print logon screens based on security level
-	if(user.security.level > highest_printed_logon_screen
-		&& bbs.menu_exists("logon" + user.security.level))
-		bbs.menu("logon" + user.security.level);
-
-	// Print one of text/menu/random*.*, picked at random
-	// e.g. random1.asc, random2.asc, random3.asc, etc.
-	bbs.menu("random*");
+	if(user.security.level==99				/* Sysop logging on */
+		&& !system.matchuser("guest")		/* Guest account does not yet exist */
+		&& bbs.mods.userprops.get("logon", "makeguest", true) /* Sysop has not asked to stop this question */
+		) {
+		if(console.yesno("\x01?Create Guest/Anonymous user account (highly recommended)"))
+			load("makeguest.js");
+		else if(!console.yesno("Ask again later")) {
+			bbs.mods.userprops.set("logon", "makeguest", false);
+			console.crlf();
+		}
+	}
 
+	// Last few callers
+	console.aborted=false;
 	console.clear(LIGHTGRAY);
-	bbs.user_event(EVENT_LOGON);
-}
-
-if(user.security.level==99				/* Sysop logging on */
-	&& !system.matchuser("guest")		/* Guest account does not yet exist */
-	&& bbs.mods.userprops.get("logon", "makeguest", true) /* Sysop has not asked to stop this question */
-	) {
-	if(console.yesno("\x01?Create Guest/Anonymous user account (highly recommended)"))
-		load("makeguest.js");
-	else if(!console.yesno("Ask again later")) {
-		bbs.mods.userprops.set("logon", "makeguest", false);
-		console.crlf();
+	if(options.show_logon_list === true)
+		bbs.exec("?logonlist -l");
+	if(bbs.node_status != NODE_QUIET && ((system.settings&SYS_SYSSTAT) || !user.is_sysop))
+		bbs.mods.logonlist_lib.add();
+
+	// Auto-message
+	const auto_msg = system.data_dir + "msgs/auto.msg"
+	if(file_size(auto_msg)>0) {
+		console.printfile(auto_msg,P_NOATCODES|P_WORDWRAP);
+	}
+	console.crlf();
+
+	if(options.show_avatar && console.term_supports(USER_ANSI)) {
+		if(options.draw_avatar_above || options.draw_avatar_right)
+			bbs.mods.avatar_lib.draw(user.number, /* name: */null, /* netaddr: */null, options.draw_avatar_above, options.draw_avatar_right);
+		else
+			bbs.mods.avatar_lib.show(user.number);
+		console.attributes = 7;	// Clear the background attribute
 	}
-}
-
-// Last few callers
-console.aborted=false;
-console.clear(LIGHTGRAY);
-if(options.show_logon_list === true)
-	bbs.exec("?logonlist -l");
-if(bbs.node_status != NODE_QUIET && ((system.settings&SYS_SYSSTAT) || !user.is_sysop))
-	bbs.mods.logonlist_lib.add();
-
-// Auto-message
-const auto_msg = system.data_dir + "msgs/auto.msg"
-if(file_size(auto_msg)>0) {
-	console.printfile(auto_msg,P_NOATCODES|P_WORDWRAP);
-}
-console.crlf();
-
-if(options.show_avatar && console.term_supports(USER_ANSI)) {
-	if(options.draw_avatar_above || options.draw_avatar_right)
-		bbs.mods.avatar_lib.draw(user.number, /* name: */null, /* netaddr: */null, options.draw_avatar_above, options.draw_avatar_right);
-	else
-		bbs.mods.avatar_lib.show(user.number);
-	console.attributes = 7;	// Clear the background attribute
 }
 
 // Set rlogin_xtrn_menu=true in [logon] section of ctrl/modopts.ini
@@ -214,7 +215,17 @@ if(options.rlogin_xtrn_menu
 	var xtrn_sec;
 	if (console.terminal.indexOf("xtrn_sec=") === 0)
 		xtrn_sec = console.terminal.substring(9);
-	bbs.xtrn_sec(xtrn_sec);
+	while(bbs.online && !js.terminated) {
+		bbs.xtrn_sec(xtrn_sec);
+		if (!options.rlogin_xtrn_logoff)
+			break;
+		if (options.rlogin_xtrn_logoff == "full")
+			bbs.logoff(/* prompt: */true);
+		else {
+			if (console.yesno(bbs.text("LogOffQ")))
+				break;
+		}
+	}
 	bbs.hangup();
 } else if(!(user.security.restrictions&UFLAG_G)
 	&& console.term_supports(USER_ANSI)