diff --git a/src/ZuulTerm/chrome/content/Term.js b/src/ZuulTerm/chrome/content/Term.js
index 2b2e62bde12292fb7c2d059592ac8f6ac9df51e6..77253a900e0d954746fd841a493918096d19550d 100644
--- a/src/ZuulTerm/chrome/content/Term.js
+++ b/src/ZuulTerm/chrome/content/Term.js
@@ -1,6 +1,6 @@
 var connection=null;
 
-function UpdateTerm(data)
+function writeText(data)
 {
 	var term=document.getElementById("frame").contentDocument.getElementById("terminal");
 	var win=document.getElementById("frame").contentWindow;
@@ -9,6 +9,42 @@ function UpdateTerm(data)
 	win.scroll(0, term.clientHeight);
 }
 
+function handleCtrl(byte)
+{
+	var term=document.getElementById("frame").contentDocument.getElementById("terminal");
+	var win=document.getElementById("frame").contentWindow;
+
+	switch(byte) {
+		case '\n':
+		case '\t':
+		case '\r':
+			writeText(byte);
+			break;
+		case '\b':
+			term.innerHTML = term.innerHTML.replace(/[^\x00-\x1F]$/,'');
+			break;
+		case '\x0c':	// Formfeed -- clear screen
+			term.innerHTML = '';
+			break;
+	}
+}
+
+function UpdateTerm(data)
+{
+	while(data.length) {
+		data=data.replace(/^([^\x00-\x1F]*)/, function(matched, text) {
+			writeText(text);
+			return '';
+		});
+		if(data.length) {
+			while(data.charCodeAt(0) < 32) {
+				handleCtrl(data.substr(0,1));
+				data=data.substr(1);
+			}
+		}
+	}
+}
+
 function doTerm(host, port)
 {
 	var ConnOpt=document.getElementById("MainConnectionMenu-connect").disabled=true;