diff -Nru irssi-0.8.6.CVS/default.theme irssi-euirc-0.8.6.CVS/default.theme
--- irssi-0.8.6.CVS/default.theme	Mon Dec 23 11:10:02 2002
+++ irssi-euirc-0.8.6.CVS/default.theme	Thu Jul 31 01:12:37 2003
@@ -222,6 +222,8 @@
   # /names list
   names_prefix = "";
   names_nick = "[%_$0%_$1-] ";
+  names_nick_founder = "{names_nick $*}";
+  names_nick_admin = "{names_nick $*}";
   names_nick_op = "{names_nick $*}";
   names_nick_halfop = "{names_nick $*}";
   names_nick_voice = "{names_nick $*}";
diff -Nru irssi-0.8.6.CVS/src/core/channels.c irssi-euirc-0.8.6.CVS/src/core/channels.c
--- irssi-0.8.6.CVS/src/core/channels.c	Sun Dec  1 17:30:02 2002
+++ irssi-euirc-0.8.6.CVS/src/core/channels.c	Wed Jul 30 23:49:44 2003
@@ -222,10 +222,12 @@
 	const char *flags = server->get_nick_flags();
 
 	return strchr(flags, flag) == NULL ||
-		(flag == flags[0] && nick->op) ||
+		(flag == flags[0] && (nick->op || nick->admin || nick->founder)) ||
 		(flag == flags[1] && (nick->voice || nick->halfop ||
-				      nick->op)) ||
-		(flag == flags[2] && (nick->halfop || nick->op));
+				      nick->op || nick->admin || nick->founder)) ||
+		(flag == flags[2] && (nick->halfop || nick->op || nick->admin || nick->founder)) ||
+		(flag == flags[3] && (nick->admin || nick->founder)) ||
+		(flag == flags[4] && nick->founder);
 }
 
 /* Send the auto send command to channel */
diff -Nru irssi-0.8.6.CVS/src/core/nick-rec.h irssi-euirc-0.8.6.CVS/src/core/nick-rec.h
--- irssi-0.8.6.CVS/src/core/nick-rec.h	Tue Jan 15 15:07:19 2002
+++ irssi-euirc-0.8.6.CVS/src/core/nick-rec.h	Wed Jul 30 23:49:44 2003
@@ -16,6 +16,8 @@
 
 /* status in channel */
 unsigned int send_massjoin:1; /* Waiting to be sent in massjoin signal */
+unsigned int founder:1;
+unsigned int admin:1;
 unsigned int op:1;
 unsigned int halfop:1;
 unsigned int voice:1;
diff -Nru irssi-0.8.6.CVS/src/core/nicklist.c irssi-euirc-0.8.6.CVS/src/core/nicklist.c
--- irssi-0.8.6.CVS/src/core/nicklist.c	Wed Mar 13 02:30:20 2002
+++ irssi-euirc-0.8.6.CVS/src/core/nicklist.c	Wed Jul 30 23:49:44 2003
@@ -369,7 +369,11 @@
 	 * returns :-)
 	 * -- yath */
 
-	if (p1->op)
+	if (p1->founder)
+		status1 = 6;
+	else if (p1->admin)
+		status1 = 5;
+	else  if (p1->op)
 		status1 = 4;
 	else if (p1->halfop)
 		status1 = 3;
@@ -378,7 +382,11 @@
 	else
 		status1 = 1;
 
-	if (p2->op)
+	if (p2->founder)
+		status2 = 6;
+	else if (p2->admin)
+		status2 = 5;
+	else if (p2->op)
 		status2 = 4;
 	else if (p2->halfop)
 		status2 = 3;
diff -Nru irssi-0.8.6.CVS/src/fe-common/core/fe-channels.c irssi-euirc-0.8.6.CVS/src/fe-common/core/fe-channels.c
--- irssi-0.8.6.CVS/src/fe-common/core/fe-channels.c	Wed Sep 18 19:45:06 2002
+++ irssi-euirc-0.8.6.CVS/src/fe-common/core/fe-channels.c	Wed Jul 30 23:49:44 2003
@@ -399,7 +399,11 @@
 	for (tmp = nicklist; tmp != NULL; tmp = tmp->next) {
 		NICK_REC *rec = tmp->data;
 
-		if (rec->op)
+		if (rec->founder)
+			nickmode[0] = '*';
+		else if (rec->admin)
+			nickmode[0] = '!';
+		else if (rec->op)
 			nickmode[0] = '@';
 		else if (rec->halfop)
 			nickmode[0] = '%';
@@ -416,7 +420,9 @@
 		linebuf[columns[col]-item_extra] = '\0';
 		memcpy(linebuf, rec->nick, strlen(rec->nick));
 
-		formatnum = rec->op ? TXT_NAMES_NICK_OP :
+		formatnum = rec->founder ? TXT_NAMES_NICK_FOUNDER :
+			rec->admin ? TXT_NAMES_NICK_ADMIN :
+			rec->op ? TXT_NAMES_NICK_OP :
 			rec->halfop ? TXT_NAMES_NICK_HALFOP :
 			rec->voice ? TXT_NAMES_NICK_VOICE :
                         TXT_NAMES_NICK;
@@ -456,9 +462,9 @@
 {
 	NICK_REC *nick;
 	GSList *tmp, *nicklist, *sorted;
-	int nicks, normal, voices, halfops, ops;
+	int nicks, normal, voices, halfops, ops, founders, admins;
 
-	nicks = normal = voices = halfops = ops = 0;
+	founders = admins = nicks = normal = voices = halfops = ops = 0;
 	nicklist = nicklist_getnicks(channel);
 	sorted = NULL;
 
@@ -467,7 +473,15 @@
 		nick = tmp->data;
 
 		nicks++;
-		if (nick->op) {
+		if (nick->founder) {
+			founders++;
+			if ((flags & CHANNEL_NICKLIST_FLAG_FOUNDERS) == 0)
+				continue;
+		} else if (nick->admin) {
+			admins++;
+			if ((flags & CHANNEL_NICKLIST_FLAG_ADMINS) == 0)
+				continue;
+		} else if (nick->op) {
 			ops++;
 			if ((flags & CHANNEL_NICKLIST_FLAG_OPS) == 0)
                                 continue;
@@ -493,16 +507,15 @@
 	/* display the nicks */
         if ((flags & CHANNEL_NICKLIST_FLAG_COUNT) == 0) {
 		printformat(channel->server, channel->visible_name,
-			    MSGLEVEL_CLIENTCRAP, TXT_NAMES,
-			    channel->visible_name,
-			    nicks, ops, halfops, voices, normal);
+			    MSGLEVEL_CLIENTCRAP, TXT_NAMES, channel->name, nicks, founders, admins, ops, halfops, voices, normal);
 		display_sorted_nicks(channel, sorted);
 	}
 	g_slist_free(sorted);
 
 	printformat(channel->server, channel->visible_name,
 		    MSGLEVEL_CLIENTNOTICE, TXT_ENDOFNAMES,
-		    channel->visible_name, nicks, ops, halfops, voices, normal);
+		    channel->visible_name, nicks, founders, admins, ops, halfops,
+		    voices, normal);
 }
 
 /* SYNTAX: NAMES [-count | -ops -halfops -voices -normal] [<channels> | **] */
@@ -531,6 +544,10 @@
 	}
 
 	flags = 0;
+	if (g_hash_table_lookup(optlist, "founders") != NULL)
+		flags |= CHANNEL_NICKLIST_FLAG_FOUNDERS;
+	if (g_hash_table_lookup(optlist, "admins") != NULL)
+		flags |= CHANNEL_NICKLIST_FLAG_ADMINS;
 	if (g_hash_table_lookup(optlist, "ops") != NULL)
 		flags |= CHANNEL_NICKLIST_FLAG_OPS;
 	if (g_hash_table_lookup(optlist, "halfops") != NULL)
@@ -629,7 +646,7 @@
 	command_bind("cycle", NULL, (SIGNAL_FUNC) cmd_cycle);
 
 	command_set_options("channel add", "auto noauto -bots -botcmd");
-	command_set_options("names", "count ops halfops voices normal");
+	command_set_options("names", "count owners admins ops halfops voices normal");
 	command_set_options("join", "window");
 }
 
diff -Nru irssi-0.8.6.CVS/src/fe-common/core/fe-channels.h irssi-euirc-0.8.6.CVS/src/fe-common/core/fe-channels.h
--- irssi-0.8.6.CVS/src/fe-common/core/fe-channels.h	Sat Jul 14 20:19:22 2001
+++ irssi-euirc-0.8.6.CVS/src/fe-common/core/fe-channels.h	Wed Jul 30 23:49:44 2003
@@ -5,8 +5,10 @@
 #define CHANNEL_NICKLIST_FLAG_HALFOPS   0x02
 #define CHANNEL_NICKLIST_FLAG_VOICES    0x04
 #define CHANNEL_NICKLIST_FLAG_NORMAL    0x08
-#define CHANNEL_NICKLIST_FLAG_ALL       0x0f
-#define CHANNEL_NICKLIST_FLAG_COUNT     0x10
+#define CHANNEL_NICKLIST_FLAG_FOUNDERS	0x10
+#define CHANNEL_NICKLIST_FLAG_ADMINS	0x20
+#define CHANNEL_NICKLIST_FLAG_ALL       0x3f
+#define CHANNEL_NICKLIST_FLAG_COUNT     0x40
 
 void fe_channels_nicklist(CHANNEL_REC *channel, int flags);
 
diff -Nru irssi-0.8.6.CVS/src/fe-common/core/fe-messages.c irssi-euirc-0.8.6.CVS/src/fe-common/core/fe-messages.c
--- irssi-0.8.6.CVS/src/fe-common/core/fe-messages.c	Wed Dec  4 22:00:02 2002
+++ irssi-euirc-0.8.6.CVS/src/fe-common/core/fe-messages.c	Wed Jul 30 23:49:44 2003
@@ -123,6 +123,8 @@
         emptystr = settings_get_bool("show_nickmode_empty") ? " " : "";
 
 	return nickrec == NULL ? emptystr :
+		nickrec->founder ? "*" :
+		nickrec->admin ? "!" :
 		nickrec->op ? "@" :
 		nickrec->halfop ? "%" :
 		nickrec->voice ? "+" :
diff -Nru irssi-0.8.6.CVS/src/fe-common/core/module-formats.c irssi-euirc-0.8.6.CVS/src/fe-common/core/module-formats.c
--- irssi-0.8.6.CVS/src/fe-common/core/module-formats.c	Sat Dec 28 19:00:03 2002
+++ irssi-euirc-0.8.6.CVS/src/fe-common/core/module-formats.c	Wed Jul 30 23:49:44 2003
@@ -109,11 +109,13 @@
 	{ "current_channel", "Current channel {channel $0}", 1, { 0 } },
 	{ "names", "{names_users Users {names_channel $0}}", 6, { 0, 1, 1, 1, 1, 1 } },
 	{ "names_prefix", "%#{names_prefix $0}", 1, { 0 } },
+	{ "names_nick_founder", "{names_nick_founder $0 $1}", 2, { 0, 0 } },
+	{ "names_nick_admin", "{names_nick_admin $0 $1}", 2, { 0, 0 } },
         { "names_nick_op", "{names_nick_op $0 $1}", 2, { 0, 0 } },
         { "names_nick_halfop", "{names_nick_halfop $0 $1}", 2, { 0, 0 } },
         { "names_nick_voice", "{names_nick_voice $0 $1}", 2, { 0, 0 } },
         { "names_nick", "{names_nick $0 $1}", 2, { 0, 0 } },
-        { "endofnames", "{channel $0}: Total of {hilight $1} nicks {comment {hilight $2} ops, {hilight $3} halfops, {hilight $4} voices, {hilight $5} normal}", 6, { 0, 1, 1, 1, 1, 1 } },
+        { "endofnames", "{channel $0}: Total of {hilight $1} nicks {comment {hilight $2} owners, {hilight $3} admins, {hilight $4} ops, {hilight $5} halfops, {hilight $6} voices, {hilight $7} normal}", 8, { 0, 1, 1, 1, 1, 1, 1, 1 } },
 	{ "chanlist_header", "%#You are on the following channels:", 0 },
 	{ "chanlist_line", "%#{channel $[-10]0} %|+$1 ($2): $3", 4, { 0, 0, 0, 0 } },
 	{ "chansetup_not_found", "Channel {channel $0} not found", 2, { 0, 0 } },
diff -Nru irssi-0.8.6.CVS/src/fe-common/core/module-formats.h irssi-euirc-0.8.6.CVS/src/fe-common/core/module-formats.h
--- irssi-0.8.6.CVS/src/fe-common/core/module-formats.h	Sat Dec 28 19:00:03 2002
+++ irssi-euirc-0.8.6.CVS/src/fe-common/core/module-formats.h	Wed Jul 30 23:49:44 2003
@@ -85,6 +85,8 @@
 	TXT_CURRENT_CHANNEL,
 	TXT_NAMES,
 	TXT_NAMES_PREFIX,
+	TXT_NAMES_NICK_FOUNDER,
+	TXT_NAMES_NICK_ADMIN,
 	TXT_NAMES_NICK_OP,
 	TXT_NAMES_NICK_HALFOP,
 	TXT_NAMES_NICK_VOICE,
diff -Nru irssi-0.8.6.CVS/src/fe-common/irc/fe-netjoin.c irssi-euirc-0.8.6.CVS/src/fe-common/irc/fe-netjoin.c
--- irssi-0.8.6.CVS/src/fe-common/irc/fe-netjoin.c	Thu Jul 10 01:45:02 2003
+++ irssi-euirc-0.8.6.CVS/src/fe-common/irc/fe-netjoin.c	Wed Jul 30 23:49:44 2003
@@ -352,9 +352,10 @@
 }
 
 #define isnickmode(c) \
-	((c) == 'o' || (c) == 'v' || (c) == 'h')
+	((c) == 'q' || (c) == 'a' || (c) == 'o' || (c) == 'v' || (c) == 'h')
 #define nickmodechar(c) \
-	((c) == 'o' ? '@' : ((c) == 'v' ? '+' : ((c) == 'h' ? '%' : '\0')))
+	((c) == 'q' ? '*' : ((c) == 'a' ? '!' : ((c) == 'o' ? '@' : \
+	((c) == 'h' ? '%' : ((c) == 'v' ? '+' : '\0')))))
 
 static void msg_mode(IRC_SERVER_REC *server, const char *channel,
 		     const char *sender, const char *addr, const char *data)
diff -Nru irssi-0.8.6.CVS/src/irc/core/irc-expandos.c irssi-euirc-0.8.6.CVS/src/irc/core/irc-expandos.c
--- irssi-0.8.6.CVS/src/irc/core/irc-expandos.c	Mon Jun 10 23:00:07 2002
+++ irssi-euirc-0.8.6.CVS/src/irc/core/irc-expandos.c	Wed Jul 30 23:49:44 2003
@@ -82,13 +82,15 @@
 	return IS_IRC_SERVER(server) ? IRC_SERVER(server)->usermode : "";
 }
 
-/* expands to your usermode on channel, op '@', halfop '%', "+" voice */
+/* expands to your usermode on channel, op '@', halfop '%', "+" voice, ...*/
 static char *expando_cumode(SERVER_REC *server, void *item, int *free_ret)
 {
 	if (IS_IRC_CHANNEL(item) && CHANNEL(item)->ownnick) {
-		return NICK(CHANNEL(item)->ownnick)->op ? "@" :
-		       NICK(CHANNEL(item)->ownnick)->halfop ? "%" :
-		       NICK(CHANNEL(item)->ownnick)->voice ? "+" : "";
+		return NICK(CHANNEL(item)->ownnick)->founder ? "*" :
+			NICK(CHANNEL(item)->ownnick)->admin ? "!" :
+			NICK(CHANNEL(item)->ownnick)->op ? "@" :
+			NICK(CHANNEL(item)->ownnick)->halfop ? "%" :
+			NICK(CHANNEL(item)->ownnick)->voice ? "+" : "";
 	}
 	return "";
 }
diff -Nru irssi-0.8.6.CVS/src/irc/core/irc-nicklist.c irssi-euirc-0.8.6.CVS/src/irc/core/irc-nicklist.c
--- irssi-0.8.6.CVS/src/irc/core/irc-nicklist.c	Sat Dec  7 22:00:02 2002
+++ irssi-euirc-0.8.6.CVS/src/irc/core/irc-nicklist.c	Wed Jul 30 23:52:48 2003
@@ -31,7 +31,8 @@
 
 /* Add new nick to list */
 NICK_REC *irc_nicklist_insert(IRC_CHANNEL_REC *channel, const char *nick,
-			      int op, int halfop, int voice, int send_massjoin)
+			      int founder, int admin, int op, int halfop,
+			      int voice, int send_massjoin)
 {
 	NICK_REC *rec;
 
@@ -41,6 +42,8 @@
 	rec = g_new0(NICK_REC, 1);
 	rec->nick = g_strdup(nick);
 
+	if (founder) rec->founder = TRUE;
+	if (admin) rec->admin = TRUE;
 	if (op) rec->op = TRUE;
 	if (halfop) rec->halfop = TRUE;
 	if (voice) rec->voice = TRUE;
@@ -78,7 +81,7 @@
 {
 	IRC_CHANNEL_REC *chanrec;
 	char *params, *type, *channel, *names, *ptr;
-        int op, halfop, voice;
+        int founder, admin, op, halfop, voice;
 
 	g_return_if_fail(data != NULL);
 
@@ -117,9 +120,15 @@
 		   showing "@+nick" and since none of these chars are valid
 		   nick chars, just check them until a non-nickflag char is
 		   found. FIXME: we just ignore owner char now. */
-		op = halfop = voice = FALSE;
+		founder = admin = op = halfop = voice = FALSE;
 		while (isnickflag(*ptr)) {
 			switch (*ptr) {
+			case '*':
+				founder = TRUE;
+				break;
+			case '!':
+				admin = TRUE;
+				break;
 			case '@':
                                 op = TRUE;
                                 break;
@@ -134,7 +143,7 @@
 		}
 
 		if (nicklist_find((CHANNEL_REC *) chanrec, ptr) == NULL) {
-			irc_nicklist_insert(chanrec, ptr, op, halfop,
+			irc_nicklist_insert(chanrec, ptr, founder, admin, op, halfop,
 					    voice, FALSE);
 		}
 	}
@@ -162,7 +171,8 @@
 			nicks = g_hash_table_size(chanrec->nicks);
 			ownnick = irc_nicklist_insert(chanrec, server->nick,
 						      nicks == 0, FALSE,
-						      FALSE, FALSE);
+						      FALSE, FALSE, FALSE, 
+						      FALSE);
 		}
 		nicklist_set_own(CHANNEL(chanrec), ownnick);
                 chanrec->chanop = chanrec->ownnick->op;
@@ -378,7 +388,7 @@
 
 static const char *get_nick_flags(void)
 {
-        return "@+%";
+        return "@+%!*";
 }
 
 static void sig_connected(IRC_SERVER_REC *server)
diff -Nru irssi-0.8.6.CVS/src/irc/core/irc-nicklist.h irssi-euirc-0.8.6.CVS/src/irc/core/irc-nicklist.h
--- irssi-0.8.6.CVS/src/irc/core/irc-nicklist.h	Sun Dec  9 18:13:47 2001
+++ irssi-euirc-0.8.6.CVS/src/irc/core/irc-nicklist.h	Wed Jul 30 23:49:44 2003
@@ -5,7 +5,7 @@
 
 /* Add new nick to list */
 NICK_REC *irc_nicklist_insert(IRC_CHANNEL_REC *channel, const char *nick,
-			      int op, int halfop, int voice, int send_massjoin);
+			      int founder, int admin, int op, int halfop, int voice, int send_massjoin);
 
 /* Remove all "extra" characters from `nick'. Like _nick_ -> nick */
 char *irc_nick_strip(const char *nick);
diff -Nru irssi-0.8.6.CVS/src/irc/core/irc-session.c irssi-euirc-0.8.6.CVS/src/irc/core/irc-session.c
--- irssi-0.8.6.CVS/src/irc/core/irc-session.c	Sat Feb 16 11:41:32 2002
+++ irssi-euirc-0.8.6.CVS/src/irc/core/irc-session.c	Wed Jul 30 23:49:44 2003
@@ -75,7 +75,7 @@
 				     CONFIG_NODE *node)
 {
 	const char *nick;
-        int op, halfop, voice;
+        int founder, admin, op, halfop, voice;
         NICK_REC *nickrec;
 
 	if (!IS_IRC_CHANNEL(channel))
@@ -85,10 +85,13 @@
 	if (nick == NULL)
                 return;
 
+	founder = config_node_get_bool(node, "founder", FALSE);
+	admin = config_node_get_bool(node, "admin", FALSE);
 	op = config_node_get_bool(node, "op", FALSE);
         voice = config_node_get_bool(node, "voice", FALSE);
         halfop = config_node_get_bool(node, "halfop", FALSE);
-	nickrec = irc_nicklist_insert(channel, nick, op, halfop, voice, FALSE);
+	nickrec = irc_nicklist_insert(channel, nick, founder, admin, op,
+			halfop, voice, FALSE);
 }
 
 static void session_restore_channel(IRC_CHANNEL_REC *channel)
diff -Nru irssi-0.8.6.CVS/src/irc/core/irc.h irssi-euirc-0.8.6.CVS/src/irc/core/irc.h
--- irssi-0.8.6.CVS/src/irc/core/irc.h	Tue Jan 21 08:10:02 2003
+++ irssi-euirc-0.8.6.CVS/src/irc/core/irc.h	Wed Jul 30 23:56:33 2003
@@ -20,8 +20,8 @@
 	(a) == '+' || (a) == '=' || (a) == '-')
 
 #define isnickflag(a) \
-	((a) == '@' || (a) == '+' || (a) == '%' || /* op / voice */ \
-	(a) == '%' || (a) == '.' || (a) == '!') /* extensions: half-op / owners */
+ 	((a) == '@' || (a) == '+' || (a) == '%' || /* op / voice  / halfop*/ \
+ 	(a) == '*' || (a) == '!' || (a) == '.') /* founder / admin / owner */
 
 #define ischannel(a) \
 	((a) == '#' || /* normal */ \
diff -Nru irssi-0.8.6.CVS/src/irc/core/massjoin.c irssi-euirc-0.8.6.CVS/src/irc/core/massjoin.c
--- irssi-0.8.6.CVS/src/irc/core/massjoin.c	Tue Aug 27 15:00:07 2002
+++ irssi-euirc-0.8.6.CVS/src/irc/core/massjoin.c	Wed Jul 30 23:49:44 2003
@@ -65,7 +65,7 @@
 	}
 
 	/* add user to nicklist */
-	nickrec = irc_nicklist_insert(chanrec, nick, FALSE, FALSE, FALSE, TRUE);
+	nickrec = irc_nicklist_insert(chanrec, nick, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE);
         nicklist_set_host(CHANNEL(chanrec), nickrec, address);
 
 	if (chanrec->massjoins == 0) {
diff -Nru irssi-0.8.6.CVS/src/irc/core/modes.c irssi-euirc-0.8.6.CVS/src/irc/core/modes.c
--- irssi-0.8.6.CVS/src/irc/core/modes.c	Mon Dec  9 23:00:02 2002
+++ irssi-euirc-0.8.6.CVS/src/irc/core/modes.c	Wed Jul 30 23:49:44 2003
@@ -43,6 +43,8 @@
 	nickrec = nicklist_find(CHANNEL(channel), nick);
 	if (nickrec == NULL) return; /* No /names list got yet */
 
+	if (mode == '*') nickrec->founder = type == '+';
+	if (mode == '!') nickrec->admin = type == '+';
 	if (mode == '@') nickrec->op = type == '+';
 	if (mode == '+') nickrec->voice = type == '+';
 	if (mode == '%') nickrec->halfop = type == '+';
@@ -236,6 +238,12 @@
 			else
 				banlist_remove(channel, arg);
 			break;
+		case 'q':
+			nick_mode_change(channel, arg, '*', type, setby);
+			break;
+		case 'a':
+			nick_mode_change(channel, arg, '!', type, setby);
+			break;
 		case 'o':
 		case 'O': /* channel owner in !channels */
 			if (g_strcasecmp(channel->server->nick, arg) == 0)
@@ -269,7 +277,6 @@
 			break;
 		case 'e':
 		case 'I':
-		case 'q':
 		case 'd':
 			/* Don't set it as channel mode */
 			break;
diff -Nru irssi-0.8.6.CVS/src/irc/core/modes.h irssi-euirc-0.8.6.CVS/src/irc/core/modes.h
--- irssi-0.8.6.CVS/src/irc/core/modes.h	Tue Aug 27 21:45:07 2002
+++ irssi-euirc-0.8.6.CVS/src/irc/core/modes.h	Wed Jul 30 23:49:44 2003
@@ -5,7 +5,7 @@
 #define HAS_MODE_ARG_ALWAYS(mode) \
 	((mode) == 'b' || (mode) == 'e' || (mode) == 'I' || (mode) == 'q' || \
         (mode) == 'd' || (mode) == 'o' || (mode) == 'h' || (mode) == 'v' || \
-        (mode) == 'O' || (mode) == 'k' || (mode) == 'f')
+        (mode) == 'O' || (mode) == 'k' || (mode) == 'a' || (mode) == 'f')
 
 /* modes that have argument when being set (+) */
 #define HAS_MODE_ARG_SET(mode) \
diff -Nru irssi-0.8.6.CVS/src/irc/core/netsplit.c irssi-euirc-0.8.6.CVS/src/irc/core/netsplit.c
--- irssi-0.8.6.CVS/src/irc/core/netsplit.c	Tue Jun  3 23:45:02 2003
+++ irssi-euirc-0.8.6.CVS/src/irc/core/netsplit.c	Wed Jul 30 23:49:44 2003
@@ -132,6 +132,8 @@
 
 		splitchan = g_new0(NETSPLIT_CHAN_REC, 1);
 		splitchan->name = g_strdup(channel->visible_name);
+		splitchan->founder = nickrec->founder;
+		splitchan->admin = nickrec->admin;
 		splitchan->op = nickrec->op;
 		splitchan->halfop = nickrec->halfop;
 		splitchan->voice = nickrec->voice;
diff -Nru irssi-0.8.6.CVS/src/irc/core/netsplit.h irssi-euirc-0.8.6.CVS/src/irc/core/netsplit.h
--- irssi-0.8.6.CVS/src/irc/core/netsplit.h	Tue Dec 11 00:32:46 2001
+++ irssi-euirc-0.8.6.CVS/src/irc/core/netsplit.h	Wed Jul 30 23:49:44 2003
@@ -25,6 +25,8 @@
 
 typedef struct {
 	char *name;
+	unsigned int founder:1;
+	unsigned int admin:1;
 	unsigned int op:1;
 	unsigned int halfop:1;
 	unsigned int voice:1;
diff -Nru irssi-0.8.6.CVS/src/irc/proxy/dump.c irssi-euirc-0.8.6.CVS/src/irc/proxy/dump.c
--- irssi-0.8.6.CVS/src/irc/proxy/dump.c	Fri Dec  7 16:58:58 2001
+++ irssi-euirc-0.8.6.CVS/src/irc/proxy/dump.c	Wed Jul 30 23:49:44 2003
@@ -177,7 +177,11 @@
 		else
 			g_string_append_c(str, ' ');
 
-		if (nick->op)
+		if (nick->founder)
+			g_string_append_c(str, '*');
+		else if (nick->admin)
+			g_string_append_c(str, '!');
+		else if (nick->op)
                         g_string_append_c(str, '@');
 		else if (nick->halfop)
                         g_string_append_c(str, '%');
diff -Nru irssi-0.8.6.CVS/src/perl/irc/Channel.xs irssi-euirc-0.8.6.CVS/src/perl/irc/Channel.xs
--- irssi-0.8.6.CVS/src/perl/irc/Channel.xs	Thu May 16 02:34:36 2002
+++ irssi-euirc-0.8.6.CVS/src/perl/irc/Channel.xs	Wed Jul 30 23:49:44 2003
@@ -50,14 +50,16 @@
 	}
 
 Irssi::Irc::Nick
-irc_nick_insert(channel, nick, op, halfop, voice, send_massjoin)
+irc_nick_insert(channel, nick, founder, admin, op, halfop, voice, send_massjoin)
 	Irssi::Irc::Channel channel
 	char *nick
+	int founder
+	int admin
 	int op
 	int halfop
 	int voice
 	int send_massjoin
 CODE:
-	RETVAL = irc_nicklist_insert(channel, nick, op, halfop, voice, send_massjoin);
+	RETVAL = irc_nicklist_insert(channel, nick, founder, admin, op, halfop, voice, send_massjoin);
 OUTPUT:
 	RETVAL
diff -Nru irssi-0.8.6.CVS/src/perl/irc/Irc.xs irssi-euirc-0.8.6.CVS/src/perl/irc/Irc.xs
--- irssi-0.8.6.CVS/src/perl/irc/Irc.xs	Sun Jul  6 16:15:03 2003
+++ irssi-euirc-0.8.6.CVS/src/perl/irc/Irc.xs	Wed Jul 30 23:49:44 2003
@@ -119,6 +119,8 @@
 static void perl_netsplit_channel_fill_hash(HV *hv, NETSPLIT_CHAN_REC *rec)
 {
 	hv_store(hv, "name", 4, new_pv(rec->name), 0);
+	hv_store(hv, "founder", 2, newSViv(rec->founder), 0);
+	hv_store(hv, "admin", 2, newSViv(rec->admin), 0);
 	hv_store(hv, "op", 2, newSViv(rec->op), 0);
 	hv_store(hv, "halfop", 6, newSViv(rec->halfop), 0);
 	hv_store(hv, "voice", 5, newSViv(rec->voice), 0);
diff -Nru irssi-0.8.6.CVS/src/perl/perl-common.c irssi-euirc-0.8.6.CVS/src/perl/perl-common.c
--- irssi-0.8.6.CVS/src/perl/perl-common.c	Sat Jan 25 04:30:02 2003
+++ irssi-euirc-0.8.6.CVS/src/perl/perl-common.c	Wed Jul 30 23:49:44 2003
@@ -433,6 +433,8 @@
 	hv_store(hv, "gone", 4, newSViv(nick->gone), 0);
 	hv_store(hv, "serverop", 8, newSViv(nick->serverop), 0);
 
+	hv_store(hv, "founder", 7, newSViv(nick->founder), 0);
+	hv_store(hv, "admin", 5, newSViv(nick->admin), 0);
 	hv_store(hv, "op", 2, newSViv(nick->op), 0);
 	hv_store(hv, "halfop", 6, newSViv(nick->halfop), 0);
 	hv_store(hv, "voice", 5, newSViv(nick->voice), 0);

