diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 25e31e1d7981ad56f007f353bdd52d87c8931636..62f9af34cfaf50a23f78805716167f0ed1f7a7cd 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 2012 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2013 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				*
@@ -938,8 +938,7 @@ public:
 	void	catsyslog(int crash);
 
 	/* telgate.cpp */
-	void	telnet_gate(char* addr, ulong mode);	// See TG_* for mode bits
-	void	rlogin_gate(char* addr, char* alias, char* pw, ulong mode);	// See TG_* for mode bits
+	void	telnet_gate(char* addr, ulong mode, char* name=NULL, char* passwd=NULL);	// See TG_* for mode bits
 
 };
 
diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index 0dc8a81caa1fc0c561913269825012090ca9d93b..9dd270e75dab0ae342117c9f3a7349e865a168f1 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.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 2012 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2013 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				*
@@ -777,6 +777,8 @@ 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_NOLF			(1<<10)	/* Do not send line-feeds (opposite of TG_CRLF) */
 								
 enum {							/* Values for 'mode' in listfileinfo        */
 	 FI_INFO            		/* Just list file information               */
diff --git a/src/sbbs3/telgate.cpp b/src/sbbs3/telgate.cpp
index ad8ece69085d86476ea38a09b5643660b5b38f30..a4fb9409c597a70c9ee534602a0f0f521e703d3f 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 2011 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2013 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)
+void sbbs_t::telnet_gate(char* destaddr, ulong mode, char* name, char* passwd)
 {
 	char*	p;
 	uchar	buf[512];
@@ -121,9 +121,15 @@ void sbbs_t::telnet_gate(char* destaddr, ulong mode)
 	if(mode&TG_RLOGIN) {
 		p=(char*)buf;
 		*(p++)=0;
-		p+=sprintf(p,"%s",useron.alias);
+		p+=sprintf(p,"%s",name==NULL ? useron.alias : name);
 		p++;	// Add NULL
-		p+=sprintf(p,"%s",useron.pass);
+		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++;	// Add NULL
 		p+=sprintf(p,"%s/57600",terminal);
 		p++;	// Add NULL
@@ -205,21 +211,25 @@ void sbbs_t::telnet_gate(char* destaddr, ulong mode)
 				}
 				if(mode&TG_CRLF && buf[rd-1]=='\r')
 					buf[rd++]='\n';
-				if(!gotline && mode&TG_ECHO) {
+				else if(mode&TG_NOLF && buf[rd-1]=='\n')
+					rd--;
+				if(!gotline && (mode&TG_ECHO) && rd) {
 					RingBufWrite(&outbuf,buf,rd);
 				}
 			}
-			for(attempts=0;attempts<60 && online; attempts++) /* added retry loop here, Jan-20-2003 */
-			{
-				if((i=sendsocket(remote_socket,(char*)buf,rd))>=0)
-					break;
-				if(ERROR_VALUE!=EWOULDBLOCK)
+			if(rd > 0) {
+				for(attempts=0;attempts<60 && online; attempts++) /* added retry loop here, Jan-20-2003 */
+				{
+					if((i=sendsocket(remote_socket,(char*)buf,rd))>=0)
+						break;
+					if(ERROR_VALUE!=EWOULDBLOCK)
+						break;
+					mswait(500);
+				} 
+				if(i<0) {
+					lprintf(LOG_NOTICE,"!TELGATE ERROR %d sending on socket %d",ERROR_VALUE,remote_socket);
 					break;
-				mswait(500);
-			} 
-			if(i<0) {
-				lprintf(LOG_NOTICE,"!TELGATE ERROR %d sending on socket %d",ERROR_VALUE,remote_socket);
-				break;
+				}
 			}
 		}
 		rd=recv(remote_socket,(char*)buf,sizeof(buf),0);