diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index 479caa582ccafdb176d1b03111529ff956e4123b..ab8ebe18f037a6a940995e77898626839c686189 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -14,6 +14,7 @@
 #include "menu.h"
 #include "dirwrap.h"
 #include "zmodem.h"
+#include "telnet_io.h"
 
 #ifdef GUTS_BUILTIN
 #include "gutsz.h"
@@ -124,7 +125,6 @@ void mousedrag(unsigned char *scrollback)
 
 void update_status(struct bbslist *bbs, int speed)
 {
-	char buf[160];
 	char nbuf[LIST_NAME_MAX+10+11+1];	/* Room for "Name (Logging) (115300)" and terminator */
 						/* SAFE and Logging should me be possible. */
 	int oldscroll;
@@ -228,7 +228,7 @@ static int lputs(void* cbdata, int level, const char* str)
 	char msg[512];
 	int chars;
 
-#if defined(_WIN32) && defined(_DEBUG) && TRUE
+#if defined(_WIN32) && defined(_DEBUG) && FALSE
 	sprintf(msg,"SyncTerm: %s\n",str);
 	OutputDebugString(msg);
 #endif
@@ -344,7 +344,7 @@ void zmodem_progress(void* cbdata, ulong current_pos)
 		cputs("\r\n");
 		cprintf("%*s%3d%%\r\n", TRANSFER_WIN_WIDTH/2-5, ""
 			,(long)(((float)current_pos/(float)zm->current_file_size)*100.0));
-		l = 60*((float)current_pos/(float)zm->current_file_size);
+		l = (long)(60*((float)current_pos/(float)zm->current_file_size));
 		cprintf("[%*.*s%*s]", l, l, 
 				"\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1"
 				"\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1"
@@ -400,6 +400,20 @@ static int recv_byte(void* unused, unsigned timeout)
 	return(ch);
 }
 
+void purge_recv(void)
+{
+	int ch;
+	unsigned count=0;
+
+	lprintf(LOG_NOTICE,"Purging receive buffer...");
+	YIELD();
+	while((ch=recv_byte(NULL,0)) >= 0) {
+		YIELD();
+		count++;
+	}
+	lprintf(LOG_NOTICE,"%u bytes purged");
+}
+
 #if defined(__BORLANDC__)
 	#pragma argsused
 #endif
@@ -438,10 +452,10 @@ void draw_transfer_window(char* title)
 	gettext(left, top, left + TRANSFER_WIN_WIDTH + 1, top + TRANSFER_WIN_HEIGHT, winbuf);
 	memset(outline, YELLOW | (BLUE<<4), sizeof(outline));
 	for(i=2;i < sizeof(outline) - 2; i+=2) {
-		outline[i] = 0xcd;	/* Double horizontal line */
+		outline[i] = (char)0xcd;	/* Double horizontal line */
 	}
-	outline[0]=0xc9;
-	outline[sizeof(outline)-2]=0xbb;
+	outline[0]=(char)0xc9;
+	outline[sizeof(outline)-2]=(char)0xbb;
 	puttext(left, top, left + TRANSFER_WIN_WIDTH - 1, top, outline);\
 
 	/* Title */
@@ -453,20 +467,20 @@ void draw_transfer_window(char* title)
 	cprintf("%s",title);
 
 	for(i=2;i < sizeof(outline) - 2; i+=2) {
-		outline[i] = 0xc4;	/* Single horizontal line */
+		outline[i] = (char)0xc4;	/* Single horizontal line */
 	}
-	outline[0] = 0xc7;	/* 0xcc */
-	outline[sizeof(outline)-2]=0xb6;	/* 0xb6 */
+	outline[0] = (char)0xc7;	/* 0xcc */
+	outline[sizeof(outline)-2]=(char)0xb6;	/* 0xb6 */
 	puttext(left, top+6, left + TRANSFER_WIN_WIDTH - 1, top+6, outline);
 
 	for(i=2;i < sizeof(outline) - 2; i+=2) {
-		outline[i] = 0xcd;	/* Double horizontal line */
+		outline[i] = (char)0xcd;	/* Double horizontal line */
 	}
-	outline[0]=0xc8;
-	outline[sizeof(outline)-2]=0xbc;
+	outline[0]=(char)0xc8;
+	outline[sizeof(outline)-2]=(char)0xbc;
 	puttext(left, top + TRANSFER_WIN_HEIGHT - 1, left+TRANSFER_WIN_WIDTH - 1, top + TRANSFER_WIN_HEIGHT - 1, outline);
-	outline[0]=0xba;
-	outline[sizeof(outline)-2]=0xba;
+	outline[0]=(char)0xba;
+	outline[sizeof(outline)-2]=(char)0xba;
 	for(i=2;i < sizeof(outline) - 2; i+=2) {
 		outline[i] = ' ';
 	}
@@ -537,10 +551,26 @@ void erase_transfer_window(void) {
 	_setcursortype(_NORMALCURSOR);
 }
 
+static binary_mode_on(struct bbslist *bbs)
+{
+	if(bbs->conn_type == CONN_TYPE_TELNET) {
+		request_telnet_opt(TELNET_DO,TELNET_BINARY_TX);
+		request_telnet_opt(TELNET_WILL,TELNET_BINARY_TX);
+	}
+}
+
+static binary_mode_off(struct bbslist *bbs)
+{
+	if(bbs->conn_type == CONN_TYPE_TELNET) {
+		request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX);
+		request_telnet_opt(TELNET_WONT,TELNET_BINARY_TX);
+	}
+}
+
 void ascii_upload(FILE *fp, char *path);
-void zmodem_upload(FILE *fp, char *path);
+void zmodem_upload(struct bbslist *bbs, FILE *fp, char *path);
 
-void begin_upload(char *uldir, BOOL autozm)
+void begin_upload(struct bbslist *bbs, BOOL autozm)
 {
 	char	str[MAX_PATH*2+1];
 	char	path[MAX_PATH+1];
@@ -558,7 +588,7 @@ void begin_upload(char *uldir, BOOL autozm)
 		return;
 
 	init_uifc(FALSE, FALSE);
-	result=filepick(&uifc, "Upload", &fpick, uldir, NULL, UIFC_FP_ALLOWENTRY);
+	result=filepick(&uifc, "Upload", &fpick, bbs->uldir, NULL, UIFC_FP_ALLOWENTRY);
 	
 	if(result==-1 || fpick.files<1) {
 		filepick_free(&fpick);
@@ -577,12 +607,12 @@ void begin_upload(char *uldir, BOOL autozm)
 	setvbuf(fp,NULL,_IOFBF,0x10000);
 
 	if(autozm) 
-		zmodem_upload(fp, path);
+		zmodem_upload(bbs, fp, path);
 	else {
 		i=0;
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Transfer Type",opts)) {
 			case 0:
-				zmodem_upload(fp, path);
+				zmodem_upload(bbs, fp, path);
 				break;
 			case 1:
 				ascii_upload(fp, path);
@@ -659,7 +689,7 @@ BOOL guts_data_waiting(void* cbdata, unsigned timeout)
 	return(rd);
 }
 
-void zmodem_download(char *download_dir);
+void zmodem_download(struct bbslist *bbs);
 
 void guts_background_download(void *cbdata)
 {
@@ -744,9 +774,9 @@ void guts_transfer(struct bbslist *bbs)
 
 	if(gi.inband) {
 		if(gi.direction==UPLOAD)
-			begin_upload(bbs->uldir, TRUE);
+			begin_upload(bbs, TRUE);
 		else
-			zmodem_download(bbs->dldir);
+			zmodem_download(bbs);
 		oob_close(&gi);
 	}
 	else {
@@ -817,13 +847,14 @@ void ascii_upload(FILE *fp, char *path)
 	fclose(fp);
 }
 
-void zmodem_upload(FILE *fp, char *path)
+void zmodem_upload(struct bbslist *bbs, FILE *fp, char *path)
 {
 	zmodem_t	zm;
 	ulong	fsize;
 
 	draw_transfer_window("Zmodem Upload");
 
+	binary_mode_on(bbs);
 	zmodem_init(&zm
 		,/* cbdata */&zm
 		,lputs, zmodem_progress
@@ -845,13 +876,14 @@ void zmodem_upload(FILE *fp, char *path)
 
 	fclose(fp);
 
+	binary_mode_off(bbs);
 	lprintf(LOG_NOTICE,"Hit any key to continue...");
 	getch();
 
 	erase_transfer_window();
 }
 
-void zmodem_download(char *download_dir)
+void zmodem_download(struct bbslist *bbs)
 {
 	zmodem_t	zm;
 	int			files_received;
@@ -864,6 +896,7 @@ void zmodem_download(char *download_dir)
 #endif
 	draw_transfer_window("Zmodem Download");
 
+	binary_mode_on(bbs);
 	zmodem_init(&zm
 		,/* cbdata */&zm
 		,lputs, zmodem_progress
@@ -872,11 +905,17 @@ void zmodem_download(char *download_dir)
 		,zmodem_check_abort
 		,data_waiting);
 
-	files_received=zmodem_recv_files(&zm,download_dir,&bytes_received);
+	files_received=zmodem_recv_files(&zm,bbs->dldir,&bytes_received);
+
+#if 0
+	if(zm.local_abort)
+		purge_recv();
+#endif
 
 	if(files_received>1)
 		lprintf(LOG_INFO,"Received %u files (%lu bytes) successfully", files_received, bytes_received);
 
+	binary_mode_off(bbs);
 	lprintf(LOG_NOTICE,"Hit any key to continue...");
 	getch();
 
@@ -888,7 +927,7 @@ void music_control(struct bbslist *bbs)
 {
 	char *buf;
 	struct	text_info txtinfo;
-	int i,j;
+	int i;
 	char *opts[4]={
 			 "ESC[| ANSI Music only"
 			,"ESC[N (BANSI-Style) and ESC[| ANSI Music"
@@ -1062,7 +1101,7 @@ BOOL doterm(struct bbslist *bbs)
 	unsigned char prn[BUFSIZE];
 #endif
 	int	key;
-	int i,j,k;
+	int i,j;
 	unsigned char *p;
 	BYTE zrqinit[] = { ZDLE, ZHEX, '0', '0', 0 };	/* for Zmodem auto-downloads */
 	BYTE zrinit[] = { ZDLE, ZHEX, '0', '1', 0 };	/* for Zmodem auto-uploads */
@@ -1175,9 +1214,9 @@ BOOL doterm(struct bbslist *bbs)
 							zrqbuf[++j]=0;
 							if(j==sizeof(zrqinit)-1) {	/* Have full sequence (Assumes zrinit and zrqinit are same length */
 								if(!strcmp(zrqbuf, zrqinit))
-									zmodem_download(bbs->dldir);
+									zmodem_download(bbs);
 								else
-									begin_upload(bbs->uldir, TRUE);
+									begin_upload(bbs, TRUE);
 								zrqbuf[0]=0;
 							}
 						}
@@ -1288,7 +1327,7 @@ BOOL doterm(struct bbslist *bbs)
 					if(!confirm("Begin download?",NULL))
 						continue;
 #endif
-					zmodem_download(bbs->dldir);
+					zmodem_download(bbs);
 					showmouse();
 					break;
 				case 0x2100:	/* ALT-F */
@@ -1328,7 +1367,7 @@ BOOL doterm(struct bbslist *bbs)
 					if(!confirm("Begin upload?",NULL))
 						continue;
 #endif
-					begin_upload(bbs->uldir, FALSE);
+					begin_upload(bbs, FALSE);
 					showmouse();
 					break;
 				case 17:		/* CTRL-Q */
@@ -1404,14 +1443,14 @@ BOOL doterm(struct bbslist *bbs)
 							if(!confirm("Begin upload?",NULL))
 								continue;
 #endif
-							begin_upload(bbs->uldir, FALSE);
+							begin_upload(bbs, FALSE);
 							break;
 						case 4:
 #ifdef PCM
 							if(!confirm("Begin download?",NULL))
 								continue;
 #endif
-							zmodem_download(bbs->dldir);
+							zmodem_download(bbs);
 							break;
 						case 7:
 #ifdef PCM