diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 97054dd308ecacf6b23e5306a3c68af34678812b..6ef62e0239ffc9862a083be4417564950eaaa516 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -3464,7 +3464,6 @@ sbbs_t::sbbs_t(ushort node_num, union xp_sockaddr *addr, size_t addr_len, const
     main_cmds = 0;
     xfer_cmds = 0;
     posts_read = 0;
-    temp_cdt = 0;
     autohang = 0;
     curgrp = 0;
     curlib = 0;
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index b7d5ed71609bf2df72e848234d9beec958ba4c49..8803dff17ddaf92499aa0cc01a0327061147b99b 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -581,9 +581,6 @@ public:
 	uint 	main_cmds;		/* Number of Main Commands this call */
 	uint 	xfer_cmds;		/* Number of Xfer Commands this call */
 	ulong	posts_read; 	/* Number of Posts read this call */
-	char 	temp_uler[31];  /* User who uploaded the files to temp dir */
-	char 	temp_file[41];	/* Origin of extracted temp files */
-	long 	temp_cdt;		/* Credit value of file that was extracted */
 	bool 	autohang;		/* Used for auto-hangup after transfer */
 	size_t 	logcol; 		/* Current column of log file */
 	uint 	criterrs; 		/* Critical error counter */
@@ -1070,7 +1067,6 @@ public:
 
 	/* tmp_xfer.cpp */
 	void	temp_xfer(void);
-	void	extract(uint dirnum);
 	const char*	temp_cmd(void);					/* Returns temp file command line */
 	ulong	create_filelist(const char *name, long mode);
 
diff --git a/src/sbbs3/scfg/scfgsys.c b/src/sbbs3/scfg/scfgsys.c
index a2cd6acb6f512b0ea70e66e37d2632e01734b41f..b6f37c440308b0dd3141afc01e86f6093ae3d39f 100644
--- a/src/sbbs3/scfg/scfgsys.c
+++ b/src/sbbs3/scfg/scfgsys.c
@@ -1656,6 +1656,7 @@ void sys_cfg(void)
 					break;
 			case 12: /* Loadable Modules */
 				done=0;
+				bar=0;
 				k=0;
 				while(!done) {
 					i=0;
@@ -1669,8 +1670,8 @@ void sys_cfg(void)
 					sprintf(opt[i++],"%-16.16s%s","Auto Message",cfg.automsg_mod);
 					sprintf(opt[i++],"%-16.16s%s","Text Section",cfg.textsec_mod);
 					sprintf(opt[i++],"%-16.16s%s","Xtrn Section",cfg.xtrnsec_mod);
-					sprintf(opt[i++],"%-16.16s%s","Pre Xtrn Prog",cfg.prextrn_mod);
-					sprintf(opt[i++],"%-16.16s%s","Post Xtrn Prog",cfg.postxtrn_mod);
+					sprintf(opt[i++],"%-16.16s%s","Pre Xtrn",cfg.prextrn_mod);
+					sprintf(opt[i++],"%-16.16s%s","Post Xtrn",cfg.postxtrn_mod);
 					sprintf(opt[i++],"%-16.16s%s","Read Mail",cfg.readmail_mod);
 					sprintf(opt[i++],"%-16.16s%s","Scan Msgs",cfg.scanposts_mod);
 					sprintf(opt[i++],"%-16.16s%s","Scan Subs",cfg.scansubs_mod);
@@ -1679,6 +1680,7 @@ void sys_cfg(void)
 					sprintf(opt[i++],"%-16.16s%s","List Nodes",cfg.nodelist_mod);
 					sprintf(opt[i++],"%-16.16s%s","Who's Online",cfg.whosonline_mod);
 					sprintf(opt[i++],"%-16.16s%s","Private Msg",cfg.privatemsg_mod);
+					sprintf(opt[i++],"%-16.16s%s","Temp Transfer",cfg.tempxfer_mod);
 					opt[i][0]=0;
 					uifc.helpbuf=
 						"`Loadable Modules:`\n"
@@ -1688,34 +1690,35 @@ void sys_cfg(void)
 						"operations. The name (root filename) of the module can be specified for\n"
 						"each of the available operations listed below:\n"
 						"\n"
-						"`Login`        Required module for interactive terminal logins (answer)\n"
-						"`Logon`        Executed during terminal logon procedure\n"
-						"`Sync`         Executed when terminal nodes are periodically synchronized\n"
-						"`Logoff`       Executed during terminal logoff procedure (interactive)\n"
-						"`Logout`       Executed during terminal logout procedure (offline)\n"
-						"`New User`     Executed at end of new terminal user creation process\n"
-						"`Expired User` Executed during daily event when user expires (offline)\n"
-						"`Auto Message` Executed when a user chooses to edit the auto-message\n"
-						"`Text Section` Executed to handle general text file (viewing) section\n"
-						"`Xtrn Section` Executed to handle external programs (doors) section\n"
-						"`Xtrn Prog Pre` Executed before external programs (doors) run\n"
-						"`Xtrn Prog Post` Executed after external programs (doors) run\n"
+						"`Login`         Required module for interactive terminal logins (answer)\n"
+						"`Logon`         Executed during terminal logon procedure\n"
+						"`Sync`          Executed when terminal nodes are periodically synchronized\n"
+						"`Logoff`        Executed during terminal logoff procedure (interactive)\n"
+						"`Logout`        Executed during terminal logout procedure (offline)\n"
+						"`New User`      Executed at end of new terminal user creation process\n"
+						"`Expired User`  Executed during daily event when user expires (offline)\n"
+						"`Auto Message`  Executed when a user chooses to edit the auto-message\n"
+						"`Text Section`  Executed to handle general text file (viewing) section\n"
+						"`Xtrn Section`  Executed to handle external programs (doors) section\n"
+						"`Pre Xtrn`      Executed before external programs (doors) run\n"
+						"`Post Xtrn`     Executed after external programs (doors) run\n"
+						"`Temp Transfer` Temporary/archive file transfer menu\n"
 						"\n"
 						"Full module command-lines may be used for the operations listed below:\n"
 						"\n"
-						"`Read Mail`    Executed when a user reads email/netmail\n"
-						"`Scan Msgs`    Executed when a user reads or scans a message sub-board\n"
-						"`Scan Subs`    Executed when a user scans one or more sub-boards for msgs\n"
-						"`List Msgs`    Executed when a user lists msgs from the msg read prompt\n"
-						"`List Logons`  Executed when a user lists logons ('-y' for yesterday)\n"
-						"`List Nodes`   Executed when a user lists all nodes\n"
-						"`Who's Online` Executed when a user lists the nodes in-use (e.g. `^U`)\n"
-						"`Private Msg`  Executed when a user sends a private node msg (e.g. `^P`)\n"
+						"`Read Mail`     Executed when a user reads email/netmail\n"
+						"`Scan Msgs`     Executed when a user reads or scans a message sub-board\n"
+						"`Scan Subs`     Executed when a user scans one or more sub-boards for msgs\n"
+						"`List Msgs`     Executed when a user lists msgs from the msg read prompt\n"
+						"`List Logons`   Executed when a user lists logons ('-y' for yesterday)\n"
+						"`List Nodes`    Executed when a user lists all nodes\n"
+						"`Who's Online`  Executed when a user lists the nodes in-use (e.g. `^U`)\n"
+						"`Private Msg`   Executed when a user sends a private node msg (e.g. `^P`)\n"
 						"\n"
 						"`Note:` JavaScript modules take precedence over Baja modules if both exist\n"
 						"      in your `exec` or `mods` directories.\n"
 					;
-					switch(uifc.list(WIN_ACT|WIN_T2B|WIN_RHT,0,0,40,&k,0
+					switch(uifc.list(WIN_ACT|WIN_T2B|WIN_RHT,0,0,40,&k,&bar
 						,"Loadable Modules",opt)) {
 
 						case -1:
@@ -1802,6 +1805,10 @@ void sys_cfg(void)
 							uifc.input(WIN_MID|WIN_SAV,0,0,"Private Message Command"
 								,cfg.privatemsg_mod,sizeof(cfg.privatemsg_mod)-1,K_EDIT);
 							break;
+						case 20:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Temporary File Transfer Module"
+								,cfg.tempxfer_mod, sizeof(cfg.tempxfer_mod)-1, K_EDIT);
+							break;
 					} 
 				}
 				break;
diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h
index 2eb2ec616676bfafde2d52107816c2375ceeb19d..606ce19d3ea689cd615e0f526dfed60fe29bdfe1 100644
--- a/src/sbbs3/scfgdefs.h
+++ b/src/sbbs3/scfgdefs.h
@@ -600,6 +600,7 @@ typedef struct
 	char			logonlist_mod[LEN_CMD+1];
     char			prextrn_mod[LEN_MODNAME+1];			/* External Program pre-execution module */
     char			postxtrn_mod[LEN_MODNAME+1];		/* External Program post-execution module */
+	char			tempxfer_mod[LEN_MODNAME+1];
 	char			scfg_cmd[LEN_CMD+1];	/* SCFG command line - unused! */
 	uchar			smb_retry_time; 		/* Seconds to retry on SMBs */
 	uint16_t		sec_warn;				/* Seconds before inactivity warning */
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index 37a750914de95327ffd62ff55f20717bea9840b2..1bbd71d2c783293d4097ecd664d94606f8a6d96a 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -252,13 +252,18 @@ BOOL read_main_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 		SAFECOPY(cfg->logonlist_mod, "logonlist");
 
 	get_str(cfg->prextrn_mod,instream);
-	if(cfg->prextrn_mod[0] == '\xff') 
+	if(cfg->prextrn_mod[0] == '\xff')
 	    SAFECOPY(cfg->prextrn_mod, "prextrn");
 	get_str(cfg->postxtrn_mod,instream);
-	if(cfg->postxtrn_mod[0] == '\xff') 
-	    SAFECOPY(cfg->postxtrn_mod, "postxtrn");		
-		
-	for(i=0;i<117;i++)					/* unused - initialized to 0xff */
+	if(cfg->postxtrn_mod[0] == '\xff')
+	    SAFECOPY(cfg->postxtrn_mod, "postxtrn");
+
+	get_str(cfg->tempxfer_mod, instream);
+	if(cfg->tempxfer_mod[0] == '\xff') 
+	    SAFECOPY(cfg->tempxfer_mod, "tempxfer");
+
+	get_int(c, instream);
+	for(i=0;i<112;i++)					/* unused - initialized to 0xff */
 		get_int(n,instream);
 
 	get_int(cfg->user_backup_level,instream);
diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c
index f91edee6bc8bebb1bba3a6e050a68754038f6641..2170b29a2dfd4ff5dd5737c579a65a7dbd0c5c2e 100644
--- a/src/sbbs3/scfgsave.c
+++ b/src/sbbs3/scfgsave.c
@@ -254,9 +254,12 @@ BOOL write_main_cfg(scfg_t* cfg, int backup_level)
 	
     put_str(cfg->prextrn_mod,stream);
     put_str(cfg->postxtrn_mod,stream);
-    
+
+	put_str(cfg->tempxfer_mod, stream);
+	c=0xff;
+	put_int(c, stream);
 	n=0xffff;
-	for(i=0;i<117;i++)
+	for(i=0;i<112;i++)
 		put_int(n,stream);
 
 	put_int(cfg->user_backup_level,stream);
diff --git a/src/sbbs3/tmp_xfer.cpp b/src/sbbs3/tmp_xfer.cpp
index e6cbbd0644d4a85d77ea1c7550b1c96f5ac25741..750dc53e71ce695cb7b9a94ef7a900946229a704 100644
--- a/src/sbbs3/tmp_xfer.cpp
+++ b/src/sbbs3/tmp_xfer.cpp
@@ -27,391 +27,11 @@
 /*****************************************************************************/
 void sbbs_t::temp_xfer()
 {
-#if 0	// TODO
-    char	str[256],tmp2[256],done=0,ch;
-	char 	tmp[512];
-	int		error;
-    uint	i,dirnum=cfg.total_dirs,files;
-    ulong	bytes;
-	ulong	space;
-    time_t	start,end,t;
-    file_t	f;
-	glob_t	g;
-	struct	tm tm;
-
-	if(!usrlibs)
-		return;
-	if(useron.rest&FLAG('D')) {
-		bputs(text[R_Download]);
-		return; 
-	}
-	/*************************************/
-	/* Create TEMP directory information */
-	/*************************************/
-	if((cfg.dir[dirnum]=(dir_t *)malloc(sizeof(dir_t)))==0) {
-		errormsg(WHERE,ERR_ALLOC,"temp_dir",sizeof(dir_t));
+	if(!cfg.tempxfer_mod[0]) {
+		bprintf(text[DirectoryDoesNotExist], "temp (module)");
 		return; 
 	}
-	memset(cfg.dir[dirnum],0,sizeof(dir_t));
-	SAFECOPY(cfg.dir[dirnum]->lname,"Temporary");
-	SAFECOPY(cfg.dir[dirnum]->sname,"Temp");
-	SAFECOPY(cfg.dir[dirnum]->code,"TEMP");
-	SAFECOPY(cfg.dir[dirnum]->path,cfg.temp_dir);
-	SAFECOPY(cfg.dir[dirnum]->data_dir,cfg.dir[0]->data_dir);
-	cfg.dir[dirnum]->maxfiles=MAX_FILES;
-	temp_dirnum=curdirnum=usrdir[curlib][curdir[curlib]];
-	cfg.total_dirs++;
-
-	/****************************/
-	/* Fill filedat information */
-	/****************************/
-	memset(&f,0,sizeof(f));
-	SAFEPRINTF2(f.name,"temp_%3.3d.%s",cfg.node_num,useron.tmpext);
-	SAFECOPY(f.desc,"Temp File");
-	f.dir=dirnum;
-
-	if(useron.misc&(RIP|WIP|HTML) && !(useron.misc&EXPERT))
-		menu("tempxfer");
-	lncntr=0;
-	while(online && !done) {
-		if(!(useron.misc&(EXPERT|RIP|WIP|HTML))) {
-			sys_status&=~SS_ABORT;
-			if(lncntr) {
-				SYNC;
-				CRLF;
-				if(lncntr)          /* CRLF or SYNC can cause pause */
-					pause(); 
-			}
-			menu("tempxfer"); 
-		}
-		ASYNC;
-		bputs(text[TempDirPrompt]);
-		SAFECOPY(f.uler,temp_uler);
-		ch=(char)getkeys("ADEFNILQRVX?\r",0);
-		if(ch>' ')
-			logch(ch,0);
-		switch(ch) {
-			case 'A':   /* add to temp file */
-				if(!isdir(cfg.temp_dir)) {
-					bprintf(text[DirectoryDoesNotExist], cfg.temp_dir);
-					lprintf(LOG_ERR,"Temp directory does not exist: %s", cfg.temp_dir);
-					break;
-				}
-				/* free disk space */
-				space=getfreediskspace(cfg.temp_dir,1024);
-				if(space<(ulong)cfg.min_dspace) {
-					bputs(text[LowDiskSpace]);
-					lprintf(LOG_ERR,"Diskspace is low: %s (%lu kilobytes)"
-						,cfg.temp_dir,space);
-					if(!dir_op(dirnum))
-						break; 
-				}
-				bprintf(text[DiskNBytesFree],ultoac(space,tmp));
-				if(!getfilespec(str))
-					break;
-				if(!checkfname(str))
-					break;
-				SAFEPRINTF2(tmp2,"added %s to %s"
-					,str,f.name);
-				logline(nulstr,tmp2);
-				SAFEPRINTF2(tmp2,"%s%s",cfg.temp_dir,str);
-				SAFEPRINTF2(str,"%s%s",cfg.temp_dir,f.name);
-				external(cmdstr(temp_cmd(),str,tmp2,NULL),EX_WILDCARD|EX_STDOUT);
-				break;
-			case 'D':   /* download from temp dir */
-				SAFEPRINTF2(str,"%s%s",cfg.temp_dir,f.name);
-				if(!fexist(str)) {
-					bprintf(text[TempFileNotCreatedYet],f.name);
-					break; 
-				}
-				f.size=f.cdt=(long)flength(str);
-				f.opencount=0;
-				if(temp_cdt)    /* if file was not free */
-					f.cdt=f.size;
-				else
-					f.cdt=0;
-				if(!(useron.exempt&FLAG('D'))
-					&& f.cdt>useron.cdt+useron.freecdt) {
-					bprintf(text[YouOnlyHaveNCredits]
-						,ultoac(useron.cdt+useron.freecdt,tmp));
-					break;     /* f.cdt must equal size here */
-				}
-				if(!(useron.exempt&FLAG('T')) && !dir_op(dirnum)
-					&& !(cfg.dir[temp_dirnum]->misc&DIR_TFREE) && cur_cps
-					&& f.size/(ulong)cur_cps>timeleft) {
-					bputs(text[NotEnoughTimeToDl]);
-					break; 
-				}
-				if(!chk_ar(cfg.dir[temp_dirnum]->dl_ar,&useron,&client)) {
-					bputs(text[CantDownloadFromDir]);
-					break; 
-				}
-				addfiledat(&cfg,&f);
-				xfer_prot_menu(XFER_DOWNLOAD);
-				SYNC;
-				mnemonics(text[ProtocolOrQuit]);
-				SAFECOPY(tmp2,"Q");
-				for(i=0;i<cfg.total_prots;i++)
-					if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron,&client)) {
-						sprintf(tmp,"%c",cfg.prot[i]->mnemonic);
-						SAFECAT(tmp2,tmp); 
-					}
-				ungetkey(useron.prot);
-				ch=(char)getkeys(tmp2,0);
-				for(i=0;i<cfg.total_prots;i++)
-					if(cfg.prot[i]->dlcmd[0] && cfg.prot[i]->mnemonic==ch
-						&& chk_ar(cfg.prot[i]->ar,&useron,&client))
-						break;
-				if(i<cfg.total_prots) {
-					getnodedat(cfg.node_num,&thisnode,1);
-					action=NODE_DLNG;
-					t=now;
-					if(cur_cps) 
-						t+=(f.size/(ulong)cur_cps);
-					if(localtime_r(&t,&tm)==NULL)
-						break;
-					thisnode.aux=(tm.tm_hour*60)+tm.tm_min;
-
-					putnodedat(cfg.node_num,&thisnode); /* calculate ETA */
-					start=time(NULL);
-					error=protocol(cfg.prot[i],XFER_DOWNLOAD,str,nulstr,false);
-					end=time(NULL);
-					if(cfg.dir[temp_dirnum]->misc&DIR_TFREE)
-						starttime+=end-start;
-					if(checkprotresult(cfg.prot[i],error,&f))
-						downloadedfile(&f);
-					else
-						notdownloaded(f.size,start,end);
-					autohangup(); 
-				}
-				removefiledat(&cfg,&f);
-				break;
-			case 'E':
-				extract(usrdir[curlib][curdir[curlib]]);
-				sys_status&=~SS_ABORT;
-				break;
-			case 'F':   /* Create a file list */
-				delfiles(cfg.temp_dir,ALLFILES);
-				create_filelist("FILELIST.TXT",0);
-				if(!(sys_status&SS_ABORT))
-					logline(nulstr,"Created list of all files");
-				CRLF;
-				sys_status&=~SS_ABORT;
-				break;
-			case 'I':   /* information on what's here */
-				bprintf(text[TempFileInfo],f.uler,temp_file);
-				break;
-			case 'L':   /* list files in dir */
-				if(!getfilespec(str))
-					break;
-				if(!checkfname(str))
-					break;
-				bytes=files=0L;
-				CRLF;
-				SAFEPRINTF2(tmp2,"%s%s",cfg.temp_dir,str);
-				glob(tmp2,0,NULL,&g);
-				for(i=0;i<(uint)g.gl_pathc && !msgabort();i++) {
-					if(isdir(g.gl_pathv[i]))
-						continue;
-					t=fdate(g.gl_pathv[i]);
-					bprintf("%-25s %15s   %s\r\n",getfname(g.gl_pathv[i])
-						,ultoac((long)flength(g.gl_pathv[i]),tmp)
-						,timestr(t));
-					files++;
-					bytes+=(long)flength(g.gl_pathv[i]);
-				}
-				globfree(&g);
-				if(!files)
-					bputs(text[EmptyDir]);
-				else if(files>1)
-					bprintf(text[TempDirTotal],ultoac(bytes,tmp),files);
-				break;
-			case 'N':   /* Create a list of new files */
-				delfiles(cfg.temp_dir,ALLFILES);
-				create_filelist("NEWFILES.TXT",FL_ULTIME);
-				if(!(sys_status&SS_ABORT))
-					logline(nulstr,"Created list of new files");
-				CRLF;
-				sys_status&=~SS_ABORT;
-				break;
-			case 'R':   /* Remove files from dir */
-				if(!getfilespec(str) || !checkfname(str))
-					break;
-				bprintf(text[NFilesRemoved],delfiles(cfg.temp_dir,str));
-				break;
-			case 'V':   /* view files in dir */
-				bputs(text[FileSpec]);
-				if(!getstr(str,64,K_NONE) || !checkfname(str))
-					break;
-				viewfiles(dirnum,str);
-				break;
-			case CR:
-			case 'Q':   /* quit */
-				done=1;
-				break;
-			case 'X':   /* extract from archive in temp dir */
-				extract(dirnum);
-				sys_status&=~SS_ABORT;
-				break;
-			case '?':   /* menu */
-				if(useron.misc&(EXPERT|RIP|WIP|HTML))
-					menu("tempxfer");
-				break; 
-		}
-		if(sys_status&SS_ABORT)
-			break; 
-	}
-	free(cfg.dir[dirnum]);
-	cfg.total_dirs--;
-#endif
-}
-
-/*****************************************************************************/
-/* Handles extraction from a normal transfer file to the temp directory      */
-/*****************************************************************************/
-void sbbs_t::extract(uint dirnum)
-{
-#if 0 // NFB-TODO
-    char	fname[13],str[256],excmd[256],path[256],done
-				,tmp[256],intmp=0;
-    uint	i,j;
-	ulong	space;
-    file_t	f;
-	DIR*	dir;
-	DIRENT*	dirent;
-
-	temp_dirnum=curdirnum=dirnum;
-	if(!strcmp(cfg.dir[dirnum]->code,"TEMP"))
-		intmp=1;
-
-	if(!isdir(cfg.temp_dir)) {
-		bprintf(text[DirectoryDoesNotExist], cfg.temp_dir);
-		lprintf(LOG_ERR,"Temp directory does not exist: %s", cfg.temp_dir);
-		return;
-	}
-
-	/* get free disk space */
-	space=getfreediskspace(cfg.temp_dir,1024);
-	if(space<(ulong)cfg.min_dspace) {
-		bputs(text[LowDiskSpace]);
-		lprintf(LOG_ERR,"Diskspace is low: %s (%lu kilobytes)",cfg.temp_dir,space);
-		if(!dir_op(dirnum))
-			return; 
-	}
-	else if(!intmp) {   /* not in temp dir */
-		CRLF; 
-	}
-	bprintf(text[DiskNBytesFree],ultoac(space,tmp));
-
-	if(!intmp) {    /* not extracting FROM temp directory */
-		SAFEPRINTF2(str,"%s%s",cfg.temp_dir,ALLFILES);
-		if(fexist(str)) {
-			bputs(text[RemovingTempFiles]);
-			dir=opendir(cfg.temp_dir);
-			while(dir!=NULL && (dirent=readdir(dir))!=NULL) {
-				SAFEPRINTF2(str,"%s%s",cfg.temp_dir,dirent->d_name);
-        		if(!isdir(str))
-					remove(str);
-			}
-			if(dir!=NULL)
-				closedir(dir);
-			CRLF; 
-		} 
-	}
-	bputs(text[ExtractFrom]);
-	if(!getstr(fname,sizeof(fname)-1,K_NONE) || !checkfname(fname) || strchr(fname,'*')
-		|| strchr(fname,'?'))
-		return;
-	padfname(fname,f.name);
-	SAFECOPY(str,f.name);
-	truncsp(str);
-	for(i=0;i<cfg.total_fextrs;i++)
-		if(!stricmp(str+9,cfg.fextr[i]->ext) && chk_ar(cfg.fextr[i]->ar,&useron,&client)) {
-			SAFECOPY(excmd,cfg.fextr[i]->cmd);
-			break; 
-		}
-	if(i==cfg.total_fextrs) {
-		bputs(text[UnextractableFile]);
-		return; 
-	}
-	if(!intmp && !findfile(&cfg, dirnum, f.name, NULL)) {    /* not temp dir */
-		bputs(text[SearchingAllDirs]);
-		for(i=0;i<usrdirs[curlib] && !msgabort();i++) {
-			if(i==dirnum) continue;
-			if(findfile(&cfg, usrdir[curlib][i], f.name, NULL))
-				break; 
-		}
-		if(i==usrdirs[curlib]) { /* not found in cur lib */
-			bputs(text[SearchingAllLibs]);
-			for(i=j=0;i<usrlibs;i++) {
-				if(i==curlib) continue;
-				for(j=0;j<usrdirs[i] && !msgabort();j++)
-					if(findfile(&cfg, usrdir[i][j], f.name, NULL))
-						break;
-				if(j<usrdirs[i])
-					break; 
-			}
-			if(i==usrlibs) {
-				bputs(text[FileNotFound]);  /* not in database */
-				return; 
-			}
-			dirnum=usrdir[i][j]; 
-		}
-		else
-			dirnum=usrdir[curlib][i]; 
-	}
-	if(sys_status&SS_ABORT)
-		return;
-	SAFEPRINTF2(path,"%s%s",cfg.dir[dirnum]->path,fname);
-	if(!intmp) {    /* not temp dir, so get temp_file info */
-		f.datoffset=f.dateuled=f.datedled=0L;
-		f.dir=dirnum;
-		getfileixb(&cfg,&f);
-		if(!f.datoffset && !f.dateuled && !f.datedled)  /* error reading ixb */
-			return;
-		f.size=0;
-		getfiledat(&cfg,&f);
-		fileinfo(&f);
-		if(f.altpath>0 && f.altpath<=cfg.altpaths)
-			SAFEPRINTF2(path,"%s%s",cfg.altpath[f.altpath-1],fname);
-		temp_dirnum=dirnum;
-		if(cfg.dir[f.dir]->misc&DIR_FREE)
-			temp_cdt=0L;
-		else
-			temp_cdt=f.cdt;
-		SAFECOPY(temp_uler,f.uler);
-		SAFECOPY(temp_file,f.name);      /* padded filename */
-	}
-	if(!fexistcase(path)) {
-		bprintf(text[FileDoesNotExist],path);  /* not on disk */
-		return; 
-	}
-	done=0;
-	while(online && !done) {
-		mnemonics(text[ExtractFilesPrompt]);
-		switch(getkeys("EVQ",0)) {
-			case 'E':
-				if(!getfilespec(str))
-					break;
-				if(!checkfname(str))
-					break;
-				if((i=external(cmdstr(excmd,path,str,NULL),EX_STDIO))!=0) {
-					errormsg(WHERE,ERR_EXEC,cmdstr(excmd,path,str,NULL),i);
-					return; 
-				}
-				SAFEPRINTF2(tmp,"extracted %s from %s", str,path);
-				logline(nulstr,tmp);
-				CRLF;
-				break;
-			case 'V':
-				viewfiles(dirnum,fname);
-				break;
-			default:
-				done=1;
-				break; 
-		} 
-	}
-#endif
+	exec_bin(cfg.tempxfer_mod, &main_csi);
 }
 
 /****************************************************************************/
@@ -465,8 +85,6 @@ ulong sbbs_t::create_filelist(const char *name, long mode)
 		SAFEPRINTF2(str,"%s%s",cfg.temp_dir,name);
 		remove(str);
 	}
-	SAFECOPY(temp_file,name);
-	SAFECOPY(temp_uler,"File List");
 	return(k);
 }