diff -ur bahamut-1.8.6-orig/include/h.h bahamut-1.8.6/include/h.h
--- bahamut-1.8.6-orig/include/h.h	2008-10-10 10:52:21.000000000 -0700
+++ bahamut-1.8.6/include/h.h	2009-04-22 22:12:18.004214129 -0700
@@ -91,6 +91,7 @@
 extern char 	*canonize(char *);
 extern void 	 check_fdlists();
 extern aChannel *find_channel(char *, aChannel *);
+extern void	flush_user_banserial(aClient *);
 extern aBan 	*nick_is_banned(aChannel *, char *, aClient *);
 extern void 	 remove_matching_bans(aChannel *, aClient *, aClient *);
 #ifdef EXEMPT_LISTS
diff -ur bahamut-1.8.6-orig/src/channel.c bahamut-1.8.6/src/channel.c
--- bahamut-1.8.6-orig/src/channel.c	2009-03-16 14:06:08.000000000 -0700
+++ bahamut-1.8.6/src/channel.c	2009-04-22 22:18:59.982371191 -0700
@@ -537,6 +537,26 @@
     return 0;
 }
 
+/*
+ * Forces the cached banned status for a user to be flushed in all the channels
+ * they are in.
+ */
+void flush_user_banserial(aClient *cptr)
+{
+	Link *ptr;
+
+	if (!IsPerson(cptr))
+		return;
+	for (ptr = cptr->user->channel; ptr; ptr = ptr->next)
+	{
+		aChannel *chptr = ptr->value.chptr;
+		chanMember *cm = find_user_member(chptr->members, cptr);
+
+		if (cm)
+			cm->banserial = chptr->banserial - 1;
+	}
+}
+
 aBan *nick_is_banned(aChannel *chptr, char *nick, aClient *cptr)
 {
     aBan *ban;
diff -ur bahamut-1.8.6-orig/src/m_services.c bahamut-1.8.6/src/m_services.c
--- bahamut-1.8.6-orig/src/m_services.c	2008-12-21 06:52:09.000000000 -0800
+++ bahamut-1.8.6/src/m_services.c	2009-04-22 22:12:49.431584592 -0700
@@ -230,6 +230,7 @@
     strcpy(acptr->name, newnick);
     add_to_client_hash_table(acptr->name, acptr);
     hash_check_watch(acptr, RPL_LOGON);
+    flush_user_banserial(acptr);
 
     return 0;
 }
