diff --git a/src/sbbs3/download.cpp b/src/sbbs3/download.cpp
index f2f697380dda595a05f36c986d7cf534be753281..9c7e4d0d63db072df60c00296f4391ee73e62053 100644
--- a/src/sbbs3/download.cpp
+++ b/src/sbbs3/download.cpp
@@ -104,21 +104,25 @@ const char* sbbs_t::protcmdline(prot_t* prot, enum XFER_TYPE type)
 	return("invalid transfer type");
 }
 
-void sbbs_t::data_transfer_begin(void)
+bool sbbs_t::data_transfer_begin()
 {
 	sys_status|=SS_FILEXFER;	/* disable spy during file xfer */
+	bool telnet_was_nvt = telnet_is_nvt();
 	/* enable telnet binary transmission in both directions */
 	request_telnet_opt(TELNET_DO,TELNET_BINARY_TX);
 	request_telnet_opt(TELNET_WILL,TELNET_BINARY_TX);
 	console |= CON_RAW_IN;
+	return telnet_was_nvt;
 }
 
-void sbbs_t::data_transfer_end(void)
+void sbbs_t::data_transfer_end(bool telnet_was_nvt)
 {
 	sys_status&=~SS_FILEXFER;
-	/* Got back to Text/NVT mode */
-	request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX);
-	request_telnet_opt(TELNET_WONT,TELNET_BINARY_TX);
+	if(telnet_was_nvt) {
+		/* Got back to Text/NVT mode */
+		request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX);
+		request_telnet_opt(TELNET_WONT,TELNET_BINARY_TX);
+	}
 	console &= ~CON_RAW_IN;
 }
 
@@ -164,11 +168,11 @@ int sbbs_t::protocol(prot_t* prot, enum XFER_TYPE type
 	cmdline=cmdstr(protcmdline(prot,type), fpath, fspec, NULL, ex_mode);
 	SAFEPRINTF(msg,"Transferring %s",cmdline);
 	spymsg(msg);
-	data_transfer_begin();
+	bool was_nvt_mode = data_transfer_begin();
 	time_t start = time(NULL);
 	i=external(cmdline,ex_mode,p);
 	time_t end = time(NULL);
-	data_transfer_end();
+	data_transfer_end(was_nvt_mode);
 
 	// Save DSZLOG to logfile
 	if((stream=fnopen(NULL,protlog,O_RDONLY))!=NULL) {
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index f3be3a703a0a6e14a7f15fcd78a092a9ec818d3e..7e45978efa24ba57c19d5aae62a139814f4f8e32 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -539,6 +539,11 @@ public:
 	int 	telnet_rows = 0;
 	int		telnet_cols = 0;
 	int		telnet_speed = 0;
+	bool	telnet_is_nvt() {
+		return !(telnet_mode & TELNET_MODE_OFF)
+			&& telnet_local_option[TELNET_BINARY_TX] != TELNET_DO
+			&& telnet_remote_option[TELNET_BINARY_TX] != TELNET_WILL;
+	}
 
 	xpevent_t	telnet_ack_event;
 
@@ -1169,8 +1174,8 @@ public:
 	bool	bulkupload(int dirnum);
 
 	/* download.cpp */
-	void	data_transfer_begin(void);
-	void	data_transfer_end(void);
+	bool	data_transfer_begin(void);
+	void	data_transfer_end(bool was_telnet_nvt_mode);
 	void	downloadedfile(file_t* f);
 	void	notdownloaded(off_t size, time_t elapsed);
 	void	downloadedbytes(off_t size, time_t elapsed);
diff --git a/src/sbbs3/telgate.cpp b/src/sbbs3/telgate.cpp
index 7e7fd56f5dd784b0c6c198f6f8e40b1fc5316416..672c24e604c6ff1614c283810f9896de7aa4bbb2 100644
--- a/src/sbbs3/telgate.cpp
+++ b/src/sbbs3/telgate.cpp
@@ -343,7 +343,8 @@ bool sbbs_t::telnet_gate(char* destaddr, uint mode, unsigned timeout, str_list_t
 	if(mode&TG_NOTERMTYPE)
 		request_telnet_opt(TELNET_DONT,TELNET_TERM_TYPE, 3000);	// Re-negotiation of terminal type
 
-	/* Text/NVT mode by default */
+	/* Text/NVT mode by default (for Ctrl-] menu support) */
+	bool remote_was_binary_tx = (telnet_remote_option[TELNET_BINARY_TX] == TELNET_WILL);
 	request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX, 3000);
 	if(!(telnet_mode&TELNET_MODE_OFF) && (mode&TG_PASSTHRU))
 		telnet_mode|=TELNET_MODE_GATE;	// Pass-through telnet commands
@@ -469,6 +470,8 @@ bool sbbs_t::telnet_gate(char* destaddr, uint mode, unsigned timeout, str_list_t
 
 	/* Disable Telnet Terminal Echo */
 	request_telnet_opt(TELNET_WILL,TELNET_ECHO);
+	if(remote_was_binary_tx)
+		request_telnet_opt(TELNET_DO,TELNET_BINARY_TX);
 
 	close_socket(remote_socket);
 
diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index b0e1c9182a9b36836c87a7cc03b3ef20c5c81ff4..67db8944c655862a0fd8845a17a63477d26a7025 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -925,9 +925,6 @@ int sbbs_t::external(const char* cmdline, int mode, const char* startup_dir)
 		attr(LIGHTGRAY);	// Force to "normal"
 
 		rio_abortable=rio_abortable_save;	// Restore abortable state
-
-		/* Got back to Text/NVT mode */
-		request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX);
 	}
 
 //	lprintf("%s returned %d",realcmdline, retval);
@@ -2051,9 +2048,6 @@ int sbbs_t::external(const char* cmdline, int mode, const char* startup_dir)
 		attr(LIGHTGRAY);	// Force to "normal"
 
 		rio_abortable=rio_abortable_save;	// Restore abortable state
-
-		/* Got back to Text/NVT mode */
-		request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX);
 	}
 
 	if(!(mode&EX_NOLOG))