diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index bf7cd921dadf926718466bdc0ede6e64f4bc033a..2f312f213d523f7b4425c8cd730109d5b04b0d0d 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -124,7 +124,7 @@ BOOL direxist(char *dir)
 
 BOOL dir_op(scfg_t* cfg, user_t* user, client_t* client, uint dirnum)
 {
-	return(user->level>=SYSOP_LEVEL || user->exempt&FLAG('R')
+	return(user->level>=SYSOP_LEVEL
 		|| (cfg->dir[dirnum]->op_ar[0] && chk_ar(cfg,cfg->dir[dirnum]->op_ar,user,client)));
 }
 
@@ -4067,7 +4067,7 @@ static void ctrl_thread(void* arg)
 					continue;
 				}
 
-				if(delecmd && !dir_op(&scfg,&user,&client,dir)) {
+				if(delecmd && !dir_op(&scfg,&user,&client,dir) && !(user.exempt&FLAG('R'))) {
 					lprintf(LOG_WARNING,"%04d !%s has insufficient access to delete files in /%s/%s"
 						,sock,user.alias
 						,scfg.lib[scfg.dir[dir]->lib]->sname
@@ -4270,13 +4270,25 @@ static void ctrl_thread(void* arg)
 
 				append=(strnicmp(cmd,"APPE",4)==0);
 			
-				if(!chk_ar(&scfg,scfg.dir[dir]->ul_ar,&user,&client)) {
-					lprintf(LOG_WARNING,"%04d !%s has insufficient access to upload to /%s/%s"
-						,sock,user.alias
-						,scfg.lib[scfg.dir[dir]->lib]->sname
-						,scfg.dir[dir]->code_suffix);
-					sockprintf(sock,"553 Insufficient access.");
-					continue;
+				if(!dir_op(&scfg,&user,&client,dir) && !(user.exempt&FLAG('U'))) {
+					if(!chk_ar(&scfg,scfg.dir[dir]->ul_ar,&user,&client)) {
+						lprintf(LOG_WARNING,"%04d !%s cannot upload to /%s/%s (insufficient access)"
+							,sock,user.alias
+							,scfg.lib[scfg.dir[dir]->lib]->sname
+							,scfg.dir[dir]->code_suffix);
+						sockprintf(sock,"553 Insufficient access.");
+						continue;
+					}
+
+					if(scfg.dir[dir]->maxfiles && getfiles(&scfg,dir)>=scfg.dir[dir]->maxfiles) {
+						lprintf(LOG_WARNING,"%04d !%s cannot upload to /%s/%s (directory full: %u files)"
+							,sock,user.alias
+							,scfg.lib[scfg.dir[dir]->lib]->sname
+							,scfg.dir[dir]->code_suffix
+							,getfiles(&scfg,dir));
+						sockprintf(sock,"553 Directory full.");
+						continue;
+					}
 				}
 				if(*p=='-'
 					|| strcspn(p,ILLEGAL_FILENAME_CHARS)!=strlen(p)
diff --git a/text/menu/exempt.asc b/text/menu/exempt.asc
index 17790cf67754e23307279c3e16515f7dcb4ff1bb..30eb907da9d19419b15b2883f65f6334a8e985df 100644
--- a/text/menu/exempt.asc
+++ b/text/menu/exempt.asc
@@ -4,4 +4,4 @@ C=Chat Page	    J=Chat Cost 	Q=Quiet/Anon Node   X=Xtrn Program Cost
 D=Download Cost     K=                  R=Remove Files      Y=
 E=Expire by Time    L=Logons            S=NetMail Cost      Z=
 F=CR/FR/RR NetMail  M=Modem Rate        T=Time Online
-G=Multiple Nodes    N=Node Locking      U=
+G=Multiple Nodes    N=Node Locking      U=Upload Files