diff --git a/xtrn/ecreader/ecReader.js b/xtrn/ecreader/ecReader.js
index 24ef73ce270e5021aa175ba2458712661cdf162d..cebec4947c6d72e630756df1295c8ecf4f0014aa 100644
--- a/xtrn/ecreader/ecReader.js
+++ b/xtrn/ecreader/ecReader.js
@@ -2,6 +2,7 @@
 // A lightbar, threaded message reader for Synchronet 3.16+
 // echicken -at- bbs.electronicchicken.com, 2012
 
+js.branch_limit = 0;
 console.clear();
 console.putmsg("\1h\1wecReader by echicken, loading message threads...");
 
@@ -11,6 +12,7 @@ load(js.exec_dir + "msglib.js");
 load("frame.js");
 load("tree.js");
 
+var showMail = true;	// Allow access to the private 'mail' sub-board
 var threaded = true;	// False to default to flat view
 var lbg = BG_CYAN;		// Lightbar background
 var lfg = WHITE;		// Foreground colour of highlighted text
@@ -25,6 +27,7 @@ var mfg = "\1n\1w";		// Message text colour (CTRL-A format, for now)
 var messages;
 var tree;
 var currentMessage = 0;
+var mail = false;
 
 if(argc > 0 && argv[0])
 	var msgBase = new MsgBase(argv[0]);
@@ -53,30 +56,24 @@ columnFrame.putmsg(
 	+ "Date"
 );
 helpFrame.putmsg(
-	hfg + "HOME"
-	+ sffg + ", "
-	+ hfg + "END"
-	+ sffg + ", "
-	+ hfg + "[" + sffg + " PgUp PgDn " + hfg + "] "
-	+ sffg + "| View: "
-	+ hfg + "T" + sffg + "hreaded, "
-	+ hfg + "F" + sffg + "lat | "
-	+ hfg + "C" + sffg + "hange area  "
-	+ hfg + "P" + sffg + "ost  "
+	hfg + "HOME" + sffg + "/" + hfg + "END "
+	+ hfg + "[" + sffg + "PgUp/PgDn" + hfg + "] "
+	+ hfg + "N" + sffg + "ew Scan "
+	+ hfg + "T" + sffg + "hreaded "
+	+ hfg + "F" + sffg + "lat "
+	+ hfg + "C" + sffg + "hange Area "
+	+ hfg + "P" + sffg + "ost "
+	+ hfg + "E" + sffg + "mail "
+	+ hfg + "DEL" + sffg + "ete "
 	+ hfg + "Q" + sffg + "uit"
 );
 messageBar.putmsg(
-	sffg + "Scroll: " + hfg + "UP" + sffg + "/" + hfg + "DOWN"
-	+ sffg + ", "
-	+ hfg + "HOME"
-	+ sffg + ", "
-	+ hfg + "END"
-	+ sffg + ", "
-	+ hfg + "[" + sffg + " PgUp PgDn " + hfg + "] "
-	+ sffg + " | "
-	+ hfg + "R" + sffg + "eply  "
-	+ hfg + "P" + sffg + "revious  "
-	+ hfg + "N" + sffg + "ext  "
+	hfg + "HOME" + sffg + "/" + hfg + "END "
+	+ hfg + "[" + sffg + "PgUp/PgDn" + hfg + "] "
+	+ hfg + "R" + sffg + "eply "
+	+ hfg + "P" + sffg + "revious "
+	+ hfg + "N" + sffg + "ext "
+	+ hfg + "DEL" + sffg + "ete "
 	+ hfg + "Q" + sffg + "uit"
 );
 
@@ -92,61 +89,79 @@ function formatItem(messageNumber, from, to, subject, date) {
 
 function getFlatList(oldestFirst) {
 	var header = null;
-	msgBase.open();
-	for(var m = msgBase.first_msg; m <= msgBase.last_msg; m++) {
-		header = msgBase.get_msg_header(m);
-		if(header === null || header.attr&MSG_DELETE)
+	var item;
+	if(!mail)
+		var mb = msgBase;
+	else
+		var mb = new MsgBase('mail');
+	mb.open();
+	for(var m = mb.first_msg; m <= mb.last_msg; m++) {
+		header = mb.get_msg_header(m);
+		if(
+			header === null
+			||
+			header.attr&MSG_DELETE
+			||
+			(mail
+				&&
+				header.to != user.alias
+				&&
+				header.to != user.name
+				&&
+				header.to_ext != user.number
+			)
+		)
 			continue;
 		messages.push(header);
 	}
-	msgBase.close();
+	mb.close();
 	if(oldestFirst === undefined || !oldestFirst)
 		messages.reverse();
 	for(var m = 0; m < messages.length; m++) {
-		tree.addItem(formatItem(messages[m].number, messages[m].from, messages[m].to, messages[m].subject, messages[m].when_written_time), showMessage, messages[m]);
+		item = formatItem(messages[m].number, messages[m].from, messages[m].to, messages[m].subject, messages[m].when_written_time);;
+		tree.addItem(item, showMessage, messages[m], mail);
 	}
 	tree.open();
 	tree.cycle();
 }
 
 function getThreadedList() {
-	var threads = getMessageThreads(msgBase.cfg.code);
+	if(!mail)
+		var threads = getMessageThreads(msgBase.cfg.code);
+	else
+		var threads = getMessageThreads('mail');
+	var item;
 	for(var t in threads.order) {
 		if(threads.thread[threads.order[t]].messages.length < 2) {
 			messages.push(threads.thread[threads.order[t]].messages[0]);
-			tree.addItem(
-					formatItem(
-						threads.thread[threads.order[t]].messages[0].number,
-						threads.thread[threads.order[t]].messages[0].from,
-						threads.thread[threads.order[t]].messages[0].to,
-						threads.thread[threads.order[t]].messages[0].subject,
-						threads.thread[threads.order[t]].messages[0].when_written_time
-					),
-				showMessage, messages[messages.length - 1]
+			item = formatItem(
+				threads.thread[threads.order[t]].messages[0].number,
+				threads.thread[threads.order[t]].messages[0].from,
+				threads.thread[threads.order[t]].messages[0].to,
+				threads.thread[threads.order[t]].messages[0].subject,
+				threads.thread[threads.order[t]].messages[0].when_written_time
 			);
+			tree.addItem(item, showMessage, messages[messages.length - 1], mail);
 			continue;
 		}
-		st = tree.addTree(
-				formatItem(
-					threads.thread[threads.order[t]].messages[0].number,
-					threads.thread[threads.order[t]].messages[0].from,
-					threads.thread[threads.order[t]].messages[0].to,
-					threads.thread[threads.order[t]].messages[0].subject,
-					threads.thread[threads.order[t]].newest
-				)
+		item = formatItem(
+			threads.thread[threads.order[t]].messages[0].number,
+			threads.thread[threads.order[t]].messages[0].from,
+			threads.thread[threads.order[t]].messages[0].to,
+			threads.thread[threads.order[t]].messages[0].subject,
+			threads.thread[threads.order[t]].newest
 		);
+		st = tree.addTree(item);
 		for(var m = 0; m < threads.thread[threads.order[t]].messages.length; m++) {
 			messages.push(threads.thread[threads.order[t]].messages[m]);
-			st.addItem(
-				formatItem(
-					threads.thread[threads.order[t]].messages[m].number,
-					threads.thread[threads.order[t]].messages[m].from,
-					threads.thread[threads.order[t]].messages[m].to,
-					threads.thread[threads.order[t]].messages[m].subject,
-					threads.thread[threads.order[t]].messages[m].when_written_time
-				),
-				showMessage, messages[messages.length - 1]
+			item = formatItem(
+				threads.thread[threads.order[t]].messages[m].number,
+				threads.thread[threads.order[t]].messages[m].from,
+				threads.thread[threads.order[t]].messages[m].to,
+				threads.thread[threads.order[t]].messages[m].subject,
+				threads.thread[threads.order[t]].messages[m].when_written_time
 			);
+			st.addItem(item, showMessage, messages[messages.length - 1], mail);
 		}
 	}
 	tree.open();
@@ -161,10 +176,17 @@ function getList() {
 	tree.colors.xfg = xfg;
 	tree.colors.tfg = tfg;
 	messages = [];
+	if(!mail) {
+		var mg = msgBase.cfg.grp_name;
+		var ms = msgBase.cfg.name;
+	} else {	
+		var mg = "Private email";
+		var ms = "Private email";
+	}
 	titleFrame.clear();
-	titleFrame.putmsg(hfg + "Message Group: " + sffg + msgBase.cfg.grp_name);
+	titleFrame.putmsg(hfg + "Message Group: " + sffg + mg);
 	titleFrame.crlf();
-	titleFrame.putmsg(hfg + "    Sub Board: " + sffg + msgBase.cfg.name);
+	titleFrame.putmsg(hfg + "    Sub Board: " + sffg + ms);
 	if(threaded)
 		getThreadedList();
 	else
@@ -174,9 +196,13 @@ function getList() {
 function showMessage(header) {
 	currentMessage = messages.indexOf(header);
 	messageFrame.top();
-	msgBase.open();
-	var body = msgBase.get_msg_body(header.number);
-	msgBase.close();
+	if(!mail)
+		mb = msgBase;
+	else
+		mb = new MsgBase('mail');
+	mb.open();
+	var body = mb.get_msg_body(header.number);
+	mb.close();
 	headerFrame.putmsg(
 		hfg + format("%15s", "Subject: ") + sffg + header.subject.substr(0, 65)
 		+ "\r\n" +
@@ -205,7 +231,12 @@ function showMessage(header) {
 				f.close();
 				frame.invalidate();
 				console.clear();
-				bbs.post_msg(msgBase.cfg.code, WM_QUOTE, header);
+				if(!mail)
+					bbs.post_msg(mb.cfg.code, WM_QUOTE, header);
+				else if(mail && header.from_net_type == NET_NONE)
+					bbs.email(parseInt(header.from_ext), WM_EMAIL|WM_QUOTE, "", "RE: " + header.subject);
+				else if(mail)
+					bbs.netmail(header.from_net_addr, WM_NETMAIL|WM_QUOTE, "RE: " + header.subject);
 				frame.draw();
 				retval = header;
 				userInput = "Q";
@@ -271,6 +302,8 @@ function showMessage(header) {
 	bodyFrame.clear();
 	if(!retval.hasOwnProperty("number"))
 		messageFrame.bottom();
+	else if(mail)
+		retval.mail = true;
 	return retval;
 }
 
@@ -294,6 +327,7 @@ while(userInput != "Q") {
 		case "C":
 			messageAreaSelector(4, 5, 70, 16, frame);
 			msgBase = new MsgBase(msg_area.grp_list[bbs.curgrp].sub_list[bbs.cursub].code);
+			mail = false;
 			getList();
 			break;
 		case "P":
@@ -302,11 +336,20 @@ while(userInput != "Q") {
 			bbs.post_msg(msgBase.cfg.code);
 			getList();
 			frame.draw();
+		case "E":
+			mail = true;
+			getList();
+			break;
+		case KEY_DEL:
+			break;
 		default:
 			r = tree.getcmd(userInput);
 			while(r.hasOwnProperty("number")) {
 				frame.cycle();
-				r = showMessage(r);
+				if(r.hasOwnProperty('mail') && r.mail)
+					r = showMessage(r, true);
+				else
+					r = showMessage(r);
 			}
 			break;
 	}