diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c
index 118808e8d4db9b2fd3eb4b2bb5a1bfef0f3313d1..6f6ed00a7a97e1488d193a6501b3938093127db3 100644
--- a/src/sbbs3/zmodem.c
+++ b/src/sbbs3/zmodem.c
@@ -35,6 +35,7 @@
 #include "crc32.h"
 
 #include "sexyz.h"
+#include "telnet.h"
 
 #define ENDOFFRAME 2
 #define FRAMEOK    1
@@ -207,6 +208,8 @@ int zmodem_send_esc(zmodem_t* zm, unsigned char c)
 
 int zmodem_tx(zmodem_t* zm, unsigned char c)
 {
+	int result;
+
 	switch (c) {
 		case DLE:
 		case DLE|0x80:          /* even if high-bit set */
@@ -221,6 +224,13 @@ int zmodem_tx(zmodem_t* zm, unsigned char c)
 			if(zm->escape_all_control_characters && (zm->last_sent&0x7f) == '@')
 				return zmodem_send_esc(zm, c);
 			break;
+		case TELNET_IAC:
+			if(zm->escape_telnet_iac) {
+				if((result=zmodem_send_raw(zm, ZDLE))!=0)
+					return(result);
+				return zmodem_send_raw(zm, ZRUB1);
+			}
+			break;
 		default:
 			if(zm->escape_all_control_characters && (c&0x60)==0)
 				return zmodem_send_esc(zm, c);
diff --git a/src/sbbs3/zmodem.h b/src/sbbs3/zmodem.h
index 21abc3b32959a770f246fb34209fc1605642ee03..454b91d95e0eda9bf8fcc8dffab7cdf73ed34c19 100644
--- a/src/sbbs3/zmodem.h
+++ b/src/sbbs3/zmodem.h
@@ -251,6 +251,7 @@ typedef struct {
 	long		crc_request;
 
 	/* Configuration */
+	BOOL		escape_telnet_iac;
 	unsigned	send_timeout;
 	unsigned	recv_timeout;
 	unsigned	max_errors;