diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 83676559cc2effd3aaf13ff0615ad8a3225ab385..53cb88e9a8b5c85b053927b0e0025643663b0d93 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -1051,12 +1051,16 @@ BOOL js_generate_index(JSContext* js_cx, JSObject* parent,
 					if(!getfiledat(&scfg,&f))
 						continue;
 				} else {
-					struct stat st;
-					if(stat(g.gl_pathv[i], &st) != 0)
-						continue;
-					f.cdt = st.st_size;
-					f.size = st.st_size;
-					f.date = (time32_t)st.st_mtime;
+					f.size = f.cdt;
+					f.date = f.dateuled;
+					if(!filedat || (scfg.dir[dir]->misc&DIR_FCHK)) {
+						struct stat st;
+						if(stat(g.gl_pathv[i], &st) != 0)
+							continue;
+						f.cdt = st.st_size;
+						f.size = st.st_size;
+						f.date = (time32_t)st.st_mtime;
+					}
 				}
 				if(f.misc&FM_EXTDESC) {
 					extdesc[0]=0;
@@ -4658,10 +4662,16 @@ static void ctrl_thread(void* arg)
 						get_owner_name(&f, str);
 						SAFEPRINTF3(aliaspath, "/%s/%s/%s", scfg.lib[lib]->sname, scfg.dir[dir]->code_suffix, getfname(g.gl_pathv[i]));
 						get_unique(aliaspath, uniq);
-						struct stat st;
-						if(stat(g.gl_pathv[i], &st) != 0)
-							continue;
-						send_mlsx_entry(fp, sock, sess, mlsx_feats, "file", permstr, (uint64_t)st.st_size, st.st_mtime, str, uniq, f.dateuled, cmd[3] == 'T' ? mls_path : getfname(g.gl_pathv[i]));
+						f.size = f.cdt;
+						f.date = f.dateuled;
+						if(!filedat || (scfg.dir[dir]->misc&DIR_FCHK)) {
+							struct stat st;
+							if(stat(g.gl_pathv[i], &st) != 0)
+								continue;
+							f.size = st.st_size;
+							f.date = (time32_t)st.st_mtime;
+						}
+						send_mlsx_entry(fp, sock, sess, mlsx_feats, "file", permstr, f.size, f.date, str, uniq, f.dateuled, cmd[3] == 'T' ? mls_path : getfname(g.gl_pathv[i]));
 						l++;
 					}
 					lprintf(LOG_INFO, "%04d <%s> %s listing (%lu bytes) of /%s/%s (%lu files) created in %ld seconds"
@@ -4949,13 +4959,17 @@ static void ctrl_thread(void* arg)
 						&& !(scfg.dir[dir]->misc&DIR_FILES))
 						continue;
 					if(detail) {
-						struct stat st;
-						if(stat(g.gl_pathv[i], &st) != 0)
-							continue;
-						f.size = st.st_size;
 						if(filedat && !getfiledat(&scfg,&f))
 							continue;
-						t = st.st_mtime;
+						f.size = f.cdt;
+						t = f.dateuled;
+						if(!filedat || (scfg.dir[dir]->misc&DIR_FCHK)) {
+							struct stat st;
+							if(stat(g.gl_pathv[i], &st) != 0)
+								continue;
+							f.size = st.st_size;
+							t = st.st_mtime;
+						}
 						if(localtime_r(&t,&tm)==NULL)
 							memset(&tm,0,sizeof(tm));
 						if(filedat) {
@@ -5131,7 +5145,7 @@ static void ctrl_thread(void* arg)
 					sockprintf(sock,sess, "550 Size not available for dynamically generated files");
 					continue;
 				}
-				if((fp=fopen(ftp_tmpfname(fname,"ndx",sock),"w+b"))==NULL) {
+				if((fp=fopen(ftp_tmpfname(fname,"ndx",sock),"wb"))==NULL) {
 					lprintf(LOG_ERR,"%04d <%s> !ERROR %d (%s) line %d opening %s"
 						,sock, user.alias, errno, strerror(errno), __LINE__, fname);
 					sockprintf(sock,sess, "451 Insufficient system storage");
@@ -5142,8 +5156,8 @@ static void ctrl_thread(void* arg)
 				if(getdate)
 					file_date=time(NULL);
 				else {
-					lprintf(LOG_INFO,"%04d <%s> downloading index for %s in %s mode"
-						,sock,user.alias,genvpath(lib,dir,str)
+					lprintf(LOG_INFO,"%04d <%s> downloading %s for %s in %s mode"
+						,sock, user.alias, startup->index_file_name, genvpath(lib,dir,str)
 						,mode);
 					credits=FALSE;
 					tmpfile=TRUE;
@@ -5355,8 +5369,8 @@ static void ctrl_thread(void* arg)
 						filepos=0;
 						continue;
 					}
-					lprintf(LOG_INFO,"%04d <%s> downloading HTML index for %s in %s mode"
-						,sock,user.alias,genvpath(lib,dir,str)
+					lprintf(LOG_INFO,"%04d <%s> downloading %s for %s in %s mode"
+						,sock, user.alias, startup->html_index_file, genvpath(lib,dir,str)
 						,mode);
 					credits=FALSE;
 					tmpfile=TRUE;