diff --git a/src/sbbs3/execfile.cpp b/src/sbbs3/execfile.cpp
index f4d6ef5e7bde0cdf8c0699abdbeb39bb4d95f272..48b40e393260b398fd08a13b38ced787bc85afb4 100644
--- a/src/sbbs3/execfile.cpp
+++ b/src/sbbs3/execfile.cpp
@@ -262,56 +262,30 @@ int sbbs_t::exec_file(csi_t *csi)
 
 		case CS_FILE_UPLOAD:
 			csi->logic=LOGIC_FALSE;
-			if(useron.rest&FLAG('U')) {
-				bputs(text[R_Upload]);
-				return(0); }
 			if(usrlibs) {
 				i=usrdir[curlib][curdir[curlib]];
 				if(cfg.upload_dir!=INVALID_DIR
 					&& !chk_ar(cfg.dir[i]->ul_ar,&useron))
-					i=cfg.upload_dir; }
-			else
+					i=cfg.upload_dir; 
+			} else
 				i=cfg.upload_dir;
-
-			if((uint)i==INVALID_DIR || !chk_ar(cfg.dir[i]->ul_ar,&useron)) {
-				bputs(text[CantUploadHere]);
-				return(0); }
-
-			if(getfiles(&cfg,i)>=cfg.dir[i]->maxfiles)
-				bputs(text[DirFull]);
-			else {
-				upload(i);
-				csi->logic=LOGIC_TRUE; }
+			csi->logic=upload(i) ? LOGIC_TRUE:LOGIC_FALSE;
 			return(0);
 		case CS_FILE_UPLOAD_USER:
 			csi->logic=LOGIC_FALSE;
 			if(cfg.user_dir==INVALID_DIR) {
 				bputs(text[NoUserDir]);
-				return(0); }
-			if(getfiles(&cfg,cfg.user_dir)>=cfg.dir[cfg.user_dir]->maxfiles)
-				bputs(text[UserDirFull]);
-			else if(useron.rest&FLAG('U'))
-				bputs(text[R_Upload]);
-			else if(!chk_ar(cfg.dir[cfg.user_dir]->ul_ar,&useron))
-				bputs(text[CantUploadToUser]);
-			else {
-				upload(cfg.user_dir);
-				csi->logic=LOGIC_TRUE; }
+				return(0); 
+			}
+			csi->logic=upload(cfg.user_dir) ? LOGIC_TRUE:LOGIC_FALSE;
 			return(0);
 		case CS_FILE_UPLOAD_SYSOP:
 			csi->logic=LOGIC_FALSE;
 			if(cfg.sysop_dir==INVALID_DIR) {
 				bputs(text[NoSysopDir]);
-				return(0); }
-			if(getfiles(&cfg,cfg.sysop_dir)>=cfg.dir[cfg.sysop_dir]->maxfiles)
-				bputs(text[DirFull]);
-			else if(useron.rest&FLAG('U'))
-				bputs(text[R_Upload]);
-			else if(!chk_ar(cfg.dir[cfg.sysop_dir]->ul_ar,&useron))
-				bputs(text[CantUploadToSysop]);
-			else {
-				upload(cfg.sysop_dir);
-				csi->logic=LOGIC_TRUE; }
+				return(0); 
+			}
+			csi->logic=upload(cfg.sysop_dir) ? LOGIC_TRUE:LOGIC_FALSE;
 			return(0);
 		case CS_FILE_DOWNLOAD:
 			if(!usrlibs) return(0);
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index bf54957895ea354a232eb8f3087a5e4247b9580e..a716eb687c48a911390f94f03ef89fb1c4028a51 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -555,7 +555,7 @@ public:
 	/* upload.cpp */
 	bool	uploadfile(file_t* f);
 	char	sbbsfilename[128],sbbsfiledesc[128]; /* env vars */
-	void	upload(uint dirnum);
+	bool	upload(uint dirnum);
     char	upload_lastdesc[LEN_FDESC+1];
 	void	update_uldate(file_t* f);
 	bool	bulkupload(uint dirnum);
diff --git a/src/sbbs3/upload.cpp b/src/sbbs3/upload.cpp
index f6bc1d2b0f094a701b5e4c4e1ae90b8605fb928c..030c4262b4c0515ee3d5c5b6db4b225fa7f18e04 100644
--- a/src/sbbs3/upload.cpp
+++ b/src/sbbs3/upload.cpp
@@ -260,7 +260,7 @@ void sbbs_t::update_uldate(file_t* f)
 /****************************************************************************/
 /* Uploads files                                                            */
 /****************************************************************************/
-void sbbs_t::upload(uint dirnum)
+bool sbbs_t::upload(uint dirnum)
 {
 	char	str[256],src[256]={""},descbeg[25]={""},descend[25]={""},path[256]
 				,fname[13],keys[256],ch,*p;
@@ -273,6 +273,25 @@ void sbbs_t::upload(uint dirnum)
     user_t	user;
     node_t	node;
 
+	/* Security Checks */
+	if(useron.rest&FLAG('U')) {
+		bputs(text[R_Upload]);
+		return(false); 
+	}
+	if(dirnum==INVALID_DIR) {
+		bputs(text[CantUploadHere]);
+		return(false);
+	}
+	if(!chk_ar(cfg.dir[dirnum]->ul_ar,&useron)) {
+		bputs(dirnum==cfg.user_dir ? text[CantUploadToUser] : 
+			dirnum==cfg.sysop_dir ? text[CantUploadToSysop] : text[CantUploadHere]);
+		return(false); 
+	}
+	if(getfiles(&cfg,dirnum)>=cfg.dir[dirnum]->maxfiles) {
+		bputs(dirnum==cfg.user_dir ? text[UserDirFull] : text[DirFull]);
+		return(false);
+	}
+
 	if(sys_status&SS_EVENT && online==ON_REMOTE && !dir_op(dirnum))
 		bprintf(text[UploadBeforeEvent],timeleft/60);
 	if(altul)
@@ -288,7 +307,8 @@ void sbbs_t::upload(uint dirnum)
 		sprintf(str,"Diskspace is low: %s (%lu bytes)",path,space);
 		errorlog(str);
 		if(!dir_op(dirnum))
-			return; }
+			return(false); 
+	}
 	bprintf(text[DiskNBytesFree],ultoac(space,tmp));
 
 	f.dir=curdirnum=dirnum;
@@ -299,7 +319,8 @@ void sbbs_t::upload(uint dirnum)
 		|| !checkfname(fname) || (trashcan(fname,"file") && !dir_op(dirnum))) {
 		if(fname[0])
 			bputs(text[BadFilename]);
-		return; }
+		return(false); 
+	}
 	if(dirnum==cfg.sysop_dir)
 		sprintf(str,text[UploadToSysopDirQ],fname);
 	else if(dirnum==cfg.user_dir)
@@ -307,21 +328,21 @@ void sbbs_t::upload(uint dirnum)
 	else
 		sprintf(str,text[UploadToCurDirQ],fname,cfg.lib[cfg.dir[dirnum]->lib]->sname
 			,cfg.dir[dirnum]->sname);
-	if(!yesno(str)) return;
+	if(!yesno(str)) return(false);
 	action=NODE_ULNG;
 	padfname(fname,f.name);
 	sprintf(str,"%s%s",path,fname);
 	if(fexist(str)) {   /* File is on disk */
 		if(!dir_op(dirnum) && online!=ON_LOCAL) {		 /* local users or sysops */
 			bprintf(text[FileAlreadyThere],fname);
-			return; }
+			return(false); }
 		if(!yesno(text[FileOnDiskAddQ]))
-			return; }
+			return(false); }
 	else if(online==ON_LOCAL) {
 		bputs(text[FileNotOnDisk]);
 		bputs(text[EnterPath]);
 		if(!getstr(tmp,60,K_LINE|K_UPPER))
-			return;
+			return(false);
 		backslash(tmp);
 		sprintf(src,"%s%s",tmp,fname); }
 	strcpy(str,cfg.dir[dirnum]->exts);
@@ -339,7 +360,7 @@ void sbbs_t::upload(uint dirnum)
 		bputs(text[TheseFileExtsOnly]);
 		bputs(cfg.dir[dirnum]->exts);
 		CRLF;
-		if(!dir_op(dirnum)) return; }
+		if(!dir_op(dirnum)) return(false); }
 	bputs(text[SearchingForDupes]);
 	for(i=k=0;i<usrlibs;i++)
 		for(j=0;j<usrdirs[i];j++,k++) {
@@ -351,9 +372,9 @@ void sbbs_t::upload(uint dirnum)
 				bputs(text[SearchedForDupes]);
 				bprintf(text[FileAlreadyOnline],f.name);
 				if(!dir_op(dirnum))
-					return; 	 /* File is in database for another dir */
+					return(false); 	 /* File is in database for another dir */
 				if(usrdir[i][j]==dirnum)
-					return; } } /* don't allow duplicates */
+					return(false); } } /* don't allow duplicates */
 	bputs(text[SearchedForDupes]);
 	if(dirnum==cfg.user_dir) {  /* User to User transfer */
 		bputs(text[EnterAfterLastDestUser]);
@@ -382,13 +403,13 @@ void sbbs_t::upload(uint dirnum)
 			else {
 				CRLF; } }
 		if(!destusers)
-			return; }
+			return(false); }
 	if(cfg.dir[dirnum]->misc&DIR_RATE) {
 		SYNC;
 		bputs(text[RateThisFile]);
 		ch=getkey(K_ALPHA);
 		if(!isalpha(ch) || sys_status&SS_ABORT)
-			return;
+			return(false);
 		CRLF;
 		sprintf(descbeg,text[Rated],toupper(ch)); }
 	if(cfg.dir[dirnum]->misc&DIR_ULDATE) {
@@ -402,10 +423,10 @@ void sbbs_t::upload(uint dirnum)
 		if(!noyes(text[MultipleDiskQ])) {
 			bputs(text[HowManyDisksTotal]);
 			if((int)(i=getnum(99))<2)
-				return;
+				return(false);
 			bputs(text[NumberOfFile]);
 			if((int)(j=getnum(i))<1)
-				return;
+				return(false);
 			if(j==1)
 				upload_lastdesc[0]=0;
 			if(i>9)
@@ -420,7 +441,7 @@ void sbbs_t::upload(uint dirnum)
 	i=LEN_FDESC-(strlen(descbeg)+strlen(descend));
 	getstr(upload_lastdesc,i,K_LINE|K_EDIT|K_AUTODEL);
 	if(sys_status&SS_ABORT)
-		return;
+		return(false);
 	if(descend[0])      /* end of desc specified, so pad desc with spaces */
 		sprintf(f.desc,"%s%-*s%s",descbeg,i,upload_lastdesc,descend);
 	else                /* no end specified, so string ends at desc end */
@@ -434,11 +455,11 @@ void sbbs_t::upload(uint dirnum)
 	if(src[0]) {    /* being copied from another local dir */
 		bprintf(text[RetrievingFile],fname);
 		if(mv(src,str,1))
-			return;
+			return(false);
 		CRLF; }
 	if(fexist(str)) {   /* File is on disk */
 		if(!uploadfile(&f))
-			return; }
+			return(false); }
 	else {
 		menu("ulprot");
 		SYNC;
@@ -454,7 +475,7 @@ void sbbs_t::upload(uint dirnum)
 				strcat(keys,tmp); }
 		ch=(char)getkeys(keys,0);
 		if(ch=='Q')
-			return;
+			return(false);
 		if(ch=='B') {
 			if(batup_total>=cfg.max_batup)
 				bputs(text[BatchUlQueueIsFull]);
@@ -462,7 +483,7 @@ void sbbs_t::upload(uint dirnum)
 				for(i=0;i<batup_total;i++)
 					if(!strcmp(batup_name[i],f.name)) {
 						bprintf(text[FileAlreadyInQueue],f.name);
-						return; }
+						return(false); }
 				strcpy(batup_name[batup_total],f.name);
 				strcpy(batup_desc[batup_total],f.desc);
 				batup_dir[batup_total]=dirnum;
@@ -485,12 +506,12 @@ void sbbs_t::upload(uint dirnum)
 				ch=uploadfile(&f);
 				autohangup();
 				if(!ch)  /* upload failed, don't process user to user xfer */
-					return; } } }
+					return(false); } } }
 	if(dirnum==cfg.user_dir) {  /* Add files to XFER.IXT in INDX dir */
 		sprintf(str,"%sxfer.ixt",cfg.data_dir);
 		if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
 			errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
-			return; }
+			return(false); }
 		for(j=0;j<destusers;j++) {
 			for(i=1;i<=cfg.sys_nodes;i++) { /* Tell user, if online */
 				getnodedat(i,&node,0);
@@ -507,6 +528,7 @@ void sbbs_t::upload(uint dirnum)
 			write(file,str,strlen(str)); }
 		close(file); 
 	}
+	return(true);
 }
 
 /****************************************************************************/