diff --git a/exec/ircd.js b/exec/ircd.js
index eb30e4436cc6fd7be5e06c06187d081de70f7841..931990c697c38fcfb12deb7757d803b34af7622a 100644
--- a/exec/ircd.js
+++ b/exec/ircd.js
@@ -127,30 +127,32 @@ function terminate_everything(terminate_reason, error) {
 	exit(error);
 }
 
-function searchbyserver(server_name,ignore_wildcards) {
+function search_server_only(server_name) {
 	if (!server_name)
 		return 0;
-	if ((ignore_wildcards &&
-	    (servername.toUpperCase() == server_name.toUpperCase()) ) ||
-	   (!ignore_wildcards && IRC_match(servername,server_name)) )
-		return -1; // the server passed to us is our own.
 	for(thisServer in Servers) {
 		var Server=Servers[thisServer];
-		if ((ignore_wildcards && 
-		    (Server.nick.toUpperCase() == server_name.toUpperCase())) ||
-		   (!ignore_wildcards &&
-		     IRC_match(Server.nick,server_name) ) )
+		if (IRC_match(Server.nick,server_name))
 			return Server;
 	}
-	// No wildcards implies not doing searches on nicks, either.
-	if (ignore_wildcards)
+	if (IRC_match(servername,server_name))
+		return -1; // the server passed to us is our own.
+	// No success.
+	return 0;
+}
+
+function searchbyserver(servnick) {
+	if (!servnick)
 		return 0;
-	// if we've had no success so far, try nicknames and glean a server
-	// from there.
-	for(thisNick in Users) {
-		var Nick=Users[thisNick];
-		if (IRC_match(Nick.nick,server_name))
-			return searchbyserver(Nick.servername);
+	var server_try = search_server_only(servnick);
+	if (server_try) {
+		return server_try;
+	} else {
+		for(thisNick in Users) {
+			var Nick=Users[thisNick];
+			if (IRC_match(Nick.nick,servnick))
+				return search_server_only(Nick.servername);
+		}
 	}
 	return 0; // looks like we failed after all that hard work :(
 }
@@ -407,7 +409,7 @@ function connect_to_server(this_cline,the_port) {
 		new_id = "id" + next_client_id;
 		next_client_id++;
 		Unregistered[new_id]=new Unregistered_Client(new_id,connect_sock);
-		Unregistered[new_id].sentps = true;
+		Unregistered[new_id].sendps = false; // Don't do P/S pair again
 	}
 	this_cline.lastconnect = time();
 }
@@ -785,7 +787,7 @@ while (!server.terminated) {
 	for(thisCL in CLines) {
 		my_cline = CLines[thisCL];
 		if (my_cline.port && YLines[my_cline.ircclass].connfreq &&
-		    !searchbyserver(my_cline.servername,true) &&
+		    (search_server_only(my_cline.servername) < 1) &&
 		     ((time() - my_cline.lastconnect) >
 		     YLines[my_cline.ircclass].connfreq)
 		   ) {
@@ -2762,13 +2764,13 @@ function IRCClient_check_sendq() {
 	}
 }
 
-function IRCClient_finalize_server_connect(states) {
+function IRCClient_finalize_server_connect(states,sendps) {
 	hcc_counter++;
 	gnotice("Link with " + this.nick + "[unknown@" + this.hostname +
 		"] established, states: " + states);
 	if (server.client_update != undefined)
 		server.client_update(this.socket, this.nick, this.hostname);
-	if (!this.sentps) {
+	if (sendps) {
 		for (cl in CLines) {
 			if(IRC_match(this.nick,CLines[cl].servername)) {
 				this.rawout("PASS " + CLines[cl].password + " :" + states);
diff --git a/exec/load/ircd_server.js b/exec/load/ircd_server.js
index a4ed81f239f2f99237de88843ba027cd6fcdfd1a..f687c5963e235802b7c1d7f6be22888c890a539d 100644
--- a/exec/load/ircd_server.js
+++ b/exec/load/ircd_server.js
@@ -576,7 +576,7 @@ function Server_Work() {
 					ns.info = my_server.realname;
 					ns.socket = my_server.socket;
 					delete Unregistered[my_server.id];
-					ns.finalize_server_connect("QWK");
+					ns.finalize_server_connect("QWK",true);
 					break;
 				} else if (dest_server) {
 					if (dest_server == -1)
@@ -697,16 +697,34 @@ function Server_Work() {
 			var cm_array;
 
 			if (cmd[3]) {
-				var mode_args = "";
+				var incoming_modes = new Array;
 				var tmp_modeargs = 0;
 
 				for (tmpmc in cmd[3]) {
-					if ((cmd[3][tmpmc] == "k") ||
-					    (cmd[3][tmpmc] == "l")) {
+					var my_modechar = cmd[3][tmpmc];
+					if (my_modechar == "+")
+						continue;
+					if ((my_modechar == "k") ||
+					    (my_modechar == "l")) {
 						tmp_modeargs++;
-						mode_args += cmd[3 + tmp_modeargs];
+						incoming_modes[my_modechar] = cmd[3 + tmp_modeargs];
+					} else {
+						incoming_modes[my_modechar] = true;
 					}
 				}
+
+				/* Reconstruct our modes into a string now */
+				var mode_args_chars = "+";
+				var mode_args_args = "";
+				for (my_mc in incoming_modes) {
+					mode_args_chars += my_mc;
+					if ((my_mc == "k") || (my_mc == "l")) {
+						mode_args_args += " " + incoming_modes[my_mc];
+					}
+				}
+				var mode_args = mode_args_chars + mode_args_args;
+
+				/* The following corrects a bug in Bahamut.. */
 				if ((cmd[4] == "") && cmd[5])
 					tmp_modeargs++;
 				
diff --git a/exec/load/ircd_unreg.js b/exec/load/ircd_unreg.js
index 29707be46c0eb3467eac4ee37ab999f001fe51d9..cc5527c3720c3d3a35a6aedbb551609c0fc8b11c 100644
--- a/exec/load/ircd_unreg.js
+++ b/exec/load/ircd_unreg.js
@@ -27,7 +27,6 @@ function Unregistered_Client(id,socket) {
 	////////// VARIABLES
 	// Bools/Flags that change depending on connection state.
 	this.pinged = false;	   // Sent PING?
-	this.sentps = false;	   // Sent PASS/SERVER?
 	this.local = true;	   // FIXME: this is redundant.
 	this.criteria_met = false; // Have we met registration criteria?
 	// Variables containing user/server information as we receive it.
@@ -42,6 +41,7 @@ function Unregistered_Client(id,socket) {
 	this.ip = socket.remote_ip_address;
 	this.pending_resolve = false;
 	this.pending_resolve_time = time();
+	this.sendps = true; // Send the PASS/SERVER pair by default.
 	// Variables (consts, really) that point to various state information
 	this.socket = socket;
 	////////// FUNCTIONS
@@ -198,7 +198,7 @@ function Unregistered_Commands() {
 				}
 			}
 			if ( (!this_nline ||
-			      ( (this_nline.password == "*") && !this.sentps &&
+			      ( (this_nline.password == "*") && 
 				!(this_nline.flags&NLINE_CHECK_QWKPASSWD) )
 			     ) && !qwk_slave) {
 				this.quit("Server not configured.");
@@ -237,7 +237,7 @@ function Unregistered_Commands() {
 					}
 				}
 			}
-			new_server.finalize_server_connect("TS");
+			new_server.finalize_server_connect("TS",this.sendps);
 			break;
 		case "USER":
 			if (this.uprefix)