diff --git a/ctrl/sbbs.ini b/ctrl/sbbs.ini
index 31c73dfe1cf2a1d316b71248d2af8e929ec4207e..bad2683c2aa4aaf9f1c7453aa260a0d8caf2c50a 100644
--- a/ctrl/sbbs.ini
+++ b/ctrl/sbbs.ini
@@ -235,8 +235,6 @@ Options = ALLOW_POP3 | USE_SUBMISSION_PORT | TLS_SUBMISSION | TLS_POP3
 
         ; Dynamically generated index files
 	IndexFileName = 00index
-	HtmlIndexFile = 00index.html
-	HtmlIndexScript = ftp-html.js
 ; Supported options (separated with |):
 ;	DEBUG_RX
 ;	DEBUG_DATA
@@ -246,13 +244,11 @@ Options = ALLOW_POP3 | USE_SUBMISSION_PORT | TLS_SUBMISSION | TLS_POP3
 ;	NO_LOCAL_FSYS
 ;	DIR_FILES
 ;	KEEP_TEMP_FILES
-;	HTML_INDEX_FILE
 ;	LOOKUP_PASV_IP
 ; 	NO_HOST_LOOKUP
 ;	NO_RECYCLE
-; 	NO_JAVASCRIPT
 ; 	MUTE
-Options = INDEX_FILE | HTML_INDEX_FILE | ALLOW_QWK
+Options = INDEX_FILE | ALLOW_QWK
 
 [Web]	Web (HTTP) Server
 	AutoStart = true
diff --git a/exec/ftp-html.js b/exec/ftp-html.js
deleted file mode 100644
index 96f4526b943ad411913e2fd1499050a6304ca394..0000000000000000000000000000000000000000
--- a/exec/ftp-html.js
+++ /dev/null
@@ -1,431 +0,0 @@
-// JavaScript HTML Index for Synchronet FTP Server
-// $Id: ftp-html.js,v 1.23 2015/04/14 01:45:31 rswindell Exp $
-
-load("sbbsdefs.js");    // Synchronet constants
-
-var start=new Date();
-var time_stamp = '';
-var time_stamp_only = '';
-var new_time_stamp='$'+start.valueOf().toString(36);    // Used to defeat caching browsers
-if (!(user.security.restrictions&UFLAG_G)) {
-	time_stamp=new_time_stamp;
-	time_stamp_only = '%3F' + time_stamp;
-}
-
-/* Utility Functions */
-
-function writeln(str)
-{
-    write(str + "\r\n");
-}
-
-function kbytes(nbytes)
-{
-    return(Math.round(nbytes/1024)+"k");
-}
-
-function secstr(sec)
-{
-    return(format("%02u:%02u",sec/60,sec%60));
-}
-
-var title = system.name + " - FTP Server";
-var font_face = "<font face=Arial,Helvetica,sans-serif>";
-var font_size = 2;  // Change base font size here
-if(client.socket.local_port!=21)
-    port=":" + client.socket.local_port;
-else
-    port="";
-
-writeln('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">');
-writeln("<html>");
-writeln("<head>");
-writeln("<title>");
-writeln(title);
-if (ftp.curdir.name!=undefined)
-    write(" - " + ftp.curdir.name);
-else if(ftp.curlib.description!=undefined)
-    write(" - " + ftp.curlib.description);
-writeln("</title>");
-
-/* META TAGS */
-writeln("<meta name='GENERATOR' content='" + system.version + "'>");
-// The following line is necessary for IBM extended-ASCII in descriptions 
-writeln("<meta http-equiv='Content-Type' content='text/html; charset=IBM437'>");
-
-writeln("</head>");
-writeln("<body bgcolor=#aaaaaa text=black link=white vlink=#334455 alink=red>");
-writeln(font_face);
-
-/* Go To Select Box */
-writeln("<table width=100%>");
-writeln("<td>");
-writeln("<h1>" + font_face + "<font color=white>" + title.italics() + "</font></h1>");
-writeln("<td align=right>");
-writeln("<form>");  // Netscape requires this to be in a form <sigh>
-writeln(format(
-    "<select " +
-    "onChange='if(selectedIndex>0) location=options[selectedIndex].value + \"%s\";'>"
-    ,time_stamp_only));
-writeln("<option>Go To...</option>");
-writeln(format("<option value=/%s>Root</option>",html_index_file));
-for(l in file_area.lib_list) {
-    writeln(format("<optgroup label=%s>",file_area.lib_list[l].name));
-    writeln(format("<option value=%s>[%s]"
-        ,file_area.lib_list[l].link
-        ,file_area.lib_list[l].name));
-    for(d in file_area.lib_list[l].dir_list) {
-        writeln(format("<option value=%s>%s"
-            ,file_area.lib_list[l].dir_list[d].link
-            ,file_area.lib_list[l].dir_list[d].name));
-    }
-    writeln("</optgroup>");
-}
-writeln("</select>");
-writeln("</form>");
-writeln("</table>");
-
-var prevdir;
-
-var hdr_font="<font color=black>";
-var dat_font="<font color=#112233>";
-
-if(!(user.security.restrictions&UFLAG_G)) { /* !Guest or Anonymous */
-    if(system.matchuser("Guest")) {
-        /* Logout button */
-        writeln("<table align=right>");
-        writeln("<form>");
-        writeln("<input type=button value=Logout onclick='location=\"ftp://" 
-            + format("%s/%s%s",system.host_name + port,html_index_file,time_stamp_only)
-            + "\";'>");
-        writeln("</form>");
-        writeln("</table>");
-        writeln("<br><br>");
-    }
-
-    /* User Info */
-    writeln("<table border=0 nowrap align=left>");
-    writeln(font_face);
-    writeln("<tr><th bgcolor=#888888 align=right>"+hdr_font+"User:<th bgcolor=#888888 align=left>"+dat_font+user.alias);
-    writeln("<tr><th bgcolor=#888888 align=right>"+hdr_font+"Address:<th bgcolor=#888888 align=left width=150>"+dat_font+user.ip_address);
-    write("<tr><th bgcolor=#888888 align=right>"+hdr_font+"Credits:<th bgcolor=#888888 align=left>"+dat_font);
-    if(user.security.exemptions&UFLAG_D)
-        writeln("Exempt");
-    else
-        writeln(kbytes(user.security.credits+user.security.free_credits));
-    write("<tr><th bgcolor=#888888 align=right>"+hdr_font+"Time left:<th bgcolor=#888888 align=left>"+dat_font);
-    if(user.security.exemptions&UFLAG_T)
-        writeln("Exempt");
-    else
-        writeln(secstr(ftp.time_left));
-    writeln("</table>");
-
-    /* User Stats */
-
-    writeln("<table border=0 nowrap>");
-    writeln(font_face);
-    writeln("<tr><th align=right bgcolor=#888888>"+hdr_font+"Logons:<th bgcolor=#888888 align=left>"+dat_font+user.stats.total_logons);
-    writeln("<tr><th bgcolor=#888888 align=right>"+hdr_font+"Last on:<th bgcolor=#888888 align=left>"+strftime("%B %d, %Y %H:%M" ,user.stats.laston_date));
-    writeln("<tr><th bgcolor=#888888 align=right>"+hdr_font+"Uploaded:<th bgcolor=#888888 align=left>"+dat_font);
-    writeln(format("%s bytes in %u files"
-        ,kbytes(user.stats.bytes_uploaded),user.stats.files_uploaded));
-    writeln("<tr><th bgcolor=#888888 align=right>"+hdr_font+"Downloaded:<th bgcolor=#888888 align=left>"+dat_font);
-    writeln(format("%s bytes in %u files",kbytes(user.stats.bytes_downloaded)
-        ,user.stats.files_downloaded));
-    writeln("</table>");
-    writeln("<br>");
-} else if(ftp.curlib.name==undefined) { /* Login */
-    writeln("<table align=right>");
-    writeln("<td><input type=button value='New User' onClick='location=\"telnet://" 
-        + system.host_name + port + "\";'>");
-    writeln("</table>");
-
-    writeln("<form name='login'>");
-    writeln("<table border=1 frame=box rules=none cellpadding=3>");
-    writeln(font_face);
-    writeln("<tr><th valign=top align=left>"+hdr_font+"Name");
-    writeln("<td colspan=2><input type=text name='username' size=25 maxlength=25>");
-    writeln("<tr><th valign=top align=left>"+hdr_font+"Password");
-    writeln("<td><input type=password name='password' size=10 maxlength=25>");
-    writeln("<td align=right><input type=button name='LoginButton' value='Login' onClick='login_event();'>");
-
-    /* Client-Side Script */
-    writeln("<SCRIPT language='JavaScript'>");
-        writeln("<!--");
-        writeln("function login_event() {");
-        write("var url='ftp://'"); 
-        write("+ escape(document.login.username.value) + ':'");
-        write("+ escape(document.login.password.value) + '@'");
-        write(format("+ '%s/%s%%3F%s'\r\n"
-            ,system.host_name + port,html_index_file,new_time_stamp));
-//      writeln("alert(url);");
-        writeln("location = url;");
-        writeln("}");
-        writeln("// -->");
-        writeln("</script>");
-
-    writeln("</table>");
-    writeln("</form>");
-}
-
-/* Virtual Path */
-writeln("<h3>" + hdr_font + "Path: ");
-if(ftp.curlib.name==undefined) 
-    writeln(dat_font + "Root");
-else
-    writeln("Root".link(format("/%s%s",html_index_file,time_stamp_only)));
-if(ftp.curlib.name!=undefined) {
-    if(ftp.curdir.name==undefined)
-        writeln(" / " + dat_font + ftp.curlib.description);
-    else
-        writeln(" / " + ftp.curlib.description.link(format("/%s/%s%s"
-            ,ftp.curlib.name,html_index_file,time_stamp_only)));
-}       
-if(ftp.curdir.name!=undefined) 
-    writeln(" / " + dat_font + ftp.curdir.description);
-if(ftp.curdir.settings!=undefined && ftp.curdir.settings&DIR_FREE)
-    write(hdr_font+" - FREE");
-writeln("</h3>");
-
-
-/* Table Attributes */
-var hdr_background="#8899aa";
-var hdr_font=format("<font size=%d color=black>",font_size-1);
-var dat_font=format("<font size=%d>",font_size);
-var cell_spacing=""; //"cellspacing=2 cellpadding=2";
-
-/* Directory Listing */
-if(ftp.dir_list.length) {
-
-    writeln("<table " + cell_spacing + " width=33%>");
-    writeln(font_face);
-
-    /* header */
-    writeln("<thead>");
-    writeln("<tr bgcolor=" + hdr_background + ">");
-    writeln("<th>" + hdr_font + "Directory");
-    if(ftp.curlib.name!=undefined) 
-        writeln("<th>" + hdr_font + "Files");
-    writeln("</thead>");
-
-    /* body */
-    writeln("<tbody>");
-    for(i in ftp.dir_list) {
-        writeln("<tr>");
-    
-        /* filename */
-        writeln("<th nowrap align=left>" + dat_font 
-            + ftp.dir_list[i].description.link(ftp.dir_list[i].link + time_stamp_only));
-
-        if(ftp.curlib.name!=undefined) {
-            writeln("<td align=right><font color=black>" + dat_font + ftp.dir_list[i].size);
-            writeln("<th>" + dat_font + (ftp.dir_list[i].settings&DIR_FREE ? "FREE":""));
-        }
-    }   
-    writeln("</table>");
-    if(ftp.file_list.length)
-        writeln("<br>"); 
-}
-
-/* File Listing */
-if(ftp.file_list.length) {
-
-    /* Sort the list? */
-    switch(ftp.sort) {
-        case "uploader":
-            ftp.file_list.sort(function(a,b) 
-                {   if(a.uploader>b.uploader)
-                        return(1);
-                    if(a.uploader<b.uploader)
-                        return(-1);
-                    return(0); }
-                );
-            break;
-        case "size":
-            ftp.file_list.sort(function(a,b) 
-                { return(a.size-b.size); }
-                );
-            break;
-        case "credits":
-            ftp.file_list.sort(function(a,b) 
-                { return(a.credits-b.credits); }
-                );
-            break;
-        case "time":
-            ftp.file_list.sort(function(a,b) 
-                { return(a.time.valueOf()-b.time.valueOf()); }
-                );
-            break;
-        case "hits":
-            ftp.file_list.sort(function(a,b) 
-                { return(a.times_downloaded-b.times_downloaded); }
-                );
-            break;
-    }
-    if(ftp.reverse)
-        ftp.file_list.reverse();
-
-    var show_ext_desc;          /* show extended descriptions */
-    var total_bytes=0;
-    var total_downloads=0;
-    var most_recent=0;
-
-    if (ftp.curdir.name==undefined)
-        show_ext_desc=false;    /* aliased files have no ext desc */
-    else
-        show_ext_desc=ftp.extended_descriptions;
-
-    writeln("<table " + cell_spacing + " width=100%>");
-    writeln(font_face);
-    
-    /* header */
-    writeln("<thead>");
-    writeln("<tr bgcolor=" + hdr_background + ">");
-
-    /* File */
-    writeln(format("<th><a href=%s%%3Fsort=name%s%s>%sFile</a>"
-        ,html_index_file
-        ,(ftp.sort=="name" && !ftp.reverse) ? "&reverse":"", time_stamp, hdr_font));
-
-    /* Credits or Size */
-    if(ftp.curdir.settings!=undefined && !(ftp.curdir.settings&DIR_FREE))
-        writeln(format("<th><a href=%s%%3Fsort=credits%s%s>%sCredits</a>"
-            ,html_index_file
-            ,(ftp.sort=="credits" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font));
-    else
-        writeln(format("<th><a href=%s%%3Fsort=size%s%s>%sSize</a>"
-            ,html_index_file
-            ,(ftp.sort=="size" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font));
-
-    /* Description */
-    write("<th>" + hdr_font + "Description");
-    if(ftp.extended_descriptions)
-        writeln(format(" [%s]"
-            ,(hdr_font+"short").link(format("%s%%3Fext=off%s",html_index_file, time_stamp))));
-    else
-        writeln(format(" [%s]"
-            ,(hdr_font+"extended").link(format("%s%%3Fext=on%s",html_index_file, time_stamp))));
-
-    /* Date/Time */
-    writeln(format("<th><a href=%s%%3Fsort=time%s%s>%sDate/Time</a>"
-        ,html_index_file
-        ,(ftp.sort=="time" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font));
-
-    /* Uploader and Hits (downloads) */
-    if(ftp.curdir.name!=undefined) {    /* not valid for aliased files in root */
-        writeln(format("<th><a href=%s%%3Fsort=uploader%s%s>%sUploader</a>"
-            ,html_index_file
-            ,(ftp.sort=="uploader" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font));
-        writeln(format("<th><a href=%s%%3Fsort=hits%s%s>%sHits</a>"
-            ,html_index_file
-            ,(ftp.sort=="hits" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font));
-    }
-    writeln("</thead>");
-
-    /* body */
-    writeln("<tbody>");
-    for(i in ftp.file_list) {
-
-        total_downloads+=ftp.file_list[i].times_downloaded;
-        if(ftp.file_list[i].time>most_recent)
-            most_recent=ftp.file_list[i].time;
-
-        writeln("<tr valign=top>");
-
-        /* filename */
-        if(user.security.restrictions&UFLAG_D
-            || (ftp.curdir.settings!=undefined 
-                && !(ftp.curdir.settings&DIR_FREE)
-                && !(user.security.exemptions&UFLAG_D)
-                && ftp.file_list[i].credits > (user.security.credits+user.security.free_credits))
-            ) {
-            write("<td align=left>" + dat_font);
-            writeln(ftp.file_list[i].name.link(
-                "javascript:alert('Sorry, you do not have enough credits to download this file.');"));
-        } else {
-            write("<th align=left>" + dat_font);
-            writeln(ftp.file_list[i].name.link(ftp.file_list[i].link));
-        }
-
-        /* size */
-        write("<td align=right>" + dat_font + "<font color=black>");
-        if(ftp.curdir.settings!=undefined && !(ftp.curdir.settings&DIR_FREE)) {
-            if(!ftp.file_list[i].credits)
-                writeln("<font color=white><b>FREE");
-            else
-                writeln(kbytes(ftp.file_list[i].credits)); 
-            total_bytes+=ftp.file_list[i].credits;
-        } else {
-            writeln(kbytes(ftp.file_list[i].size)); 
-            total_bytes+=ftp.file_list[i].size;
-        }
-
-        /* description */
-        write("<td>" + dat_font);
-        if (show_ext_desc) {
-            if(ftp.file_list[i].settings&FILE_EXTDESC)
-                writeln("<pre>" + ftp.file_list[i].extended_description);
-            else
-                writeln("<tt>" + ftp.file_list[i].description);
-        } else
-            writeln(dat_font + ftp.file_list[i].description);
-
-        /* date/time */
-        writeln("<td align=center nowrap>" + dat_font + "<font color=black>" 
-            + "<tt>"+ strftime("%b %d, %Y %H:%M" ,ftp.file_list[i].time));
-
-        if(ftp.curdir.name!=undefined) {    /* not valid for aliased files in root */
-            /* uploader */
-            var uploader=ftp.file_list[i].uploader;
-            if(ftp.file_list[i].settings&FILE_ANON)
-                uploader="Anonymous";
-			else {
-				if(uploader == "-> ADDFILES <-")
-					uploader=system.operator;
-				if(!(user.security.restrictions&UFLAG_G)) /* ! Guest/Anonymous */
-					uploader=uploader.link("mailto:" + uploader + "@" + system.inetaddr);
-			}
-
-            writeln("<td nowrap>" + dat_font + uploader);
-
-            /* download count */
-            writeln("<td align=right>" + dat_font + "<font color=black>" 
-                + ftp.file_list[i].times_downloaded);
-        }
-    }
-
-    /* Footer (with totals) */
-    writeln("<tfoot>");
-    writeln(format("<tr bgcolor=%s><th>%s%lu files" +
-        "<th align=right>%s%s<th>%s-<th>%s<font color=black><tt>%s"
-        ,hdr_background
-        ,hdr_font, ftp.file_list.length
-        ,hdr_font, kbytes(total_bytes)
-        ,hdr_font
-        ,dat_font, strftime("%b %d, %Y %H:%M" ,most_recent)
-        ));
-
-    if(ftp.curdir.name!=undefined)  /* not valid for aliased files in root */
-        writeln(format("<th>%s-<th align=right>%s%lu"
-            ,hdr_font
-            ,hdr_font, total_downloads
-            ));
-
-    writeln("</table>");
-}
-
-if(!ftp.file_list.length && !ftp.dir_list.length)
-    writeln("<br><b>No Files.</b><br>");
-
-/* Footer */
-write(format("<br><font size=%d color=black>Problems? Ask ",font_size-1));
-write(format("<a href=mailto:sysop@%s>%s</a>.",system.inetaddr,system.operator));
-
-write(format("<br><font size=%d>Dynamically generated ",font_size-1));
-write(format("in %lu milliseconds ", new Date().valueOf()-start.valueOf()));
-write("by <a href=http://www.synchro.net>" + server.version + "</a>");
-writeln("<br>" + Date() + "</font>");
-writeln("</body>");
-writeln("</html>");
-
-/* End of ftp-html.js */
diff --git a/exec/ftp-web-html.js b/exec/ftp-web-html.js
deleted file mode 100644
index 2e815a4df9b19fd2696f2928f0c1cc287e9fb4c4..0000000000000000000000000000000000000000
--- a/exec/ftp-web-html.js
+++ /dev/null
@@ -1,457 +0,0 @@
-// JavaScript HTML Index for Synchronet FTP Server
-// $Id: ftp-web-html.js,v 1.11 2015/04/14 01:42:29 rswindell Exp $
-
-load("sbbsdefs.js");    // Synchronet constants
-
-var start=new Date();
-var time_stamp = '';
-var time_stamp_only = '';
-var new_time_stamp='$'+start.valueOf().toString(36);    // Used to defeat caching browsers
-if (!(user.security.restrictions&UFLAG_G)) {
-	time_stamp=new_time_stamp;
-	time_stamp_only = '%3F' + time_stamp;
-}
-
-/* Utility Functions */
-
-function writeln(str)
-{
-    write(str + "\r\n");
-}
-
-function kbytes(nbytes)
-{
-    return(Math.round(nbytes/1024)+"k");
-}
-
-function secstr(sec)
-{
-    return(format("%02u:%02u",sec/60,sec%60));
-}
-
-var title = system.name + " - FTP Server";
-if(client.socket.local_port!=21)
-    port=":" + client.socket.local_port;
-else
-    port="";
-
-var http_port = 80;
-var file = new File(file_cfgname(system.ctrl_dir, "sbbs.ini"));
-if(file.open("r")) {
-	http_port = file.iniGetValue("web","port",80);
-	file.close();
-}
-    
-writeln('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">');
-writeln("<html>");
-writeln("<head>");
-writeln("<title>");
-writeln(title);
-if (ftp.curdir.name!=undefined)
-    write(" - " + ftp.curdir.name);
-else if(ftp.curlib.description!=undefined)
-    write(" - " + ftp.curlib.description);
-writeln("</title>");
-
-/* META TAGS */
-writeln("<meta name='GENERATOR' content='" + system.version + "'>");
-// The following line is necessary for IBM extended-ASCII in descriptions 
-writeln("<meta http-equiv='Content-Type' content='text/html; charset=IBM437'>");
-writeln('<link rel="stylesheet" type="text/css" href="http://' + format("%s:%u",system.host_name, http_port) + '/default.css">');
-
-writeln("</head>");
-writeln('<body style="background-image: url(http://' + format("%s:%u",system.host_name, http_port) +'/images/default/bg_grad.jpg)";>');
-//writeln(font_face);
-
-writeln('<table class="welcome_main" width="95%"><tr><td>');
-
-/* Go To Select Box */
-writeln("<table width=100%>");
-writeln("<td>");
-writeln('<h1 class="ftp_title">' + title + '</h1>');
-writeln("<td align=right>");
-writeln("<form>");  // Netscape requires this to be in a form <sigh>
-writeln(format(
-    "<select " +
-    "onChange='if(selectedIndex>0) location=options[selectedIndex].value + \"%s\";'>"
-    ,time_stamp_only));
-writeln("<option>Go To...</option>");
-writeln(format("<option value=/%s>Root</option>",html_index_file));
-for(l in file_area.lib_list) {
-    writeln(format("<optgroup label=%s>",file_area.lib_list[l].name));
-    writeln(format("<option value=%s>[%s]"
-        ,file_area.lib_list[l].link
-        ,file_area.lib_list[l].name));
-    for(d in file_area.lib_list[l].dir_list) {
-        writeln(format("<option value=%s>%s"
-            ,file_area.lib_list[l].dir_list[d].link
-            ,file_area.lib_list[l].dir_list[d].name));
-    }
-    writeln("</optgroup>");
-}
-writeln("</select>");
-writeln("</form>");
-writeln("</table>");
-
-var prevdir;
-
-var hdr_font="<font color=silver>";
-var dat_font="<font color=#CCCCCC>";
-
-if(!(user.security.restrictions&UFLAG_G)) { /* !Guest or Anonymous */
-    if(system.matchuser("Guest")) {
-        /* Logout button */
-        writeln("<table align=right>");
-        writeln("<form>");
-        writeln("<input type=button value=Logout onclick='location=\"ftp://" 
-            + format("%s/%s%s",system.host_name + port,html_index_file,time_stamp_only)
-            + "\";'>");
-        writeln("</form>");
-        writeln("</table><br /><br />");
-    }
-
-	writeln("<table nowrap class=\"ftp_stats\"><tr><td>");
-
-    /* User Info */
-    writeln("<table nowrap align=left>");
-    writeln("<tr><th class=\"ftp_stats\" align=right>" + hdr_font 
-        + "User:<th class=\"ftp_stats\" align=left>" +dat_font+ user.alias);
-    writeln("<tr><th class=\"ftp_stats\" align=right>"+ hdr_font 
-        + "Address:<th class=\"ftp_stats\" align=left width=150>"+dat_font+user.ip_address);
-    write("<tr><th class=\"ftp_stats\" align=right>" + hdr_font 
-        + "Credits:<th class=\"ftp_stats\" align=left>"+dat_font);
-    if(user.security.exemptions&UFLAG_D)
-        writeln("Exempt");
-    else
-        writeln(kbytes(user.security.credits+user.security.free_credits));
-    write("<tr><th class=\"ftp_stats\" align=right>" + hdr_font 
-        + "Time left:<th class=\"ftp_stats\" align=left>"+dat_font);
-    if(user.security.exemptions&UFLAG_T)
-        writeln("Exempt");
-    else
-        writeln(secstr(ftp.time_left));
-    writeln("</table>");
-
-    /* User Stats */
-
-    writeln("<table nowrap>");
-    writeln("<tr><th class=\"ftp_stats\" align=right>" + hdr_font 
-        + "Logons:<th class=\"ftp_stats\" align=left>" + dat_font + user.stats.total_logons);
-    writeln("<tr><th class=\"ftp_stats\" align=right>" + hdr_font 
-        + "Last on:<th class=\"ftp_stats\" align=left>"+ dat_font 
-        + strftime("%B %d, %Y, %H:%M" ,user.stats.laston_date));
-    writeln("<tr><th class=\"ftp_stats\" align=right>" + hdr_font 
-        + "Uploaded:<th class=\"ftp_stats\" align=left>"+dat_font);
-    writeln(format("%s bytes in %u files"
-        ,kbytes(user.stats.bytes_uploaded),user.stats.files_uploaded));
-    writeln("<tr><th class=\"ftp_stats\" align=right>" + hdr_font 
-        + "Downloaded:<th class=\"ftp_stats\" align=left>"+dat_font);
-    writeln(format("%s bytes in %u files",kbytes(user.stats.bytes_downloaded)
-        ,user.stats.files_downloaded));
-    writeln("</table>");
-
-	writeln("</tr></td></table>");  
-    
-    writeln("<br>");
-} else if(ftp.curlib.name==undefined) { /* Login */
-    writeln("<table align=right>");
-    writeln("<td><input type=button value='New User' onClick='location=\"telnet://" 
-        + system.host_name + port + "\";'>");
-    writeln("</table>");
-
-    writeln("<form name='login'>");
-    writeln("<table border=1 frame=box rules=none cellpadding=3>");
-    writeln("<tr><th valign=top align=left>"+hdr_font+"Name");
-    writeln("<td colspan=2><input type=text name='username' size=25 maxlength=25>");
-    writeln("<tr><th valign=top align=left>"+hdr_font+"Password");
-    writeln("<td><input type=password name='password' size=10 maxlength=25>");
-    writeln("<td align=right><input type=button name='LoginButton' value='Login' onClick='login_event();'>");
-
-    /* Client-Side Script */
-    writeln("<SCRIPT language='JavaScript'>");
-        writeln("<!--");
-        writeln("function login_event() {");
-        write("var url='ftp://'"); 
-        write("+ escape(document.login.username.value) + ':'");
-        write("+ escape(document.login.password.value) + '@'");
-        write(format("+ '%s/%s%%3F%s'\r\n"
-            ,system.host_name + port,html_index_file,new_time_stamp));
-//      writeln("alert(url);");
-        writeln("location = url;");
-        writeln("}");
-        writeln("// -->");
-        writeln("</script>");
-
-    writeln("</table>");
-    writeln("</form>");
-}
-
-/* Virtual Path */
-
-writeln('<table align="center" width="100%"  border="0" cellspacing="0" cellpadding="0">');
-    writeln('<tr>');
-    writeln('<td style="background-image: url(http://' + format("%s:%u",system.host_name, http_port) + '/images/default/tnav_bg.gif); background-repeat: repeat-x; text-align: left;" width="1%"><img src="http://' + format("%s:%u"
-        ,system.host_name
-        ,http_port) 
-        + '/images/default/tnav_left.gif" width="5" height="32" alt="" /></td>');
-    writeln('<td style="background-image: url(http://' 
-        + format("%s:%u",system.host_name, http_port) 
-        + '/images/default/tnav_bg.gif); background-repeat: repeat-x;">');
-        if(ftp.curlib.name==undefined) 
-            writeln('<span class="tlink">FTP Server Root</span>');
-        else
-    writeln('<a class="tlink" href="' + format("/%s%s",html_index_file,time_stamp_only) 
-        + '">FTP Server Root</a>');
-    if(ftp.curlib.name!=undefined) {
-        if(ftp.curdir.name==undefined)
-            writeln('<span class="tlink">' + ftp.curlib.description + '</span>');
-        else
-            writeln('<a class="tlink" href="' + format("/%s/%s%s",ftp.curlib.name,html_index_file,time_stamp_only) + '">' 
-            + ftp.curlib.description + '</a>');
-}       
-if(ftp.curdir.name!=undefined) 
-    writeln('<span class="tlink">' + ftp.curdir.description + '</span>');
-if(ftp.curdir.settings!=undefined && ftp.curdir.settings&DIR_FREE)
-    write(" - FREE");
-    writeln('</td>');
-    writeln('<td style="background-image: url(http://' + format("%s:%u",system.host_name, http_port) + '/images/default/tnav_bg.gif); background-repeat: repeat-x; text-align: right;" width="1%"><img src="http://' + format("%s:%u",system.host_name, http_port) 
-        + '/images/default/tnav_right.gif" width="5" height="32" alt="" /></td>');
-    writeln('</tr>');
-writeln('</table>');
-writeln('<br />');
-
-
-
-/* Directory Listing */
-if(ftp.dir_list.length) {
-
-    writeln('<table class="ftp_dirlist" cellspacing="2" width="33%">');
-
-    /* header */
-    writeln("<thead>");
-    writeln('<tr class="ftp_dirlist_hdr">');
-    writeln('<th class="ftp_dirlist_hdr">Directory</th>');
-    if(ftp.curlib.name!=undefined) 
-        writeln('<th class="ftp_dirlist_hdr">Files</th>');
-    writeln("</thead>");
-
-    /* body */
-    writeln("<tbody>");
-    for(i in ftp.dir_list) {
-        writeln("<tr>");
-    
-        /* filename */
-        writeln('<th class="ftp_dirlist" nowrap align="left"><a class="ftp_dirlist" href="' 
-            + ftp.dir_list[i].link + time_stamp_only + '">' + ftp.dir_list[i].description + '</a></th>');
-
-        if(ftp.curlib.name!=undefined) {
-            writeln('<td class="ftp_dirlist" align="right">' + ftp.dir_list[i].size);
-            writeln((ftp.dir_list[i].settings&DIR_FREE ? "FREE</th>":"</th>"));
-        }
-    }   
-    writeln('</tr><tr><th class="ftp_dirlist_hdr">&nbsp;</th>');
-    if(ftp.curlib.name!=undefined) 
-        writeln('<th class="ftp_dirlist_hdr_rt">-</th></tr></tbody></table>');
-    else
-        writeln('</table>');
-    if(ftp.file_list.length)
-        writeln("<br>"); 
-}
-
-/* File Listing */
-if(ftp.file_list.length) {
-
-    /* Sort the list? */
-    switch(ftp.sort) {
-        case "uploader":
-            ftp.file_list.sort(function(a,b) 
-                {   if(a.uploader>b.uploader)
-                        return(1);
-                    if(a.uploader<b.uploader)
-                        return(-1);
-                    return(0); }
-                );
-            break;
-        case "size":
-            ftp.file_list.sort(function(a,b) 
-                { return(a.size-b.size); }
-                );
-            break;
-        case "credits":
-            ftp.file_list.sort(function(a,b) 
-                { return(a.credits-b.credits); }
-                );
-            break;
-        case "time":
-            ftp.file_list.sort(function(a,b) 
-                { return(a.time.valueOf()-b.time.valueOf()); }
-                );
-            break;
-        case "hits":
-            ftp.file_list.sort(function(a,b) 
-                { return(a.times_downloaded-b.times_downloaded); }
-                );
-            break;
-    }
-    if(ftp.reverse)
-        ftp.file_list.reverse();
-
-    var show_ext_desc;          /* show extended descriptions */
-    var total_bytes=0;
-    var total_downloads=0;
-    var most_recent=0;
-
-    if (ftp.curdir.name==undefined)
-        show_ext_desc=false;    /* aliased files have no ext desc */
-    else
-        show_ext_desc=ftp.extended_descriptions;
-
-    writeln('<table class="ftp_dirlist" cellspacing="2" width="100%">');
-    
-    /* header */
-    writeln("<thead>");
-    writeln('<tr>');
-
-    /* File */
-    writeln(format('<th class="ftp_dirlist_hdr"><a class="ftp_dirlist_hdr" href=%s%%3Fsort=name%s%s>File</a>'
-        ,html_index_file
-        ,(ftp.sort=="name" && !ftp.reverse) ? '&reverse':'', time_stamp) + '</th>');
-
-    /* Credits or Size */
-    if(ftp.curdir.settings!=undefined && !(ftp.curdir.settings&DIR_FREE))
-        writeln(format('<th class="ftp_dirlist_hdr"><a class="ftp_dirlist_hdr" href=%s%%3Fsort=credits%s%s>Credits</a>'
-            ,html_index_file
-            ,(ftp.sort=="credits" && !ftp.reverse) ? '&reverse' : '', time_stamp) + '</th>');
-    else
-        writeln(format('<th class="ftp_dirlist_hdr"><a class="ftp_dirlist_hdr" href=%s%%3Fsort=size%s%s>Size</a>'
-            ,html_index_file
-            ,(ftp.sort=="size" && !ftp.reverse) ? '&reverse' : '', time_stamp) + '</th>');
-
-    /* Description */
-    write('<th class="ftp_dirlist_hdr">Description');
-    if(ftp.extended_descriptions)
-        writeln(' [<a class="ftp_dirlist_hdr" href="' 
-        + format("%s%%3Fext=off%s",html_index_file, time_stamp) + '">short</a>]</th>');
-    else
-        writeln(' [<a class="ftp_dirlist_hdr" href="' 
-        + format("%s%%3Fext=on%s",html_index_file, time_stamp) + '">extended</a>]</th>');
-
-    /* Date/Time */
-    writeln(format('<th class="ftp_dirlist_hdr"><a class="ftp_dirlist_hdr" href=%s%%3Fsort=time%s%s>Date/Time</a>'
-        ,html_index_file
-        ,(ftp.sort=="time" && !ftp.reverse) ? '&reverse' : '', time_stamp) + '</th>');
-
-    /* Uploader and Hits (downloads) */
-    if(ftp.curdir.name!=undefined) {    /* not valid for aliased files in root */
-        writeln(format('<th class="ftp_dirlist_hdr"><a class="ftp_dirlist_hdr" href=%s%%3Fsort=uploader%s%s>Uploader</a>'
-            ,html_index_file
-            ,(ftp.sort=="uploader" && !ftp.reverse) ? '&reverse' : '', time_stamp) + '</th>');
-        writeln(format('<th class="ftp_dirlist_hdr"><a class="ftp_dirlist_hdr" href=%s%%3Fsort=hits%s%s>Hits</a>'
-            ,html_index_file
-            ,(ftp.sort=="hits" && !ftp.reverse) ? '&reverse' : '', time_stamp) + '</th>');
-    }
-    writeln("</thead>");
-
-    /* body */
-    writeln("<tbody>");
-    for(i in ftp.file_list) {
-
-        total_downloads+=ftp.file_list[i].times_downloaded;
-        if(ftp.file_list[i].time>most_recent)
-            most_recent=ftp.file_list[i].time;
-
-        writeln("<tr valign=top>");
-
-        /* filename */
-        if(user.security.restrictions&UFLAG_D
-            || (ftp.curdir.settings!=undefined 
-                && !(ftp.curdir.settings&DIR_FREE)
-                && !(user.security.exemptions&UFLAG_D)
-                && ftp.file_list[i].credits > (user.security.credits+user.security.free_credits))
-            ) {
-            write('<td class="ftp_dirlist" align="left">');
-            writeln('<a class="ftp_dirlist" href="javascript:alert(\"Sorry, you do not have enough credits to download this file.\"); ">' 
-            + ftp.file_list[i].name + '</a><td>');
-        } else {
-            write('<th class="ftp_dirlist" align=left>');
-            writeln('<a class="ftp_dirlist" href="' + ftp.file_list[i].link + '">' 
-            + ftp.file_list[i].name + "</a></th>");
-        }
-
-        /* size */
-        write('<td class="ftp_dirlist" align="right">');
-        if(ftp.curdir.settings!=undefined && !(ftp.curdir.settings&DIR_FREE)) {
-            if(!ftp.file_list[i].credits)
-                writeln('FREE</td>');
-            else
-                writeln(kbytes(ftp.file_list[i].credits)+ "</td>"); 
-            total_bytes+=ftp.file_list[i].credits;
-        } else {
-            writeln(kbytes(ftp.file_list[i].size) + "</td>"); 
-            total_bytes+=ftp.file_list[i].size;
-        }
-
-        /* description */
-        write("<td>");
-        if (show_ext_desc) {
-            if(ftp.file_list[i].settings&FILE_EXTDESC)
-                writeln("<pre class=\"ftp_desc\">" + ftp.file_list[i].extended_description + "</pre></td>");
-            else
-                writeln("<tt class=\"ftp_dirlist\">" + ftp.file_list[i].description + "</tt></td>");
-        } else
-            writeln(ftp.file_list[i].description + "</td>");
-
-        /* date/time */
-        writeln('<td align="left" class="ftp_dirlist" nowrap="nowrap">' 
-            + strftime("%b %d, %Y %H:%M" ,ftp.file_list[i].time) + "</td>");
-        if(ftp.curdir.name!=undefined) {    /* not valid for aliased files in root */
-            /* uploader */
-            var uploader=ftp.file_list[i].uploader;
-            if(ftp.file_list[i].settings&FILE_ANON)
-                uploader="Anonymous";
-			else {
-				if(uploader == "-> ADDFILES <-")
-					uploader=system.operator;
-				if(!(user.security.restrictions&UFLAG_G)) /* ! Guest/Anonymous */
-					uploader=uploader.link("mailto:" + uploader + "@" + system.inetaddr);
-			}
-            writeln('<td class="ftp_dirlist" nowrap="nowrap">' + uploader + '</td>');
-
-            /* download count */
-            writeln('<td class="ftp_dirlist" align=right>' 
-                + ftp.file_list[i].times_downloaded + '</td>');
-        }
-    }
-
-    /* Footer (with totals) */
-    writeln("<tfoot>");
-    writeln(format('<tr><th class="ftp_dirlist_ftr">%lu files</th><th class="ftp_dirlist_ftr" align="right">%s</th><th class="ftp_dirlist_ftr">-</th><th class="ftp_dirlist_ftr">%s'
-        ,ftp.file_list.length
-        ,kbytes(total_bytes)
-        ,strftime("%b %d, %Y %H:%M" ,most_recent)
-        ));
-
-    if(ftp.curdir.name!=undefined)  /* not valid for aliased files in root */
-        writeln(format('<th class="ftp_dirlist_ftr">-</th><th class="ftp_dirlist_ftr" align=right>%lu'
-            ,total_downloads
-            ) + '</th>');
-
-    writeln('</tr></tfoot></table>');
-}
-
-if(!ftp.file_list.length && !ftp.dir_list.length)
-    writeln("<br><b>No Files.</b><br>");
-
-/* Footer */
-write(format('<div class="ftp_ftr"><br>Problems? Ask '));
-write(format("<a href=mailto:sysop@%s>%s</a>.",system.inetaddr,system.operator));
-
-write(format("<br>Dynamically generated "));
-write(format("in %lu milliseconds ", new Date().valueOf()-start.valueOf()));
-write("by <a href=http://www.synchro.net>" + server.version + "</a>");
-writeln("<br>" + Date() + "</font>");
-writeln('</div></td></tr></table><br>');
-writeln("</body>");
-writeln("</html>");
-
-/* End of ftp-html.js */
diff --git a/src/sbbs3/ctrl/FtpCfgDlgUnit.cpp b/src/sbbs3/ctrl/FtpCfgDlgUnit.cpp
index 7289b56ba98134f715c7bfbd7d2013ae37244e06..ed33aff4fbd1a11fd546a0d79559be3d532ba399 100644
--- a/src/sbbs3/ctrl/FtpCfgDlgUnit.cpp
+++ b/src/sbbs3/ctrl/FtpCfgDlgUnit.cpp
@@ -1,12 +1,10 @@
 /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
 
-/* $Id: FtpCfgDlgUnit.cpp,v 1.13 2016/05/27 08:55:02 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright Rob Swindell - http://www.synchro.net/copyright.html		    *
+ * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -85,8 +71,6 @@ void __fastcall TFtpCfgDlg::FormShow(TObject *Sender)
   	PasvPortHighEdit->Text=AnsiString((int)MainForm->ftp_startup.pasv_port_high);
 
     IndexFileNameEdit->Text=AnsiString(MainForm->ftp_startup.index_file_name);
-    HtmlFileNameEdit->Text=AnsiString(MainForm->ftp_startup.html_index_file);
-    HtmlJavaScriptEdit->Text=AnsiString(MainForm->ftp_startup.html_index_script);
     AnswerSoundEdit->Text=AnsiString(MainForm->ftp_startup.answer_sound);
     HangupSoundEdit->Text=AnsiString(MainForm->ftp_startup.hangup_sound);
     HackAttemptSoundEdit->Text=AnsiString(MainForm->ftp_startup.hack_sound);    
@@ -102,9 +86,6 @@ void __fastcall TFtpCfgDlg::FormShow(TObject *Sender)
         =!(MainForm->ftp_startup.options&FTP_OPT_NO_HOST_LOOKUP);
 	AutoIndexCheckBox->Checked=MainForm->ftp_startup.options&FTP_OPT_INDEX_FILE;
 	AutoIndexCheckBoxClick(Sender);
-	HtmlIndexCheckBox->Checked
-        =MainForm->ftp_startup.options&FTP_OPT_HTML_INDEX_FILE;
-	HtmlIndexCheckBoxClick(Sender);
     PasvIpLookupCheckBoxClick(Sender);
 
     PageControl->ActivePage=GeneralTabSheet;
@@ -149,10 +130,6 @@ void __fastcall TFtpCfgDlg::OKBtnClick(TObject *Sender)
 
     SAFECOPY(MainForm->ftp_startup.index_file_name
         ,IndexFileNameEdit->Text.c_str());
-    SAFECOPY(MainForm->ftp_startup.html_index_file
-        ,HtmlFileNameEdit->Text.c_str());
-    SAFECOPY(MainForm->ftp_startup.html_index_script
-        ,HtmlJavaScriptEdit->Text.c_str());
 
     SAFECOPY(MainForm->ftp_startup.answer_sound
         ,AnswerSoundEdit->Text.c_str());
@@ -193,10 +170,6 @@ void __fastcall TFtpCfgDlg::OKBtnClick(TObject *Sender)
     	MainForm->ftp_startup.options|=FTP_OPT_INDEX_FILE;
     else
 	    MainForm->ftp_startup.options&=~FTP_OPT_INDEX_FILE;
-	if(HtmlIndexCheckBox->Checked==true)
-    	MainForm->ftp_startup.options|=FTP_OPT_HTML_INDEX_FILE;
-    else
-	    MainForm->ftp_startup.options&=~FTP_OPT_HTML_INDEX_FILE;
     if(PasvIpLookupCheckBox->Checked==true)
         MainForm->ftp_startup.options|=FTP_OPT_LOOKUP_PASV_IP;
     else
@@ -241,24 +214,6 @@ void __fastcall TFtpCfgDlg::AutoIndexCheckBoxClick(TObject *Sender)
 }
 //---------------------------------------------------------------------------
 
-
-void __fastcall TFtpCfgDlg::HtmlJavaScriptButtonClick(TObject *Sender)
-{
-	OpenDialog->FileName=HtmlJavaScriptEdit->Text;
-	if(OpenDialog->Execute()==true) {
-    	HtmlJavaScriptEdit->Text=OpenDialog->FileName;
-	}
-}
-//---------------------------------------------------------------------------
-
-void __fastcall TFtpCfgDlg::HtmlIndexCheckBoxClick(TObject *Sender)
-{
-    HtmlFileNameEdit->Enabled=HtmlIndexCheckBox->Checked;
-    HtmlJavaScriptEdit->Enabled=HtmlIndexCheckBox->Checked;
-    HtmlJavaScriptLabel->Enabled=HtmlIndexCheckBox->Checked;
-}
-//---------------------------------------------------------------------------
-
 void __fastcall TFtpCfgDlg::PasvIpLookupCheckBoxClick(TObject *Sender)
 {
     PasvIPv4AddrEdit->Enabled = !PasvIpLookupCheckBox->Checked;
diff --git a/src/sbbs3/ctrl/FtpCfgDlgUnit.dfm b/src/sbbs3/ctrl/FtpCfgDlgUnit.dfm
index a444e6f4465ff182f828e31163ca0bae6ce0a430..80e0e6201aa08a3a44ac39b31539ada217ebfc31 100644
--- a/src/sbbs3/ctrl/FtpCfgDlgUnit.dfm
+++ b/src/sbbs3/ctrl/FtpCfgDlgUnit.dfm
@@ -255,14 +255,6 @@ object FtpCfgDlg: TFtpCfgDlg
     object IndexTabSheet: TTabSheet
       Caption = 'Index'
       ImageIndex = 3
-      object HtmlJavaScriptLabel: TLabel
-        Left = 7
-        Top = 62
-        Width = 65
-        Height = 20
-        AutoSize = False
-        Caption = 'JavaScript'
-      end
       object AutoIndexCheckBox: TCheckBox
         Left = 7
         Top = 10
@@ -285,38 +277,6 @@ object FtpCfgDlg: TFtpCfgDlg
         ShowHint = True
         TabOrder = 1
       end
-      object HtmlIndexCheckBox: TCheckBox
-        Left = 7
-        Top = 36
-        Width = 78
-        Height = 19
-        Hint = 'Automatically generate HTML index files for file descriptions'
-        Caption = 'HTML'
-        ParentShowHint = False
-        ShowHint = True
-        TabOrder = 2
-        OnClick = HtmlIndexCheckBoxClick
-      end
-      object HtmlFileNameEdit: TEdit
-        Left = 85
-        Top = 36
-        Width = 156
-        Height = 21
-        Hint = 'Name of HTML index file (default=00index.html)'
-        ParentShowHint = False
-        ShowHint = True
-        TabOrder = 3
-      end
-      object HtmlJavaScriptEdit: TEdit
-        Left = 85
-        Top = 62
-        Width = 156
-        Height = 21
-        Hint = 'JavaScript filename to execute to generate HTML index file'
-        ParentShowHint = False
-        ShowHint = True
-        TabOrder = 4
-      end
     end
     object LogTabSheet: TTabSheet
       Caption = 'Log'
diff --git a/src/sbbs3/ctrl/FtpCfgDlgUnit.h b/src/sbbs3/ctrl/FtpCfgDlgUnit.h
index 47be277570edc689ebc5ec743358cd865753f62f..c2a1efc8957c28b2ffe47759c49c078e27da07e2 100644
--- a/src/sbbs3/ctrl/FtpCfgDlgUnit.h
+++ b/src/sbbs3/ctrl/FtpCfgDlgUnit.h
@@ -1,7 +1,5 @@
 /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
 
-/* $Id: FtpCfgDlgUnit.h,v 1.8 2018/07/24 01:11:28 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -87,10 +73,6 @@ __published:
     TTabSheet *IndexTabSheet;
     TCheckBox *AutoIndexCheckBox;
     TEdit *IndexFileNameEdit;
-    TCheckBox *HtmlIndexCheckBox;
-    TEdit *HtmlFileNameEdit;
-    TLabel *HtmlJavaScriptLabel;
-    TEdit *HtmlJavaScriptEdit;
     TLabel *QwkTimeoutLabel;
     TEdit *QwkTimeoutEdit;
     TLabel *HackAttemptSoundLabel;
@@ -109,8 +91,6 @@ __published:
 	void __fastcall AnswerSoundButtonClick(TObject *Sender);
 	void __fastcall HangupSoundButtonClick(TObject *Sender);
 	void __fastcall AutoIndexCheckBoxClick(TObject *Sender);
-    void __fastcall HtmlJavaScriptButtonClick(TObject *Sender);
-    void __fastcall HtmlIndexCheckBoxClick(TObject *Sender);
     void __fastcall HackAttemptSoundButtonClick(TObject *Sender);
     void __fastcall PasvIpLookupCheckBoxClick(TObject *Sender);
 private:
diff --git a/src/sbbs3/ctrl/MainFormUnit.cpp b/src/sbbs3/ctrl/MainFormUnit.cpp
index 8744c3065288192cef125b779c0e774b4c5a49cb..660684b7c68ea22bb61d0f84b1bd9620539815b1 100644
--- a/src/sbbs3/ctrl/MainFormUnit.cpp
+++ b/src/sbbs3/ctrl/MainFormUnit.cpp
@@ -866,11 +866,9 @@ __fastcall TMainForm::TMainForm(TComponent* Owner)
     ftp_startup.client_on=client_on;
     ftp_startup.socket_open=socket_open;
 	ftp_startup.options
-        =FTP_OPT_INDEX_FILE|FTP_OPT_HTML_INDEX_FILE|FTP_OPT_ALLOW_QWK;
+        =FTP_OPT_INDEX_FILE | FTP_OPT_ALLOW_QWK;
     ftp_startup.max_clients=10;
     strcpy(ftp_startup.index_file_name,"00index");
-    strcpy(ftp_startup.html_index_file,"00index.html");
-    strcpy(ftp_startup.html_index_script,"ftp-html.js");
 	ftp_startup.login_attempt_list=&login_attempt_list;
 
     memset(&web_startup,0,sizeof(web_startup));
@@ -3038,7 +3036,6 @@ void __fastcall TMainForm::PropertiesExecute(TObject *Sender)
 
         /* Copy global settings, if appropriate (not unique) */
         if(memcmp(&bbs_startup.js,&js,sizeof(js))==0)       bbs_startup.js=global.js;
-        if(memcmp(&ftp_startup.js,&js,sizeof(js))==0)       ftp_startup.js=global.js;
         if(memcmp(&web_startup.js,&js,sizeof(js))==0)       web_startup.js=global.js;
         if(memcmp(&mail_startup.js,&js,sizeof(js))==0)      mail_startup.js=global.js;
         if(memcmp(&services_startup.js,&js,sizeof(js))==0)  services_startup.js=global.js;
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 87bf05a99b4375ebf9cd2efcd475d72691a67e94..d8ef62c04eec11d6bd1217a10b6925fb300a6889 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -36,8 +36,6 @@
 #include "text.h"			/* TOTAL_TEXT */
 #include "ftpsrvr.h"
 #include "telnet.h"
-#include "js_rtpool.h"
-#include "js_request.h"
 #include "multisock.h"
 #include "ssl.h"
 #include "cryptlib.h"
@@ -433,692 +431,6 @@ int getdir(char* p, user_t* user, client_t* client)
 	return(dir);
 }
 
-/*********************************/
-/* JavaScript Data and Functions */
-/*********************************/
-#ifdef JAVASCRIPT
-
-js_server_props_t js_server_props;
-
-static JSBool
-js_write(JSContext *cx, uintN argc, jsval *arglist)
-{
-	jsval *argv=JS_ARGV(cx, arglist);
-    uintN		i;
-    JSString*	str=NULL;
-	FILE*	fp;
-	jsrefcount	rc;
-	char		*p = NULL;
-	size_t		len;
-
-	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
-
-	if((fp=(FILE*)JS_GetContextPrivate(cx))==NULL)
-		return(JS_FALSE);
-
-    for (i = 0; i < argc; i++) {
-		str = JS_ValueToString(cx, argv[i]);
-		if (!str)
-		    return JS_FALSE;
-		JSSTRING_TO_MSTRING(cx, str, p, &len);
-		HANDLE_PENDING(cx, p);
-		rc=JS_SUSPENDREQUEST(cx);
-		if(p) {
-			fwrite(p, len, 1, fp);
-			free(p);
-		}
-		JS_RESUMEREQUEST(cx, rc);
-	}
-
-	if(str==NULL)
-		JS_SET_RVAL(cx, arglist, JSVAL_VOID);
-	else
-		JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(str));
-	return(JS_TRUE);
-}
-
-static JSBool
-js_writeln(JSContext *cx, uintN argc, jsval *arglist)
-{
-	FILE*	fp;
-	jsrefcount	rc;
-
-	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
-
-	if((fp=(FILE*)JS_GetContextPrivate(cx))==NULL)
-		return(JS_FALSE);
-
-	js_write(cx,argc,arglist);
-	rc=JS_SUSPENDREQUEST(cx);
-	fprintf(fp,"\r\n");
-	JS_RESUMEREQUEST(cx, rc);
-	return(JS_TRUE);
-}
-
-static JSFunctionSpec js_global_functions[] = {
-	{"write",           js_write,           1},		/* write to HTML file */
-	{"writeln",         js_writeln,         1},		/* write to HTML file */
-	{"print",			js_writeln,         1},		/* alias for writeln */
-	{0}
-};
-
-static void
-js_ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report)
-{
-	char	line[64];
-	char	file[MAX_PATH+1];
-	char*	warning;
-	FILE*	fp;
-	int		log_level;
-
-	fp=(FILE*)JS_GetContextPrivate(cx);
-	
-	if(report==NULL) {
-		lprintf(LOG_ERR,"!JavaScript: %s", message);
-		if(fp!=NULL)
-			fprintf(fp,"!JavaScript: %s", message);
-		return;
-    }
-
-	if(report->filename)
-		sprintf(file," %s",report->filename);
-	else
-		file[0]=0;
-
-	if(report->lineno)
-		sprintf(line," line %u",report->lineno);
-	else
-		line[0]=0;
-
-	if(JSREPORT_IS_WARNING(report->flags)) {
-		if(JSREPORT_IS_STRICT(report->flags))
-			warning="strict warning";
-		else
-			warning="warning";
-		log_level=LOG_WARNING;
-	} else {
-		log_level=LOG_ERR;
-		warning="";
-	}
-
-	lprintf(log_level,"!JavaScript %s%s%s: %s",warning,file,line,message);
-	if(fp!=NULL)
-		fprintf(fp,"!JavaScript %s%s%s: %s",warning,file,line,message);
-}
-
-static JSContext* 
-js_initcx(JSRuntime* runtime, SOCKET sock, JSObject** glob, JSObject** ftp, js_callback_t* cb)
-{
-	JSContext*	js_cx;
-	BOOL		success=FALSE;
-	BOOL		rooted=FALSE;
-
-    if((js_cx = JS_NewContext(runtime, JAVASCRIPT_CONTEXT_STACK))==NULL)
-		return(NULL);
-	JS_BEGINREQUEST(js_cx);
-
-	lprintf(LOG_DEBUG,"%04d JavaScript: Context created",sock);
-
-    JS_SetErrorReporter(js_cx, js_ErrorReporter);
-
-	memset(cb, 0, sizeof(js_callback_t));
-
-	/* ToDo: call js_CreateCommonObjects() instead */
-
-	do {
-
-		lprintf(LOG_DEBUG,"%04d JavaScript: Initializing Global object",sock);
-		if(!js_CreateGlobalObject(js_cx, &scfg, NULL, &startup->js, glob))
-			break;
-		rooted=TRUE;
-
-		if(!JS_DefineFunctions(js_cx, *glob, js_global_functions)) 
-			break;
-
-		/* Internal JS Object */
-		if(js_CreateInternalJsObject(js_cx, *glob, cb, &startup->js)==NULL)
-			break;
-
-		lprintf(LOG_DEBUG,"%04d JavaScript: Initializing System object",sock);
-		if(js_CreateSystemObject(js_cx, *glob, &scfg, uptime, server_host_name(), SOCKLIB_DESC)==NULL) 
-			break;
-
-		if((*ftp=JS_DefineObject(js_cx, *glob, "ftp", NULL
-			,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))==NULL)
-			break;
-
-		if(js_CreateServerObject(js_cx,*glob,&js_server_props)==NULL)
-			break;
-
-		success=TRUE;
-
-	} while(0);
-
-	if(!success) {
-		if(rooted)
-			JS_RemoveObjectRoot(js_cx, glob);
-		JS_ENDREQUEST(js_cx);
-		JS_DestroyContext(js_cx);
-		return(NULL);
-	}
-
-	return(js_cx);
-}
-
-BOOL js_add_file(JSContext* js_cx, JSObject* array, 
-				 char* name, char* desc, char* ext_desc,
-				 off_t size, ulong credits, 
-				 time_t time, time_t uploaded, time_t last_downloaded, 
-				 ulong times_downloaded, ulong misc, 
-				 char* uploader, char* link)
-{
-	JSObject*	file;
-	JSString*	js_str;
-	jsval		val;
-	jsuint		index;
-
-	if(uploaded == 0)
-		uploaded = time;
-
-	if((file=JS_NewObject(js_cx, NULL, NULL, NULL))==NULL)
-		return(FALSE);
-
-	if((js_str=JS_NewStringCopyZ(js_cx, name))==NULL)
-		return(FALSE);
-	val=STRING_TO_JSVAL(js_str);
-	if(!JS_SetProperty(js_cx, file, "name", &val))
-		return(FALSE);
-
-	if((js_str=JS_NewStringCopyZ(js_cx, desc))==NULL)
-		return(FALSE);
-	val=STRING_TO_JSVAL(js_str);
-	if(!JS_SetProperty(js_cx, file, "description", &val))
-		return(FALSE);
-
-	if((js_str=JS_NewStringCopyZ(js_cx, ext_desc))==NULL)
-		return(FALSE);
-	val=STRING_TO_JSVAL(js_str);
-	if(!JS_SetProperty(js_cx, file, "extended_description", &val))
-		return(FALSE);
-
-	val=INT_TO_JSVAL(size);
-	if(!JS_SetProperty(js_cx, file, "size", &val))
-		return(FALSE);
-
-	val=INT_TO_JSVAL(credits);
-	if(!JS_SetProperty(js_cx, file, "credits", &val))
-		return(FALSE);
-
-	val=DOUBLE_TO_JSVAL((double)time);
-	if(!JS_SetProperty(js_cx, file, "time", &val))
-		return(FALSE);
-
-	val=INT_TO_JSVAL((int32)uploaded);
-	if(!JS_SetProperty(js_cx, file, "uploaded", &val))
-		return(FALSE);
-
-	val=INT_TO_JSVAL((int32)last_downloaded);
-	if(!JS_SetProperty(js_cx, file, "last_downloaded", &val))
-		return(FALSE);
-
-	val=INT_TO_JSVAL(times_downloaded);
-	if(!JS_SetProperty(js_cx, file, "times_downloaded", &val))
-		return(FALSE);
-
-	if((js_str=JS_NewStringCopyZ(js_cx, uploader))==NULL)
-		return(FALSE);
-	val=STRING_TO_JSVAL(js_str);
-	if(!JS_SetProperty(js_cx, file, "uploader", &val))
-		return(FALSE);
-
-	val=INT_TO_JSVAL(misc);
-	if(!JS_SetProperty(js_cx, file, "settings", &val))
-		return(FALSE);
-
-	if((js_str=JS_NewStringCopyZ(js_cx, link))==NULL)
-		return(FALSE);
-	val=STRING_TO_JSVAL(js_str);
-	if(!JS_SetProperty(js_cx, file, "link", &val))
-		return(FALSE);
-
-	if(!JS_GetArrayLength(js_cx, array, &index))
-		return(FALSE);
-
-	val=OBJECT_TO_JSVAL(file);
-	return(JS_SetElement(js_cx, array, index, &val));
-}
-
-BOOL js_generate_index(JSContext* js_cx, JSObject* parent, 
-					   SOCKET sock, FILE* fp, int lib, int dir, user_t* user, client_t* client)
-{
-	char		str[256];
-	char		path[MAX_PATH+1];
-	char		spath[MAX_PATH+1];	/* script path */
-	char		vpath[MAX_PATH+1];	/* virtual path */
-	char		aliasfile[MAX_PATH+1];
-	char		extdesc[513];
-	char*		p;
-	char*		tp;
-	char*		np;
-	char*		dp;
-	char		aliasline[512];
-	BOOL		alias_dir;
-	BOOL		success=FALSE;
-	FILE*		alias_fp;
-	uint		i;
-	file_t		f;
-	glob_t		g;
-	jsval		val;
-	jsval		rval;
-	JSObject*	lib_obj=NULL;
-	JSObject*	dir_obj=NULL;
-	JSObject*	file_array=NULL;
-	JSObject*	dir_array=NULL;
-	JSObject*	js_script=NULL;
-	JSString*	js_str;
-	long double		start=xp_timer();
-	jsrefcount	rc;
-
-	lprintf(LOG_DEBUG,"%04d <%s> JavaScript: Generating HTML Index for %s"
-		,sock, user->alias, genvpath(lib,dir,str));
-
-	JS_SetContextPrivate(js_cx, fp);
-
-	do {	/* pseudo try/catch */
-
-		if((file_array=JS_NewArrayObject(js_cx, 0, NULL))==NULL) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to create file_array",sock, user->alias);
-			break;
-		}
-
-		/* file[] */
-		val=OBJECT_TO_JSVAL(file_array);
-		if(!JS_SetProperty(js_cx, parent, "file_list", &val)) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set file property",sock, user->alias);
-			break;
-		}
-
-		if((dir_array=JS_NewArrayObject(js_cx, 0, NULL))==NULL) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to create dir_array",sock, user->alias);
-			break;
-		}
-
-		/* dir[] */
-		val=OBJECT_TO_JSVAL(dir_array);
-		if(!JS_SetProperty(js_cx, parent, "dir_list", &val)) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set dir property",sock, user->alias);
-			break;
-		}
-
-		rc=JS_SUSPENDREQUEST(js_cx);
-		if(strcspn(startup->html_index_script,"/\\")==strlen(startup->html_index_script)) {
-			sprintf(spath,"%s%s",scfg.mods_dir,startup->html_index_script);
-			if(scfg.mods_dir[0]==0 || !fexist(spath))
-				sprintf(spath,"%s%s",scfg.exec_dir,startup->html_index_script);
-		} else
-			sprintf(spath,"%.*s",(int)sizeof(spath)-4,startup->html_index_script);
-		/* Add extension if not specified */
-		if(!strchr(spath,'.'))
-			strcat(spath,".js");
-
-		if(!fexist(spath)) {
-			JS_RESUMEREQUEST(js_cx, rc);
-			lprintf(LOG_ERR,"%04d <%s> !HTML JavaScript (%s) doesn't exist",sock,user->alias, spath);
-			break;
-		}
-		JS_RESUMEREQUEST(js_cx, rc);
-
-		if((js_str=JS_NewStringCopyZ(js_cx, startup->html_index_file))==NULL)
-			break;
-		val=STRING_TO_JSVAL(js_str);
-		if(!JS_SetProperty(js_cx, parent, "html_index_file", &val)) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set html_index_file property",sock, user->alias);
-			break;
-		}
-
-		/* curlib */
-		if((lib_obj=JS_NewObject(js_cx, NULL, 0, NULL))==NULL) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to create lib_obj",sock, user->alias);
-			break;
-		}
-
-		val=OBJECT_TO_JSVAL(lib_obj);
-		if(!JS_SetProperty(js_cx, parent, "curlib", &val)) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set curlib property",sock, user->alias);
-			break;
-		}
-
-		/* curdir */
-		if((dir_obj=JS_NewObject(js_cx, NULL, 0, NULL))==NULL) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to create dir_obj",sock, user->alias);
-			break;
-		}
-
-		val=OBJECT_TO_JSVAL(dir_obj);
-		if(!JS_SetProperty(js_cx, parent, "curdir", &val)) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set curdir property",sock, user->alias);
-			break;
-		}
-
-		SAFECOPY(vpath,"/");
-
-		if(lib>=0) { /* root */
-
-			strcat(vpath,scfg.lib[lib]->sname);
-			strcat(vpath,"/");
-
-			if((js_str=JS_NewStringCopyZ(js_cx, scfg.lib[lib]->sname))==NULL)
-				break;
-			val=STRING_TO_JSVAL(js_str);
-			if(!JS_SetProperty(js_cx, lib_obj, "name", &val)) {
-				lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set curlib.name property",sock, user->alias);
-				break;
-			}
-
-			if((js_str=JS_NewStringCopyZ(js_cx, scfg.lib[lib]->lname))==NULL)
-				break;
-			val=STRING_TO_JSVAL(js_str);
-			if(!JS_SetProperty(js_cx, lib_obj, "description", &val)) {
-				lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set curlib.desc property",sock, user->alias);
-				break;
-			}
-		}
-
-		if(dir>=0) { /* 1st level */
-			strcat(vpath,scfg.dir[dir]->code_suffix);
-			strcat(vpath,"/");
-
-			if((js_str=JS_NewStringCopyZ(js_cx, scfg.dir[dir]->code))==NULL)
-				break;
-			val=STRING_TO_JSVAL(js_str);
-			if(!JS_SetProperty(js_cx, dir_obj, "code", &val)) {
-				lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set curdir.code property",sock, user->alias);
-				break;
-			}
-
-			if((js_str=JS_NewStringCopyZ(js_cx, scfg.dir[dir]->sname))==NULL)
-				break;
-			val=STRING_TO_JSVAL(js_str);
-			if(!JS_SetProperty(js_cx, dir_obj, "name", &val)) {
-				lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set curdir.name property",sock, user->alias);
-				break;
-			}
-
-			if((js_str=JS_NewStringCopyZ(js_cx, scfg.dir[dir]->lname))==NULL)
-				break;
-			val=STRING_TO_JSVAL(js_str);
-			if(!JS_SetProperty(js_cx, dir_obj, "description", &val)) {
-				lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set curdir.desc property",sock, user->alias);
-				break;
-			}
-
-			val=INT_TO_JSVAL(scfg.dir[dir]->misc);
-			if(!JS_SetProperty(js_cx, dir_obj, "settings", &val)) {
-				lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set curdir.misc property",sock, user->alias);
-				break;
-			}
-		}
-
-		if((js_str=JS_NewStringCopyZ(js_cx, vpath))==NULL)
-			break;
-		val=STRING_TO_JSVAL(js_str);
-		if(!JS_SetProperty(js_cx, parent, "path", &val)) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to set curdir property",sock, user->alias);
-			break;
-		}
-
-		if(lib<0) {	/* root dir */
-
-			rc=JS_SUSPENDREQUEST(js_cx);
-			/* File Aliases */
-			sprintf(path,"%sftpalias.cfg",scfg.ctrl_dir);
-			if((alias_fp=fopen(path,"r"))!=NULL) {
-
-				while(!feof(alias_fp)) {
-					if(!fgets(aliasline,sizeof(aliasline),alias_fp))
-						break;
-
-					p=aliasline;	/* alias pointer */
-					SKIP_WHITESPACE(p);
-
-					if(*p==';')	/* comment */
-						continue;
-
-					tp=p;		/* terminator pointer */
-					FIND_WHITESPACE(tp);
-					if(*tp) *tp=0;
-
-					np=tp+1;	/* filename pointer */
-					SKIP_WHITESPACE(np);
-
-					tp=np;		/* terminator pointer */
-					FIND_WHITESPACE(tp);
-					if(*tp) *tp=0;
-
-					dp=tp+1;	/* description pointer */
-					SKIP_WHITESPACE(dp);
-					truncsp(dp);
-
-					if(stricmp(dp,BBS_HIDDEN_ALIAS)==0)
-						continue;
-
-					alias_dir=FALSE;
-
-					/* Virtual Path? */
-					if(!strnicmp(np,BBS_VIRTUAL_PATH,strlen(BBS_VIRTUAL_PATH))) {
-						if((dir=getdir(np+strlen(BBS_VIRTUAL_PATH),user,client))<0)
-							continue; /* No access or invalid virtual path */
-						tp=strrchr(np,'/');
-						if(tp==NULL) 
-							continue;
-						tp++;
-						if(*tp) {
-							SAFEPRINTF2(aliasfile,"%s%s",scfg.dir[dir]->path,tp);
-							np=aliasfile;
-						}
-						else 
-							alias_dir=TRUE;
-					}
-
-					if(!alias_dir && !fexist(np))
-						continue;
-
-					if(alias_dir) {
-						if(!chk_ar(&scfg,scfg.dir[dir]->ar,user,client))
-							continue;
-						SAFEPRINTF2(vpath,"/%s/%s",p,startup->html_index_file);
-					} else
-						SAFECOPY(vpath,p);
-					JS_RESUMEREQUEST(js_cx, rc);
-					js_add_file(js_cx
-						,alias_dir ? dir_array : file_array
-						,p				/* filename */
-						,dp				/* description */
-						,NULL			/* extdesc */
-						,flength(np)	/* size */
-						,0				/* credits */
-						,fdate(np)		/* time */
-						,0				/* uploaded */
-						,0				/* last downloaded */
-						,0				/* times downloaded */
-						,0				/* misc */
-						,scfg.sys_id	/* uploader */
-						,vpath			/* link */
-						);
-					rc=JS_SUSPENDREQUEST(js_cx);
-				}
-
-				fclose(alias_fp);
-			}
-			JS_RESUMEREQUEST(js_cx, rc);
-
-			/* QWK Packet */
-			if(startup->options&FTP_OPT_ALLOW_QWK /* && fexist(qwkfile) */) {
-				sprintf(str,"%s.qwk",scfg.sys_id);
-				SAFEPRINTF(vpath,"/%s",str);
-				js_add_file(js_cx
-					,file_array 
-					,str						/* filename */
-					,"QWK Message Packet"		/* description */
-					,NULL						/* extdesc */
-					,10240						/* size */
-					,0							/* credits */
-					,time(NULL)					/* time */
-					,0							/* uploaded */
-					,0							/* last downloaded */
-					,0							/* times downloaded */
-					,0							/* misc */
-					,scfg.sys_id				/* uploader */
-					,str						/* link */
-					);
-			}
-
-			/* Library Folders */
-			for(i=0;i<scfg.total_libs;i++) {
-				if(!chk_ar(&scfg,scfg.lib[i]->ar,user,client))
-					continue;
-				SAFEPRINTF2(vpath,"/%s/%s",scfg.lib[i]->sname,startup->html_index_file);
-				js_add_file(js_cx
-					,dir_array 
-					,scfg.lib[i]->sname			/* filename */
-					,scfg.lib[i]->lname			/* description */
-					,NULL						/* extdesc */
-					,0,0,0,0,0,0,0				/* unused */
-					,scfg.sys_id				/* uploader */
-					,vpath						/* link */
-					);
-			}
-		} else if(dir<0) {
-			/* Directories */
-			for(i=0;i<scfg.total_dirs;i++) {
-				if(scfg.dir[i]->lib!=lib)
-					continue;
-				if(/* i!=scfg.sysop_dir && i!=scfg.upload_dir && */
-					!chk_ar(&scfg,scfg.dir[i]->ar,user,client))
-					continue;
-				SAFEPRINTF3(vpath,"/%s/%s/%s"
-					,scfg.lib[scfg.dir[i]->lib]->sname
-					,scfg.dir[i]->code_suffix
-					,startup->html_index_file);
-				js_add_file(js_cx
-					,dir_array 
-					,scfg.dir[i]->sname			/* filename */
-					,scfg.dir[i]->lname			/* description */
-					,NULL						/* extdesc */
-					,getfiles(&scfg,i)			/* size */
-					,0,0,0,0,0					/* unused */
-					,scfg.dir[i]->misc			/* misc */
-					,scfg.sys_id				/* uploader */
-					,vpath						/* link */
-					);
-
-			}
-		} else if(chk_ar(&scfg,scfg.dir[dir]->ar,user,client)){
-			SAFEPRINTF(path,"%s*",scfg.dir[dir]->path);
-			rc=JS_SUSPENDREQUEST(js_cx);
-			time_t start = time(NULL);
-			glob(path, GLOB_MARK, NULL, &g);
-			for(i=0;i<(int)g.gl_pathc;i++) {
-				if(*lastchar(g.gl_pathv[i]) == '/')	/* is directory */
-					continue;
-	#ifdef _WIN32
-				GetShortPathName(g.gl_pathv[i], str, sizeof(str));
-	#else
-				SAFECOPY(str,g.gl_pathv[i]);
-	#endif
-				memset(&f, 0, sizeof(f));
-				padfname(getfname(str),f.name);
-				f.dir=dir;
-				BOOL filedat;
-				if((filedat=getfileixb(&scfg,&f))==FALSE
-					&& !(startup->options&FTP_OPT_DIR_FILES)
-					&& !(scfg.dir[dir]->misc&DIR_FILES))
-					continue;
-				if(filedat) {
-					if(!getfiledat(&scfg,&f))
-						continue;
-				} else {
-					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;
-					getextdesc(&scfg, dir, f.datoffset, extdesc);
-					/* Remove Ctrl-A Codes and Ex-ASCII code */
-					remove_ctrl_a(extdesc,extdesc);
-				}
-				SAFEPRINTF3(vpath,"/%s/%s/%s"
-					,scfg.lib[scfg.dir[dir]->lib]->sname
-					,scfg.dir[dir]->code_suffix
-					,getfname(g.gl_pathv[i]));
-				JS_RESUMEREQUEST(js_cx, rc);
-				js_add_file(js_cx
-					,file_array 
-					,getfname(g.gl_pathv[i])	/* filename */
-					,f.desc						/* description */
-					,f.misc&FM_EXTDESC ? extdesc : NULL
-					,f.size						/* size */
-					,f.cdt						/* credits */
-					,f.date						/* time */
-					,f.dateuled					/* uploaded */
-					,f.datedled					/* last downloaded */
-					,f.timesdled				/* times downloaded */
-					,f.misc						/* misc */
-					,f.uler						/* uploader */
-					,getfname(g.gl_pathv[i])	/* link */
-					);
-				rc=JS_SUSPENDREQUEST(js_cx);
-			}
-			lprintf(LOG_INFO, "%04d <%s> JavaScript array of /%s/%s (%lu files) created in %ld seconds"
-				,sock, user->alias, scfg.lib[lib]->sname, scfg.dir[dir]->code_suffix
-				,(ulong)g.gl_pathc,(long)time(NULL) - start);
-			globfree(&g);
-			JS_RESUMEREQUEST(js_cx, rc);
-		}
-
-		/* RUN SCRIPT */
-		JS_ClearPendingException(js_cx);
-
-		if((js_script=JS_CompileFile(js_cx, parent, spath))==NULL) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to compile script (%s)",sock, user->alias, spath);
-			break;
-		}
-
-		js_PrepareToExecute(js_cx, parent, spath, /* startup_dir: */NULL, parent);
-		if((success=JS_ExecuteScript(js_cx, parent, js_script, &rval))!=TRUE) {
-			lprintf(LOG_ERR,"%04d <%s> !JavaScript FAILED to execute script (%s)",sock, user->alias, spath);
-			break;
-		}
-
-		lprintf(LOG_DEBUG,"%04d <%s> JavaScript: Done executing script: %s (%.2Lf seconds)"
-			,sock, user->alias, spath, xp_timer()-start);
-
-	} while(0);
-
-
-	JS_DeleteProperty(js_cx, parent, "path");
-	JS_DeleteProperty(js_cx, parent, "sort");
-	JS_DeleteProperty(js_cx, parent, "reverse");
-	JS_DeleteProperty(js_cx, parent, "file_list");
-	JS_DeleteProperty(js_cx, parent, "dir_list");
-	JS_DeleteProperty(js_cx, parent, "curlib");
-	JS_DeleteProperty(js_cx, parent, "curdir");
-	JS_DeleteProperty(js_cx, parent, "html_index_file");
-
-	return(success);
-}
-
-
-#endif	/* ifdef JAVASCRIPT */
-
 void recverror(SOCKET socket, int rd, int line)
 {
 	if(rd==0) 
@@ -2934,7 +2246,6 @@ static void ctrl_thread(void* arg)
 	char		path[MAX_PATH+1];
 	char		local_dir[MAX_PATH+1];
 	char		ren_from[MAX_PATH+1]="";
-	char		html_index_ext[MAX_PATH+1];
 	WORD		port;
 	uint32_t	ip_addr;
 	socklen_t	addr_len;
@@ -2997,15 +2308,6 @@ static void ctrl_thread(void* arg)
 	client_t	client;
 	struct tm	tm;
 	struct tm 	cur_tm;
-#ifdef JAVASCRIPT
-	jsval		js_val;
-	JSRuntime*	js_runtime=NULL;
-	JSContext*	js_cx=NULL;
-	JSObject*	js_glob;
-	JSObject*	js_ftp;
-	JSString*	js_str;
-	js_callback_t	js_callback;
-#endif
 	login_attempt_t attempted;
 	CRYPT_SESSION	sess = -1;
 	BOOL		got_pbsz = FALSE;
@@ -3374,27 +2676,6 @@ static void ctrl_thread(void* arg)
 			timeleft=(long)gettimeleft(&scfg,&user,logintime);
 			ftp_printfile(sock,sess,"hello",230);
 
-#ifdef JAVASCRIPT
-#ifdef JS_CX_PER_SESSION
-			if(js_cx!=NULL) {
-
-				if(js_CreateUserClass(js_cx, js_glob, &scfg)==NULL) 
-					lprintf(LOG_ERR,"%04d !JavaScript ERROR creating user class",sock);
-
-				if(js_CreateUserObject(js_cx, js_glob, &scfg, "user", user.number, &client)==NULL) 
-					lprintf(LOG_ERR,"%04d !JavaScript ERROR creating user object",sock);
-
-				if(js_CreateClientObject(js_cx, js_glob, "client", &client, sock, -1)==NULL) 
-					lprintf(LOG_ERR,"%04d !JavaScript ERROR creating client object",sock);
-
-				if(js_CreateFileAreaObject(js_cx, js_glob, &scfg, &user
-					,startup->html_index_file)==NULL) 
-					lprintf(LOG_ERR,"%04d !JavaScript ERROR creating file area object",sock);
-
-			}
-#endif
-#endif
-
 			if(sysop)
 				sockprintf(sock,sess,"230-Sysop access granted.");
 			sockprintf(sock,sess,"230-%s logged in.",user.alias);
@@ -4408,16 +3689,6 @@ static void ctrl_thread(void* arg)
 					send_mlsx_entry(fp, sock, sess, mlsx_feats, "file", "r", UINT64_MAX, 0, str, NULL, 0, cmd[3] == 'T' ? mls_path : startup->index_file_name);
 					l++;
 				}
-				/* HTML Index File */
-				if(startup->options&FTP_OPT_INDEX_FILE && startup->html_index_file[0]
-						&& (cmd[3] == 'D' || strcmp(startup->html_index_file, mls_fname) == 0)) {
-					if (cmd[3] == 'T')
-						sockprintf(sock,sess, "250- Listing %s", startup->html_index_file);
-					get_owner_name(NULL, str);
-					send_mlsx_entry(fp, sock, sess, mlsx_feats, "file", "r", UINT64_MAX, 0, str, NULL, 0, cmd[3] == 'T' ? mls_path : startup->html_index_file);
-					l++;
-				}
-
 				if(lib<0) { /* Root dir */
 					if (cmd[3] == 'T' && !*mls_fname) {
 						sockprintf(sock,sess, "250- Listing root");
@@ -4503,25 +3774,6 @@ static void ctrl_thread(void* arg)
 								lprintf(LOG_WARNING,"%04d <%s> !Missing aliased file: %s",sock, user.alias, np);
 								continue;
 							}
-
-							if(cmd[3] == 'D' || strcmp(startup->html_index_file, mls_fname) == 0) {
-								if (cmd[3] == 'T')
-									sockprintf(sock,sess, "250- Listing %s", p);
-								get_unique(aliaspath, uniq);
-								if (cmd[3] == 'D') {
-									if (alias_dir==TRUE)
-										send_mlsx_entry(fp, sock, sess, mlsx_feats, "dir", "el", UINT64_MAX, 0, NULL, uniq, 0, p);
-									else
-										send_mlsx_entry(fp, sock, sess, mlsx_feats, "file", "r", (uint64_t)flength(np), fdate(np), NULL, uniq, 0, p);
-								}
-								else {
-									if (alias_dir==TRUE)
-										send_mlsx_entry(fp, sock, sess, mlsx_feats, "dir", "el", UINT64_MAX, 0, NULL, uniq, 0, aliaspath[0] ? aliaspath : mls_path);
-									else
-										send_mlsx_entry(fp, sock, sess, mlsx_feats, "file", "r", (uint64_t)flength(np), fdate(np), NULL, uniq, 0, mls_path);
-								}
-								l++;
-							}
 						}
 
 						fclose(alias_fp);
@@ -4722,21 +3974,6 @@ static void ctrl_thread(void* arg)
 				else
 					fprintf(fp,"%s\r\n",startup->index_file_name);
 			} 
-			/* HTML Index File */
-			if(startup->options&FTP_OPT_HTML_INDEX_FILE && startup->html_index_file[0]
-				&& wildmatchi(startup->html_index_file, filespec, FALSE)) {
-				if(detail)
-					fprintf(fp,"-r--r--r--   1 %-*s %-8s %9ld %s %2d %02d:%02d %s\r\n"
-						,NAME_LEN
-						,scfg.sys_id
-						,lib<0 ? scfg.sys_id : dir<0 
-							? scfg.lib[lib]->sname : scfg.dir[dir]->code_suffix
-						,512L
-						,ftp_mon[cur_tm.tm_mon],cur_tm.tm_mday,cur_tm.tm_hour,cur_tm.tm_min
-						,startup->html_index_file);
-				else
-					fprintf(fp,"%s\r\n",startup->html_index_file);
-			} 
 
 			if(lib<0) { /* Root dir */
 				lprintf(LOG_INFO,"%04d <%s> %slisting: root in %s mode", sock, user.alias, detail ? "detailed ":"", mode);
@@ -5054,8 +4291,6 @@ static void ctrl_thread(void* arg)
 				p=tp+1;
 			}
 
-			sprintf(html_index_ext,"%s?",startup->html_index_file);
-
 			sprintf(str,"%s.qwk",scfg.sys_id);
 			if(lib<0 && startup->options&FTP_OPT_ALLOW_QWK 
 				&& !stricmp(p,str) && !delecmd) {
@@ -5141,9 +4376,7 @@ static void ctrl_thread(void* arg)
 					delfile=TRUE;
 					fprintf(fp,"%-*s File/Folder Descriptions\r\n"
 						,INDEX_FNAME_LEN,startup->index_file_name);
-					if(startup->options&FTP_OPT_HTML_INDEX_FILE)
-						fprintf(fp,"%-*s File/Folder Descriptions (HTML)\r\n"
-							,INDEX_FNAME_LEN,startup->html_index_file);
+
 					if(lib<0) {
 
 						/* File Aliases */
@@ -5236,132 +4469,6 @@ static void ctrl_thread(void* arg)
 					}
 					fclose(fp);
 				}
-			/* HTML Index File */
-			} else if(startup->options&FTP_OPT_HTML_INDEX_FILE 
-				&& (!stricmp(p,startup->html_index_file) 
-				|| !strnicmp(p,html_index_ext,strlen(html_index_ext)))
-				&& !delecmd) {
-				success=TRUE;
-				if(getsize) {
-					sockprintf(sock,sess, "550 Size not available for dynamically generated files");
-					continue;
-				}
-				else if(getdate)
-					file_date=time(NULL);
-				else {
-#ifdef JAVASCRIPT
-					if(startup->options&FTP_OPT_NO_JAVASCRIPT) {
-						lprintf(LOG_ERR,"%04d <%s> !JavaScript disabled, cannot generate %s",sock, user.alias, fname);
-						sockprintf(sock,sess, "451 JavaScript disabled");
-						filepos=0;
-						continue;
-					}
-					if(js_runtime == NULL) {
-						lprintf(LOG_DEBUG,"%04d <%s> JavaScript: Creating runtime: %lu bytes"
-							,sock, user.alias,startup->js.max_bytes);
-
-						if((js_runtime = jsrt_GetNew(startup->js.max_bytes, 1000, __FILE__, __LINE__))==NULL) {
-							lprintf(LOG_ERR,"%04d <%s> !ERROR creating JavaScript runtime",sock, user.alias);
-							sockprintf(sock,sess,"451 Error creating JavaScript runtime");
-							filepos=0;
-							continue;
-						}
-					}
-
-					if(js_cx==NULL) {	/* Context not yet created, create it now */
-						/* js_initcx() starts a request */
-						if(((js_cx=js_initcx(js_runtime, sock,&js_glob,&js_ftp,&js_callback))==NULL)) {
-							lprintf(LOG_ERR,"%04d <%s> !ERROR initializing JavaScript context",sock, user.alias);
-							sockprintf(sock,sess,"451 Error initializing JavaScript context");
-							filepos=0;
-							continue;
-						}
-						if(js_CreateUserClass(js_cx, js_glob, &scfg)==NULL) 
-							lprintf(LOG_ERR,"%04d <%s> !JavaScript ERROR creating user class",sock, user.alias);
-
-						if(js_CreateFileClass(js_cx, js_glob)==NULL) 
-							lprintf(LOG_ERR,"%04d <%s> !JavaScript ERROR creating file class",sock, user.alias);
-
-						if(js_CreateUserObject(js_cx, js_glob, &scfg, "user", &user, &client, /* global_user: */TRUE)==NULL) 
-							lprintf(LOG_ERR,"%04d <%s> !JavaScript ERROR creating user object",sock, user.alias);
-
-						if(js_CreateClientObject(js_cx, js_glob, "client", &client, sock, -1)==NULL) 
-							lprintf(LOG_ERR,"%04d <%s> !JavaScript ERROR creating client object",sock, user.alias);
-
-						if(js_CreateFileAreaObject(js_cx, js_glob, &scfg, &user, &client
-							,startup->html_index_file)==NULL) 
-							lprintf(LOG_ERR,"%04d <%s> !JavaScript ERROR creating file area object",sock, user.alias);
-					}
-					else
-						JS_BEGINREQUEST(js_cx);
-
-					if((js_str=JS_NewStringCopyZ(js_cx, "name"))!=NULL) {
-						js_val=STRING_TO_JSVAL(js_str);
-						JS_SetProperty(js_cx, js_ftp, "sort", &js_val);
-					}
-					js_val=BOOLEAN_TO_JSVAL(FALSE);
-					JS_SetProperty(js_cx, js_ftp, "reverse", &js_val);
-
-					if(!strnicmp(p,html_index_ext,strlen(html_index_ext))) {
-						p+=strlen(html_index_ext);
-						tp=strrchr(p,'$');
-						if(tp!=NULL)
-							*tp=0;
-						if(!strnicmp(p,"ext=",4)) {
-							p+=4;
-							if(!strcmp(p,"on"))
-								user.misc|=EXTDESC;
-							else
-								user.misc&=~EXTDESC;
-							if(!(user.rest&FLAG('G')))
-								putuserrec(&scfg,user.number,U_MISC,8,ultoa(user.misc,str,16));
-						} 
-						else if(!strnicmp(p,"sort=",5)) {
-							p+=5;
-							tp=strchr(p,'&');
-							if(tp!=NULL) {
-								*tp=0;
-								tp++;
-								if(!stricmp(tp,"reverse")) {
-									js_val=BOOLEAN_TO_JSVAL(TRUE);
-									JS_SetProperty(js_cx, js_ftp, "reverse", &js_val);
-								}
-							}
-							if((js_str=JS_NewStringCopyZ(js_cx, p))!=NULL) {
-								js_val=STRING_TO_JSVAL(js_str);
-								JS_SetProperty(js_cx, js_ftp, "sort", &js_val);
-							}
-						}
-					}
-
-					js_val=BOOLEAN_TO_JSVAL(INT_TO_BOOL(user.misc&EXTDESC));
-					JS_SetProperty(js_cx, js_ftp, "extended_descriptions", &js_val);
-
-					JS_ENDREQUEST(js_cx);
-#endif
-					if((fp=fopen(ftp_tmpfname(fname,"html",sock),"w+b"))==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");
-						filepos=0;
-						continue;
-					}
-					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;
-					delfile=TRUE;
-#ifdef JAVASCRIPT
-					JS_BEGINREQUEST(js_cx);
-					js_val=INT_TO_JSVAL(timeleft);
-					if(!JS_SetProperty(js_cx, js_ftp, "time_left", &js_val))
-						lprintf(LOG_ERR,"%04d <%s> !JavaScript ERROR setting user.time_left",sock, user.alias);
-					js_generate_index(js_cx, js_ftp, sock, fp, lib, dir, &user, &client);
-					JS_ENDREQUEST(js_cx);
-#endif
-					fclose(fp);
-				}
 			} else if(dir>=0) {
 
 				if(!chk_ar(&scfg,scfg.dir[dir]->ar,&user,&client)) {
@@ -5617,8 +4724,6 @@ static void ctrl_thread(void* arg)
 				if((!append && filepos==0 && fexist(fname))
 					|| (startup->options&FTP_OPT_INDEX_FILE 
 						&& !stricmp(p,startup->index_file_name))
-					|| (startup->options&FTP_OPT_HTML_INDEX_FILE 
-						&& !stricmp(p,startup->html_index_file))
 					) {
 					lprintf(LOG_WARNING,"%04d <%s> attempted to overwrite existing file: %s"
 						,sock,user.alias,fname);
@@ -5867,22 +4972,6 @@ static void ctrl_thread(void* arg)
 		PlaySound(startup->hangup_sound, NULL, SND_ASYNC|SND_FILENAME);
 #endif
 
-#ifdef JAVASCRIPT
-	if(js_cx!=NULL) {
-		lprintf(LOG_DEBUG,"%04d JavaScript: Destroying context",sock);
-		JS_BEGINREQUEST(js_cx);
-		JS_RemoveObjectRoot(js_cx, &js_glob);
-		JS_ENDREQUEST(js_cx);
-		JS_DestroyContext(js_cx);	/* Free Context */
-	}
-
-	if(js_runtime!=NULL) {
-		lprintf(LOG_DEBUG,"%04d JavaScript: Destroying runtime",sock);
-		jsrt_Release(js_runtime);
-	}
-
-#endif
-
 /*	status(STATUS_WFC); server thread should control status display */
 
 	if(pasv_sock!=INVALID_SOCKET)
@@ -6020,13 +5109,6 @@ void DLLCALL ftp_server(void* arg)
 		return;
 	}
 
-	ZERO_VAR(js_server_props);
-	SAFEPRINTF3(js_server_props.version,"%s %s%c", FTP_SERVER, VERSION, REVISION);
-	js_server_props.version_detail=ftp_ver();
-	js_server_props.clients=&active_clients.value;
-	js_server_props.options=&startup->options;
-	js_server_props.interfaces=&startup->interfaces;
-
 	uptime=0;
 	served=0;
 	startup->recycle_now=FALSE;
@@ -6043,13 +5125,6 @@ void DLLCALL ftp_server(void* arg)
 		if(startup->max_inactivity==0)			startup->max_inactivity=FTP_DEFAULT_MAX_INACTIVITY;	/* seconds */
 		if(startup->sem_chk_freq==0)			startup->sem_chk_freq=DEFAULT_SEM_CHK_FREQ;		/* seconds */
 		if(startup->index_file_name[0]==0)		SAFECOPY(startup->index_file_name,"00index");
-		if(startup->html_index_file[0]==0)		SAFECOPY(startup->html_index_file,"00index.html");
-		if(startup->html_index_script[0]==0)	SAFECOPY(startup->html_index_script,"ftp-html.js");
-		if(startup->options&FTP_OPT_HTML_INDEX_FILE)
-			startup->options&=~FTP_OPT_NO_JAVASCRIPT;
-		else
-			startup->options|=FTP_OPT_NO_JAVASCRIPT;
-		if(startup->js.max_bytes==0)			startup->js.max_bytes=JAVASCRIPT_MAX_BYTES;
 
 		protected_uint32_adjust(&thread_count,1);
 		thread_up(FALSE /* setuid */);
diff --git a/src/sbbs3/ftpsrvr.h b/src/sbbs3/ftpsrvr.h
index c5bf4be5572df5c1eca4bf88bfbaffad2ad216dc..e83599d978f13e54b74bf4aafad6c84570c6ae99 100644
--- a/src/sbbs3/ftpsrvr.h
+++ b/src/sbbs3/ftpsrvr.h
@@ -1,7 +1,5 @@
 /* Synchronet FTP server */
 
-/* $Id: ftpsrvr.h,v 1.58 2019/03/22 21:28:27 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -79,8 +65,6 @@ typedef struct {
 	/* Paths */
     char    ctrl_dir[128];
     char	index_file_name[64];
-    char	html_index_file[64];
-    char	html_index_script[64];
     char	temp_dir[128];
 	char	answer_sound[128];
 	char	hangup_sound[128];
@@ -95,9 +79,6 @@ typedef struct {
 	uint	bind_retry_count;		/* Number of times to retry bind() calls */
 	uint	bind_retry_delay;		/* Time to wait between each bind() retry */
 
-	/* JavaScript operating parameters */
-	js_startup_t js;
-
 	/* Login Attempt parameters */
 	struct login_attempt_settings login_attempt;
 	link_list_t* login_attempt_list;
@@ -123,11 +104,9 @@ static struct init_field ftp_init_fields[] = {
 #define FTP_OPT_NO_LOCAL_FSYS		(1<<5)
 #define FTP_OPT_DIR_FILES			(1<<6)	/* Allow access to files in dir but not in database */
 #define FTP_OPT_KEEP_TEMP_FILES		(1<<7)	/* Don't delete temp files (for debugging) */
-#define FTP_OPT_HTML_INDEX_FILE		(1<<8)	/* Auto-generate HTML index files */
 #define FTP_OPT_LOOKUP_PASV_IP		(1<<9)	/* resolve public IP address for PASV response */
 #define FTP_OPT_NO_HOST_LOOKUP		(1<<11)
 #define FTP_OPT_NO_RECYCLE			(1<<27)	/* Disable recycling of server		*/
-#define FTP_OPT_NO_JAVASCRIPT		(1<<29)	/* JavaScript disabled				*/
 #define FTP_OPT_MUTE				(1<<31)
 
 /* ftp_startup_t.options bits that require re-init/recycle when changed */
@@ -144,11 +123,9 @@ static ini_bitdesc_t ftp_options[] = {
 	{ FTP_OPT_NO_LOCAL_FSYS			,"NO_LOCAL_FSYS"		},
 	{ FTP_OPT_DIR_FILES				,"DIR_FILES"			},
 	{ FTP_OPT_KEEP_TEMP_FILES		,"KEEP_TEMP_FILES"		},
-	{ FTP_OPT_HTML_INDEX_FILE		,"HTML_INDEX_FILE"		},
 	{ FTP_OPT_LOOKUP_PASV_IP		,"LOOKUP_PASV_IP"		},
 	{ FTP_OPT_NO_HOST_LOOKUP		,"NO_HOST_LOOKUP"		},
 	{ FTP_OPT_NO_RECYCLE			,"NO_RECYCLE"			},
-	{ FTP_OPT_NO_JAVASCRIPT			,"NO_JAVASCRIPT"		},
 	{ FTP_OPT_MUTE					,"MUTE"					},
 	/* terminator */										
 	{ 0 							,NULL					}
diff --git a/src/sbbs3/sbbs_ini.c b/src/sbbs3/sbbs_ini.c
index f42808d34ee226f9c6725e3e6f40707f6d5e693f..d754f5b50f3aa4eec830371472f1d88738c73e63 100644
--- a/src/sbbs3/sbbs_ini.c
+++ b/src/sbbs3/sbbs_ini.c
@@ -434,19 +434,11 @@ void sbbs_read_ini(
 		ftp->pasv_port_high
 			=iniGetShortInt(list,section,"PasvPortHigh",0xffff);
 
-
-		/* JavaScript Operating Parameters */
-		sbbs_get_js_settings(list, section, &ftp->js, &global->js);
-
 		SAFECOPY(ftp->host_name
 			,iniGetString(list,section,strHostName,global->host_name,value));
 
 		SAFECOPY(ftp->index_file_name
 			,iniGetString(list,section,"IndexFileName","00index",value));
-		SAFECOPY(ftp->html_index_file
-			,iniGetString(list,section,"HtmlIndexFile","00index.html",value));
-		SAFECOPY(ftp->html_index_script
-			,iniGetString(list,section,"HtmlIndexScript","ftp-html.js",value));
 
 		SAFECOPY(ftp->answer_sound
 			,iniGetString(list,section,strAnswerSound,nulstr,value));
@@ -462,7 +454,7 @@ void sbbs_read_ini(
 			=iniGetLogLevel(list,section,strLogLevel,global->log_level);
 		ftp->options
 			=iniGetBitField(list,section,strOptions,ftp_options
-				,FTP_OPT_INDEX_FILE|FTP_OPT_HTML_INDEX_FILE|FTP_OPT_ALLOW_QWK);
+				,FTP_OPT_INDEX_FILE | FTP_OPT_ALLOW_QWK);
 
 		ftp->bind_retry_count=iniGetInteger(list,section,strBindRetryCount,global->bind_retry_count);
 		ftp->bind_retry_delay=iniGetInteger(list,section,strBindRetryDelay,global->bind_retry_delay);
@@ -921,10 +913,6 @@ BOOL sbbs_write_ini(
 		else if(!iniSetLogLevel(lp,section,strLogLevel,ftp->log_level,&style))
 			break;
 
-		/* JavaScript Operating Parameters */
-		if(!sbbs_set_js_settings(lp,section,&ftp->js,&global->js,&style))
-			break;
-
 		if(strcmp(ftp->host_name,global->host_name)==0
             || (bbs != NULL && strcmp(bbs->host_name,cfg->sys_inetaddr)==0))
 			iniRemoveKey(lp,section,strHostName);
@@ -938,10 +926,6 @@ BOOL sbbs_write_ini(
 
 		if(!iniSetString(lp,section,"IndexFileName",ftp->index_file_name,&style))
 			break;
-		if(!iniSetString(lp,section,"HtmlIndexFile",ftp->html_index_file,&style))
-			break;
-		if(!iniSetString(lp,section,"HtmlIndexScript",ftp->html_index_script,&style))
-			break;
 
 		if(!iniSetString(lp,section,strAnswerSound,ftp->answer_sound,&style))
 			break;
diff --git a/web/lib/nightshade/leftnav_html.ssjs b/web/lib/nightshade/leftnav_html.ssjs
index a22d5fe243bad03db6f88a46209d6fab24ae9652..4b4884adbe5aa5e23d888f50d877072af5d1cdea 100644
--- a/web/lib/nightshade/leftnav_html.ssjs
+++ b/web/lib/nightshade/leftnav_html.ssjs
@@ -16,7 +16,7 @@
     template.ftp_url += host; 
     if(ftp_port!=21)
         template.ftp_url += ftp_port;
-    template.ftpidx ="/00index.html?$" + new Date().valueOf().toString(36);
+    template.ftpidx ="/";
     template.ftpqwk = "/" + system.qwk_id.toLowerCase() + ".qwk";
  }