diff --git a/src/sbbs3/Makefile b/src/sbbs3/Makefile
index 75064cfb30f53e4447760f168e04a1d540f82145..eb2e8c3f6118ae68feea6b74548d765d3a38c853 100644
--- a/src/sbbs3/Makefile
+++ b/src/sbbs3/Makefile
@@ -23,7 +23,7 @@ CFLAGS = $(CFLAGS) -DJAVASCRIPT
 !ifdef JSINCLUDE
 	CFLAGS = $(CFLAGS) -I$(JSINCLUDE)
 !else
-	CFLAGS = $(CFLAGS) -I$(SRC_ROOT)\..\include\mozilla\js
+	CFLAGS = $(CFLAGS) -I$(SRC_ROOT)\..\lib\js\win32\include\js
 !endif
 !ifdef NSPRINCLUDE
 	CFLAGS = $(CFLAGS) -I$(NSPRINCLUDE)
diff --git a/src/sbbs3/answer.cpp b/src/sbbs3/answer.cpp
index 178a29c7d29b6b646415ead6f52d3a0ccad21c4a..7770429c9d368a587366f00338e149ca32e43bb1 100644
--- a/src/sbbs3/answer.cpp
+++ b/src/sbbs3/answer.cpp
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2012 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2014 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -97,24 +97,24 @@ bool sbbs_t::answer()
 				terminal[i]=in;
 			}
 			terminal[i]=0;
-			truncstr(terminal,"/");
 			lprintf(LOG_DEBUG,"Node %d RLogin: '%.*s' / '%.*s' / '%s'"
 				,cfg.node_num
 				,LEN_ALIAS*2,str
 				,LEN_ALIAS*2,str2
 				,terminal);
-			SAFECOPY(rlogin_name
-				,startup->options&BBS_OPT_USE_2ND_RLOGIN ? str2 : str);
-			SAFECOPY(rlogin_pass
-				,startup->options&BBS_OPT_USE_2ND_RLOGIN ? str : str2);
+			SAFECOPY(rlogin_term, terminal);
+			SAFECOPY(rlogin_name, str2);
+			SAFECOPY(rlogin_pass, str);
+			/* Truncate terminal speed (e.g. "/57600") from terminal-type string 
+			   (but keep full terminal type/speed string in rlogin_term): */
+			truncstr(terminal,"/");	
 			useron.number=userdatdupe(0, U_ALIAS, LEN_ALIAS, rlogin_name);
 			if(useron.number) {
 				getuserdat(&cfg,&useron);
 				useron.misc&=~TERM_FLAGS;
 				SAFEPRINTF(path,"%srlogin.cfg",cfg.ctrl_dir);
 				if(!findstr(client.addr,path)) {
-					SAFECOPY(tmp
-						,rlogin_pass);
+					SAFECOPY(tmp, rlogin_pass);
 					for(i=0;i<3;i++) {
 						if(stricmp(tmp,useron.pass)) {
 							badlogin(useron.alias, tmp);
diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp
index ab113e127d93a8db75c3e10a5e6c05e3af96cda6..d1bfce1430361d306a643341d1acf6e2d3056135 100644
--- a/src/sbbs3/js_bbs.cpp
+++ b/src/sbbs3/js_bbs.cpp
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2013 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2014 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -85,6 +85,7 @@ enum {
 	,BBS_PROP_CONNECTION		/* READ ONLY */
 	,BBS_PROP_RLOGIN_NAME
 	,BBS_PROP_RLOGIN_PASS
+	,BBS_PROP_RLOGIN_TERM
 	,BBS_PROP_CLIENT_NAME
 
 	,BBS_PROP_ALTUL
@@ -394,6 +395,9 @@ static JSBool js_bbs_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
 		case BBS_PROP_RLOGIN_PASS:
 			p=sbbs->rlogin_pass;
 			break;
+		case BBS_PROP_RLOGIN_TERM:
+			p=sbbs->rlogin_term;
+			break;
 		case BBS_PROP_CLIENT_NAME:
 			p=sbbs->client_name;
 			break;
@@ -807,6 +811,9 @@ static JSBool js_bbs_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, j
 		case BBS_PROP_RLOGIN_PASS:
 			SAFECOPY(sbbs->rlogin_pass,p);
 			break;
+		case BBS_PROP_RLOGIN_TERM:
+			SAFECOPY(sbbs->rlogin_term,p);
+			break;
 		case BBS_PROP_CLIENT_NAME:
 			SAFECOPY(sbbs->client_name,p);
 			break;
@@ -883,6 +890,7 @@ static jsSyncPropertySpec js_bbs_properties[] = {
 	{	"connection"		,BBS_PROP_CONNECTION	,PROP_READONLY		,310},
 	{	"rlogin_name"		,BBS_PROP_RLOGIN_NAME	,JSPROP_ENUMERATE	,310},
 	{	"rlogin_password"	,BBS_PROP_RLOGIN_PASS	,JSPROP_ENUMERATE	,315},
+	{	"rlogin_terminal"	,BBS_PROP_RLOGIN_TERM	,JSPROP_ENUMERATE	,316},
 	{	"client_name"		,BBS_PROP_CLIENT_NAME	,JSPROP_ENUMERATE	,310},
 	{	"alt_ul_dir"		,BBS_PROP_ALTUL			,JSPROP_ENUMERATE	,310},
 	{	"errorlevel"		,BBS_PROP_ERRORLEVEL	,PROP_READONLY		,312},
@@ -2628,15 +2636,15 @@ js_telnet_gate(JSContext *cx, uintN argc, jsval *arglist)
 static JSBool
 js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist)
 {
-	jsval *argv=JS_ARGV(cx, arglist);
+	jsval*		argv=JS_ARGV(cx, arglist);
+	uintN		argn;
 	char*		addr;
-	char*		alias=NULL;
-	char*		pass=NULL;
+	char*		client_user_name=NULL;
+	char*		server_user_name=NULL;
+	char*		term_type=NULL;
 	bool		fail = false;
 	int32		mode = 0;
-	JSString*	js_addr;
-	JSString*	js_alias;
-	JSString*	js_pass;
+	JSString*	js_str;
 	sbbs_t*		sbbs;
 	jsrefcount	rc;
 
@@ -2648,47 +2656,43 @@ js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist)
 	if((sbbs=js_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if((js_addr=JS_ValueToString(cx, argv[0]))==NULL) 
+	if((js_str=JS_ValueToString(cx, argv[0]))==NULL) 
 		return(JS_FALSE);
 
-	JSSTRING_TO_MSTRING(cx, js_addr, addr, NULL);
+	JSSTRING_TO_MSTRING(cx, js_str, addr, NULL);
 	if(addr==NULL) 
 		return(JS_FALSE);
 
-	/* if remote username & password supplied */
-	if(argc>2) {
-	
-		if((js_alias=JS_ValueToString(cx, argv[1]))==NULL) {
-			fail = true;
-		}
-			
-		if((js_pass=JS_ValueToString(cx, argv[2]))==NULL) {
-			fail = true;
-		}
-
-		JSSTRING_TO_MSTRING(cx, js_alias, alias, NULL);
-		JSSTRING_TO_MSTRING(cx, js_pass, pass, NULL);
-		
-		if(argc>3 && JSVAL_IS_NUMBER(argv[3])) {
-			if(!JS_ValueToInt32(cx,argv[3],&mode)) {
+	/* Parse optional arguments if provided */
+	for(argn=1; argn<argc; argn++) {
+		if(JSVAL_IS_STRING(argv[argn])) {
+			if((js_str=JS_ValueToString(cx, argv[argn]))==NULL) {
 				fail = true;
+				break;
+			}
+			if(client_user_name==NULL) {	
+				JSSTRING_TO_MSTRING(cx, js_str, client_user_name, NULL);
+			} else if(server_user_name==NULL) {
+				JSSTRING_TO_MSTRING(cx, js_str, server_user_name, NULL);
+			} else if(term_type==NULL) {
+				JSSTRING_TO_MSTRING(cx, js_str, term_type, NULL);
+			}
+		} else if(JSVAL_IS_NUMBER(argv[argn])) {
+			if(!JS_ValueToInt32(cx,argv[argn],&mode)) {
+				fail = true;
+				break;
 			}
 		}
 	}
-	else if(argc>1 && JSVAL_IS_NUMBER(argv[1])) {
-		if(!JS_ValueToInt32(cx,argv[1],&mode)) {
-			fail = true;
-		}
-	}
-	
 	if(!fail) {
 		rc=JS_SUSPENDREQUEST(cx);
-		sbbs->telnet_gate(addr,mode|TG_RLOGIN,alias,pass);
+		sbbs->telnet_gate(addr,mode|TG_RLOGIN,client_user_name,server_user_name,term_type);
 		JS_RESUMEREQUEST(cx, rc);
 	}
 	FREE_AND_NULL(addr);
-	FREE_AND_NULL(alias);
-	FREE_AND_NULL(pass);
+	FREE_AND_NULL(client_user_name);
+	FREE_AND_NULL(server_user_name);
+	FREE_AND_NULL(term_type);
 	
 	return(fail ? JS_FALSE : JS_TRUE);
 }
@@ -3757,10 +3761,10 @@ static jsSyncMethodSpec js_bbs_functions[] = {
 	,310
 	},		
 	{"telnet_gate",		js_telnet_gate,		1,	JSTYPE_VOID,	JSDOCSTR("address [,mode=<tt>TG_NONE</tt>]")
-	,JSDOCSTR("external telnet/rlogin gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> bits)")
+	,JSDOCSTR("external Telnet gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> bits)")
 	,310
 	},		
-	{"rlogin_gate",		js_rlogin_gate,		1,	JSTYPE_VOID,	JSDOCSTR("address [,user=<tt>user.alias</tt>,pass=<tt>user.pass</tt>,mode=<tt>TG_NONE</tt>]")
+	{"rlogin_gate",		js_rlogin_gate,		1,	JSTYPE_VOID,	JSDOCSTR("address [,client-user-name=<tt>user.alias</tt>, server-user-name=<tt>user.name</tt>, terminal=<tt>console.terminal</tt>] [,mode=<tt>TG_NONE</tt>]")
 	,JSDOCSTR("external RLogin gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> bits)")
 	,316
 	},		
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index a19bf7b4ce5e8fc646b36868e8bf91c9f2f9abd4..5c46f92abc328424bddf13a629c61a38f0c7873d 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -2941,6 +2941,7 @@ sbbs_t::sbbs_t(ushort node_num, SOCKADDR_IN addr, const char* name, SOCKET sd,
 	terminal[0]=0;
 	rlogin_name[0]=0;
 	rlogin_pass[0]=0;
+	rlogin_term[0]=0;
 
 	/* Init some important variables */
 
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 62f9af34cfaf50a23f78805716167f0ed1f7a7cd..67a120f0f5f78d8ac2f00d00bdedc732ab2ce886 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2013 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2014 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -385,6 +385,7 @@ public:
 	smb_t	smb;			/* Currently open message base */
 	char	rlogin_name[LEN_ALIAS+1];
 	char	rlogin_pass[LEN_PASS+1];
+	char	rlogin_term[TELNET_TERM_MAXLEN+1];	/* RLogin passed terminal type/speed (e.g. "xterm/57600") */
 
 	uint	temp_dirnum;
 
@@ -938,7 +939,7 @@ public:
 	void	catsyslog(int crash);
 
 	/* telgate.cpp */
-	void	telnet_gate(char* addr, ulong mode, char* name=NULL, char* passwd=NULL);	// See TG_* for mode bits
+	void	telnet_gate(char* addr, ulong mode, char* client_user_name=NULL, char* server_user_name=NULL, char* term_type=NULL);	// See TG_* for mode bits
 
 };
 
diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index eb787acb8129b55c538a335b0f354664cdd1098d..7bd3388de034894ea38c920205cc53f3d12b5d04 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -778,7 +778,7 @@ enum {							/* readmail and delmailidx which types		*/
 #define TG_RLOGIN		(1<<6)	/* Use BSD RLogin protocol					*/
 #define TG_NOCHKTIME	(1<<7)	/* Don't check time left while gated		*/
 #define TG_NOTERMTYPE	(1<<8)	/* Request client "DONT TERM_TYPE"			*/
-#define TG_SENDPASS		(1<<9)	/* Send password instead of real name (RLogin)	*/
+#define TG_SENDPASS		(1<<9)	/* Send password instead of real name (RLogin) - DEPRECATED	(it sent the password as the server user name) */
 #define TG_NOLF			(1<<10)	/* Do not send line-feeds (opposite of TG_CRLF) */
 								
 enum {							/* Values for 'mode' in listfileinfo        */
diff --git a/src/sbbs3/startup.h b/src/sbbs3/startup.h
index d5c46cebab85430d6975519ae387ba783e8190ed..d5f20c42c3e5d41c27c56e8335e3fac174a2b636 100644
--- a/src/sbbs3/startup.h
+++ b/src/sbbs3/startup.h
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2014 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -167,7 +167,7 @@ static struct init_field {
 #define BBS_OPT_DEBUG_TELNET		(1<<3)	/* Debug telnet commands			*/
 #define BBS_OPT_SYSOP_AVAILABLE		(1<<4)	/* Available for chat				*/
 #define BBS_OPT_ALLOW_RLOGIN		(1<<5)	/* Allow logins via BSD RLogin		*/
-#define BBS_OPT_USE_2ND_RLOGIN		(1<<6)	/* Use 2nd username in BSD RLogin	*/
+#define BBS_OPT_USE_2ND_RLOGIN		(1<<6)	/* Use 2nd username in BSD RLogin - DEPRECATED (Always enabled)	*/
 #define BBS_OPT_NO_QWK_EVENTS		(1<<7)	/* Don't run QWK-related events		*/
 #define BBS_OPT_NO_TELNET_GA		(1<<8)	/* Don't send periodic Telnet GAs	*/
 #define BBS_OPT_NO_EVENTS			(1<<9)	/* Don't run event thread			*/
@@ -191,7 +191,6 @@ static ini_bitdesc_t bbs_options[] = {
 	{ BBS_OPT_DEBUG_TELNET			,"DEBUG_TELNET"			},
 	{ BBS_OPT_SYSOP_AVAILABLE		,"SYSOP_AVAILABLE"		},
 	{ BBS_OPT_ALLOW_RLOGIN			,"ALLOW_RLOGIN"			},
-	{ BBS_OPT_USE_2ND_RLOGIN		,"USE_2ND_RLOGIN"		},
 	{ BBS_OPT_NO_QWK_EVENTS			,"NO_QWK_EVENTS"		},
 	{ BBS_OPT_NO_TELNET_GA			,"NO_TELNET_GA"			},
 	{ BBS_OPT_NO_EVENTS				,"NO_EVENTS"			},
diff --git a/src/sbbs3/telgate.cpp b/src/sbbs3/telgate.cpp
index c7ea0f3607b12151342b8434f0078629e26fde96..5cfa402f3b90e491884ea0346675c438302fe1d6 100644
--- a/src/sbbs3/telgate.cpp
+++ b/src/sbbs3/telgate.cpp
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2013 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2014 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -38,7 +38,7 @@
 #include "sbbs.h"
 #include "telnet.h" 
 
-void sbbs_t::telnet_gate(char* destaddr, ulong mode, char* name, char* passwd)
+void sbbs_t::telnet_gate(char* destaddr, ulong mode, char* client_user_name, char* server_user_name, char* term_type)
 {
 	char*	p;
 	uchar	buf[512];
@@ -121,17 +121,14 @@ void sbbs_t::telnet_gate(char* destaddr, ulong mode, char* name, char* passwd)
 	if(mode&TG_RLOGIN) {
 		p=(char*)buf;
 		*(p++)=0;
-		p+=sprintf(p,"%s",name==NULL ? useron.alias : name);
+		p+=sprintf(p,"%s",client_user_name==NULL ? useron.alias : client_user_name);
 		p++;	// Add NULL
-		if(passwd!=NULL)
-			p+=sprintf(p,"%s",passwd);
-		else if(mode&TG_SENDPASS) {
-			p+=sprintf(p,"%s",useron.pass);
-		} else {
-			p+=sprintf(p,"%s",useron.name);
-		}
+		p+=sprintf(p,"%s",server_user_name==NULL ? useron.name : server_user_name);
 		p++;	// Add NULL
-		p+=sprintf(p,"%s/57600",terminal);
+		if(term_type!=NULL)
+			p+=sprintf(p,"%s",term_type);
+		else
+			p+=sprintf(p,"%s/%u",terminal, cur_rate);
 		p++;	// Add NULL
 		l=p-(char*)buf;
 		sendsocket(remote_socket,(char*)buf,l);