diff --git a/src/sbbs3/bat_xfer.cpp b/src/sbbs3/bat_xfer.cpp
index 1f7072ffd51e0b7e85064b669c030fda1f95caf7..76c7799aadfddc713796802640286e6b38f2302b 100644
--- a/src/sbbs3/bat_xfer.cpp
+++ b/src/sbbs3/bat_xfer.cpp
@@ -148,12 +148,14 @@ void sbbs_t::batchmenu()
 				if((n = batup_total()) > 0) {
 					bprintf(text[RemoveWhichFromUlQueue], n);
 					if(getstr(str, MAX_FILENAME_LEN, K_NONE) > 0)
-						batch_file_remove(&cfg, useron.number, XFER_BATCH_UPLOAD, str);
+						if(!batch_file_remove(&cfg, useron.number, XFER_BATCH_UPLOAD, str) && (n = atoi(str)) > 0)
+							batch_file_remove_n(&cfg, useron.number, XFER_BATCH_UPLOAD, n - 1);
 				}
 				if((n = batdn_total()) > 0) {
 					bprintf(text[RemoveWhichFromDlQueue], n);
 					if(getstr(str, MAX_FILENAME_LEN, K_NONE) > 0)
-						batch_file_remove(&cfg, useron.number, XFER_BATCH_DOWNLOAD, str);
+						if(!batch_file_remove(&cfg, useron.number, XFER_BATCH_DOWNLOAD, str) && (n = atoi(str)) > 0)
+							batch_file_remove_n(&cfg, useron.number, XFER_BATCH_DOWNLOAD, n - 1);
 				}
 				break;
 		   case 'U':
diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c
index e69c2de26fc9812c9dc8e20c985f3664c8b294ab..8088d734fd0c5a07b7ebe4a51bb25233a14b523e 100644
--- a/src/sbbs3/filedat.c
+++ b/src/sbbs3/filedat.c
@@ -411,6 +411,25 @@ bool batch_file_remove(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, const
 	return result;
 }
 
+// 'n' is zero-based index of file to remove
+bool batch_file_remove_n(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, uint n)
+{
+	FILE* fp = batch_list_open(cfg, usernumber, type, /* create: */false);
+	if(fp == NULL)
+		return false;
+	str_list_t ini = iniReadFile(fp);
+	str_list_t files = iniGetSectionList(ini, NULL);
+	bool result = false;
+	if(n < strListCount(files))
+		result = iniRemoveSection(&ini, files[n]);
+	iniWriteFile(fp, ini);
+	iniCloseFile(fp);
+	iniFreeStringList(ini);
+	iniFreeStringList(files);
+	return result;
+}
+
+
 bool batch_file_exists(scfg_t* cfg, uint usernumber, enum XFER_TYPE type, const char* filename)
 {
 	FILE* fp = batch_list_open(cfg, usernumber, type, /* create: */false);
diff --git a/src/sbbs3/filedat.h b/src/sbbs3/filedat.h
index f44c9122fc24275ced4bf496668d597959b3fbd7..057df739bab3b10190f2bfff41ee87a43e861274 100644
--- a/src/sbbs3/filedat.h
+++ b/src/sbbs3/filedat.h
@@ -87,6 +87,7 @@ DLLEXPORT bool			batch_list_clear(scfg_t*, uint usernumber, enum XFER_TYPE);
 DLLEXPORT bool			batch_file_add(scfg_t*, uint usernumber, enum XFER_TYPE, file_t*);
 DLLEXPORT bool			batch_file_exists(scfg_t*, uint usernumber, enum XFER_TYPE, const char* filename);
 DLLEXPORT bool			batch_file_remove(scfg_t*, uint usernumber, enum XFER_TYPE, const char* filename);
+DLLEXPORT bool			batch_file_remove_n(scfg_t*, uint usernumber, enum XFER_TYPE, uint n);
 DLLEXPORT size_t		batch_file_count(scfg_t*, uint usernumber, enum XFER_TYPE);
 DLLEXPORT bool			batch_file_get(scfg_t*, str_list_t, const char* filename, file_t*);
 DLLEXPORT int			batch_file_dir(scfg_t*, str_list_t, const char* filename);