diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 77d268ca1a106b6d39737f655b860c06621a2ceb..7e88423a7d7c2a905f79522586f4617f43b2e55d 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -588,7 +588,7 @@ BOOL js_add_file(JSContext* js_cx, JSObject* array,
 	if(!JS_SetProperty(js_cx, file, "credits", &val))
 		return(FALSE);
 
-	JS_NewNumberValue(js_cx,time,&val);
+	JS_NewNumberValue(js_cx,(jsdouble)time,&val);
 	if(!JS_SetProperty(js_cx, file, "time", &val))
 		return(FALSE);
 
@@ -1501,7 +1501,7 @@ static void send_thread(void* arg)
 		lprintf(LOG_DEBUG,"%04d DATA socket closed",xfer.ctrl_sock);
 	
 	if(!error) {
-		dur=time(NULL)-start;
+		dur=(long)(time(NULL)-start);
 		cps=dur ? total/dur : total*2;
 		lprintf(LOG_INFO,"%04d Transfer successful: %lu bytes sent in %lu seconds (%lu cps)"
 			,xfer.ctrl_sock
@@ -1751,7 +1751,7 @@ static void receive_thread(void* arg)
 		lprintf(LOG_DEBUG,"%04d DATA socket %d closed",xfer.ctrl_sock,*xfer.data_sock);
 	
 	if(!error) {
-		dur=time(NULL)-start;
+		dur=(long)(time(NULL)-start);
 		cps=dur ? total/dur : total*2;
 		lprintf(LOG_INFO,"%04d Transfer successful: %lu bytes received in %lu seconds (%lu cps)"
 			,xfer.ctrl_sock
@@ -2592,7 +2592,7 @@ static void ctrl_thread(void* arg)
 			sockprintf(sock," QUIT    REIN    PORT    PASV    LIST    NLST    NOOP    HELP");
 			sockprintf(sock," SIZE    MDTM    RETR    STOR    REST    ALLO    ABOR    SYST");
 			sockprintf(sock," TYPE    STRU    MODE    SITE    RNFR*   RNTO*   DELE*   DESC#");
-			sockprintf(sock," FEAT#   OPTS#");
+			sockprintf(sock," FEAT#   OPTS#   EPRT    EPSV");
 			sockprintf(sock,"214 Direct comments to sysop@%s.",scfg.sys_inetaddr);
 			continue;
 		}
@@ -2865,16 +2865,35 @@ static void ctrl_thread(void* arg)
 		}
 #endif
 
-		if(!strnicmp(cmd, "PORT ",5)) {
+		if(strnicmp(cmd, "PORT ",5)==0 || strnicmp(cmd, "EPRT ",5)==0) {
 
 			if(pasv_sock!=INVALID_SOCKET) 
 				ftp_close_socket(&pasv_sock,__LINE__);
 
 			p=cmd+5;
 			SKIP_WHITESPACE(p);
-			sscanf(p,"%u,%u,%u,%u,%hd,%hd",&h1,&h2,&h3,&h4,&p1,&p2);
-			data_addr.sin_addr.s_addr=htonl((h1<<24)|(h2<<16)|(h3<<8)|h4);
-			data_addr.sin_port=(u_short)((p1<<8)|p2);
+			if(strnicmp(cmd, "PORT ",5)==0) {
+				sscanf(p,"%u,%u,%u,%u,%hd,%hd",&h1,&h2,&h3,&h4,&p1,&p2);
+				data_addr.sin_addr.s_addr=htonl((h1<<24)|(h2<<16)|(h3<<8)|h4);
+				data_addr.sin_port=(u_short)((p1<<8)|p2);
+			} else { /* EPRT */
+				char	delim = *p;
+				int		prot;
+
+				if(*p) p++;
+				prot=strtol(p,NULL,/* base: */10);
+				if(prot!=1) {
+					lprintf(LOG_WARNING,"%04d UNSUPPORTED protocol: %d", sock, prot);
+					sockprintf(sock,"522 Network protocol not supported, use (1)");
+					continue;
+				}
+				FIND_CHAR(p,delim);
+				if(*p) p++;
+				data_addr.sin_addr.s_addr=inet_addr(p);
+				FIND_CHAR(p,delim);
+				if(*p) p++;
+				data_addr.sin_port=atoi(p);
+			}
 			if(data_addr.sin_port< IPPORT_RESERVED) {	
 				lprintf(LOG_WARNING,"%04d !SUSPECTED BOUNCE ATTACK ATTEMPT by %s to %s port %u"
 					,sock,user.alias
@@ -2893,8 +2912,8 @@ static void ctrl_thread(void* arg)
 			continue;
 		}
 
-		if(!stricmp(cmd, "PASV") 
-			|| !stricmp(cmd, "P@SW")) {	/* Kludge required for SMC Barricade V1.2 */
+		if(stricmp(cmd, "PASV")==0 || stricmp(cmd, "P@SW")==0	/* Kludge required for SMC Barricade V1.2 */
+			|| stricmp(cmd, "EPSV")==0) {	
 
 			if(pasv_sock!=INVALID_SOCKET) 
 				ftp_close_socket(&pasv_sock,__LINE__);
@@ -2971,14 +2990,17 @@ static void ctrl_thread(void* arg)
 					,ip_addr&0xff
 					);
 			port=ntohs(addr.sin_port);
-			sockprintf(sock,"227 Entering Passive Mode (%u,%u,%u,%u,%hu,%hu)"
-				,(ip_addr>>24)&0xff
-				,(ip_addr>>16)&0xff
-				,(ip_addr>>8)&0xff
-				,ip_addr&0xff
-				,(port>>8)&0xff
-				,port&0xff
-				);
+			if(stricmp(cmd, "EPSV")==0)
+				sockprintf(sock,"229 Entering Extended Passive Mode (|||%hu|)", port);
+			else
+				sockprintf(sock,"227 Entering Passive Mode (%u,%u,%u,%u,%hu,%hu)"
+					,(ip_addr>>24)&0xff
+					,(ip_addr>>16)&0xff
+					,(ip_addr>>8)&0xff
+					,ip_addr&0xff
+					,(port>>8)&0xff
+					,port&0xff
+					);
 			mode="passive";
 			continue;
 		}
@@ -3787,7 +3809,8 @@ static void ctrl_thread(void* arg)
 				&& !stricmp(p,startup->index_file_name)
 				&& !delecmd) {
 				if(getsize) {
-					sockprintf(sock, "500 Size not available for dynamically generated files");
+					/* Size not available for dynamically generated files */
+					sockprintf(sock, "213 0"); /* report size of 0 to be make Google Chrome happy */
 					continue;
 				}
 				if((fp=fopen(ftp_tmpfname(fname,"ndx",sock),"w+b"))==NULL) {
@@ -3902,7 +3925,8 @@ static void ctrl_thread(void* arg)
 				&& !delecmd) {
 				success=TRUE;
 				if(getsize) {
-					sockprintf(sock, "500 Size not available for dynamically generated files");
+					/* Size not available for dynamically generated files */
+					sockprintf(sock, "213 0"); /* report size of 0 to be make Google Chrome happy */
 					continue;
 				}
 				else if(getdate)