diff --git a/exec/load/sbbsimsg_lib.js b/exec/load/sbbsimsg_lib.js
index f8ae4f67db041929726247aec4774b8c6253b026..8af2a8c47a643bc37b863cb9f6558cedc8961759 100644
--- a/exec/load/sbbsimsg_lib.js
+++ b/exec/load/sbbsimsg_lib.js
@@ -52,7 +52,7 @@ function request_active_users()
 {
 	var requests_sent = 0;
 	for(var i in sys_list) {
-		if(!sock.sendto("\r\n", i, IPPORT_SYSTAT))	// Get list of active users
+		if(!sock.sendto("?active-users.json\r\n", i, IPPORT_SYSTAT))	// Get list of active users (in JSON fmt, if available)
 			continue;
 		requests_sent++;
 	}
@@ -67,6 +67,15 @@ function find_name(arr, name)
 	return false;
 }
 
+// Converts HH:MM:SS to seconds
+function parseTimeOn(str)
+{
+	var arr = str.match(/(\d+)\:(\d+)\:(\d+)$/);
+	if(!arr)
+		return 0;
+	return parseInt(arr[1]*60*60, 10) + parseInt(arr[2]*60, 10) + parseInt(arr[3], 10);
+}
+
 function parse_active_users(message, logon_callback, logoff_callback)
 {
 	if(!message)
@@ -78,37 +87,39 @@ function parse_active_users(message, logon_callback, logoff_callback)
 	}
 	
 	sys.last_response = time();
-	
-	var response = message.data.split("\r\n");
-	
-	// Skip header
-	while(response.length && response[0].charAt(0)!='-')
-		response.shift();
-	if(response.length && response[0].charAt(0)=='-')
-		response.shift();	// Delete the separator line
-	while(response.length && !response[0].length)
-		response.shift();	// Delete any blank lines
-	while(response.length && !response[response.length-1].length)
-		response.pop();		// Delete trailing blank lines
-	
 	var old_users = sys.users.slice();
-	sys.users = [];
-
-	for(var i in response) {
-		if(response[i]=="")
-			continue;
-
-		sys.users.push( { 
-			name: format("%.25s",response[i]).trimRight(),
-			action: response[i].substr(26, 31).trimLeft().trimRight(),
-			timeon: response[i].substr(57, 9).trimLeft(),
-			age: response[i].substr(67, 3).trimLeft(),
-			sex: response[i].substr(71, 3).trimLeft(),
-			node: response[i].substr(75, 4).trimLeft(),
-			time: time() 
-			} );
-	}
 	
+	if(message.data[0] == '[')
+		sys.users = JSON.parse(message.data);
+	else {
+		var response = message.data.split("\r\n");
+		
+		// Skip header
+		while(response.length && response[0].charAt(0)!='-')
+			response.shift();
+		if(response.length && response[0].charAt(0)=='-')
+			response.shift();	// Delete the separator line
+		while(response.length && !response[0].length)
+			response.shift();	// Delete any blank lines
+		while(response.length && !response[response.length-1].length)
+			response.pop();		// Delete trailing blank lines
+		
+		sys.users = [];
+
+		for(var i in response) {
+			if(response[i]=="")
+				continue;
+
+			sys.users.push( { 
+				name: format("%.25s",response[i]).trimRight(),
+				action: response[i].substr(26, 31).trimLeft().trimRight(),
+				timeon: parseTimeOn(response[i].substr(57, 9).trimLeft()),
+				age: response[i].substr(67, 3).trimLeft(),
+				sex: response[i].substr(71, 3).trimLeft(),
+				node: response[i].substr(75, 4).trimLeft()
+				} );
+		}
+	}
 	if(logon_callback) {
 		var count = 0;
 		for(var i in sys.users) {