diff --git a/src/sbbs3/addfiles.c b/src/sbbs3/addfiles.c
index 5084404f22c090cb727a79021fdbfc4dd0bf1425..a6da5a368ceda9c4690ce7dd0ebfca9029fc1de8 100644
--- a/src/sbbs3/addfiles.c
+++ b/src/sbbs3/addfiles.c
@@ -104,7 +104,7 @@ void updatestats(ulong size)
 	close(file);
 }
 
-bool reupload(smb_t* smb, smbfile_t* f)
+bool reupload(smb_t* smb, file_t* f)
 {
 	char path[MAX_PATH + 1];
 	if(!smb_renewfile(smb, f, SMB_SELFPACK, getfilepath(&scfg, f, path))) {
@@ -115,7 +115,7 @@ bool reupload(smb_t* smb, smbfile_t* f)
 }
 
 
-bool get_file_diz(smbfile_t* f, char* ext, size_t maxlen)
+bool get_file_diz(file_t* f, char* ext, size_t maxlen)
 {
 	char path[MAX_PATH + 1];
 	printf("Extracting DIZ from: %s\n", getfilepath(&scfg, f, path));
@@ -158,7 +158,7 @@ void addlist(char *inpath, uint dirnum, const char* uploader, uint dskip, uint s
 	DIR*	dir;
 	DIRENT*	dirent;
 	smb_t smb;
-	smbfile_t f;
+	file_t f;
 
 	int result = smb_open_dir(&scfg, &smb, dirnum);
 	if(result != SMB_SUCCESS) {
@@ -442,8 +442,8 @@ void synclist(char *inpath, int dirnum)
 	int		found;
 	long	l;
 	FILE*	stream;
-	smbfile_t*	f;
-	smbfile_t*	file_list;
+	file_t*	f;
+	file_t*	file_list;
 	smb_t	smb;
 
 	SAFECOPY(listpath,inpath);
@@ -547,7 +547,7 @@ int main(int argc, char **argv)
 	uint desc_offset=0, size_offset=0;
 	long l;
 	smb_t	smb;
-	smbfile_t	f;
+	file_t	f;
 	uint dirnum = INVALID_DIR;
 
 	fprintf(stderr,"\nADDFILES v%s-%s %s/%s - Adds Files to Synchronet "
diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp
index ca7627ef9731bb89fcea49376f8be9a724af0015..f258c80f879d757382be779f7311c391e8fcb249 100644
--- a/src/sbbs3/atcodes.cpp
+++ b/src/sbbs3/atcodes.cpp
@@ -1990,6 +1990,8 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen, long* pmode, bool
 			return current_file->name;
 		if(strcmp(sp, "FILE_DESC") == 0)
 			return current_file->desc;
+		if(strcmp(sp, "FILE_TAGS") == 0)
+			return current_file->tags;
 		if(strcmp(sp, "FILE_UPLOADER") == 0)
 			return current_file->from;
 		if(strcmp(sp, "FILE_SIZE") == 0) {
diff --git a/src/sbbs3/bat_xfer.cpp b/src/sbbs3/bat_xfer.cpp
index 948db65e2db7d87fe9579dbccedcde217a5ce174..518f87b3e7d6f317c2887454aadfacf56c457f47 100644
--- a/src/sbbs3/bat_xfer.cpp
+++ b/src/sbbs3/bat_xfer.cpp
@@ -117,7 +117,7 @@ void sbbs_t::batchmenu()
 					bputs(text[DownloadQueueLstHdr]);
 					for(size_t i = 0; filenames[i]; ++i) {
 						const char* filename = filenames[i];
-						smbfile_t f = {{}};
+						file_t f = {{}};
 						if(!batch_file_load(&cfg, ini, filename, &f))
 							continue;
 						getfilesize(&cfg, &f);
@@ -238,7 +238,7 @@ BOOL sbbs_t::start_batch_download()
 	str_list_t filenames = iniGetSectionList(ini, NULL);
 
 	if(file_count == 1) {	// Only one file in the queue? Perform a non-batch (e.g. XMODEM) download
-		smbfile_t f = {{}};
+		file_t f = {{}};
 		BOOL result = FALSE;
 		if(batch_file_get(&cfg, ini, filenames[0], &f)) {
 			result = sendfile(&f, /* prot: */' ', /* autohang: */true);
@@ -253,7 +253,7 @@ BOOL sbbs_t::start_batch_download()
 
 	int64_t totalcdt = 0;
 	for(size_t i=0; filenames[i] != NULL; ++i) {
-		smbfile_t f = {{}};
+		file_t f = {{}};
 		if(batch_file_load(&cfg, ini, filenames[i], &f)) {
 			totalcdt += f.cost;
 			smb_freefilemem(&f);
@@ -270,7 +270,7 @@ BOOL sbbs_t::start_batch_download()
 	int64_t totalsize = 0;
 	int64_t totaltime = 0;
 	for(size_t i=0; filenames[i] != NULL; ++i) {
-		smbfile_t f = {{}};
+		file_t f = {{}};
 		if(!batch_file_get(&cfg, ini, filenames[i], &f))
 			continue;
 		if(!(cfg.dir[f.dir]->misc&DIR_TFREE) && cur_cps)
@@ -405,7 +405,7 @@ bool sbbs_t::create_batchdn_lst(bool native)
 	str_list_t filenames = iniGetSectionList(ini, /* prefix: */NULL);
 	for(size_t i = 0; filenames[i] != NULL; ++i) {
 		const char* filename = filenames[i];
-		smbfile_t f = {};
+		file_t f = {};
 		f.dir = batch_file_dir(&cfg, ini, filename);
 		if(!loadfile(&cfg, f.dir, filename, &f, file_detail_index)) {
 			errormsg(WHERE, "loading file", filename, i);
@@ -454,7 +454,7 @@ bool sbbs_t::create_batchup_lst()
 	str_list_t filenames = iniGetSectionList(ini, /* prefix: */NULL);
 	for(size_t i = 0; filenames[i] != NULL; ++i) {
 		const char* filename = filenames[i];
-		smbfile_t f = {{}};
+		file_t f = {{}};
 		if(!batch_file_get(&cfg, ini, filename, &f))
 			continue;
 		fprintf(fp, "%s%s\r\n", cfg.dir[f.dir]->path, filename);
@@ -493,7 +493,7 @@ void sbbs_t::batch_upload()
 		if(fexist(src))
 			mv(src, dest, /* copy: */FALSE);
 
-		smbfile_t f = {{}};
+		file_t f = {{}};
 		if(!batch_file_get(&cfg, ini, filename, &f))
 			continue;
 		if(uploadfile(&f))
@@ -534,7 +534,7 @@ void sbbs_t::batch_upload()
 		if(x<usrlibs) {
 			bprintf(text[FileAlreadyOnline], dirent->d_name);
 		} else {
-			smbfile_t f = {{}};
+			file_t f = {{}};
 			f.dir = cfg.upload_dir;
 			smb_hfield_str(&f, SMB_FILENAME, dirent->d_name);
 			uploadfile(&f);
@@ -561,7 +561,7 @@ void sbbs_t::batch_download(int xfrprot)
 		char* filename = filenames[i];
 		lncntr=0;                               /* defeat pause */
 		if(xfrprot==-1 || checkprotresult(cfg.prot[xfrprot], 0, filename)) {
-			smbfile_t f = {{}};
+			file_t f = {{}};
 			if(!batch_file_load(&cfg, ini, filename, &f)) {
 				errormsg(WHERE, "loading file", filename, i);
 				continue;
@@ -589,7 +589,7 @@ void sbbs_t::batch_add_list(char *list)
 	int		file;
 	uint	i,j,k;
     FILE *	stream;
-	smbfile_t	f;
+	file_t	f;
 
 	if((stream=fnopen(&file,list,O_RDONLY))!=NULL) {
 		bputs(text[SearchingAllLibs]);
@@ -628,7 +628,7 @@ void sbbs_t::batch_add_list(char *list)
 /**************************************************************************/
 /* Add file 'f' to batch download queue. Return 1 if successful, 0 if not */
 /**************************************************************************/
-bool sbbs_t::addtobatdl(smbfile_t* f)
+bool sbbs_t::addtobatdl(file_t* f)
 {
     char	str[256],tmp2[256];
 	char 	tmp[512];
@@ -669,7 +669,7 @@ bool sbbs_t::addtobatdl(smbfile_t* f)
 		totalsize = 0;
 		for(i=0; filenames[i] != NULL; ++i) {
 			const char* filename = filenames[i];
-			smbfile_t bf = {{}};
+			file_t bf = {{}};
 			if(!batch_file_load(&cfg, ini, filename, &bf))
 				continue;
 			totalcost += bf.cost;
diff --git a/src/sbbs3/delfiles.c b/src/sbbs3/delfiles.c
index f54c6d51495f01c54ef652aba2e26ca262687745..3104f93db2e3a46f7b14e1f2e42e9306f7686205 100644
--- a/src/sbbs3/delfiles.c
+++ b/src/sbbs3/delfiles.c
@@ -243,10 +243,10 @@ int main(int argc, char **argv)
 		printf("\nScanning %s %s\n", cfg.lib[cfg.dir[i]->lib]->sname, cfg.dir[i]->lname);
 
 		size_t file_count;
-		smbfile_t* file_list = loadfiles(&smb, NULL, 0, /* extdesc: */FALSE, FILE_SORT_NATURAL, &file_count);
+		file_t* file_list = loadfiles(&smb, NULL, 0, /* extdesc: */FALSE, FILE_SORT_NATURAL, &file_count);
 
 		for(fi = 0; fi < file_count; fi++) {
-			smbfile_t* f = &file_list[fi];
+			file_t* f = &file_list[fi];
 			getfilepath(&cfg, f, fpath);
 			if(cfg.dir[i]->maxage && cfg.dir[i]->misc&DIR_SINCEDL && f->hdr.last_downloaded
 				&& (now - f->hdr.last_downloaded)/86400L > cfg.dir[i]->maxage) {
diff --git a/src/sbbs3/download.cpp b/src/sbbs3/download.cpp
index 093e60c6dff4275d0230b3916101246c91cce395..8590bba83f80d20dacfbd4ffb0b3cbf37f89025c 100644
--- a/src/sbbs3/download.cpp
+++ b/src/sbbs3/download.cpp
@@ -28,7 +28,7 @@
 /* Updates downloader, uploader and downloaded file data                    */
 /* Must have offset, dir and name fields filled prior to call.              */
 /****************************************************************************/
-void sbbs_t::downloadedfile(smbfile_t* f)
+void sbbs_t::downloadedfile(file_t* f)
 {
     char		str[MAX_PATH+1];
 	char 		tmp[512];
@@ -285,7 +285,7 @@ bool sbbs_t::checkprotresult(prot_t* prot, int error, const char* fpath)
 	return success;
 }
 
-bool sbbs_t::checkprotresult(prot_t* prot, int error, smbfile_t* f)
+bool sbbs_t::checkprotresult(prot_t* prot, int error, file_t* f)
 {
 	char str[512];
 	char tmp[128];
@@ -413,7 +413,7 @@ bool sbbs_t::sendfile(char* fname, char prot, const char* desc, bool autohang)
 }
 
 // contains some copy/pasta from downloadedfile()
-bool sbbs_t::sendfile(smbfile_t* f, char prot, bool autohang)
+bool sbbs_t::sendfile(file_t* f, char prot, bool autohang)
 {
 	char path[MAX_PATH + 1];
 	char str[256];
diff --git a/src/sbbs3/execfile.cpp b/src/sbbs3/execfile.cpp
index fb0525a96755c30fd5298eb8ceb4ea4a0472836e..dae7a9c871072f1274dfb52bfa3d10d5e85972e0 100644
--- a/src/sbbs3/execfile.cpp
+++ b/src/sbbs3/execfile.cpp
@@ -28,7 +28,7 @@ int sbbs_t::exec_file(csi_t *csi)
 	char	str[256],ch;
 	int		s;
 	ulong 	i,j,x,y;
-	smbfile_t	f;
+	file_t	f;
 
 	switch(*(csi->ip++)) {
 
diff --git a/src/sbbs3/file.cpp b/src/sbbs3/file.cpp
index 8121ace531e7c18fb88a8cde78aab86085b66bf7..e04c5f71105c113007e28d79137cb681bb143a1d 100644
--- a/src/sbbs3/file.cpp
+++ b/src/sbbs3/file.cpp
@@ -25,7 +25,7 @@
 /****************************************************************************/
 /* Prints all information of file in file_t structure 'f'					*/
 /****************************************************************************/
-void sbbs_t::showfileinfo(smbfile_t* f, bool show_extdesc)
+void sbbs_t::showfileinfo(file_t* f, bool show_extdesc)
 {
 	char 	tmp[512];
 	char	tmp2[64];
@@ -150,14 +150,14 @@ long sbbs_t::delfiles(const char *inpath, const char *spec, size_t keep)
 /****************************************************************************/
 /* Remove credits from uploader of file 'f'                                 */
 /****************************************************************************/
-bool sbbs_t::removefcdt(smb_t* smb, smbfile_t* f)
+bool sbbs_t::removefcdt(smb_t* smb, file_t* f)
 {
 	return false;
 }
 
 /****************************************************************************/
 /****************************************************************************/
-bool sbbs_t::removefile(smb_t* smb, smbfile_t* f)
+bool sbbs_t::removefile(smb_t* smb, file_t* f)
 {
 	char str[256];
 	int result;
@@ -176,7 +176,7 @@ bool sbbs_t::removefile(smb_t* smb, smbfile_t* f)
 
 /****************************************************************************/
 /****************************************************************************/
-bool sbbs_t::movefile(smb_t* smb, smbfile_t* f, int newdir)
+bool sbbs_t::movefile(smb_t* smb, file_t* f, int newdir)
 {
 	if(findfile(&cfg, newdir, f->name, NULL)) {
 		bprintf(text[FileAlreadyThere], f->name);
diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c
index d3e3ffc7e4261b9759725412eb3032ee82af21df..1007b5b2e0694f5b90d1d4362b358b704f91eea6 100644
--- a/src/sbbs3/filedat.c
+++ b/src/sbbs3/filedat.c
@@ -35,7 +35,7 @@
 
  /****************************************************************************/
 /****************************************************************************/
-bool findfile(scfg_t* cfg, uint dirnum, const char *filename, smbfile_t* file)
+bool findfile(scfg_t* cfg, uint dirnum, const char *filename, file_t* file)
 {
 	smb_t smb;
 
@@ -180,7 +180,7 @@ str_list_t loadfilenames(smb_t* smb, const char* filespec, time_t t, enum file_s
 }
 
 // Load and optionally-sort files from an open filebase into a dynamically-allocated list of "objects"
-smbfile_t* loadfiles(smb_t* smb, const char* filespec, time_t t, enum file_detail detail, enum file_sort order, size_t* count)
+file_t* loadfiles(smb_t* smb, const char* filespec, time_t t, enum file_detail detail, enum file_sort order, size_t* count)
 {
 	*count = 0;
 
@@ -192,14 +192,14 @@ smbfile_t* loadfiles(smb_t* smb, const char* filespec, time_t t, enum file_detai
 			return NULL;
 	}
 
-	smbfile_t* file_list = calloc(smb->status.total_files, sizeof(smbfile_t));
+	file_t* file_list = calloc(smb->status.total_files, sizeof(file_t));
 	if(file_list == NULL)
 		return NULL;
 
 	fseek(smb->sid_fp, start * sizeof(fileidxrec_t), SEEK_SET);
 	long offset = start;
 	while(!feof(smb->sid_fp)) {
-		smbfile_t* f = &file_list[*count];
+		file_t* f = &file_list[*count];
 
 		if(smb_fread(smb, &f->file_idx, sizeof(f->file_idx), smb->sid_fp) != sizeof(f->file_idx))
 			break;
@@ -228,53 +228,53 @@ smbfile_t* loadfiles(smb_t* smb, const char* filespec, time_t t, enum file_detai
 
 static int file_compare_name_a(const void* v1, const void* v2)
 {
-	smbfile_t* f1 = (smbfile_t*)v1;
-	smbfile_t* f2 = (smbfile_t*)v2;
+	file_t* f1 = (file_t*)v1;
+	file_t* f2 = (file_t*)v2;
 
 	return stricmp(f1->name, f2->name);
 }
 
 static int file_compare_name_ac(const void* v1, const void* v2)
 {
-	smbfile_t* f1 = (smbfile_t*)v1;
-	smbfile_t* f2 = (smbfile_t*)v2;
+	file_t* f1 = (file_t*)v1;
+	file_t* f2 = (file_t*)v2;
 
 	return strcmp(f1->name, f2->name);
 }
 
 static int file_compare_name_d(const void* v1, const void* v2)
 {
-	smbfile_t* f1 = (smbfile_t*)v1;
-	smbfile_t* f2 = (smbfile_t*)v2;
+	file_t* f1 = (file_t*)v1;
+	file_t* f2 = (file_t*)v2;
 
 	return stricmp(f2->name, f1->name);
 }
 
 static int file_compare_name_dc(const void* v1, const void* v2)
 {
-	smbfile_t* f1 = (smbfile_t*)v1;
-	smbfile_t* f2 = (smbfile_t*)v2;
+	file_t* f1 = (file_t*)v1;
+	file_t* f2 = (file_t*)v2;
 
 	return strcmp(f2->name, f1->name);
 }
 
 static int file_compare_date_a(const void* v1, const void* v2)
 {
-	smbfile_t* f1 = (smbfile_t*)v1;
-	smbfile_t* f2 = (smbfile_t*)v2;
+	file_t* f1 = (file_t*)v1;
+	file_t* f2 = (file_t*)v2;
 
 	return f1->hdr.when_imported.time - f2->hdr.when_imported.time;
 }
 
 static int file_compare_date_d(const void* v1, const void* v2)
 {
-	smbfile_t* f1 = (smbfile_t*)v1;
-	smbfile_t* f2 = (smbfile_t*)v2;
+	file_t* f1 = (file_t*)v1;
+	file_t* f2 = (file_t*)v2;
 
 	return f2->hdr.when_imported.time - f1->hdr.when_imported.time;
 }
 
-void sortfiles(smbfile_t* filelist, size_t count, enum file_sort order)
+void sortfiles(file_t* filelist, size_t count, enum file_sort order)
 {
 	switch(order) {
 		case FILE_SORT_NAME_A:
@@ -298,14 +298,14 @@ void sortfiles(smbfile_t* filelist, size_t count, enum file_sort order)
 	}
 }
 
-void freefiles(smbfile_t* filelist, size_t count)
+void freefiles(file_t* filelist, size_t count)
 {
 	for(size_t i = 0; i < count; i++)
 		smb_freefilemem(&filelist[i]);
 	free(filelist);
 }
 
-bool loadfile(scfg_t* cfg, uint dirnum, const char* filename, smbfile_t* file, enum file_detail detail)
+bool loadfile(scfg_t* cfg, uint dirnum, const char* filename, file_t* file, enum file_detail detail)
 {
 	smb_t smb;
 
@@ -393,7 +393,7 @@ bool batch_file_exists(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, const
 	return result;
 }
 
-bool batch_file_add(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, smbfile_t* f)
+bool batch_file_add(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, file_t* f)
 {
 	FILE* fp = batch_list_open(cfg, usernumber, type, /* create: */true);
 	if(fp == NULL)
@@ -410,7 +410,7 @@ bool batch_file_add(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, smbfile_t
 	return true;
 }
 
-bool batch_file_get(scfg_t* cfg, str_list_t ini, const char* filename, smbfile_t* f)
+bool batch_file_get(scfg_t* cfg, str_list_t ini, const char* filename, file_t* f)
 {
 	char* p;
 	char value[INI_MAX_VALUE_LEN + 1];
@@ -434,7 +434,7 @@ int batch_file_dir(scfg_t* cfg, str_list_t ini, const char* filename)
 	return getdirnum(cfg, iniGetString(ini, filename, "dir", NULL, value));
 }
 
-bool batch_file_load(scfg_t* cfg, str_list_t ini, const char* filename, smbfile_t* f)
+bool batch_file_load(scfg_t* cfg, str_list_t ini, const char* filename, file_t* f)
 {
 	if(!iniSectionExists(ini, filename))
 		return false;
@@ -444,7 +444,7 @@ bool batch_file_load(scfg_t* cfg, str_list_t ini, const char* filename, smbfile_
 	return loadfile(cfg, f->dir, filename, f, file_detail_normal);
 }
 
-bool updatefile(scfg_t* cfg, smbfile_t* file)
+bool updatefile(scfg_t* cfg, file_t* file)
 {
 	smb_t smb;
 
@@ -464,7 +464,7 @@ bool removefile(scfg_t* cfg, uint dirnum, const char* filename)
 		return false;
 
 	int result;
-	smbfile_t file;
+	file_t file;
 	if((result = smb_loadfile(&smb, filename, &file, file_detail_normal)) == SMB_SUCCESS) {
 		result = smb_removefile(&smb, &file);
 		smb_freefilemem(&file);
@@ -479,7 +479,7 @@ bool removefile(scfg_t* cfg, uint dirnum, const char* filename)
 /* If the directory is configured to allow file-checking and the file does	*/
 /* not exist, the size element is set to -1.								*/
 /****************************************************************************/
-char* getfilepath(scfg_t* cfg, smbfile_t* f, char* path)
+char* getfilepath(scfg_t* cfg, file_t* f, char* path)
 {
 	bool fchk = true;
 	const char* name = f->name == NULL ? f->file_idx.name : f->name;
@@ -494,7 +494,7 @@ char* getfilepath(scfg_t* cfg, smbfile_t* f, char* path)
 	return path;
 }
 
-off_t getfilesize(scfg_t* cfg, smbfile_t* f)
+off_t getfilesize(scfg_t* cfg, file_t* f)
 {
 	char fpath[MAX_PATH + 1];
 	if(f->size > 0)
@@ -503,7 +503,7 @@ off_t getfilesize(scfg_t* cfg, smbfile_t* f)
 	return f->size;
 }
 
-time_t getfiletime(scfg_t* cfg, smbfile_t* f)
+time_t getfiletime(scfg_t* cfg, file_t* f)
 {
 	char fpath[MAX_PATH + 1];
 	if(f->time > 0)
@@ -512,7 +512,7 @@ time_t getfiletime(scfg_t* cfg, smbfile_t* f)
 	return f->time;
 }
 
-ulong gettimetodl(scfg_t* cfg, smbfile_t* f, uint rate_cps)
+ulong gettimetodl(scfg_t* cfg, file_t* f, uint rate_cps)
 {
 	if(getfilesize(cfg, f) < 1)
 		return 0;
@@ -521,7 +521,7 @@ ulong gettimetodl(scfg_t* cfg, smbfile_t* f, uint rate_cps)
 	return (ulong)(f->size / rate_cps);
 }
 
-bool hashfile(scfg_t* cfg, smbfile_t* f)
+bool hashfile(scfg_t* cfg, file_t* f)
 {
 	bool result = false;
 	smb_t smb;
@@ -542,7 +542,7 @@ bool hashfile(scfg_t* cfg, smbfile_t* f)
 	return result;
 }
 
-bool addfile(scfg_t* cfg, uint dirnum, smbfile_t* f, const char* extdesc)
+bool addfile(scfg_t* cfg, uint dirnum, file_t* f, const char* extdesc)
 {
 	char fpath[MAX_PATH + 1];
 	smb_t smb;
@@ -821,7 +821,7 @@ long extract_files_from_archive(const char* archive, const char* outdir, const c
 	return extracted;
 }
 
-bool extract_diz(scfg_t* cfg, smbfile_t* f, str_list_t diz_fnames, char* path, size_t maxlen)
+bool extract_diz(scfg_t* cfg, file_t* f, str_list_t diz_fnames, char* path, size_t maxlen)
 {
 	int i;
 	char archive[MAX_PATH + 1];
diff --git a/src/sbbs3/filedat.h b/src/sbbs3/filedat.h
index 8f3bad952b3048435022652b8b48d7e233431caf..277d9ad56c4ccb594a85352368c3e970384de1e5 100644
--- a/src/sbbs3/filedat.h
+++ b/src/sbbs3/filedat.h
@@ -38,23 +38,23 @@ DLLEXPORT bool			update_newfiletime(smb_t*, time_t);
 DLLEXPORT time_t		dir_newfiletime(scfg_t*, uint dirnum);
 DLLEXPORT time_t		lastfiletime(smb_t*); // Reads the last index record
 
-DLLEXPORT bool			findfile(scfg_t* cfg, uint dirnum, const char *filename, smbfile_t*);
-DLLEXPORT bool			loadfile(scfg_t*, uint dirnum, const char* filename, smbfile_t*, enum file_detail);
-DLLEXPORT smbfile_t*	loadfiles(smb_t*, const char* filespec, time_t, enum file_detail, enum file_sort, size_t* count);
-DLLEXPORT void			sortfiles(smbfile_t*, size_t count, enum file_sort);
-DLLEXPORT void			freefiles(smbfile_t*, size_t count);
+DLLEXPORT bool			findfile(scfg_t* cfg, uint dirnum, const char *filename, file_t*);
+DLLEXPORT bool			loadfile(scfg_t*, uint dirnum, const char* filename, file_t*, enum file_detail);
+DLLEXPORT file_t*	loadfiles(smb_t*, const char* filespec, time_t, enum file_detail, enum file_sort, size_t* count);
+DLLEXPORT void			sortfiles(file_t*, size_t count, enum file_sort);
+DLLEXPORT void			freefiles(file_t*, size_t count);
 DLLEXPORT str_list_t	loadfilenames(smb_t*, const char* filespec, time_t t, enum file_sort, size_t* count);
 DLLEXPORT void			sortfilenames(str_list_t, size_t count, enum file_sort);
-DLLEXPORT bool			updatefile(scfg_t*, smbfile_t*);
-DLLEXPORT char*			getfilepath(scfg_t*, smbfile_t*, char* path);
-DLLEXPORT off_t			getfilesize(scfg_t*, smbfile_t*);
-DLLEXPORT time_t		getfiletime(scfg_t*, smbfile_t*);
-DLLEXPORT ulong			gettimetodl(scfg_t*, smbfile_t*, uint rate_cps);
-DLLEXPORT bool			hashfile(scfg_t*, smbfile_t*);
-DLLEXPORT bool			addfile(scfg_t*, uint dirnum, smbfile_t*, const char* extdesc);
+DLLEXPORT bool			updatefile(scfg_t*, file_t*);
+DLLEXPORT char*			getfilepath(scfg_t*, file_t*, char* path);
+DLLEXPORT off_t			getfilesize(scfg_t*, file_t*);
+DLLEXPORT time_t		getfiletime(scfg_t*, file_t*);
+DLLEXPORT ulong			gettimetodl(scfg_t*, file_t*, uint rate_cps);
+DLLEXPORT bool			hashfile(scfg_t*, file_t*);
+DLLEXPORT bool			addfile(scfg_t*, uint dirnum, file_t*, const char* extdesc);
 DLLEXPORT bool			removefile(scfg_t*, uint dirnum, const char* filename);
 DLLEXPORT char*			format_filename(const char* fname, char* buf, size_t, bool pad);
-DLLEXPORT bool			extract_diz(scfg_t*, smbfile_t*, str_list_t diz_fname, char* path, size_t);
+DLLEXPORT bool			extract_diz(scfg_t*, file_t*, str_list_t diz_fname, char* path, size_t);
 DLLEXPORT str_list_t	read_diz(const char* path, size_t max_line_len);
 DLLEXPORT char*			format_diz(str_list_t lines, char*, size_t maxlen, bool allow_ansi);
 DLLEXPORT char*			prep_file_desc(const char *src, char* dst);
@@ -75,13 +75,13 @@ DLLEXPORT str_list_t	batch_list_read(scfg_t* , uint usernumber, enum XFER_TYPE);
 DLLEXPORT bool			batch_list_write(scfg_t*, uint usernumber, enum XFER_TYPE, str_list_t list);
 DLLEXPORT bool			batch_list_clear(scfg_t*, uint usernumber, enum XFER_TYPE);
 
-DLLEXPORT bool			batch_file_add(scfg_t*, uint usernumber, enum XFER_TYPE, smbfile_t*);
+DLLEXPORT bool			batch_file_add(scfg_t*, uint usernumber, enum XFER_TYPE, file_t*);
 DLLEXPORT bool			batch_file_exists(scfg_t*, uint usernumber, enum XFER_TYPE, const char* filename);
 DLLEXPORT bool			batch_file_remove(scfg_t*, uint usernumber, enum XFER_TYPE, const char* filename);
 DLLEXPORT size_t		batch_file_count(scfg_t*, uint usernumber, enum XFER_TYPE);
-DLLEXPORT bool			batch_file_get(scfg_t*, str_list_t, const char* filename, smbfile_t*);
+DLLEXPORT bool			batch_file_get(scfg_t*, str_list_t, const char* filename, file_t*);
 DLLEXPORT int			batch_file_dir(scfg_t*, str_list_t, const char* filename);
-DLLEXPORT bool			batch_file_load(scfg_t*, str_list_t, const char* filename, smbfile_t*);
+DLLEXPORT bool			batch_file_load(scfg_t*, str_list_t, const char* filename, file_t*);
 
 #ifdef __cplusplus
 }
diff --git a/src/sbbs3/filelist.c b/src/sbbs3/filelist.c
index 5775fbf7f43dd63dbe680f4327cb1606998a22e1..0a532fc4cde7cc72142d60cf9013a55342408601 100644
--- a/src/sbbs3/filelist.c
+++ b/src/sbbs3/filelist.c
@@ -339,7 +339,7 @@ int main(int argc, char **argv)
 		if(max_age)
 			t = time(NULL) - (max_age * 24 * 60 * 60);
 		ulong file_count;
-		smbfile_t* file_list = loadfiles(&smb
+		file_t* file_list = loadfiles(&smb
 			,/* filespec: */pattern, /* time: */t, /* extdesc: */TRUE, scfg.dir[i]->sort, &file_count);
 
 		if(misc&AUTO) {
@@ -368,7 +368,7 @@ int main(int argc, char **argv)
 				longest_filename = fnamelen;
 		}
 		for(m = 0; m < file_count && !ferror(out); m++) {
-			smbfile_t file = file_list[m];
+			file_t file = file_list[m];
 
 			if(misc&PAD) {
 				char* ext = getfext(file.name);
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 303d0bc4d09ac065c49b5c1aae76bfed82825543..e009f2d9366442815681da8c1568e9ce915fcc3d 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -615,7 +615,7 @@ static void send_thread(void* arg)
 	off_t		length;
 	BOOL		error=FALSE;
 	FILE*		fp;
-	smbfile_t	f;
+	file_t		f;
 	xfer_t		xfer;
 	time_t		now;
 	time_t		start;
@@ -888,7 +888,7 @@ static void receive_thread(void* arg)
 	BOOL		error=FALSE;
 	BOOL		filedat;
 	FILE*		fp;
-	smbfile_t	f;
+	file_t	f;
 	xfer_t		xfer;
 	time_t		now;
 	time_t		start;
@@ -1983,7 +1983,7 @@ static void get_dirperm(lib_t *lib, dir_t *dir, user_t *user, client_t *client,
 	*p=0;
 }
 
-static BOOL can_append(lib_t *lib, dir_t *dir, user_t *user, client_t *client, smbfile_t *file)
+static BOOL can_append(lib_t *lib, dir_t *dir, user_t *user, client_t *client, file_t *file)
 {
 	if (!chk_ar(&scfg,lib->ar,user,client))
 		return FALSE;
@@ -2000,7 +2000,7 @@ static BOOL can_append(lib_t *lib, dir_t *dir, user_t *user, client_t *client, s
 	return TRUE;
 }
 
-static BOOL can_delete(lib_t *lib, dir_t *dir, user_t *user, client_t *client, smbfile_t *file)
+static BOOL can_delete(lib_t *lib, dir_t *dir, user_t *user, client_t *client, file_t *file)
 {
 	if (user->rest&FLAG('D'))
 		return FALSE;
@@ -2015,7 +2015,7 @@ static BOOL can_delete(lib_t *lib, dir_t *dir, user_t *user, client_t *client, s
 	return TRUE;
 }
 
-static BOOL can_download(lib_t *lib, dir_t *dir, user_t *user, client_t *client, smbfile_t *file)
+static BOOL can_download(lib_t *lib, dir_t *dir, user_t *user, client_t *client, file_t *file)
 {
 	if (user->rest&FLAG('D'))
 		return FALSE;
@@ -2029,7 +2029,7 @@ static BOOL can_download(lib_t *lib, dir_t *dir, user_t *user, client_t *client,
 	return TRUE;
 }
 
-static void get_fileperm(lib_t *lib, dir_t *dir, user_t *user, client_t *client, smbfile_t *file, char *permstr)
+static void get_fileperm(lib_t *lib, dir_t *dir, user_t *user, client_t *client, file_t *file, char *permstr)
 {
 	char *p = permstr;
 
@@ -2049,7 +2049,7 @@ static void get_fileperm(lib_t *lib, dir_t *dir, user_t *user, client_t *client,
 	*p = 0;
 }
 
-static void get_owner_name(smbfile_t *file, char *namestr)
+static void get_owner_name(file_t *file, char *namestr)
 {
 	char *p;
 
@@ -3730,10 +3730,10 @@ static void ctrl_thread(void* arg)
 					}
 					time_t start = time(NULL);
 					size_t file_count = 0;
-					smbfile_t* file_list = loadfiles(&smb
+					file_t* file_list = loadfiles(&smb
 						,/* filespec */NULL, /* time: */0, file_detail_normal, scfg.dir[dir]->sort, &file_count);
 					for(size_t i = 0; i < file_count; i++) {
-						smbfile_t* f = &file_list[i];
+						file_t* f = &file_list[i];
 						if (cmd[3] != 'D' && strcmp(f->name, mls_fname) != 0)
 							continue;
 						if (cmd[3] == 'T')
@@ -4017,10 +4017,10 @@ static void ctrl_thread(void* arg)
 				}
 				time_t start = time(NULL);
 				size_t file_count = 0;
-				smbfile_t* file_list = loadfiles(&smb
+				file_t* file_list = loadfiles(&smb
 					,filespec, /* time: */0, file_detail_normal, scfg.dir[dir]->sort, &file_count);
 				for(size_t i = 0; i < file_count; i++) {
-					smbfile_t* f = &file_list[i];
+					file_t* f = &file_list[i];
 					if(detail) {
 						f->size = f->cost;
 						t = f->hdr.when_imported.time;
@@ -4306,10 +4306,10 @@ static void ctrl_thread(void* arg)
 						}
 						time_t start = time(NULL);
 						size_t file_count = 0;
-						smbfile_t* file_list = loadfiles(&smb
+						file_t* file_list = loadfiles(&smb
 							,/* filespec */NULL, /* time: */0, file_detail_normal, scfg.dir[dir]->sort, &file_count);
 						for(size_t i = 0; i < file_count; i++) {
-							smbfile_t* f = &file_list[i];
+							file_t* f = &file_list[i];
 							fprintf(fp,"%-*s %s\r\n",INDEX_FNAME_LEN
 								,f->name, f->desc);
 						}
@@ -4366,7 +4366,7 @@ static void ctrl_thread(void* arg)
 				/* Verify credits */
 				if(!getsize && !getdate && !delecmd
 					&& !is_download_free(&scfg,dir,&user,&client)) {
-					smbfile_t f;
+					file_t f;
 					if(filedat)
 						loadfile(&scfg, dir, p, &f, file_detail_normal);
 					else
@@ -4577,7 +4577,7 @@ static void ctrl_thread(void* arg)
 					continue;
 				}
 				if(append || filepos) {	/* RESUME */
-					smbfile_t f;
+					file_t f;
 					if(!loadfile(&scfg, dir, p, &f, file_detail_normal)) {
 						if(filepos) {
 							lprintf(LOG_WARNING,"%04d <%s> file (%s) not in database for %.4s command"
diff --git a/src/sbbs3/js_filebase.c b/src/sbbs3/js_filebase.c
index 2b06584f370a5da634e291d7a4e356b8944d175a..78b8658249319dd64255495243c1f0bb58c0b781 100644
--- a/src/sbbs3/js_filebase.c
+++ b/src/sbbs3/js_filebase.c
@@ -137,7 +137,7 @@ js_dump_file(JSContext *cx, uintN argc, jsval *arglist)
 	if(filename == NULL)
 		return JS_FALSE;
 
-	smbfile_t file;
+	file_t file;
 	if((p->smb_result = smb_loadfile(&p->smb, filename, &file, file_detail_normal)) == SMB_SUCCESS) {
 		str_list_t list = smb_msghdr_str_list(&file);
 		if(list != NULL) {
@@ -163,7 +163,7 @@ js_dump_file(JSContext *cx, uintN argc, jsval *arglist)
 }
 
 static bool
-set_file_properties(JSContext *cx, JSObject* obj, smbfile_t* f, enum file_detail detail)
+set_file_properties(JSContext *cx, JSObject* obj, file_t* f, enum file_detail detail)
 {
 	jsval		val;
 	JSString*	js_str;
@@ -323,7 +323,7 @@ parse_file_index_properties(JSContext *cx, JSObject* obj, fileidxrec_t* idx)
 }
 
 static int
-parse_file_properties(JSContext *cx, JSObject* obj, smbfile_t* file, char** extdesc)
+parse_file_properties(JSContext *cx, JSObject* obj, file_t* file, char** extdesc)
 {
 	char*		cp = NULL;
 	size_t		cp_sz = 0;
@@ -445,7 +445,7 @@ js_hash_file(JSContext *cx, uintN argc, jsval *arglist)
 	if((p=(private_t*)js_GetClassPrivate(cx, obj, &js_filebase_class))==NULL)
 		return JS_FALSE;
 
-	smbfile_t file;
+	file_t file;
 	ZERO_VAR(file);
 
 	uintN argn = 0;
@@ -517,7 +517,7 @@ js_get_file(JSContext *cx, uintN argc, jsval *arglist)
 		return JS_FALSE;
 	}
 
-	smbfile_t file;
+	file_t file;
 	ZERO_VAR(file);
 
 	uintN argn = 0;
@@ -625,7 +625,7 @@ js_get_file_list(JSContext *cx, uintN argc, jsval *arglist)
 	}
 
 	size_t file_count;
-	smbfile_t* file_list = loadfiles(&p->smb, filespec, t, detail, sort, &file_count);
+	file_t* file_list = loadfiles(&p->smb, filespec, t, detail, sort, &file_count);
 	if(file_list != NULL) {
 		for(size_t i = 0; i < file_count; i++) {
 			JSObject* fobj;
@@ -753,7 +753,7 @@ js_get_file_path(JSContext *cx, uintN argc, jsval *arglist)
 	private_t*	p;
 	char*		filename = NULL;
 	jsrefcount	rc;
-	smbfile_t file;
+	file_t file;
 
 	ZERO_VAR(file);
 	JS_SET_RVAL(cx, arglist, JSVAL_NULL);
@@ -805,7 +805,7 @@ js_get_file_size(JSContext *cx, uintN argc, jsval *arglist)
 	private_t*	p;
 	char*		filename = NULL;
 	jsrefcount	rc;
-	smbfile_t	file;
+	file_t	file;
 
 	ZERO_VAR(file);
 	JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(-1));
@@ -856,7 +856,7 @@ js_get_file_time(JSContext *cx, uintN argc, jsval *arglist)
 	private_t*	p;
 	char*		filename = NULL;
 	jsrefcount	rc;
-	smbfile_t file;
+	file_t file;
 
 	ZERO_VAR(file);
 	JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(-1));
@@ -899,7 +899,7 @@ js_get_file_time(JSContext *cx, uintN argc, jsval *arglist)
 	return JS_TRUE;
 }
 
-static void get_diz(scfg_t* scfg, smbfile_t* file, char** extdesc)
+static void get_diz(scfg_t* scfg, file_t* file, char** extdesc)
 {
 	char diz_fpath[MAX_PATH + 1];
 	if(extract_diz(scfg, file, /* diz_fnames: */NULL, diz_fpath, sizeof(diz_fpath))) {
@@ -924,7 +924,7 @@ js_add_file(JSContext *cx, uintN argc, jsval *arglist)
 	jsval*		argv = JS_ARGV(cx, arglist);
 	private_t*	p;
 	char*		extdesc = NULL;
-	smbfile_t	file;
+	file_t	file;
 	bool		use_diz_always = false;
 	jsrefcount	rc;
 
@@ -983,7 +983,7 @@ js_update_file(JSContext *cx, uintN argc, jsval *arglist)
 	JSObject*	obj = JS_THIS_OBJECT(cx, arglist);
 	jsval*		argv = JS_ARGV(cx, arglist);
 	private_t*	p;
-	smbfile_t	file;
+	file_t	file;
 	char*		filename = NULL;
 	JSObject*	fileobj = NULL;
 	bool		use_diz_always = false;
@@ -1099,7 +1099,7 @@ js_renew_file(JSContext *cx, uintN argc, jsval *arglist)
 		return JS_TRUE;
 
 	rc=JS_SUSPENDREQUEST(cx);
-	smbfile_t file;
+	file_t file;
 	if((p->smb_result = smb_loadfile(&p->smb, fname, &file, file_detail_index)) == SMB_SUCCESS) {
 		char path[MAX_PATH + 1];
 		p->smb_result = smb_renewfile(&p->smb, &file, SMB_SELFPACK, getfilepath(scfg, &file, path));
@@ -1153,7 +1153,7 @@ js_remove_file(JSContext *cx, uintN argc, jsval *arglist)
 
 	JSBool result = JS_TRUE;
 	rc=JS_SUSPENDREQUEST(cx);
-	smbfile_t file;
+	file_t file;
 	if((p->smb_result = smb_loadfile(&p->smb, fname, &file, file_detail_index)) == SMB_SUCCESS) {
 		char path[MAX_PATH + 1];
 		if(delfile && remove(getfilepath(scfg, &file, path)) != 0) {
diff --git a/src/sbbs3/listfile.cpp b/src/sbbs3/listfile.cpp
index 09be3b75bbf863bc8cde2083e392c0812b5e374e..a9077ea921549cf3c9fcc79a7f963febacb7d532 100644
--- a/src/sbbs3/listfile.cpp
+++ b/src/sbbs3/listfile.cpp
@@ -42,7 +42,7 @@ int sbbs_t::listfiles(uint dirnum, const char *filespec, FILE* tofile, long mode
 	int		found=0,lastbat=0,disp;
 	size_t	m=0;
 	long	anchor=0,next;
-	smbfile_t* bf[BF_MAX];	/* bf is batch flagged files */
+	file_t* bf[BF_MAX];	/* bf is batch flagged files */
 	smb_t	smb;
 	ulong	file_row[26];
 
@@ -57,7 +57,7 @@ int sbbs_t::listfiles(uint dirnum, const char *filespec, FILE* tofile, long mode
 		return 0;
 
 	size_t file_count = 0;
-	smbfile_t* file_list = loadfiles(&smb
+	file_t* file_list = loadfiles(&smb
 		, (mode&(FL_FINDDESC|FL_EXFIND)) ? NULL : filespec
 		, (mode&FL_ULTIME) ? ns_time : 0
 		, file_detail_extdesc
@@ -81,7 +81,7 @@ int sbbs_t::listfiles(uint dirnum, const char *filespec, FILE* tofile, long mode
 	}
 
 	m = 0; // current file index
-	smbfile_t* f;
+	file_t* f;
 	while(online) {
 		if(found<0)
 			found=0;
@@ -340,7 +340,7 @@ int sbbs_t::listfiles(uint dirnum, const char *filespec, FILE* tofile, long mode
 /* Prints one file's information on a single line                           */
 /* Return 1 if displayed, 0 otherwise										*/
 /****************************************************************************/
-bool sbbs_t::listfile(smbfile_t* f, uint dirnum, const char *search, const char letter)
+bool sbbs_t::listfile(file_t* f, uint dirnum, const char *search, const char letter)
 {
 	char	*ptr,*cr,*lf;
 	bool	exist = true;
@@ -465,7 +465,7 @@ bool sbbs_t::listfile(smbfile_t* f, uint dirnum, const char *search, const char
 /* Returns -1 if 'Q' or Ctrl-C, 0 if skip, 1 if [Enter], 2 otherwise        */
 /* or 3, backwards. 														*/
 /****************************************************************************/
-int sbbs_t::batchflagprompt(smb_t* smb, smbfile_t** bf, ulong* row, uint total
+int sbbs_t::batchflagprompt(smb_t* smb, file_t** bf, ulong* row, uint total
 							,long totalfiles)
 {
 	char	ch,str[256],*p,remcdt=0,remfile=0;
@@ -698,7 +698,7 @@ int sbbs_t::batchflagprompt(smb_t* smb, smbfile_t** bf, ulong* row, uint total
 					if(strchr(str+c,'.'))
 						c+=strlen(str+c);
 					else if(str[c]<'A'+(char)total && str[c]>='A') {
-						smbfile_t* f = bf[str[c]-'A'];
+						file_t* f = bf[str[c]-'A'];
 						if(ch=='R') {
 							if(removefile(smb, f)) {
 								if(remfile) {
@@ -740,7 +740,7 @@ int sbbs_t::listfileinfo(uint dirnum, const char *filespec, long mode)
     size_t	m;
 	long	usrcdt;
     time_t	start,end,t;
-    smbfile_t*	f;
+    file_t*	f;
 	struct	tm tm;
 	smb_t	smb;
 
@@ -750,7 +750,7 @@ int sbbs_t::listfileinfo(uint dirnum, const char *filespec, long mode)
 		return 0;
 
 	size_t file_count = 0;
-	smbfile_t* file_list = loadfiles(&smb
+	file_t* file_list = loadfiles(&smb
 		, filespec
 		, /* time_t */0
 		, file_detail_extdesc
@@ -1149,7 +1149,7 @@ int sbbs_t::listfileinfo(uint dirnum, const char *filespec, long mode)
 /****************************************************************************/
 /* Prints one file's information on a single line to a file stream 'fp'		*/
 /****************************************************************************/
-void sbbs_t::listfiletofile(smbfile_t* f, FILE* fp)
+void sbbs_t::listfiletofile(file_t* f, FILE* fp)
 {
 	char fname[13];	/* This is one of the only 8.3 filename formats left! (used for display purposes only) */
 	fprintf(fp, "%-*s %10lu %s\r\n", (int)sizeof(fname)-1, format_filename(f->name, fname, sizeof(fname)-1, /* pad: */TRUE)
diff --git a/src/sbbs3/logon.cpp b/src/sbbs3/logon.cpp
index 509f0f85d57db269691bb339a55099a30399cb16..e36827d651f40df1bcee0d6ed43bf8c909baf298 100644
--- a/src/sbbs3/logon.cpp
+++ b/src/sbbs3/logon.cpp
@@ -225,7 +225,7 @@ bool sbbs_t::logon()
 		str_list_t filenames = iniGetSectionList(ini, NULL);
 		for(size_t i = 0; filenames[i] != NULL; i++) {
 			const char* filename = filenames[i];
-			smbfile_t f = {{}};
+			file_t f = {{}};
 			if(batch_file_get(&cfg, ini, filename, &f)) {
 				bprintf(text[FileAddedToUlQueue], f.name, i + 1, cfg.max_batup);
 				smb_freefilemem(&f);
@@ -242,7 +242,7 @@ bool sbbs_t::logon()
 		str_list_t filenames = iniGetSectionList(ini, NULL);
 		for(size_t i = 0; filenames[i] != NULL; i++) {
 			const char* filename = filenames[i];
-			smbfile_t f = {{}};
+			file_t f = {{}};
 			if(batch_file_load(&cfg, ini, filename, &f)) {
 				char tmp2[256];
 				getfilesize(&cfg, &f);
diff --git a/src/sbbs3/pack_qwk.cpp b/src/sbbs3/pack_qwk.cpp
index b0b67ce960824f38e44a813b3740dced30c9042a..80975d81880ed552b8fc382a0ef2e78ae3bb7a5e 100644
--- a/src/sbbs3/pack_qwk.cpp
+++ b/src/sbbs3/pack_qwk.cpp
@@ -650,7 +650,7 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack)
 		str_list_t filenames = iniGetSectionList(ini, NULL);
 		for(size_t i = 0; filenames[i] != NULL; i++) {
 			const char* filename = filenames[i];
-			smbfile_t f = {{}};
+			file_t f = {{}};
 			if(!batch_file_load(&cfg, ini, filename, &f))
 				continue;
 			if(!is_download_free(&cfg, f.dir, &useron, &client)) {
diff --git a/src/sbbs3/qwk.cpp b/src/sbbs3/qwk.cpp
index 6469c2f2e07a03bd3ec9548258423aad416ecc01..ff39c49ab869725faa784dc6d453846aa4776258 100644
--- a/src/sbbs3/qwk.cpp
+++ b/src/sbbs3/qwk.cpp
@@ -719,7 +719,7 @@ void sbbs_t::qwkcfgline(char *buf,uint subnum)
 	uint 	x,y;
 	long	l;
 	ulong	qwk=useron.qwk;
-	smbfile_t f = {{}};
+	file_t f = {{}};
 
 	sprintf(str,"%-25.25s",buf);	/* Note: must be space-padded, left justified */
 	strupr(str);
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 0a5e9078a6eae1b7639b46266786c9b0adb9e9c0..dc8067b865a43888512145bf1f5b42a5803b9de9 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -618,7 +618,7 @@ public:
 	const char*	current_msg_subj;
 	const char*	current_msg_from;
 	const char*	current_msg_to;
-	smbfile_t*	current_file;	
+	file_t*	current_file;	
 
 			/* Global command shell variables */
 	uint	global_str_vars;
@@ -1016,14 +1016,14 @@ public:
 	bool	backup(const char* fname, int backup_level, bool rename);
 
 	/* upload.cpp */
-	bool	uploadfile(smbfile_t* f);
+	bool	uploadfile(file_t* f);
 	char	sbbsfilename[128],sbbsfiledesc[128]; /* env vars */
 	bool	upload(uint dirnum);
     char	upload_lastdesc[LEN_FDESC+1];
 	bool	bulkupload(uint dirnum);
 
 	/* download.cpp */
-	void	downloadedfile(smbfile_t* f);
+	void	downloadedfile(file_t* f);
 	void	notdownloaded(off_t size, time_t start, time_t end);
 	int		protocol(prot_t* prot, enum XFER_TYPE, const char *fpath, const char *fspec, bool cd, bool autohangup=true);
 	const char*	protcmdline(prot_t* prot, enum XFER_TYPE type);
@@ -1031,29 +1031,29 @@ public:
 	void	autohangup(void);
 	bool	checkdszlog(const char*);
 	bool	checkprotresult(prot_t*, int error, const char* fpath);
-	bool	checkprotresult(prot_t*, int error, smbfile_t*);
-	bool	sendfile(smbfile_t*, char prot, bool autohang);
+	bool	checkprotresult(prot_t*, int error, file_t*);
+	bool	sendfile(file_t*, char prot, bool autohang);
 	bool	sendfile(char* fname, char prot=0, const char* description = NULL, bool autohang=true);
 	bool	recvfile(char* fname, char prot=0, bool autohang=true);
 
 	/* file.cpp */
-	void	showfileinfo(smbfile_t*, bool show_extdesc = true);
-	bool	removefcdt(smb_t*, smbfile_t*);
-	bool	removefile(smb_t*, smbfile_t*);
-	bool	movefile(smb_t*, smbfile_t*, int newdir);
+	void	showfileinfo(file_t*, bool show_extdesc = true);
+	bool	removefcdt(smb_t*, file_t*);
+	bool	removefile(smb_t*, file_t*);
+	bool	movefile(smb_t*, file_t*, int newdir);
 	char *	getfilespec(char *str);
 	bool	checkfname(char *fname);
-	bool	addtobatdl(smbfile_t*);
+	bool	addtobatdl(file_t*);
 	bool	clearbatdl(void);
 	bool	clearbatul(void);
 	long	delfiles(const char *inpath, const char *spec, size_t keep = 0);
 
 	/* listfile.cpp */
-	bool	listfile(smbfile_t*, uint dirnum, const char *search, const char letter);
+	bool	listfile(file_t*, uint dirnum, const char *search, const char letter);
 	int		listfiles(uint dirnum, const char *filespec, FILE* tofile, long mode);
 	int		listfileinfo(uint dirnum, const char *filespec, long mode);
-	void	listfiletofile(smbfile_t*, FILE*);
-	int		batchflagprompt(smb_t*, smbfile_t* bf[], ulong row[], uint total, long totalfiles);
+	void	listfiletofile(file_t*, FILE*);
+	int		batchflagprompt(smb_t*, file_t* bf[], ulong row[], uint total, long totalfiles);
 
 	/* bat_xfer.cpp */
 	void	batchmenu(void);
@@ -1071,9 +1071,9 @@ public:
 	ulong	create_filelist(const char *name, long mode);
 
 	/* viewfile.cpp */
-	int		viewfile(smbfile_t* f, bool extdesc);
+	int		viewfile(file_t* f, bool extdesc);
 	void	viewfiles(uint dirnum, char *fspec);
-	void	viewfilecontents(smbfile_t* f);
+	void	viewfilecontents(file_t* f);
 
 	/* xtrn.cpp */
 	int		external(const char* cmdline, long mode, const char* startup_dir=NULL);
diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index dfcc8a594e054e347c4d5c9f692036463f2e5299..096d7ff1bd45b8a6f60b15683ef35dd087fbaee5 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -1047,6 +1047,7 @@ typedef struct {
 } post_t;
 typedef idxrec_t mail_t;				/* defined in smbdefs.h */
 typedef fidoaddr_t faddr_t;				/* defined in smbdefs.h */
+typedef smbfile_t file_t;				/* defined in smbdefs.h */
 
 typedef struct {						/* System/Node Statistics */
 	uint32_t	logons,						/* Total Logons on System */
diff --git a/src/sbbs3/upgrade_to_v319.c b/src/sbbs3/upgrade_to_v319.c
index b013f7f1cb562fc4d47beb933c7d89f7e4412510..5bd114c4df8d791a5be549d025e72411221f9dcc 100644
--- a/src/sbbs3/upgrade_to_v319.c
+++ b/src/sbbs3/upgrade_to_v319.c
@@ -142,7 +142,7 @@ typedef struct {						/* File (transfers) Data */
 			misc;						/* Miscellaneous bits */
 	uint32_t	cdt;						/* Credit value for this file */
 
-} file_t;
+} oldfile_t;
 
                                     /* Bit values for file_t.misc */
 #define FM_EXTDESC  (1<<0)          /* Extended description exists */
@@ -191,7 +191,7 @@ char* unpadfname(const char *filename, char *str)
 /****************************************************************************/
 /* Returns full (case-corrected) path to specified file						*/
 /****************************************************************************/
-char* getoldfilepath(scfg_t* cfg, file_t* f, char* path)
+char* getoldfilepath(scfg_t* cfg, oldfile_t* f, char* path)
 {
 	char	fname[MAX_PATH+1];
 
@@ -215,8 +215,8 @@ char* getoldfilepath(scfg_t* cfg, file_t* f, char* path)
 
 int file_uldate_compare(const void* v1, const void* v2)
 {
-	file_t* f1 = (file_t*)v1;
-	file_t* f2 = (file_t*)v2;
+	oldfile_t* f1 = (oldfile_t*)v1;
+	oldfile_t* f2 = (oldfile_t*)v2;
 
 	return f1->dateuled - f2->dateuled;
 }
@@ -226,7 +226,7 @@ int file_uldate_compare(const void* v1, const void* v2)
 /* Need fields .name ,.dir and .offset to get other info    				*/
 /* Does not fill .dateuled or .datedled fields.                             */
 /****************************************************************************/
-BOOL getfiledat(scfg_t* cfg, file_t* f)
+BOOL getfiledat(scfg_t* cfg, oldfile_t* f)
 {
 	char buf[F_LEN+1],str[MAX_PATH+1];
 	int file;
@@ -289,7 +289,7 @@ BOOL getfiledat(scfg_t* cfg, file_t* f)
 /* Puts filedata into DIR_code.DAT file                                     */
 /* Called from removefiles                                                  */
 /****************************************************************************/
-BOOL putfiledat(scfg_t* cfg, file_t* f)
+BOOL putfiledat(scfg_t* cfg, oldfile_t* f)
 {
     char buf[F_LEN+1],str[MAX_PATH+1],tmp[128];
     int file;
@@ -338,7 +338,7 @@ BOOL putfiledat(scfg_t* cfg, file_t* f)
 /* Need fields .name and .dir filled.                                       */
 /* only fills .offset, .dateuled, and .datedled                             */
 /****************************************************************************/
-BOOL getfileixb(scfg_t* cfg, file_t* f)
+BOOL getfileixb(scfg_t* cfg, oldfile_t* f)
 {
 	char			str[MAX_PATH+1],fname[13];
 	uchar *	ixbbuf;
@@ -389,7 +389,7 @@ BOOL getfileixb(scfg_t* cfg, file_t* f)
 /****************************************************************************/
 /* Updates the datedled and dateuled index record fields for a file			*/
 /****************************************************************************/
-BOOL putfileixb(scfg_t* cfg, file_t* f)
+BOOL putfileixb(scfg_t* cfg, oldfile_t* f)
 {
 	char	str[MAX_PATH+1],fname[13];
 	uchar*	ixbbuf;
@@ -493,7 +493,7 @@ void putextdesc(scfg_t* cfg, uint dirnum, ulong datoffset, char *ext)
 /****************************************************************************/
 /* Update the upload date for the file 'f'                                  */
 /****************************************************************************/
-int update_uldate(scfg_t* cfg, file_t* f)
+int update_uldate(scfg_t* cfg, oldfile_t* f)
 {
 	char str[MAX_PATH+1],fname[13];
 	int i,file;
@@ -595,13 +595,13 @@ bool upgrade_file_bases(bool hash)
 		}
 		close(file);
 		size_t file_count = l / F_IXBSIZE;
-		file_t* filelist = malloc(sizeof(file_t) * file_count);
+		oldfile_t* filelist = malloc(sizeof(*filelist) * file_count);
 		if(filelist == NULL) {
 			printf("malloc failure");
 			return false;
 		}
-		memset(filelist, 0, sizeof(file_t) * file_count);
-		file_t* f = filelist;
+		memset(filelist, 0, sizeof(*filelist) * file_count);
+		oldfile_t* f = filelist;
 		long m=0L;
 		while(m + F_IXBSIZE <= l) {
 			int j;
@@ -633,7 +633,7 @@ bool upgrade_file_bases(bool hash)
 			}
 			char fpath[MAX_PATH+1];
 			getoldfilepath(&scfg, f, fpath);
-			smbfile_t file;
+			file_t file;
 			memset(&file, 0, sizeof(file));
 			file.hdr.when_imported.time = f->dateuled;
 			file.hdr.last_downloaded = f->datedled;
diff --git a/src/sbbs3/upload.cpp b/src/sbbs3/upload.cpp
index 12d55616ab7403fd835e887edfee4030c9c79771..c3431ab4926d18bf2febc4d9978fd6c2d4f52c42 100644
--- a/src/sbbs3/upload.cpp
+++ b/src/sbbs3/upload.cpp
@@ -24,7 +24,7 @@
 
 /****************************************************************************/
 /****************************************************************************/
-bool sbbs_t::uploadfile(smbfile_t* f)
+bool sbbs_t::uploadfile(file_t* f)
 {
 	char	path[MAX_PATH+1];
 	char	str[MAX_PATH+1] = "";
@@ -226,7 +226,7 @@ bool sbbs_t::upload(uint dirnum)
     time_t	start,end;
     uint	i,j,k;
 	ulong	space;
-	smbfile_t	f = {{}};
+	file_t	f = {{}};
 
 	/* Security Checks */
 	if(useron.rest&FLAG('U')) {
@@ -462,7 +462,7 @@ bool sbbs_t::bulkupload(uint dirnum)
 	char	path[MAX_PATH+1];
 	char	desc[LEN_FDESC + 1];
 	smb_t	smb;
-    smbfile_t f;
+    file_t f;
 	DIR*	dir;
 	DIRENT*	dirent;
 
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 7221b23d8ead155d4386e68e9952644577c54422..ada3b2ded35b407dc6b006870540af20904f6438 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -2431,7 +2431,7 @@ BOOL user_downloaded(scfg_t* cfg, user_t* user, int files, off_t bytes)
 BOOL user_downloaded_file(scfg_t* cfg, user_t* user, client_t* client,
 	uint dirnum, const char* filename, off_t bytes)
 {
-	smbfile_t f;
+	file_t f;
 
 	if(!loadfile(cfg, dirnum, filename, &f, file_detail_normal))
 		return FALSE;
diff --git a/src/sbbs3/viewfile.cpp b/src/sbbs3/viewfile.cpp
index 52f5e91617d64f34ff39b6af9d5ee41798de7462..b76ef3ff4df0cac76ff55974450676982fa86f52 100644
--- a/src/sbbs3/viewfile.cpp
+++ b/src/sbbs3/viewfile.cpp
@@ -28,7 +28,7 @@
 /* call with ext=1 for default to extended info, or 0 for file view         */
 /* Returns -1 for Batch, 1 for Next, -2 for Previous, or 0 for Quit         */
 /****************************************************************************/
-int sbbs_t::viewfile(smbfile_t* f, bool ext)
+int sbbs_t::viewfile(file_t* f, bool ext)
 {
 	char	ch,str[256];
 	char	fname[13];	/* This is one of the only 8.3 filename formats left! (used for display purposes only) */
@@ -107,7 +107,7 @@ void sbbs_t::viewfiles(uint dirnum, char *fspec)
 
 /****************************************************************************/
 /****************************************************************************/
-void sbbs_t::viewfilecontents(smbfile_t* f)
+void sbbs_t::viewfilecontents(file_t* f)
 {
 	char	cmd[128];
 	char	path[MAX_PATH+1];