diff --git a/exec/ircd.js b/exec/ircd.js
index 461bbaac2e6098b6689cf4865417d46a2b256f6c..f56134237d90d37dcdcd283685ae9821e512dea0 100644
--- a/exec/ircd.js
+++ b/exec/ircd.js
@@ -111,18 +111,6 @@ function true_array_len(my_array) {
 	return counter;
 }
 
-// Sigh, socket_select only accepts a sequential array with numerical indexes.
-// This rebuilds the array whenever someone connects or disconnects.
-function rebuild_socksel_array() {
-	Selectable_Sockets = new Array;
-	Selectable_Sockets_Map = new Array;
-	for (i in Local_Sockets) {
-		Selectable_Sockets.push(Local_Sockets[i]);
-		Selectable_Sockets_Map.push(Local_Sockets_Map[i]);
-	}
-	restart_socksel_loop = true;
-}
-
 function ip_to_int(ip) {
 	var quads = ip.split(".");
 	var addr = (quads[0]&0xff)<<24;
@@ -667,7 +655,7 @@ Local_Unreg = new Array;
 Local_Users = new Array;
 Local_Servers = new Array;
 
-restart_socksel_loop = false;
+rebuild_socksel_array = false;
 
 sync_310 = false;
 network_debug = false;
@@ -760,24 +748,33 @@ while (!server.terminated) {
 		}
 	}
 
+	if (rebuild_socksel_array) {
+		Selectable_Sockets = new Array;
+		Selectable_Sockets_Map = new Array
+		for (i in Local_Sockets) {
+			Selectable_Sockets.push(Local_Sockets[i]);
+			Selectable_Sockets_Map.push(Local_Sockets_Map[i]);
+		}
+		rebuild_socksel_array = false;
+	}
+
 	// Check for ping timeouts, and, do work on the sockets if we're 3.10
 	for(this_sock in Selectable_Sockets) {
-		if (Selectable_Sockets_Map[this_sock].check_timeout())
+		if (Selectable_Sockets_Map[this_sock] &&
+		    Selectable_Sockets_Map[this_sock].check_timeout())
 			continue;
 		if(this.socket_select==undefined)
 			Selectable_Sockets_Map[this_sock].work();
 	}
 
 	// do some work.
-	restart_socksel_loop = false;
 	if (!Selectable_Sockets.length) {
 		mswait(1000);
 	} else if (this.socket_select!=undefined) {
 		var readme = socket_select(Selectable_Sockets, 1 /*secs*/);
 		for(thisPolled in readme) {
-			Selectable_Sockets_Map[readme[thisPolled]].work();
-			if (restart_socksel_loop)
-				break;
+			if (Selectable_Sockets_Map[readme[thisPolled]])
+				Selectable_Sockets_Map[readme[thisPolled]].work();
 		}
 	}
 
@@ -3160,7 +3157,7 @@ function IRCClient_setusermode(modestr) {
 		bcast_modestr += "+" + bcast_addmodes;
 	if (bcast_delmodes)
 		bcast_modestr += "-" + bcast_delmodes;
-	if (!this.local) {
+	if (this.local) {
 		this.originatorout("MODE "+this.nick+" "+final_modestr,this);
 		if (bcast_addmodes || bcast_delmodes)
 			this.bcast_to_servers("MODE "+this.nick+" "+bcast_modestr,this);
diff --git a/exec/load/ircd_server.js b/exec/load/ircd_server.js
index b09194759f31eed7ab27a2c51d551ad445197422..9be40b3b8d26cd2600ab9cb115d6a68528f4e359 100644
--- a/exec/load/ircd_server.js
+++ b/exec/load/ircd_server.js
@@ -1023,7 +1023,7 @@ function Server_Quit(str,suppress_bcast,is_netsplit,origin) {
 	delete Local_Servers[this.id];
 	delete Servers[this.nick.toLowerCase()];
 	delete this;
-	rebuild_socksel_array();
+	rebuild_socksel_array = true;
 }
 
 function IRCClient_synchronize() {
diff --git a/exec/load/ircd_unreg.js b/exec/load/ircd_unreg.js
index 88a65805d6b1323f9116c79fe4edff48900ec337..0131a0239327dff186334cb5382f41ebc00e87da 100644
--- a/exec/load/ircd_unreg.js
+++ b/exec/load/ircd_unreg.js
@@ -60,7 +60,7 @@ function Unregistered_Client(id,socket) {
 	// We're a local socket that must be polled.
 	Local_Sockets[id] = socket.descriptor;
 	Local_Sockets_Map[id] = this;
-	rebuild_socksel_array();
+	rebuild_socksel_array = true;
 	log(format("%04u",socket.descriptor)
 		+ " Accepted new connection: " + socket.remote_ip_address
 		+ " port " + socket.remote_port);
@@ -217,7 +217,7 @@ function Unregistered_Commands() {
 			var new_server = Servers[cmd[1].toLowerCase()];
 			Local_Servers[this.id] = new_server;
 			Local_Sockets_Map[this.id] = new_server;
-			rebuild_socksel_array();
+			rebuild_socksel_array = true;
 			new_server.socket = this.socket;
 			new_server.hops = cmd[2];
 			new_server.info = IRC_string(cmdline);
@@ -317,7 +317,7 @@ function Unregistered_Commands() {
 		new_user = Users[this.nick.toUpperCase()];
 		Local_Sockets_Map[this.id] = new_user;
 		Local_Users[this.id] = new_user;
-		rebuild_socksel_array();
+		rebuild_socksel_array = true;
 		new_user.socket = this.socket;
 		new_user.nick = this.nick;
 		new_user.uprefix = this.uprefix;
@@ -356,6 +356,6 @@ function Unregistered_Quit(msg) {
 	delete Local_Sockets_Map[this.id];
 	delete Unregistered[this.id];
 	delete this;
-	rebuild_socksel_array();
+	rebuild_socksel_array = true;
 }
 
diff --git a/exec/load/ircd_user.js b/exec/load/ircd_user.js
index 2f76752368c4fe8c9341d1ecba41e57b746fae80..f4d5a6723f2cb22676bec08225e1414662bdce3c 100644
--- a/exec/load/ircd_user.js
+++ b/exec/load/ircd_user.js
@@ -1452,6 +1452,6 @@ function User_Quit(str,suppress_bcast,is_netsplit,origin) {
 	delete Local_Users[this.id];
 	delete Users[this.nick.toUpperCase()];
 	delete this;
-	rebuild_socksel_array();
+	rebuild_socksel_array = true;
 }