diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c
index 5a09f511a6f8ede8c793a7eec8fc4dfe452ce0f6..84c21f8d6bbb62aff75d8dce371a042265ec8d9c 100644
--- a/src/syncterm/rlogin.c
+++ b/src/syncterm/rlogin.c
@@ -5,15 +5,16 @@
 
 static SOCKET	rlogin_socket=INVALID_SOCKET;
 
-int rlogin_recv(char *buffer, size_t buflen, unsigned int timeout)
+int rlogin_recv(char *buffer, size_t buflen)
 {
 	int	r;
 
-	if(!socket_check(rlogin_socket, &r, NULL, timeout))
+	if(!socket_check(rlogin_socket, NULL, NULL, 0))
 		return(-1);
-	if(!r)
-		return(0);
-	return(recv(rlogin_socket,buffer,buflen,0));
+	r=recv(rlogin_socket,buffer,buflen,0);
+	if(r==-1 && (errno==EAGAIN || errno==EINTR))
+		r=0;
+	return(r);
 }
 
 int rlogin_send(char *buffer, size_t buflen, unsigned int timeout)
@@ -50,6 +51,7 @@ int rlogin_connect(char *addr, int port, char *ruser, char *passwd)
 	char	nil=0;
 	char	*p;
 	unsigned int	neta;
+	struct	timeval	tv;
 
 	for(p=addr;*p;p++)
 		if(*p!='.' && !isdigit(*p))
@@ -90,6 +92,11 @@ int rlogin_connect(char *addr, int port, char *ruser, char *passwd)
 		return(-1);
 	}
 
+	tv.tv_sec=0;
+	tv.tv_usec=100000;
+
+	setsockopt(rlogin_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+
 	rlogin_send("",1,1000);
 	rlogin_send(passwd,strlen(passwd)+1,1000);
 	rlogin_send(ruser,strlen(ruser)+1,1000);
diff --git a/src/syncterm/rlogin.h b/src/syncterm/rlogin.h
index 1589bd0cf66e9e54f59387192f05038eccf553bb..8f8d9940d38e3cfacae3137ff44fac2c9581dae3 100644
--- a/src/syncterm/rlogin.h
+++ b/src/syncterm/rlogin.h
@@ -5,7 +5,7 @@
 
 extern SOCKET	rlogin_socket;
 
-int rlogin_recv(char *buffer, size_t buflen, unsigned int timeout);
+int rlogin_recv(char *buffer, size_t buflen);
 int rlogin_send(char *buffer, size_t buflen, unsigned int timeout);
 int rlogin_connect(char *addr, int port, char *ruser, char *passwd);
 int rlogin_close(void);
diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index 640222aaf6953f3820aea9941a177fc3d0f98079..72d83a89f2f7b2747383a8887ef5b40245a477f9 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -5,6 +5,8 @@
 #include "uifcinit.h"
 #include "menu.h"
 
+#define	BUFSIZE	2048
+
 struct terminal term;
 
 const int tabs[11]={1,8,16,24,32,40,48,56,64,72,80};
@@ -495,8 +497,10 @@ void do_ansi(void)
 void doterm(void)
 {
 	unsigned char ch[2];
+	unsigned char buf[BUFSIZE];
+	unsigned char prn[BUFSIZE];
 	int	key;
-	int i;
+	int i,j;
 
 	term.xpos=1;
 	term.ypos=1;
@@ -516,86 +520,110 @@ void doterm(void)
 	/* Main input loop */
 	for(;;) {
 		/* Get remote input */
-		i=rlogin_recv(ch,1,100);
+		i=rlogin_recv(buf,sizeof(buf));
 		switch(i) {
 			case -1:
 				uifcmsg("Disconnected","`Disconnected`\n\nRemote host dropped connection");
 				return;
-			case 1:
-				if(term.sequence) {
-					strcat(term.escbuf,ch);
-					if((ch[0]>='@' && ch[0]<='Z')
-							|| (ch[0]>='a' && ch[0]<='z')) {
-						do_ansi();
+			case 0:
+				break;
+			default:
+				prn[0]=0;
+				for(j=0;j<i;j++) {
+					ch[0]=buf[j];
+					if(term.sequence) {
+						strcat(term.escbuf,ch);
+						if((ch[0]>='@' && ch[0]<='Z')
+								|| (ch[0]>='a' && ch[0]<='z')) {
+							do_ansi();
+						}
 					}
-				}
-				else if (term.music) {
-					strcat(term.musicbuf,ch);
-					if(ch[0]==14)
-						play_music();
-				}
-				else {
-					switch(ch[0]) {
-						case 0:
-							break;
-						case 7:			/* Beep */
-							#ifdef __unix__
-								beep();
-							#else
-								MessageBeep(MB_OK);
-							#endif
-							break;
-						case 12:		/* ^L - Clear screen */
-							clearscreen(term.attr);
-							term.ypos=1;
-							term.xpos=1;
-							set_cursor();
-							break;
-						case 27:		/* ESC */
-							term.sequence=1;
-							break;
-						case '\n':
-							term.ypos++;
-							if(term.ypos>term.height) {
-								term.ypos=term.height;
-								scrollup();
-							}
-							set_cursor();
-							break;
-						case '\t':
-							for(i=0;i<11;i++) {
-								if(tabs[i]>term.xpos) {
-									term.xpos=tabs[i];
-									break;
-								}
-							}
-							set_cursor();
-							break;
-						case '\r':
-							term.xpos=1;
-							set_cursor();
-							break;
-						case '\b':
-							term.xpos--;
-							if(term.xpos<1)
-								term.xpos=1;
-							putch(' ');
-							set_cursor();
-							break;
-						default:
-							putch(ch[0]);
-							term.xpos++;
-							if(term.xpos>term.width) {
+					else if (term.music) {
+						strcat(term.musicbuf,ch);
+						if(ch[0]==14)
+							play_music();
+					}
+					else {
+						switch(buf[j]) {
+							case 0:
+								break;
+							case 7:			/* Beep */
+								cprintf(prn);
+								prn[0]=0;
+								#ifdef __unix__
+									beep();
+								#else
+									MessageBeep(MB_OK);
+								#endif
+								break;
+							case 12:		/* ^L - Clear screen */
+								cprintf(prn);
+								prn[0]=0;
+								clearscreen(term.attr);
+								term.ypos=1;
 								term.xpos=1;
+								set_cursor();
+								break;
+							case 27:		/* ESC */
+								cprintf(prn);
+								prn[0]=0;
+								term.sequence=1;
+								break;
+							case '\n':
+								cprintf(prn);
+								prn[0]=0;
 								term.ypos++;
 								if(term.ypos>term.height) {
 									term.ypos=term.height;
 									scrollup();
 								}
 								set_cursor();
-							}
+								break;
+							case '\t':
+								cprintf(prn);
+								prn[0]=0;
+								for(i=0;i<11;i++) {
+									if(tabs[i]>term.xpos) {
+										term.xpos=tabs[i];
+										break;
+									}
+								}
+								set_cursor();
+								break;
+							case '\r':
+								cprintf(prn);
+								prn[0]=0;
+								term.xpos=1;
+								set_cursor();
+								break;
+							case '\b':
+								cprintf(prn);
+								prn[0]=0;
+								term.xpos--;
+								if(term.xpos<1)
+									term.xpos=1;
+								putch(' ');
+								set_cursor();
+								break;
+							default:
+								strcat(prn,ch);
+								term.xpos++;
+								if(term.xpos>term.width) {
+									cprintf(prn);
+									prn[0]=0;
+									term.xpos=1;
+									term.ypos++;
+									if(term.ypos>term.height) {
+										term.ypos=term.height;
+										scrollup();
+									}
+									set_cursor();
+								}
+						}
 					}
 				}
+				cprintf(prn);
+				prn[0]=0;
 				break;
 		}