diff --git a/exec/msglist.js b/exec/msglist.js
index f46d4e28d375346c44739345d58bbc97501b1192..16912aa49fac0e06810d5d28df430beea1277ef7 100644
--- a/exec/msglist.js
+++ b/exec/msglist.js
@@ -62,6 +62,9 @@ if(argv.indexOf('-?') >= 0 || argv.indexOf('-help') >= 0)
 	writeln("  -p=<list>       specify comma-separated list of property names to print");
 	writeln("  -fmt=<fmt>      specify format string");
 	writeln("  -hdr            include list header");
+	writeln("  -count          show count of messages only");
+	writeln("  -all_subs	   action for all sub areas")
+	writeln("  -hide_zero      do not show a line if zero messages are returned")
 	exit(0);
 }
 require('sbbsdefs.js', 'LEN_ALIAS');
@@ -1553,6 +1556,9 @@ var lm_mode;
 var preview;
 var msgbase_code;
 var since;
+var count_only;
+var all_subs;
+var hide_zero;
 
 for(var i in argv) {
 	var arg = argv[i].toLowerCase();
@@ -1612,6 +1618,15 @@ for(var i in argv) {
 		case '-hdr':
 			list_hdr = true;
 			break;
+		case '-count':
+			count_only = true;
+			break;
+		case '-all_subs':
+			all_subs = true;
+			break;
+		case '-hide_zero':
+			hide_zero = true;
+			break;
 		default:
 			if(msgbase_code === undefined)
 				msgbase_code = arg;
@@ -1625,16 +1640,18 @@ for(var i in argv) {
 	}
 }
 
-if(!msgbase_code) {
-	if(js.global.bbs === undefined) {
-		alert("No msgbase code specified");
-		exit();
+if (!all_subs) {
+	if(!msgbase_code) {
+		if(js.global.bbs === undefined) {
+			alert("No msgbase code specified");
+			exit();
+		}
+		msgbase_code = bbs.cursub_code;
 	}
-	msgbase_code = bbs.cursub_code;
 }
 
 var msgbase = new MsgBase(msgbase_code);
-if(!msgbase.open()) {
+if(!msgbase.open() && !all_subs) {
 	alert(msgbase.error);
 	exit();
 }
@@ -1656,7 +1673,7 @@ if(options.date_fmt === undefined)
 	options.date_fmt = "%Y-%m-%d";
 // options.date_time_fmt = "%a %b %d %Y %H:%M:%S";
 
-if(!msgbase.total_msgs) {
+if(!msgbase.total_msgs && !all_subs) {
 	alert("No messages");
 	exit();
 }
@@ -1744,12 +1761,36 @@ if(js.global.bbs && bbs.online) {
 	js.on_exit("bbs.sys_status &= ~SS_MOFF");
 	bbs.sys_status |= SS_MOFF; // Disable automatic messages
 } else {
-	var list = load_msgs(msgbase, which, lm_mode, /* usernumber; */0, since);
-	if(!list || !list.length) {
-		alert("No messages");
-		exit(0);
+	var sub_list = [];
+	if (all_subs) {
+		for (var sub in msg_area.sub) {
+			sub_list.push(sub);
+		}
+	} else {
+		sub_list.push(msgbase_code)
 	}
-	list_msgs_offline(msgbase, list);
+
+	for(var i = 0; i < sub_list.length; i++)
+	{
+		var local_msgbase_code = sub_list[i];
+		var msgbase = new MsgBase(local_msgbase_code);
+
+		if(!msgbase.open()) {
+			alert(msgbase.error);
+			exit();
+		}
+
+		var list = load_msgs(msgbase, which, lm_mode, /* usernumber; */0, since);
+
+		if (count_only) {
+			if ( list.length || !hide_zero )
+				printf("%10s  %-40s %5s\n", msgbase.cfg.grp_name, msgbase.cfg.description, list.length)
+		} else {
+			list_msgs_offline(msgbase, list);
+		}
+
+	}
+	
 	exit(0);
 }