diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c
index e3de8b39f07ebb4845767f2af5cb431a394b4958..108d8866eb020ce99ad7d5cf42aba30c88555ab8 100644
--- a/src/sbbs3/smbutil.c
+++ b/src/sbbs3/smbutil.c
@@ -117,6 +117,8 @@ char *usage=
 "       d    = delete all msgs\n"
 "       m    = maintain msg base - delete old msgs and msgs over max\n"
 "       p[k] = pack msg base (k specifies minimum packable Kbytes)\n"
+"       L    = lock a msg base for exclusive-access/backup\n"
+"       U    = unlock a msg base\n"
 "opts:\n"
 "      -c[m] = create message base if it doesn't exist (m=max msgs)\n"
 "      -a    = always pack msg base (disable compression analysis)\n"
@@ -1678,26 +1680,28 @@ int main(int argc, char **argv)
 					fprintf(errfp,"\n%s doesn't exist (use -c to create)\n",path);
 					bail(1);
 				}
-				smb.retry_time=30;
-				fprintf(statfp,"Opening %s\r\n",smb.file);
-				if((i=smb_open(&smb))!=0) {
-					fprintf(errfp,"\n%s!Error %d (%s) opening %s message base\n"
-						,beep,i,smb.last_error,smb.file);
-					continue; 
-				}
-				if(!filelength(fileno(smb.shd_fp))) {
-					if(!create) {
-						printf("Empty\n");
-						smb_close(&smb);
+				if(cmd[0] != 'U') {
+					smb.retry_time=30;
+					fprintf(statfp,"Opening %s\r\n",smb.file);
+					if((i=smb_open(&smb))!=0) {
+						fprintf(errfp,"\n%s!Error %d (%s) opening %s message base\n"
+							,beep,i,smb.last_error,smb.file);
 						continue; 
 					}
-					smb.status.max_msgs=max_msgs;
-					smb.status.max_crcs=count;
-					if((i=smb_create(&smb))!=0) {
-						smb_close(&smb);
-						printf("!Error %d (%s) creating %s\n",i,smb.last_error,smb.file);
-						continue; 
-					} 
+					if(!filelength(fileno(smb.shd_fp))) {
+						if(!create) {
+							printf("Empty\n");
+							smb_close(&smb);
+							continue; 
+						}
+						smb.status.max_msgs=max_msgs;
+						smb.status.max_crcs=count;
+						if((i=smb_create(&smb))!=0) {
+							smb_close(&smb);
+							printf("!Error %d (%s) creating %s\n",i,smb.last_error,smb.file);
+							continue; 
+						} 
+					}
 				}
 				for(y=0;cmd[y];y++)
 					switch(cmd[y]) {
@@ -1741,11 +1745,15 @@ int main(int argc, char **argv)
 							break;
 						case 'p':
 						case 'd':
+						case 'L':
 							if((i=smb_lock(&smb))!=0) {
 								fprintf(errfp,"\n%s!smb_lock returned %d: %s\n"
 									,beep,i,smb.last_error);
 								return(i);
 							}
+							printf("%s locked successfully\n", smb.file);
+							if(cmd[y] == 'L')	// Lock base
+								break;
 							switch(toupper(cmd[y])) {
 								case 'P':
 									packmsgs(atol(cmd+y+1));
@@ -1754,8 +1762,13 @@ int main(int argc, char **argv)
 									delmsgs();
 									break;
 							}
-							smb_unlock(&smb);
 							y=strlen(cmd)-1;
+							/* fall-through */
+						case 'U':	// Unlock base
+							if((i=smb_unlock(&smb)) == SMB_SUCCESS)
+								printf("%s unlocked successfully\n", smb.file);
+							else
+								fprintf(errfp, "\nError %d (%s) unlocking %s\n", i, smb.last_error, smb.file);
 							break;
 						case 'r':
 							readmsgs(atol(cmd+1));