diff --git a/src/sbbs3/bat_xfer.cpp b/src/sbbs3/bat_xfer.cpp
index e12bc335432fe3eb89621138cf8dd1a8d4915366..bd52b1a394bd0afaed8cad9b9f1d3330e76efe99 100644
--- a/src/sbbs3/bat_xfer.cpp
+++ b/src/sbbs3/bat_xfer.cpp
@@ -101,9 +101,9 @@ void sbbs_t::batchmenu()
 					break; 
 				}
 				for(i=0,totalcdt=0;i<batdn_total;i++)
+					if(!is_download_free(&cfg,batdn_dir[i],&useron))
 						totalcdt+=batdn_cdt[i];
-				if(!(useron.exempt&FLAG('D'))
-					&& totalcdt>useron.cdt+useron.freecdt) {
+				if(totalcdt>useron.cdt+useron.freecdt) {
 					bprintf(text[YouOnlyHaveNCredits]
 						,ultoac(useron.cdt+useron.freecdt,tmp));
 					break; 
@@ -353,9 +353,9 @@ BOOL sbbs_t::start_batch_download()
 		return(FALSE); 
 	}
 	for(i=0,totalcdt=0;i<batdn_total;i++)
-		totalcdt+=batdn_cdt[i];
-	if(!(useron.exempt&FLAG('D'))
-		&& totalcdt>useron.cdt+useron.freecdt) {
+		if(is_download_free(&cfg,batdn_dir[i],&useron))
+			totalcdt+=batdn_cdt[i];
+	if(totalcdt>useron.cdt+useron.freecdt) {
 		bprintf(text[YouOnlyHaveNCredits]
 			,ultoac(useron.cdt+useron.freecdt,tmp));
 		return(FALSE); 
@@ -788,10 +788,12 @@ bool sbbs_t::addtobatdl(file_t* f)
 		return(false); 
 	}
 	for(i=0,totalcdt=0;i<batdn_total;i++)
-		totalcdt+=batdn_cdt[i];
+		if(!is_download_free(&cfg,batdn_dir[i],&useron))
+			totalcdt+=batdn_cdt[i];
 	if(cfg.dir[f->dir]->misc&DIR_FREE) f->cdt=0L;
-	totalcdt+=f->cdt;
-	if(!(useron.exempt&FLAG('D')) && totalcdt>useron.cdt+useron.freecdt) {
+	if(!is_download_free(&cfg,f->dir,&useron))
+		totalcdt+=f->cdt;
+	if(totalcdt>useron.cdt+useron.freecdt) {
 		bprintf(text[CantAddToQueue],f->name);
 		bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt+useron.freecdt,tmp));
 		return(false); 
diff --git a/src/sbbs3/download.cpp b/src/sbbs3/download.cpp
index a7443ddb4871a79d956372ac174152eb48bc57f8..4b86d52297d02e8018d99a22301edb547a33ce84 100644
--- a/src/sbbs3/download.cpp
+++ b/src/sbbs3/download.cpp
@@ -67,7 +67,7 @@ void sbbs_t::downloadfile(file_t* f)
 	/****************************/
 	useron.dls=(ushort)adjustuserrec(&cfg,useron.number,U_DLS,5,1);
 	useron.dlb=adjustuserrec(&cfg,useron.number,U_DLB,10,length);
-	if(!(cfg.dir[f->dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D')))
+	if(!is_download_free(&cfg,f->dir,&useron))
 		subtract_cdt(&cfg,&useron,f->cdt);
 	/**************************/
 	/* Update Uploader's Info */
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 5483d737f02038a3b9a82f6cea63ee3e48739237..d377bda74e8e5b576487cd966d501d7fe071cc65 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -1335,7 +1335,6 @@ static void send_thread(void* arg)
 	ulong		dur;
 	ulong		cps;
 	ulong		length;
-	BOOL		exempt;
 	BOOL		error=FALSE;
 	FILE*		fp;
 	file_t		f;
@@ -1553,13 +1552,7 @@ static void send_thread(void* arg)
 		if(xfer.credits) {
 			xfer.user->dls=(ushort)adjustuserrec(&scfg, xfer.user->number,U_DLS,5,1);
 			xfer.user->dlb=adjustuserrec(&scfg, xfer.user->number,U_DLB,10,total);
-			exempt=FALSE;
-			if(xfer.user->exempt&FLAG('D'))
-				exempt=TRUE;
-			if(scfg.dir[xfer.dir]->ex_ar[0]!=0
-				&& chk_ar(&scfg, scfg.dir[xfer.dir]->ex_ar, xfer.user))
-				exempt=TRUE;
-			if(xfer.dir>=0 && !(scfg.dir[xfer.dir]->misc&DIR_FREE) && !exempt)
+			if(xfer.dir>=0 && !is_download_free(&scfg,xfer.dir,xfer.user))
 				subtract_cdt(&scfg, xfer.user, xfer.credits);
 		}
 		if(!xfer.tmpfile && !xfer.delfile)
@@ -3900,8 +3893,7 @@ static void ctrl_thread(void* arg)
 
 				/* Verify credits */
 				if(!getsize && !getdate && !delecmd
-					&& !(scfg.dir[dir]->misc&DIR_FREE) 
-					&& !(user.exempt&FLAG('D'))) {
+					&& !is_download_free(&scfg,dir,&user)) {
 					if(filedat)
 						getfiledat(&scfg,&f);
 					else
diff --git a/src/sbbs3/listfile.cpp b/src/sbbs3/listfile.cpp
index 8f0f941c0dbb8f4a92dd91cf4301da39169e614b..630899d7f10cec9a9665a64a76c794f0d9074ea2 100644
--- a/src/sbbs3/listfile.cpp
+++ b/src/sbbs3/listfile.cpp
@@ -1207,7 +1207,7 @@ int sbbs_t::listfileinfo(uint dirnum, char *filespec, long mode)
 					found=-1;
 					break; }
 				continue; }
-			if(!(cfg.dir[f.dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D'))
+			if(!is_download_free(&cfg,f.dir,&useron)
 				&& f.cdt>(useron.cdt+useron.freecdt)) {
 				SYNC;
 				bprintf(text[YouOnlyHaveNCredits]
diff --git a/src/sbbs3/pack_qwk.cpp b/src/sbbs3/pack_qwk.cpp
index 4759065af77ccd44296390e749ce222abc6c1e8c..fc7fd21ab58c33755b113ee4c607fd277577d171 100644
--- a/src/sbbs3/pack_qwk.cpp
+++ b/src/sbbs3/pack_qwk.cpp
@@ -541,9 +541,9 @@ bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack)
 
 	if(batdn_total) {
 		for(i=0,totalcdt=0;i<batdn_total;i++)
+			if(!is_download_free(&cfg,batdn_dir[i],&useron))
 				totalcdt+=batdn_cdt[i];
-		if(!(useron.exempt&FLAG('D'))
-			&& totalcdt>useron.cdt+useron.freecdt) {
+		if(totalcdt>useron.cdt+useron.freecdt) {
 			bprintf(text[YouOnlyHaveNCredits]
 				,ultoac(useron.cdt+useron.freecdt,tmp)); 
 		}
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index dcd9e85cf2faf85ffc881f3bba471d733d9df290..37153e7b360c5e92004dd325d89035c7c7df47dc 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -2200,3 +2200,26 @@ int DLLCALL user_rec_len(int offset)
 
 	return(-1);
 }
+
+BOOL DLLCALL is_download_free(scfg_t* cfg, uint dirnum, user_t* user)
+{
+	if(!VALID_CFG(cfg))
+		return(FALSE);
+	
+	if(dirnum>=cfg->total_dirs)
+		return(FALSE);
+
+	if(cfg->dir[dirnum]->misc&DIR_FREE)
+		return(TRUE);
+
+	if(user==NULL)
+		return(FALSE);
+
+	if(user->exempt&FLAG('D'))
+		return(TRUE);
+
+	if(cfg->dir[dirnum]->ex_ar[0]==0)
+		return(FALSE);
+
+	return(chk_ar(cfg,cfg->dir[dirnum]->ex_ar,user));
+}
\ No newline at end of file
diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h
index d831a6fdfcac64768663c3cdf8627a14d1c391ff..e081ea8e41ebc7e3bdd7aae13ab387a6207567a0 100644
--- a/src/sbbs3/userdat.h
+++ b/src/sbbs3/userdat.h
@@ -106,6 +106,7 @@ DLLEXPORT BOOL	DLLCALL logoutuserdat(scfg_t*, user_t*, time_t now, time_t logont
 DLLEXPORT void	DLLCALL resetdailyuserdat(scfg_t*, user_t*);
 DLLEXPORT void	DLLCALL subtract_cdt(scfg_t*, user_t*, long amt);
 DLLEXPORT int	DLLCALL user_rec_len(int offset);
+DLLEXPORT BOOL	DLLCALL is_download_free(scfg_t* cfg, uint dirnum, user_t* user);
 
 #ifdef __cplusplus
 }