diff --git a/src/sbbs3/sexyz.c b/src/sbbs3/sexyz.c
index 1b9ef471b1eb84925a72f540a0ada657e835ec63..bb16544b3aade4e6acb16925b7dcf4289b520435 100644
--- a/src/sbbs3/sexyz.c
+++ b/src/sbbs3/sexyz.c
@@ -704,18 +704,17 @@ void zmodem_progress(void* cbdata, ulong start_pos, ulong current_pos)
 	long		t;
 	time_t		now;
 	static time_t last_progress;
-	zmodem_t*	zm = (zmodem_t*)cbdata;
 
 	now=time(NULL);
-	if(now-last_progress>=progress_interval || current_pos >= zm->current_file_size || newline) {
-		t=now-zm->transfer_start;
+	if(now-last_progress>=progress_interval || current_pos >= zm.current_file_size || newline) {
+		t=now-zm.transfer_start;
 		if(t<=0)
 			t=1;
 		if(start_pos>current_pos)
 			start_pos=0;
 		if((cps=(current_pos-start_pos)/t)==0)
 			cps=1;		/* cps so far */
-		l=zm->current_file_size/cps;	/* total transfer est time */
+		l=zm.current_file_size/cps;	/* total transfer est time */
 		l-=t;			/* now, it's est time left */
 		if(l<0) l=0;
 		if(start_pos)
@@ -726,13 +725,13 @@ void zmodem_progress(void* cbdata, ulong start_pos, ulong current_pos)
 			"Time: %lu:%02lu/%lu:%02lu  CPS: %u  %lu%% "
 			,orig
 			,current_pos/1024
-			,zm->current_file_size/1024
+			,zm.current_file_size/1024
 			,t/60L
 			,t%60L
 			,l/60L
 			,l%60L
 			,cps
-			,(long)(((float)current_pos/(float)zm->current_file_size)*100.0)
+			,(long)(((float)current_pos/(float)zm.current_file_size)*100.0)
 			);
 		newline=FALSE;
 		last_progress=now;
@@ -1228,6 +1227,8 @@ static const char* usage=
 	"\n"
 	"opts   = -o  to overwrite files when receiving\n"
 	"         -s  disable Zmodem streaming (Slow Zmodem)\n"
+	"         -4  transmit with 4K Zmodem blocks\n"
+	"         -8  transmit with 8K Zmodem blocks (ZedZap)\n"
 	"         -!  to pause after abnormal exit (error)\n"
 	"         -telnet to enable Telnet mode (the default)\n"
 	"         -rlogin to enable RLogin (pass-through) mode\n"
@@ -1328,6 +1329,7 @@ int main(int argc, char **argv)
 
 	zm.send_timeout			=iniReadInteger(fp,"Zmodem","SendTimeout",zm.send_timeout);	/* seconds */
 	zm.recv_timeout			=iniReadInteger(fp,"Zmodem","RecvTimeout",zm.recv_timeout);	/* seconds */
+	zm.block_size			=iniReadInteger(fp,"Zmodem","BlockSize",zm.block_size);		/* 1024 or 8192 */
 	zm.max_errors			=iniReadInteger(fp,"Zmodem","MaxErrors",zm.max_errors);
 	zm.escape_telnet_iac	=iniReadBool(fp,"Zmodem","EscapeTelnetIAC",TRUE);
 
@@ -1430,6 +1432,12 @@ int main(int argc, char **argv)
 					case 'K':	/* sz/rz compatible */
 						xm.block_size=1024;
 						break;
+					case '4':
+						zm.block_size=4096;
+						break;
+					case '8':
+						zm.block_size=8192;
+						break;
 					case 'S':	/* disable Zmodem streaming */
 						zm.no_streaming=TRUE;
 						break;
diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c
index 3ecb99830d7ef4bdc5dafbd061fcba44444b8184..7c80cc0bb25bb1563aeb065aedfe7778b23d8b2e 100644
--- a/src/sbbs3/zmodem.c
+++ b/src/sbbs3/zmodem.c
@@ -1349,7 +1349,10 @@ int zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong* sent)
 		/*
 		 * read a block from the file
 		 */
-		n = fread(zm->tx_data_subpacket,1,sizeof(zm->tx_data_subpacket),fp);
+		if(zm->block_size < 128 || zm->block_size > sizeof(zm->tx_data_subpacket))
+			zm->block_size = 1024;	/* sanity check block size here */
+
+		n = fread(zm->tx_data_subpacket,sizeof(BYTE),zm->block_size,fp);
 
 #if 0
 		if(n == 0) {
@@ -1398,7 +1401,7 @@ int zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong* sent)
 					if((ack = zmodem_recv_header(zm)) != ZACK)
 						return(ack);
 
-					if(zm->rxd_header_pos == ftell(fp))
+					if(zm->rxd_header_pos == (ulong)ftell(fp))
 						break;
 					lprintf(zm,LOG_WARNING,"ZACK for incorrect offset (%lu vs %lu)"
 						,zm->rxd_header_pos, ftell(fp));
@@ -1498,6 +1501,8 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti
 	}
 
 	fstat(fileno(fp),&s);
+	zm->current_file_size = s.st_size;
+	SAFECOPY(zm->current_file_name, getfname(fname));
 
 	/*
 	 * the file exists. now build the ZFILE frame
@@ -1558,7 +1563,7 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti
 	p += strlen(p) + 1;
 
 	sprintf(p,"%lu %lo %lo %d %u %lu %d"
-		,(ulong)s.st_size
+		,zm->current_file_size
 		,s.st_mtime
 		,0						/* file mode */
 		,0						/* serial number */
@@ -1627,7 +1632,7 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti
 		 */
 
 		if(type == ZRPOS) {
-			if(zm->rxd_header_pos <= s.st_size) {
+			if(zm->rxd_header_pos <= zm->current_file_size) {
 				pos = zm->rxd_header_pos;
 				lprintf(zm,LOG_INFO,"Resuming transfer from offset: %lu", pos);
 			} else
@@ -1662,10 +1667,10 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti
 		 * and wait for zrinit. if it doesnt come then try again
 		 */
 
-		zeof_frame[ZP0] = (uchar) (s.st_size        & 0xff);
-		zeof_frame[ZP1] = (uchar)((s.st_size >> 8)  & 0xff);
-		zeof_frame[ZP2] = (uchar)((s.st_size >> 16) & 0xff);
-		zeof_frame[ZP3] = (uchar)((s.st_size >> 24) & 0xff);
+		zeof_frame[ZP0] = (uchar) (zm->current_file_size        & 0xff);
+		zeof_frame[ZP1] = (uchar)((zm->current_file_size >> 8)  & 0xff);
+		zeof_frame[ZP2] = (uchar)((zm->current_file_size >> 16) & 0xff);
+		zeof_frame[ZP3] = (uchar)((zm->current_file_size >> 24) & 0xff);
 
 		for(errors=0;errors<=zm->max_errors && !zm->cancelled && is_connected(zm);errors++) {
 			lprintf(zm,LOG_INFO,"Sending End-of-File (ZEOF) frame (%u of %u)"
@@ -1931,7 +1936,7 @@ int zmodem_recv_file_frame(zmodem_t* zm, FILE* fp, ulong offset)
 
 		} while(type != ZDATA);
 
-		if(zm->rxd_header_pos==ftell(fp))
+		if(zm->rxd_header_pos==(ulong)ftell(fp))
 			break;
 		lprintf(zm,LOG_WARNING,"Wrong ZDATA block (%lu vs %lu)", zm->rxd_header_pos, ftell(fp));
 
@@ -1986,8 +1991,8 @@ void zmodem_init(zmodem_t* zm, void* cbdata
 #if 0
 	zm->byte_timeout=3;			/* seconds */
 	zm->ack_timeout=10;			/* seconds */
-	zm->block_size=1024;
 #endif
+	zm->block_size=1024;
 	zm->max_errors=9;
 
 	zm->cbdata=cbdata;
diff --git a/src/sbbs3/zmodem.h b/src/sbbs3/zmodem.h
index 1866d07cc7c71f3070adaceec518c682e99beda3..30aff326a50fa782f9c3904296cfd63be69cb4f4 100644
--- a/src/sbbs3/zmodem.h
+++ b/src/sbbs3/zmodem.h
@@ -193,9 +193,9 @@
 
 typedef struct {
 
-	BYTE rxd_header[ZMAXHLEN];								/* last received header */
-	int rxd_header_len;										/* last received header size */
-	long rxd_header_pos;									/* last received header position value */
+	BYTE	rxd_header[ZMAXHLEN];							/* last received header */
+	int		rxd_header_len;									/* last received header size */
+	ulong	rxd_header_pos;									/* last received header position value */
 
 	/*
 	 * receiver capability flags
@@ -221,9 +221,7 @@ typedef struct {
 
 	/* from zmtx.c */
 
-	#define MAX_SUBPACKETSIZE 1024
-
-	BYTE tx_data_subpacket[MAX_SUBPACKETSIZE];
+	BYTE tx_data_subpacket[8192];
 	BYTE rx_data_subpacket[8192];							/* zzap = 8192 */
 
 	char		current_file_name[MAX_PATH+1];
@@ -260,6 +258,7 @@ typedef struct {
 	unsigned	send_timeout;
 	unsigned	recv_timeout;
 	unsigned	max_errors;
+	unsigned	block_size;
 
 	/* Callbacks */
 	void*		cbdata;
@@ -283,7 +282,7 @@ void		zmodem_init(zmodem_t*, void* cbdata
 char*		zmodem_ver(char *buf);
 const char* zmodem_source(void);
 int			zmodem_rx(zmodem_t* zm);
-int zmodem_tx(zmodem_t* zm, BYTE ch);
+int			zmodem_tx(zmodem_t* zm, BYTE ch);
 int			zmodem_abort_receive(zmodem_t*);
 int			zmodem_send_ack(zmodem_t*, long pos);
 int			zmodem_send_nak(zmodem_t*);