diff --git a/CONTROL/control b/CONTROL/control
index 9122999..e94dc2f 100644
--- a/CONTROL/control
+++ b/CONTROL/control
@@ -1,7 +1,7 @@
 Package: webif
 Priority: optional
 Section: web
-Version: 0.8.0-4
+Version: 0.8.1
 Architecture: mipsel
 Maintainer: af123@hummypkg.org.uk
 Depends: mongoose(>=3.0-2),jim(>=0.71-1),jim-sqlite3(>=0.71-1),jim-cgi(>=0.4),jim-oo,jim-pack,service-control,busybox(>=1.18.3-1),lsof,epg(>=1.0.7),hmt(>=1.1.1),ssmtp
diff --git a/var/mongoose/cgi-bin/diag.jim b/var/mongoose/cgi-bin/diag.jim
new file mode 100755
index 0000000..586e23d
--- /dev/null
+++ b/var/mongoose/cgi-bin/diag.jim
@@ -0,0 +1,33 @@
+#!/mod/bin/jimsh
+
+package require cgi
+source /mod/var/mongoose/lib/setup
+require system.class chunked
+
+cgi_input
+#cgi_dump
+
+set diag [cgi_get diag general]
+
+start_chunked
+
+if {[system modversion 1] < 113} {
+	chunk ">>> Diagnostics only available with customised firmware 1.13 or above."
+	end_chunked
+	exit
+}
+
+chunk ">>> Beginning diagnostic $diag\r\n"
+
+set bcmd "|/bin/diag $diag"
+set fd [open $bcmd r]
+while {[gets $fd line] >= 0} {
+	chunk "$line\r\n"
+	#chunk_pad
+}
+close $fd
+chunk "\r\n"
+chunk ">>> Ending diagnostic $diag\r\n"
+
+end_chunked
+
diff --git a/var/mongoose/cgi-bin/settings.jim b/var/mongoose/cgi-bin/settings.jim
index 85bd48a..a5171b7 100755
--- a/var/mongoose/cgi-bin/settings.jim
+++ b/var/mongoose/cgi-bin/settings.jim
@@ -58,6 +58,34 @@ if {[dict exists $_cgi pkgdevoff] && ![dict exists $_cgi pkgdev]} {
 }
 handle_int_update pkgdev $pkgdev "Development Package Display"
 
+set acluser [cgi_get acluser "-"]
+set aclpass [cgi_get aclpass "-"]
+set aclpassc [cgi_get aclpassc "-"]
+if {$acluser ne "-" && $aclpass ne "-"} {
+	if {![string length $acluser]} {
+		puts "No username provided."
+		exit
+	}
+	if {$aclpass ne $aclpassc} {
+		puts "Passwords do not match."
+		exit
+	}
+	if {[string length $aclpass] < 4} {
+		puts "Password is too short (< 4 characters)"
+		exit
+	}
+	puts [$settings addacluser $acluser $aclpass]
+	exit
+}
+
+set aclact [cgi_get aclact "-"]
+if {$aclact ne "-" && $acluser ne "-"} {
+	switch $aclact {
+		"del" { puts [$settings delacluser $acluser] }
+	}
+	exit
+}
+
 header
 
 puts {
@@ -194,6 +222,100 @@ puts "
 puts "
 	</table>
 	</fieldset>
+"
+
+puts "
+	<br><br>
+	<fieldset style=\"display: inline\">
+	<legend> Web Interface User Access Control </legend>
+	<table>
+"
+
+set aclusers [$settings aclusers]
+if {[llength $aclusers]} {
+	puts "<tr><th colspan=5 class=odd>Existing Users</th></tr>"
+	foreach user [$settings aclusers] {
+		lassign $user user
+		puts "<tr><td align=center style=\"font-weight: bold\">
+		    $user</td>"
+		puts "<th class=key>New password:
+	        <input
+		  class=\"aclpass text ui-widget-content ui-corner-all\"
+		  type=password size=20 maxlength=50><br>"
+		puts "Again:
+	        <input
+		  class=\"aclpassc text ui-widget-content ui-corner-all\"
+		  type=password size=20 maxlength=50></td>"
+		puts "<th class=key><button class=pwchange>
+		    Change</button></td>"
+		puts "<th class=key><button class=userdel>
+		    Delete User</button></td>"
+		puts "</tr>"
+	}
+	puts "<tr><td colspan=5 id=aclusermod_output>&nbsp;</td></tr>"
+	puts "<tr><td colspan=5>&nbsp;</td></tr>"
+} else {
+	puts "<tr><td colspan=5 class=blood><b>
+	    Add a user to enable authentication.</b></td></tr>"
+}
+
+puts "<tr><th colspan=5 class=odd>Add New User</th></tr>"
+puts "
+	<form id=aclnewuser method=get action=$env(REQUEST_URI)>
+	<tr><th class=key>New User:</th><td>
+	    <input
+		class=\"text ui-widget-content ui-corner-all\"
+		id=acluser name=acluser size=20 maxlength=50></td></tr>
+	<tr><th class=key>Password:</th><td>
+	    <input type=password
+		class=\"text ui-widget-content ui-corner-all\"
+		id=aclpass name=aclpass size=20 maxlength=50></td></tr>
+	<tr><th class=key>Password (confirm):</th><td>
+	    <input type=password
+		class=\"text ui-widget-content ui-corner-all\"
+		id=aclpassc name=aclpassc size=20 maxlength=50></td></tr>
+	<tr><td><input id=aclnewuser_submit value=\"Add User\" type=submit>
+	    </td></tr>
+	</form>
+	</table>
+	<div id=aclnewuser_output></div>
+	</fieldset>
+"
+
+puts {
+<script type=text/javascript>
+$('#aclnewuser').ajaxForm({
+	target: '#aclnewuser_output',
+	success: function(txt) {
+		if (txt.indexOf('Success') >= 0)
+			window.location.reload(true);
+	}
+});
+
+$('button.userdel').click(function(el) {
+	var user = $('td:first', $(this).parents('tr')).text().trim();
+	$('#aclusermod_output').load(
+	    '/cgi-bin/settings.jim?aclact=del&acluser=' +
+	    encodeURIComponent(user), function(txt) {
+		if (txt.indexOf('Success') >= 0)
+			window.location.reload(true);
+	});
+});
+
+$('button.pwchange').click(function(el) {
+	var tr = $(this).parents('tr');
+	var user = $('td:first', $(tr)).text().trim();
+	var pass = $(tr).find('input.aclpass').val();
+	var passc = $(tr).find('input.aclpassc').val();
+	$('#aclusermod_output').load('/cgi-bin/settings.jim?' +
+	    'acluser=' + encodeURIComponent(user) + '&' +
+	    'aclpass=' + encodeURIComponent(pass) + '&' +
+	    'aclpassc=' + encodeURIComponent(passc));
+});
+</script>
+}
+
+puts "
 	<br><br>
 	<fieldset style=\"display: inline\">
 	<legend> Advanced Settings </legend>
diff --git a/var/mongoose/html/css/style.css b/var/mongoose/html/css/style.css
index ae6d7b1..be6a708 100644
--- a/var/mongoose/html/css/style.css
+++ b/var/mongoose/html/css/style.css
@@ -285,3 +285,14 @@ div.cut
 	color: black;
 }
 
+.ui-button-text
+{
+	font-size: inherit !important;
+}
+
+.ui-button, .ui-button-text
+{
+	padding: 0;
+	font-size: 12px;
+}
+
diff --git a/var/mongoose/html/diag.shtml b/var/mongoose/html/diag.shtml
new file mode 100644
index 0000000..47f774a
--- /dev/null
+++ b/var/mongoose/html/diag.shtml
@@ -0,0 +1,25 @@
+<!--#include virtual="/lib/header.shtml" -->
+
+<fieldset style="display: inline">
+<legend>Diagnostics</legend>
+Diagnostic:
+<input name=seq id=seq value=general size=30 maxlength=50
+    class="text ui-widget-content ui-corner-all">
+<button id=rundiag>Run Diagnostic</button>
+</fieldset>
+
+<div style="margin-top: 2em; display: none" class=pre id=results>
+<br><br>
+<i>Running diagnostic, please wait...</i>
+<br><br>
+</div>
+
+<script type=text/javascript>
+$('#rundiag').button().click(function() {
+	$('#results').slideDown().load('/cgi-bin/diag.jim?diag=' +
+	    encodeURIComponent($('#seq').val()));
+});
+</script>
+
+<!--#include virtual="/lib/footer.shtml" -->
+
diff --git a/var/mongoose/html/img/more_btn.gif b/var/mongoose/html/img/more_btn.gif
new file mode 100644
index 0000000..9055fb0
Binary files /dev/null and b/var/mongoose/html/img/more_btn.gif differ
diff --git a/var/mongoose/html/index.shtml b/var/mongoose/html/index.shtml
index 15b3b0b..3a215c9 100644
--- a/var/mongoose/html/index.shtml
+++ b/var/mongoose/html/index.shtml
@@ -111,6 +111,8 @@ $(document).ready(function() {
 <div class=footer>
 <ul>
 <li>
+<a href=/diag.shtml>Diagnostics</a>
+</li><li>
 <a href=/cgi-bin/channel.jim>Channel Information</a>
 </li><li>
 <a href=/cgi-bin/db.jim target=_blank>SQLite3 Database Dump</a>
diff --git a/var/mongoose/html/lib/header.jim b/var/mongoose/html/lib/header.jim
index 049089d..c7eed4a 100644
--- a/var/mongoose/html/lib/header.jim
+++ b/var/mongoose/html/lib/header.jim
@@ -8,8 +8,8 @@ source /mod/var/mongoose/include/model.jim
 puts {
 </title>
 <link rel="shortcut icon" href=/img/favicon.ico />
-<link href=/css/style.css rel=stylesheet type=text/css />
 <link type="text/css" href="/css/jquery-ui.css" rel="Stylesheet" />     
+<link href=/css/style.css rel=stylesheet type=text/css />
 <script type="text/javascript" src="/js/jquery.js"></script>
 <script type="text/javascript" src="/js/jquery-ui.js"></script>
 </head>
diff --git a/var/mongoose/html/lib/header.shtml b/var/mongoose/html/lib/header.shtml
index aff584a..c87c6c0 100644
--- a/var/mongoose/html/lib/header.shtml
+++ b/var/mongoose/html/lib/header.shtml
@@ -5,8 +5,8 @@
 <meta http-equiv="expires" value="Thu, 01 Jan 1970 00:00:00 GMT" />
 <meta http-equiv="pragma" content="no-cache" />
 <link rel="shortcut icon" href=/img/favicon.ico />
-<link href=/css/style.css rel=stylesheet type=text/css />
 <link type="text/css" href="/css/jquery-ui.css" rel="Stylesheet" />     
+<link href=/css/style.css rel=stylesheet type=text/css />
 <script type="text/javascript" src="/js/jquery.js"></script>
 <script type="text/javascript" src="/js/jquery-ui.js"></script>
 </head>
diff --git a/var/mongoose/lib/settings.class b/var/mongoose/lib/settings.class
index 04baca7..bf3b194 100644
--- a/var/mongoose/lib/settings.class
+++ b/var/mongoose/lib/settings.class
@@ -135,3 +135,76 @@ settings method channel_groups {} {
 	return $ret
 }
 
+settings method aclusers {} {
+	if {![file exists "/mod/etc/htpasswd"]} { return {} }
+	set fd [open "/mod/etc/htpasswd" r]
+	set users {}
+	foreach line [string trim [split [read $fd] "\n"]] {
+		set info [split $line ":"]
+		if {[llength $info] != 3} { continue }
+		lappend users $info
+	}
+	$fd close
+	return $users
+}
+
+settings method mongooseauth {{mode 1}} {
+	set fd [open "/mod/etc/mongoose.conf" r]
+	set fdnew [open "/mod/etc/mongoose.conf.new" w]
+	foreach line [string trim [split [read $fd] "\n"]] {
+		if {[string match -nocase {authentication_domain*} $line]} {
+			continue
+		}
+		if {[string match -nocase {global_passwords_file*} $line]} {
+			continue
+		}
+		if {$line ne ""} { puts $fdnew $line }
+	}
+	$fd close
+	if {$mode} {
+		puts $fdnew "authentication_domain webif"
+		puts $fdnew "global_passwords_file /mod/etc/htpasswd"
+	}
+	$fdnew close
+	file delete "/mod/etc/mongoose.conf"
+	file rename "/mod/etc/mongoose.conf.new" "/mod/etc/mongoose.conf"
+}
+
+settings method addacluser {user pass} {
+	set msg ""
+	if {![llength [$self aclusers]]} {
+		$self mongooseauth 1
+		append msg "Enabled web server authentication<br>"
+	}
+	set cmd "/mod/sbin/mongoose -A /mod/etc/htpasswd webif $user $pass"
+	exec {*}$cmd
+	append msg "Successfully updated user $user"
+	return $msg
+}
+
+settings method delacluser {user} {
+	if {![file exists "/mod/etc/htpasswd"]} { return }
+	set fd [open "/mod/etc/htpasswd" r]
+	set fdnew [open "/mod/etc/htpasswd.new" w]
+	set num 0
+	foreach line [string trim [split [read $fd] "\n"]] {
+		lassign [split $line ":"] xuser
+		if {$xuser eq $user} { continue }
+		if {$line ne ""} {
+			puts $fdnew $line
+			incr num
+		}
+	}
+	$fd close
+	$fdnew close
+	file delete "/mod/etc/htpasswd"
+	file rename "/mod/etc/htpasswd.new" "/mod/etc/htpasswd"
+	set msg "Successfully removed user $user"
+
+	if {$num == 0} {
+		$self mongooseauth 0
+		append msg "<br>Disabled web server authentication<br>"
+	}
+	return $msg
+}
+
diff --git a/var/mongoose/lib/system.class b/var/mongoose/lib/system.class
index 483ca92..f89b1f7 100644
--- a/var/mongoose/lib/system.class
+++ b/var/mongoose/lib/system.class
@@ -21,13 +21,14 @@ proc {system hostname} {} {
 	return $hostname
 }
 
-proc {system modversion} {} {
+proc {system modversion} {{short 0}} {
 	if {[catch {set fp [open /etc/modversion r]}]} {
-		set modver "1.02"
+		set modver "102"
 	} else {
 		set modver [string trim [read $fp]]
 		close $fp
 	}
+	if {$short} { return $modver }
 	lassign [split $modver ""] a b c
 	return [format "%d.%d%d" $a $b $c]
 }