diff --git a/var/mongoose/cgi-bin/browse.jim b/var/mongoose/cgi-bin/browse.jim
index 4e88f7f..38a05ef 100755
--- a/var/mongoose/cgi-bin/browse.jim
+++ b/var/mongoose/cgi-bin/browse.jim
@@ -217,6 +217,7 @@ puts {
 	<script type="text/javascript" src="/js/jquery.contextMenu.js"></script>
 	<link href=/css/jquery.bar.css rel=stylesheet type=text/css />
 	<script type="text/javascript" src="/js/jquery.bar.js"></script>
+	<script type=text/javascript src=/js/enadis.js></script>
 	<script type=text/javascript src=/cgi-bin/browse/browse.js></script>
 	<link type=text/css rel=stylesheet href=/cgi-bin/browse/style.css />
 }
diff --git a/var/mongoose/cgi-bin/browse/browse.js b/var/mongoose/cgi-bin/browse/browse.js
index f3e71e1..350724d 100755
--- a/var/mongoose/cgi-bin/browse/browse.js
+++ b/var/mongoose/cgi-bin/browse/browse.js
@@ -1,23 +1,3 @@
-(function($)
-{
-	$.fn.enable = function()
-	{
-		return this.each(function() {
-			$(this)
-			    .removeClass('ui-state-disabled')
-			    .removeProp('disabled');
-		});
-	};
-
-	$.fn.disable = function()
-	{
-		return this.each(function() {
-			$(this)
-			    .addClass('ui-state-disabled')
-			    .prop('disabled', true);
-		});
-	};
-})(jQuery);
 
 var dir;
 
diff --git a/var/mongoose/cgi-bin/edit/edit.jim b/var/mongoose/cgi-bin/edit/edit.jim
new file mode 100755
index 0000000..41fcae1
--- /dev/null
+++ b/var/mongoose/cgi-bin/edit/edit.jim
@@ -0,0 +1,43 @@
+#!/mod/bin/jimsh
+
+package require cgi
+source /mod/var/mongoose/lib/setup
+
+puts "Content-Type: text/html"
+puts ""
+
+header
+
+cgi_input
+#cgi_dump
+set file [cgi_get file "/tmp/hosts"]
+
+puts "
+<script type=text/javascript src=/js/enadis.js></script>
+<script type=text/javascript src=/js/tabsupport.js></script>
+<script type=text/javascript src=script.js></script>
+<link rel=stylesheet href=style.css type=text/css />
+
+<fieldset class=cleft>
+<legend>File Editor</legend>
+<div class=blood style=\"padding-bottom: 0.7em\">
+	Editing: <span id=filename>$file</span>
+</div>
+
+<textarea cols=80 rows=15 id=editor class=loading>
+
+Loading file...
+
+</textarea>
+<br>
+<button class=afterload id=revert>Revert</button>
+<button class=afterload id=save>Save</button>
+<div id=result class=\"blood hidden\"></div>
+</fieldset>
+<div class=cleft>
+<button id=back>Back to diagnostics</button>
+</div>
+"
+
+footer
+
diff --git a/var/mongoose/cgi-bin/edit/get.jim b/var/mongoose/cgi-bin/edit/get.jim
new file mode 100755
index 0000000..735044b
--- /dev/null
+++ b/var/mongoose/cgi-bin/edit/get.jim
@@ -0,0 +1,24 @@
+#!/mod/bin/jimsh
+
+package require cgi
+source /mod/var/mongoose/lib/setup
+require chunked
+
+cgi_input
+#cgi_dump
+
+set file [cgi_get file "/tmp/hosts"]
+if {$file eq "-"} { exit }
+
+start_chunked
+
+if {![file exists $file]} {
+	chunk ">>> File $file does not exist.\r\n"
+} else {
+	set fp [open $file r]
+	chunk [read $fp]
+	close $fp
+}
+
+end_chunked
+
diff --git a/var/mongoose/cgi-bin/edit/put.jim b/var/mongoose/cgi-bin/edit/put.jim
new file mode 100755
index 0000000..eb318da
--- /dev/null
+++ b/var/mongoose/cgi-bin/edit/put.jim
@@ -0,0 +1,23 @@
+#!/mod/bin/jimsh
+
+package require cgi
+source /mod/var/mongoose/lib/setup
+
+puts "Content-Type: text/html"
+puts ""
+
+cgi_input
+#cgi_dump
+
+set file [cgi_get file "/tmp/testfile"]
+if {$file eq "-"} { exit }
+set data [cgi_get data]
+
+if {[catch {set fp [open $file w]} msg]} {
+	puts "Error, $msg"
+} else {
+	$fp puts -nonewline $data
+	close $fp
+	puts "File saved."
+}
+
diff --git a/var/mongoose/cgi-bin/edit/script.js b/var/mongoose/cgi-bin/edit/script.js
new file mode 100644
index 0000000..d33f9a4
--- /dev/null
+++ b/var/mongoose/cgi-bin/edit/script.js
@@ -0,0 +1,51 @@
+
+$(function() {
+
+var file = $('#filename').text();
+
+function loadfile()
+{
+	$('button.afterload').disable();
+	$('#editor')
+	    .addClass('loading')
+	    .val('Loading file...');
+	$.get('get.jim?file=' + encodeURIComponent(file), function(data) {
+		$('#editor')
+			.removeClass('loading')
+			.val(data);
+		$('button.afterload').enable();
+	});
+}
+
+$('#save')
+	.button()
+	.click(function() {
+		$.post('put.jim', {
+		    'file': file,
+		    'data': $('#editor').val()
+		}, function(data) {
+			$('#result')
+			    .html(data)
+			    .slideDown('slow')
+			    .delay(5000)
+			    .slideUp('slow');
+		});
+	});
+
+$('#revert')
+	.button()
+	.click(function() {
+		loadfile();
+	});
+
+$('#back')
+	.button()
+	.click(function() {
+		window.location = '/diag.shtml';
+	});
+
+$('#editor').tabsupport();
+loadfile();
+
+});
+
diff --git a/var/mongoose/cgi-bin/edit/style.css b/var/mongoose/cgi-bin/edit/style.css
new file mode 100644
index 0000000..06a07fd
--- /dev/null
+++ b/var/mongoose/cgi-bin/edit/style.css
@@ -0,0 +1,18 @@
+textarea
+{
+	background: white;
+	font-color: black;
+}
+
+#filename
+{
+	font-style: italic;
+}
+
+.loading
+{
+	font-style: italic;
+	color: #aaa;
+	background: white;
+}
+
diff --git a/var/mongoose/html/diag.shtml b/var/mongoose/html/diag.shtml
index 75af1f1..919ccd7 100644
--- a/var/mongoose/html/diag.shtml
+++ b/var/mongoose/html/diag.shtml
@@ -1,6 +1,8 @@
 <!--#include virtual="/lib/header.shtml" -->
 
-<fieldset style="display: inline; float: left; clear: left">
+<script type=text/javascript src=/js/enadis.js></script>
+
+<fieldset class=cleft>
 <legend>Diagnostics</legend>
 Diagnostic:
 <input name=seq id=seq autocorrect=off autocapitalize=off
@@ -9,7 +11,16 @@ Diagnostic:
 <button id=rundiag>Run Diagnostic</button>
 </fieldset>
 
-<fieldset style="display: inline; float: left; clear: left">
+<fieldset class=cleft>
+<legend>File Editor</legend>
+File:
+<input name=editfile id=editfile autocorrect=off autocapitalize=off
+    value='' size=30 maxlength=50
+    class="text ui-widget-content ui-corner-all">
+<button id=runedit>Edit File</button>
+</fieldset>
+
+<fieldset class=cleft>
 <legend>Log Files</legend>
 <!--#exec cmd="/mod/var/mongoose/include/logfiles.jim" -->
 </fieldset>
@@ -27,6 +38,14 @@ $('#rundiag').button().click(function() {
 		$('#results').wrapInner('<pre>');
 	    });
 });
+
+$('#runedit').button().click(function() {
+	if ($('#editfile').val().length)
+		window.location = '/cgi-bin/edit/edit.jim?file=' +
+		    encodeURIComponent($('#editfile').val());
+});
+
+
 $('a.log').click(function() {
 	$('#results')
 	    .slideDown()
diff --git a/var/mongoose/html/js/enadis.js b/var/mongoose/html/js/enadis.js
new file mode 100755
index 0000000..fb91ac1
--- /dev/null
+++ b/var/mongoose/html/js/enadis.js
@@ -0,0 +1,20 @@
+(function($)
+{
+	$.fn.enable = function()
+	{
+		return this.each(function() {
+			$(this)
+			    .removeClass('ui-state-disabled')
+			    .removeProp('disabled');
+		});
+	};
+
+	$.fn.disable = function()
+	{
+		return this.each(function() {
+			$(this)
+			    .addClass('ui-state-disabled')
+			    .prop('disabled', true);
+		});
+	};
+})(jQuery);
diff --git a/var/mongoose/html/js/tabsupport.js b/var/mongoose/html/js/tabsupport.js
new file mode 100644
index 0000000..0b7f525
--- /dev/null
+++ b/var/mongoose/html/js/tabsupport.js
@@ -0,0 +1,23 @@
+(function($)
+{
+	$.fn.tabsupport = function()
+	{
+		return this.each(function() {
+		    $(this).keydown(function(e) {
+			if (e.keyCode == 9)
+			{
+				var el = $(this).get(0);
+				var start = el.selectionStart;
+				var end = el.selectionEnd;
+				$(this).val(
+				    $(this).val().substring(0, start) +
+				    "\t" +
+				    $(this).val().substring(end)
+				);
+				el.selectionStart = el.selectionEnd = start + 1;
+				return false;
+			}
+		    });
+		});
+	}
+})(jQuery);