diff --git a/exec/allusers.js b/exec/allusers.js
index 31745d5a2ff252d8f32ddd0edc3372dbd5ae8246..4f306a9729254baf8e88e904dc2da0cb946acdce 100644
--- a/exec/allusers.js
+++ b/exec/allusers.js
@@ -1,182 +1,205 @@
-/* 
- *	ALLUSERS - Bulk User Editor for Synchronet User Database
- * 
- *	usage: jsexec allusers.js [[ARS] [...]] [[/modify] [...]]
- * 
- *	where ARS is any valid ARS string 
- *		(see http://www.synchro.net/docs/security.html)
- *	
- *	where modify is one of:
- *		L#                  			change security level to #
- *		F#[+|-]<flags>      			add or remove flags from flag set #
- *		E[+|-]<flags>       			add or remove exemption flags
- *		R[+|-]<flags>       			add or remove restriction flags
- * 
- *	examples:
- *
- *	jsexec allusers.js "L30" /FA  		add 'A' to flag set #1 for all level 30+ users
- *	jsexec allusers.js /F3-G      		remove 'G' from flag set #3 for all users
- *	jsexec allusers.js F2B /E-P 		remove 'P' exemption for all users with FLAG '2B'
- *	jsexec allusers.js "60$XA" /R+W 	add 'W' restriction for all level 60+ users 
- *										with exemption 'A'
- *
- *	NOTE: 	multi-word ARS strings or ARS strings with special characters
- *			must be enclosed in "quotes"
- */
+writeln("\nALLUSERS - Bulk User Editor for Synchronet User Database\n");
 
 (function() {
-	
-	/* required values for user matching */	 
-	var match_rules = [];
+    var error = false;
+    
+    /* required values for user matching */     
+    var match_rules = [];
 
-	/* items to edit in matched users */
-	var edit_rule = {
-		flags:{
-			1:undefined,
-			2:undefined,
-			3:undefined,
-			4:undefined},
-		level:undefined,
-		restrictions:undefined,
-		exemptions:undefined
-	}
+    /* items to edit in matched users */
+    var edit_rule = {
+        flags:{
+            1:undefined,
+            2:undefined,
+            3:undefined,
+            4:undefined},
+        level:undefined,
+        restrictions:undefined,
+        exemptions:undefined
+    }
+    
+    /* display command usage */
+    function usage() {
+        writeln('usage: jsexec allusers.js [[ARS] [...]] [[/modify] [...]]');
+        writeln();
+        writeln('where ARS is any valid ARS string');
+        writeln('    (see http://www.synchro.net/docs/security.html)');
+        writeln();
+        writeln('where modify is one of:');
+        writeln('    L#                     change security level to #');
+        writeln('    F#[+|-]<flags>         add or remove flags from flag set #');
+        writeln('    E[+|-]<flags>          add or remove exemption flags');
+        writeln('    R[+|-]<flags>          add or remove restriction flags');
+        writeln();
+        writeln('examples: jsexec allusers.js ..');
+        writeln();
+        writeln('    "L30" /FA              add "A" to flag set #1 for all level 30+ users');
+        writeln('    /F3-G                  remove "G" from flag set #3 for all users');
+        writeln('    F2B /E-P               remove "P" exemption for all users with FLAG "2B"');
+        writeln('    "60$XA" /R+W           add "W" restriction for all level 60+ users');
+        writeln('                           with exemption "A"');
+        writeln();
+        writeln('NOTE: multi-word ARS strings or ARS strings with special characters');
+        writeln('      must be enclosed in "quotes"');
+        writeln();
+    }
 
-	/* apply argument to edit rule */
-	function setEditRule(str) {
-		
-		str = str.substr(1);
-		var level = undefined;
-		var flag_set = 1;
-		var flags = undefined;
-		var exemptions = undefined;
-		var restrictions = undefined;
+    /* apply argument to edit rule */
+    function setEditRule(str) {
+        
+        str = str.substr(1);
+        var level = undefined;
+        var flag_set = 1;
+        var flags = undefined;
+        var exemptions = undefined;
+        var restrictions = undefined;
 
-		switch(str[0].toUpperCase()) {
-			case "L":
-				level = str.substr(1);
-				break;
-			case "F":
-				if(isNaN(str[1])) {
-					flags = str;
-				}
-				else {
-					flag_set = str[1];
-					flags = str.substr(2);
-				}
-				break;
-			case "E":
-				exemptions = str.substr(1);
-				break;
-			case "R":
-				restrictions = str.substr(1);
-				break;
-			default:
-				throw("invalid edit rule: " + str);
-				break;
-		}
-		
-		if(level && level < 1 || level > 99)
-			throw("invalid security level: " + level);
-		if(flag_set < 1 || flag_set > 4)
-			throw("invalid flag set: " + flag_set);
-			
-		if(level && !edit_rule.level)
-			edit_rule.level = level;
-		if(flags && !edit_rule.flags[flag_set])
-			edit_rule.flags[flag_set] = parseFlags(flags);
-		if(restrictions && !edit_rule.restrictions)
-			edit_rule.restrictions = parseFlags(restrictions);
-		if(exemptions && !edit_rule.exemptions)
-			edit_rule.exemptions = parseFlags(exemptions);
-	}
+        switch(str[0].toUpperCase()) {
+            case "L":
+                level = str.substr(1);
+                break;
+            case "F":
+                if(isNaN(str[1])) {
+                    flags = str;
+                }
+                else {
+                    flag_set = str[1];
+                    flags = str.substr(2);
+                }
+                break;
+            case "E":
+                exemptions = str.substr(1);
+                break;
+            case "R":
+                restrictions = str.substr(1);
+                break;
+            default:
+                writeln("* Invalid edit rule: " + str);
+                error = true;
+                break;
+        }
+        
+        if(level && level < 1 || level > 99) {
+            writeln("* Invalid security level: " + level);
+            error = true;
+        }
+        if(flag_set < 1 || flag_set > 4) {
+            writeln("* Invalid flag set: " + flag_set);
+            error = true;
+        }
+            
+        if(level && !edit_rule.level)
+            edit_rule.level = level;
+        if(flags && !edit_rule.flags[flag_set])
+            edit_rule.flags[flag_set] = parseFlags(flags);
+        if(restrictions && !edit_rule.restrictions)
+            edit_rule.restrictions = parseFlags(restrictions);
+        if(exemptions && !edit_rule.exemptions)
+            edit_rule.exemptions = parseFlags(exemptions);
+    }
 
-	/* parse a +/- flag string and return a flag set/unset object */
-	function parseFlags(str) {
-		var flags = {
-			set:undefined,
-			unset:undefined
-		};
-		var set = true;
-		
-		str = str.split("");
-		for each(var f in str) {
-			if(f == "+")
-				set = true;
-			else if(f == "-")
-				set = false;
-			else if(flags_str(f) > 0) {
-				if(set) 
-					flags.set |= flags_str(f);
-				else
-					flags.unset |= flags_str(f);
-			}
-			else {
-				throw("invalid flag: " + f);
-			}
-		}
-		
-		return flags;
-	}
+    /* parse a +/- flag string and return a flag set/unset object */
+    function parseFlags(str) {
+        var flags = {
+            set:undefined,
+            unset:undefined
+        };
+        var set = true;
+        
+        str = str.split("");
+        for each(var f in str) {
+            if(f == "+")
+                set = true;
+            else if(f == "-")
+                set = false;
+            else if(flags_str(f) > 0) {
+                if(set) 
+                    flags.set |= flags_str(f);
+                else
+                    flags.unset |= flags_str(f);
+            }
+            else {
+                writeln("* Invalid flag: " + f);
+            }
+        }
+        
+        return flags;
+    }
 
-	/* return a list of users that fit the match rule */
-	function matchUsers() {
-		var matches = [];
-		user_loop:
-		for(var u = 1; u < system.lastuser; u++) {
-			var usr = new User(u);
-			for each(var m in match_rules) {
-				if(!usr.compare_ars(m))
-					continue user_loop;
-			}
-			matches.push(usr);
-		}
-		return matches;
-	}
+    /* return a list of users that fit the match rule */
+    function matchUsers() {
+        var matches = [];
+        user_loop:
+        for(var u = 1; u < system.lastuser; u++) {
+            var usr = new User(u);
+            for each(var m in match_rules) {
+                if(!usr.compare_ars(m))
+                    continue user_loop;
+            }
+            matches.push(usr);
+        }
+        return matches;
+    }
 
-	/* edit them bitches */
-	function editUsers(matches, rule) {
-		for each(var m in matches) {
-			if(rule.level) 
-				m.security.level = Number(rule.level);
-				
-			flag_loop:
-			for(var s in rule.flags) {
-				if(!rule.flags[s])
-					continue flag_loop;
-				m.security["flags" + s] |= rule.flags[s].set;
-				m.security["flags" + s] &= ~rule.flags[s].unset;
-			}
-			
-			if(rule.exemptions) {
-				m.security.exemptions |= rule.exemptions.set;
-				m.security.exemptions &= ~rule.exemptions.unset;
-			}
+    /* edit them bitches */
+    function editUsers(matches, rule) {
+        for each(var m in matches) {
+            if(rule.level) 
+                m.security.level = Number(rule.level);
+                
+            flag_loop:
+            for(var s in rule.flags) {
+                if(!rule.flags[s])
+                    continue flag_loop;
+                m.security["flags" + s] |= rule.flags[s].set;
+                m.security["flags" + s] &= ~rule.flags[s].unset;
+            }
+            
+            if(rule.exemptions) {
+                m.security.exemptions |= rule.exemptions.set;
+                m.security.exemptions &= ~rule.exemptions.unset;
+            }
 
-			if(rule.restrictions) {
-				m.security.restrictions |= rule.restrictions.set;
-				m.security.restrictions &= ~rule.restrictions.unset;
-			}
-			
-			writeln("Modified user record #" + m.number);
-		}
-		writeln("Modified " + matches.length + " record(s)");
-	}
+            if(rule.restrictions) {
+                m.security.restrictions |= rule.restrictions.set;
+                m.security.restrictions &= ~rule.restrictions.unset;
+            }
+            
+            writeln("Modified user record #" + m.number);
+        }
+        writeln("Modified " + matches.length + " record(s)");
+    }
 
-	/* parse command arguments */
-	while(argv.length > 0) {
-		var arg = argv.shift();
-		if(arg[0] == "/") 
-			setEditRule(arg);
-		else
-			match_rules.push(arg);
-	}
+    /* if no arguments were passed, display command usage */
+    if(argc == 0) {
+        usage();
+        return;
+    }
+    
+    /* parse command arguments */
+    while(argv.length > 0) {
+        var arg = argv.shift();
+        if(arg[0] == "/") 
+            setEditRule(arg);
+        else
+            match_rules.push(arg);
+    }
+    
+    /* if there was an error processing the request, exit */
+    if(error) {
+        writeln("\nError(s) processing request");
+        return false;
+    }
 
-	/* search user list and return matches */
-	var matches = matchUsers();
-	
-	/* edit matched users */
-	editUsers(matches, edit_rule);
-		
+    /* search user list and return matches */
+    var matches = matchUsers();
+    
+    /* edit matched users */
+    editUsers(matches, edit_rule);
+        
+    return true;
 })();
 
+writeln();
+
 
diff --git a/exec/slog.js b/exec/slog.js
index ceab18d1f74f65f5cb85ec9777e82320d1bc595e..7771006712036bb6ea22a69c5814e86c87da1842 100644
--- a/exec/slog.js
+++ b/exec/slog.js
@@ -1,5 +1,5 @@
 (function() {
-	writeln("\r\nSynchronet System/Node Statistics Log Viewer v1.02\n");
+	writeln("\r\nSynchronet System/Node Statistics Log Viewer\n");
 
 	var sfile = new File(system.ctrl_dir + "csts.dab");
 	var list = [];
@@ -29,10 +29,14 @@
 		}
 	}
 
-	if(!file_exists(sfile.name))
-		throw(sfile.name + " does not exist");
-	if(!sfile.open('r+b'))
-		throw("error opening " + sfile.name);
+	if(!file_exists(sfile.name)) {
+		writeln("* " + sfile.name + " does not exist");
+		return false;
+	}
+	if(!sfile.open('r+b')) {
+		writeln("* error opening " + sfile.name);
+		return false;
+	}
 
 	while(sfile.position <= file_size(sfile.name) - 40) {