diff --git a/src/sbbs3/chk_ar.cpp b/src/sbbs3/chk_ar.cpp
index 1f124796fea10734c6b86912f26b682bb64166e0..1519cbd82da324682dd723b37a99c9fcf47695e5 100644
--- a/src/sbbs3/chk_ar.cpp
+++ b/src/sbbs3/chk_ar.cpp
@@ -581,6 +581,39 @@ void sbbs_t::getusrdirs()
 	while(curdir[curlib]>=usrdirs[curlib] && curdir[curlib]) curdir[curlib]--;
 }
 
+uint sbbs_t::getusrgrp(uint subnum)
+{
+	uint	ugrp;
+
+	if(subnum==INVALID_SUB)
+		return(0);
+
+	if(usrgrps<=0)
+		return(0);
+
+	for(ugrp=0;ugrp<usrgrps;ugrp++)
+		if(usrgrp[ugrp]==cfg.sub[subnum]->grp)
+			break;
+
+	return(ugrp+1);
+}
+
+uint sbbs_t::getusrsub(uint subnum)
+{
+	uint	usub;
+	uint	ugrp;
+
+	ugrp = getusrgrp(subnum);
+	if(ugrp<=0)
+		return(0);
+	
+	for(usub=0;usub<usrsubs[ugrp];usub++)
+		if(usrsub[ugrp][usub]==subnum)
+			break;
+
+	return(usub+1);
+}
+
 int sbbs_t::dir_op(uint dirnum)
 {
 	return(SYSOP || (cfg.dir[dirnum]->op_ar[0] && chk_ar(cfg.dir[dirnum]->op_ar,&useron)));
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 57d9d42ab345016ef278bb97d0d0644ed21269cb..f07215c0f0ef17dd135a31dbb4c7308cb60e1de2 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -383,6 +383,9 @@ public:
 	void	putmsgptrs(void);
 	void	getusrsubs(void);
 	void	getusrdirs(void);
+	uint	getusrsub(uint subnum);
+	uint	getusrgrp(uint subnum);
+
 	uint	userdatdupe(uint usernumber, uint offset, uint datlen, char *dat
 				,bool del);
 	void	gettimeleft(void);