--- ircii-2.8.12beta-test/include/server.h	Thu Oct 12 08:19:56 1995
+++ ircii-2.8.12beta/include/server.h	Sat Apr 20 22:38:55 1996
@@ -34,6 +34,7 @@
 	char	*name;			/* the name of the server */
 	char	*itsname;		/* the server's idea of its name */
 	char	*password;		/* password for that server */
+	char	*umodes;		/* the various usermode flags */
 	int	port;			/* port number on that server */
 	char	*nickname;		/* nickname for this server */
 	char	*away;			/* away message for this server */
@@ -128,6 +129,7 @@
 	int	is_server_connected _((int));
 	void	flush_server _((void));
 	int	get_server_flag _((int, int));
+	void	get_server_umodes _((int, char *));
 	void	set_server_operator _((int, int));
 	void	server_is_connected _((int, int));
 	int	parse_server_index _((char *));
@@ -149,11 +151,10 @@
 	/* server_list: the list of servers that the user can connect to,etc */
 	extern	Server	*server_list;
 
+#define SERV_NULL	0x0000
 #define	SERVER_2_6_2	0x0001
-#define	USER_MODE_I	0x0002
-#define	USER_MODE_W	0x0004
-#define	USER_MODE_S	0x0008
-#define CLOSE_PENDING	0x0010
-#define LOGGED_IN	0x0020
+#define CLOSE_PENDING	0x0002
+#define LOGGED_IN	0x0004
+#define UMODE_SIZE	10
 
 #endif /* __server_h_ */
--- ircii-2.8.12beta-test/source/edit.c	Tue Oct 31 02:48:19 1995
+++ ircii-2.8.12beta/source/edit.c	Sun Apr 14 17:25:15 1996
@@ -1583,6 +1583,7 @@
 		*args,
 		*subargs;
 {
+	char buf[10];
 	if (strcmp(command, "WALL") == 0)
 	{	/* I hate this */
 		message_from(NULL, LOG_WALL);
@@ -1592,7 +1593,8 @@
 	else
 	{
 		message_from(NULL, LOG_WALLOP);
-		if (!get_server_flag(from_server, USER_MODE_W))
+		get_server_umodes(from_server, buf);
+		if (strchr(buf, (int) 'w'))
 			put_it("!! %s", args);
 	}
 	if (!in_on_who)
--- ircii-2.8.12beta-test/source/funny.c	Tue Sep  5 08:39:37 1995
+++ ircii-2.8.12beta/source/funny.c	Sat Apr 20 22:43:25 1996
@@ -362,7 +362,7 @@
 
 	while (*modes)
 	{
-		switch(*modes++)
+		switch(*modes)
 		{
 		case '-':
 			onoff=0;
@@ -373,39 +373,26 @@
 		case 'o':
 		case 'O':
 			set_server_operator(parsing_server_index, onoff);
+			set_server_flag(parsing_server_index, (int) *modes, onoff);
 			break;
-		case 's':
-		case 'S':
-			set_server_flag(parsing_server_index, USER_MODE_S, onoff);
-			break;
-		case 'i':
-		case 'I':
-			set_server_flag(parsing_server_index, USER_MODE_I, onoff);
-			break;
-		case 'w':
-		case 'W':
-			set_server_flag(parsing_server_index, USER_MODE_W, onoff);
+		default:
+			set_server_flag(parsing_server_index, (int) *modes, onoff);
 			break;
 		}
+	modes++;
 	}
 }
 
 void
 reinstate_user_modes()
 {
-	char	modes[10];
+	char	modes[UMODE_SIZE];
 	char	*c;
 
 	if (get_server_version(parsing_server_index) < Server2_7)
 		return;
-	c = modes;
-	if (get_server_flag(parsing_server_index, USER_MODE_W))
-		*c++ = 'w';
-	if (get_server_flag(parsing_server_index, USER_MODE_S))
-		*c++ = 's';
-	if (get_server_flag(parsing_server_index, USER_MODE_I))
-		*c++ = 'i';
-	*c = '\0';
+	get_server_umodes(parsing_server_index, modes);
+	c = modes; 
 	if (c != modes)
 		send_to_server("MODE %s +%s",
 			get_server_nickname(parsing_server_index),
--- ircii-2.8.12beta-test/source/irc.c	Wed Nov  1 04:38:07 1995
+++ ircii-2.8.12beta/source/irc.c	Sat Apr 20 23:00:59 1996
@@ -10,7 +10,7 @@
 static	char	rcsid[] = "@(#)$Id: irc.c,v 1.111.2.2 1995/11/01 12:38:07 mrg Exp $";
 #endif
 
-#define IRCII_VERSION	"2.8.12beta"
+#define IRCII_VERSION	"2.8.12beta+rak"
 
 /*
  * INTERNAL_VERSION is the number that the special alias $V returns.
--- ircii-2.8.12beta-test/source/numbers.c	Tue Oct 24 06:57:39 1995
+++ ircii-2.8.12beta/source/numbers.c	Sun Apr 14 17:29:45 1996
@@ -538,9 +538,11 @@
 		if (do_hook(current_numeric, "%s %s", from, *ArgList))
 			display_msg(from, ArgList);
 		set_server_operator(parsing_server_index, 1);
-		set_server_flag(parsing_server_index, USER_MODE_S, 1);
-		set_server_flag(parsing_server_index, USER_MODE_W, 1);
-		update_all_status();	/* fix the status line */
+/*		set_server_flag(parsing_server_index, 's', 1);
+		set_server_flag(parsing_server_index, 'w', 1);
+*/		/* DALnet hack */
+/*		set_server_flag(parsing_server_index, 'g', 1);
+*/		update_all_status();	/* fix the status line */
 		break;
 
 	case 401:		/* #define ERR_NOSUCHNICK       401 */
--- ircii-2.8.12beta-test/source/server.c	Thu Oct 26 05:05:51 1995
+++ ircii-2.8.12beta/source/server.c	Sat Apr 20 22:40:45 1996
@@ -120,6 +120,7 @@
 		server_list[i].connected = 0;
 		server_list[i].buffer = (char *) 0;
 		server_list[i].flags = 0;
+		server_list[i].umodes = (char *) 0;
 		if (-1 != server_list[i].write)
 		{
 			if (message && *message)
@@ -400,6 +401,7 @@
 		server_list[from_server].password = (char *) 0;
 		server_list[from_server].away = (char *) 0;
 		server_list[from_server].version_string = (char *) 0;
+		server_list[from_server].umodes = (char *) 0;
 		server_list[from_server].operator = 0;
 		server_list[from_server].read = -1;
 		server_list[from_server].write = -1;
@@ -483,6 +485,8 @@
 		new_free(&server_list[i].version_string);
 	if (server_list[i].nickname)
 		new_free(&server_list[i].nickname);
+	if (server_list[i].umodes)
+		new_free(&server_list[i].umodes);
 	if (server_list[i].whois_stuff.nick)
 		new_free(&server_list[i].whois_stuff.nick);
 	if (server_list[i].whois_stuff.user)
@@ -1381,7 +1385,9 @@
 	int	server_index,
 		value;
 {
-	set_server_flag(server_index, SERVER_2_6_2, value);
+	if (server_index == -1)
+		server_index = primary_server;
+	server_list[server_index].flags &= ~SERVER_2_6_2;
 }
 
 int
@@ -1399,12 +1405,38 @@
 	int	flag;
 	int	value;
 {
+	char *offset = (char *) 0;
+	char newlist[UMODE_SIZE], oldlist[UMODE_SIZE]; /* This large enough to cover all usermodes?? */
+
+	int count = 0; 
+
 	if (server_index == -1)
 		server_index = primary_server;
-	if (value)
-		server_list[server_index].flags |= flag;
+	if (server_list[server_index].umodes)
+	{
+		offset = strchr (server_list[server_index].umodes, flag);
+		strcpy(oldlist, server_list[server_index].umodes);
+	}
 	else
-		server_list[server_index].flags &= ~flag;
+		oldlist[0]='\0';
+	if ((value) && (!offset))
+	{
+		while (((int) oldlist[count] < flag) && 
+		(oldlist[count] != '\0'))
+			newlist[count] = oldlist[count++];
+		newlist[count++]=(char) flag;
+		while (newlist[count] = oldlist[count++ - 1])
+			;
+		malloc_strcpy(&server_list[server_index].umodes, newlist);
+	}
+	else if ((!value) && (offset))
+	{
+		while (oldlist[count] != (char) flag)
+			newlist[count]=oldlist[count++];
+		while ((newlist[count] = oldlist[count+1]) != '\0')
+			count++;
+		malloc_strcpy(&server_list[server_index].umodes, newlist);
+	}
 }
 
 int
@@ -1415,6 +1447,19 @@
 	if (server_index == -1)
 		server_index = primary_server;
 	return server_list[server_index].flags & value;
+}
+
+void
+get_server_umodes(server_index, buf)
+	int	server_index;
+	char	buf[UMODE_SIZE];
+{
+	if (server_index == -1)
+		server_index = primary_server;
+	if (server_list[server_index].umodes)
+		strncpy(buf, server_list[server_index].umodes, (size_t) UMODE_SIZE);
+	else
+		buf[0]='\0';
 }
 
 /*
--- ircii-2.8.12beta-test/source/status.c	Sat Oct 28 21:25:31 1995
+++ ircii-2.8.12beta/source/status.c	Sun Apr 14 17:11:14 1996
@@ -901,17 +901,8 @@
 		malloc_strcpy(&ptr, empty_string);
 	else
 	{
-		c = localbuf;
-		if (get_server_flag(window->server, USER_MODE_I))
-			*c++ = 'i';
-		if (get_server_operator(window->server))
-			*c++ = 'o';
-		if (get_server_flag(window->server, USER_MODE_S))
-			*c++ = 's';
-		if (get_server_flag(window->server, USER_MODE_W))
-			*c++ = 'w';
-		*c++ = '\0';
-		if (*localbuf!='\0')
+		get_server_umodes(window->server, localbuf);
+		if (*localbuf)
 		{
 			sprintf(buffer, umode_format, localbuf);
 			malloc_strcpy(&ptr, buffer);
