diff --git a/exec/ircd.js b/exec/ircd.js
index ec841e238b7834e6186c4760a738c36ac2a7ae56..7eecc3e887ba4f4a9f23d05fb90eaf6a3b85ea3f 100644
--- a/exec/ircd.js
+++ b/exec/ircd.js
@@ -18,6 +18,8 @@
 // Copyright 2003-2009 Randolph Erwin Sommerfeld <sysop@rrx.ca>
 //
 
+load("synchronet-json.js");
+
 load("sbbsdefs.js");
 load("sockdefs.js");
 load("nodedefs.js");
@@ -157,6 +159,8 @@ for (cmdarg=0;cmdarg<argc;cmdarg++) {
 
 read_config_file();
 
+log("---got past read_config---");
+
 if(this.server==undefined) {		// Running from JSexec?
 	if (!jsexec_revision_detail)
 		jsexec_revision_detail = "JSexec";
@@ -379,7 +383,7 @@ function searchbyserver(servnick) {
 // 9 characters for 'anonymous' users (i.e. not using PASS to authenticate.)
 // hostile characters like !,@,: etc would be bad here :)
 function parse_username(str) {
-	str.replace(/[^\w]/g,"");
+	str = str.replace(/[^\w]/g,"").toLowerCase();
 	if (!str)
 		str = "user"; // nothing? we'll give you something boring.
 	return str.slice(0,9);
diff --git a/exec/load/ircd_unreg.js b/exec/load/ircd_unreg.js
index 335bf1d32e5f673ae8c7ae8d5be7b3d8f14ab4e4..f6620c31e3b4089d5ea2a10a7d792f064f42315d 100644
--- a/exec/load/ircd_unreg.js
+++ b/exec/load/ircd_unreg.js
@@ -15,7 +15,7 @@
 //
 // Synchronet IRC Daemon as per RFC 1459, link compatible with Bahamut 1.4
 //
-// Copyright 2003-2009 Randolph Erwin Sommerfeld <sysop@rrx.ca>
+// Copyright 2003-2010 Randolph Erwin Sommerfeld <sysop@rrx.ca>
 //
 // ** Handle unregistered clients.
 //
@@ -48,6 +48,8 @@ function Unregistered_Client(id,socket) {
 	////////// FUNCTIONS
 	// Functions we use to control clients (specific)
 	this.work = Unregistered_Commands;
+	this.JSON_Unregistered_Commands = JSON_Unregistered_Commands;
+	this.IRC_Unregistered_Commands = IRC_Unregistered_Commands;
 	this.quit = Unregistered_Quit;
 	this.check_timeout = IRCClient_check_timeout;
 	this.check_queues = IRCClient_check_queues;
@@ -83,23 +85,50 @@ function Unregistered_Client(id,socket) {
 	} else {
 		this.pending_resolve = load(true,"dnshelper.js",this.ip);
 	}
-	this.server_notice("*** " + VERSION + " (" + serverdesc + ") Ready.");
+	this.server_notice("*** " + VERSION + " (" + serverdesc + ") Ready. " + id);
 }
 
 ////////// Command Parsers //////////
 
 function Unregistered_Commands(cmdline) {
-	var clockticks = system.timer;
-	var cmd;
-	var command;
-
 	// Only accept up to 512 bytes from unregistered clients.
 	cmdline = cmdline.slice(0,512);
+
 	// Kludge for broken clients.
 	if ((cmdline[0] == "\r") || (cmdline[0] == "\n"))
 		cmdline = cmdline.slice(1);
+
 	if (debug)
 		log(LOG_DEBUG,"[UNREG]: " + cmdline);
+
+	// Detect JSON message
+	if (cmdline[0] == "{")
+		this.JSON_Unregistered_Commands(cmdline);
+	else
+		this.IRC_Unregistered_Commands(cmdline);
+}
+
+function JSON_Unregistered_Commands(cmdline) {
+	var msg = JSON.parse(cmdline);
+	if (msg.realname)
+		this.realname = msg.realname.slice(0,50);
+	if (msg.nick) {
+		msg.nick = msg.nick.slice(0,max_nicklen);
+		if (this.check_nickname(msg.nick))
+			this.nick = msg.nick;
+	}
+	if (msg.uprefix)
+		this.uprefix = parse_username(msg.uprefix);
+	if (msg.password)
+		this.password = msg.password;
+	this.rawout(JSON.stringify(this));
+}
+
+function IRC_Unregistered_Commands(cmdline) {
+	var clockticks = system.timer;
+	var cmd;
+	var command;
+
 	cmd = cmdline.split(" ");
 	if (cmdline[0] == ":") {
 		// Silently ignore NULL originator commands.
@@ -266,7 +295,7 @@ function Unregistered_Commands(cmdline) {
 			if (usernum) {
 				var bbsuser = new User(usernum);
 				if (this.password.toUpperCase() == bbsuser.security.password) {
-					this.uprefix = parse_username(bbsuser.handle).toLowerCase().slice(0,10);
+					this.uprefix = parse_username(bbsuser.handle);
 					bbsuser.connection = "IRC";
 					bbsuser.logontime = time();
 				}
@@ -301,6 +330,11 @@ function Unregistered_Quit(msg) {
 	delete Unregistered[this.id];
 	delete this;
 	rebuild_socksel_array = true;
+	/* debug */
+	log("end of Unregistered_Quit()");
+	for (x in Unregistered) {
+		log("Unreg member: " + x);
+	}
 }
 
 function Unregistered_Resolve_Check() {