diff --git a/src/sbbs3/ars.c b/src/sbbs3/ars.c
index 8c0bca5aa841f0600fe1087667022f67ce29e719..003a1e0d7823bd722da20d215a326e00a161cf78 100644
--- a/src/sbbs3/ars.c
+++ b/src/sbbs3/ars.c
@@ -392,8 +392,12 @@ uchar* arstr(ushort* count, char* str, scfg_t* cfg)
 			else if(!strnicmp(str+i,"FILE_CMDS",9)) {
 				artype=AR_FILE_CMDS;
 				i+=8; }
+			else if(!strnicmp(str+i,"SHELL",5)) {
+				artype=AR_SHELL;
+				i+=4; }
 			if(n!=i)            /* one of the above */
-				continue; }
+				continue; 
+		}
 
 		if(not)
 			ar[j++]=AR_NOT;
@@ -472,7 +476,7 @@ uchar* arstr(ushort* count, char* str, scfg_t* cfg)
 					break; }
 			while(isdigit(str[i+1])) i++;
 			continue; }
-		if(artype==AR_SUBCODE || artype==AR_DIRCODE) {
+		if(artype==AR_SUBCODE || artype==AR_DIRCODE || artype==AR_SHELL) {
 			for(n=0;n<8
 				&& str[i]
 				&& str[i]!=SP
diff --git a/src/sbbs3/ars_defs.h b/src/sbbs3/ars_defs.h
index 71eeeca8574951f70b1f5f0f656ee16028496aaa..e2eb58d47713ca79ce5a7837132e4da409d48b39 100644
--- a/src/sbbs3/ars_defs.h
+++ b/src/sbbs3/ars_defs.h
@@ -107,6 +107,7 @@ enum {                              /* Access requirement binaries */
 	,AR_WIN32
 	,AR_UNIX
 	,AR_LINUX
+	,AR_SHELL
     };
 
 #endif		/* Don't add anything after this line */
diff --git a/src/sbbs3/chk_ar.cpp b/src/sbbs3/chk_ar.cpp
index 8ee5b4006f2c30a46540dc13c8ca9ed622ebbdbe..3558dcce4cf239ebabeb82e4227ec0c7321dcb8c 100644
--- a/src/sbbs3/chk_ar.cpp
+++ b/src/sbbs3/chk_ar.cpp
@@ -267,7 +267,7 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user_t* user)
 				break;
 			case AR_SUBCODE:
 				if(cursubnum>=cfg.total_subs
-					|| strcmp(cfg.sub[cursubnum]->code,(char*)*ptrptr))
+					|| stricmp(cfg.sub[cursubnum]->code,(char*)*ptrptr))
 					result=_not;
 				else
 					result=!_not;
@@ -302,7 +302,7 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user_t* user)
 				break;
 			case AR_DIRCODE:
 				if(curdirnum>=cfg.total_dirs
-					|| strcmp(cfg.dir[curdirnum]->code,(char *)*ptrptr))
+					|| stricmp(cfg.dir[curdirnum]->code,(char *)*ptrptr))
 					result=_not;
 				else
 					result=!_not;
@@ -491,7 +491,18 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user_t* user)
 				if(!result) {
 					noaccess_str=text[NoAccessSex];
 					noaccess_val=n; }
-				break; } }
+				break; 
+			case AR_SHELL:
+				if(user->shell>=cfg.total_shells
+					|| stricmp(cfg.shell[user->shell]->code,(char*)*ptrptr))
+					result=_not;
+				else
+					result=!_not;
+				while(*(*ptrptr))
+					(*ptrptr)++;
+				break;
+		}
+	}
 	return(result);
 }
 
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 488998e71963f2ccac2483797e93906e097a9fdd..64ac9460e784ab8ee522549721707074a2a56a9c 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -1089,7 +1089,18 @@ static BOOL ar_exp(scfg_t* cfg, uchar **ptrptr, user_t* user)
 					result=not;
 				else
 					result=!not;
-				break; } }
+				break; 
+			case AR_SHELL:
+				if(user->shell>=cfg->total_shells
+					|| stricmp(cfg->shell[user->shell]->code,(char*)*ptrptr))
+					result=not;
+				else
+					result=!not;
+				while(*(*ptrptr))
+					(*ptrptr)++;
+				break;
+		} 
+	}
 	return(result);
 }