diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 9b6ac3e33de1b23b2abce3bb517a1d9d1de3109d..85d2e26f4ca44bf012807c591e49252bedc07f91 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -600,6 +600,7 @@ public:
 	char	yes_key(void) { return toupper(*text[Yes]); }
 	char	no_key(void) { return toupper(*text[No]); }
 	char	quit_key(void) { return toupper(*text[Quit]); }
+	char*	quit_key(char* str) { str[0] = quit_key(); str[1] = '\0'; return str; }
 	char	all_key(void) { return toupper(*text[All]); }
 	char	list_key(void) { return toupper(*text[List]); }
 	char	next_key(void) { return toupper(*text[Next]); }
@@ -839,8 +840,8 @@ public:
 	char	cmdstr_output[512]{};
 	char*	ultoac(uint32_t, char*, char sep=',');
 	char*	u64toac(uint64_t, char*, char sep=',');
-	int		protnum(char prot);
-	const char* protname(char prot);
+	int		protnum(char prot, enum XFER_TYPE xfer_type = XFER_DOWNLOAD);
+	const char* protname(char prot, enum XFER_TYPE xfer_type = XFER_DOWNLOAD);
 
 	void	subinfo(int subnum);
 	void	dirinfo(int dirnum);
diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp
index 9da3f697d6f74edc983e210f65bfd2d8017a0665..be469aad49114b757a586b0cbecd1e3555f8785e 100644
--- a/src/sbbs3/str.cpp
+++ b/src/sbbs3/str.cpp
@@ -1437,20 +1437,38 @@ char* sbbs_t::u64toac(uint64_t val, char* str, char sep)
 	return ::u64toac(val, str, sep);
 }
 
-int sbbs_t::protnum(char prot)
+int sbbs_t::protnum(char prot, enum XFER_TYPE type)
 {
 	int i;
 
 	for(i = 0; i < cfg.total_prots; ++i) {
-		if(prot == cfg.prot[i]->mnemonic && chk_ar(cfg.prot[i]->ar, &useron, &client))
-			break;
+		if(prot != cfg.prot[i]->mnemonic || !chk_ar(cfg.prot[i]->ar, &useron, &client))
+			continue;
+		switch(type) {
+			case XFER_UPLOAD:
+				if(cfg.prot[i]->ulcmd[0])
+					return i;
+				break;
+			case XFER_DOWNLOAD:
+				if(cfg.prot[i]->dlcmd[0])
+					return i;
+				break;
+			case XFER_BATCH_UPLOAD:
+				if(cfg.prot[i]->batulcmd[0])
+					return i;
+				break;
+			case XFER_BATCH_DOWNLOAD:
+				if(cfg.prot[i]->batdlcmd[0])
+					return i;
+				break;
+		}
 	}
 	return i;
 }
 
-const char* sbbs_t::protname(char prot)
+const char* sbbs_t::protname(char prot, enum XFER_TYPE type)
 {
-	int i = protnum(prot);
+	int i = protnum(prot, type);
 	if(i < cfg.total_prots)
 		return cfg.prot[i]->name;
 	return text[None];