Index: account.c
===================================================================
--- account.c	(revision fef6116e89bb0651c72454effbb51e04e9e1b8dc)
+++ account.c	(revision 5100caa16bb707d89f1873aca99b5f87abc1dd56)
@@ -72,5 +72,5 @@
 	
 	/* Double-check: We refuse to edit on-line accounts. */
-	if( set->flags & ACC_SET_OFFLINE_ONLY && acc->gc )
+	if( acc->gc )
 		return NULL;
 	
Index: irc.c
===================================================================
--- irc.c	(revision fef6116e89bb0651c72454effbb51e04e9e1b8dc)
+++ irc.c	(revision 5100caa16bb707d89f1873aca99b5f87abc1dd56)
@@ -649,53 +649,54 @@
 void irc_names( irc_t *irc, char *channel )
 {
-	user_t *u;
-	char namelist[385] = "";
+	user_t *u = irc->users;
+	char *s;
+	int control = ( g_strcasecmp( channel, irc->channel ) == 0 );
 	struct conversation *c = NULL;
+	
+	if( !control )
+		c = conv_findchannel( channel );
 	
 	/* RFCs say there is no error reply allowed on NAMES, so when the
 	   channel is invalid, just give an empty reply. */
 	
-	if( g_strcasecmp( channel, irc->channel ) == 0 )
-	{
-		for( u = irc->users; u; u = u->next ) if( u->online )
-		{
-			if( strlen( namelist ) + strlen( u->nick ) > sizeof( namelist ) - 4 )
+	if( control || c ) while( u )
+	{
+		if( u->online )
+		{
+			if( u->gc && control )
 			{
-				irc_reply( irc, 353, "= %s :%s", channel, namelist );
-				*namelist = 0;
+				if( set_getint( &irc->set, "away_devoice" ) && !u->away )
+					s = "+";
+				else
+					s = "";
+				
+				irc_reply( irc, 353, "= %s :%s%s", channel, s, u->nick );
 			}
-			
-			if( u->gc && !u->away && set_getbool( &irc->set, "away_devoice" ) )
-				strcat( namelist, "+" );
-			
-			strcat( namelist, u->nick );
-			strcat( namelist, " " );
-		}
-	}
-	else if( ( c = conv_findchannel( channel ) ) )
+			else if( !u->gc )
+			{
+				if( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( set_getstr( &irc->set, "ops" ), "root" ) == 0 || strcmp( set_getstr( &irc->set, "ops" ), "both" ) == 0 ) )
+					s = "@";
+				else if( strcmp( u->nick, irc->nick ) == 0 && ( strcmp( set_getstr( &irc->set, "ops" ), "user" ) == 0 || strcmp( set_getstr( &irc->set, "ops" ), "both" ) == 0 ) )
+					s = "@";
+				else
+					s = "";
+				
+				irc_reply( irc, 353, "= %s :%s%s", channel, s, u->nick );
+			}
+		}
+		
+		u = u->next;
+	}
+	
+	/* For non-controlchannel channels (group conversations) only root and
+	   you are listed now. Time to show the channel people: */
+	if( !control && c )
 	{
 		GList *l;
-		char *ops = set_getstr( &irc->set, "ops" );
-		
-		/* root and the user aren't in the channel userlist but should
-		   show up in /NAMES, so list them first: */
-		sprintf( namelist, "%s%s %s%s ", strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->mynick,
-		                                 strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->nick );
-		
-		for( l = c->in_room; l; l = l->next ) if( ( u = user_findhandle( c->gc, l->data ) ) )
-		{
-			if( strlen( namelist ) + strlen( u->nick ) > sizeof( namelist ) - 4 )
-			{
-				irc_reply( irc, 353, "= %s :%s", channel, namelist );
-				*namelist = 0;
-			}
-			
-			strcat( namelist, u->nick );
-			strcat( namelist, " " );
-		}
-	}
-	
-	if( *namelist )
-		irc_reply( irc, 353, "= %s :%s", channel, namelist );
+		
+		for( l = c->in_room; l; l = l->next )
+			if( ( u = user_findhandle( c->gc, l->data ) ) )
+				irc_reply( irc, 353, "= %s :%s%s", channel, "", u->nick );
+	}
 	
 	irc_reply( irc, 366, "%s :End of /NAMES list", channel );
Index: set.h
===================================================================
--- set.h	(revision fef6116e89bb0651c72454effbb51e04e9e1b8dc)
+++ set.h	(revision 5100caa16bb707d89f1873aca99b5f87abc1dd56)
@@ -45,5 +45,4 @@
 G_MODULE_EXPORT char *set_getstr( set_t **head, char *key );
 G_MODULE_EXPORT int set_getint( set_t **head, char *key );
-G_MODULE_EXPORT int set_getbool( set_t **head, char *key );
 int set_setstr( set_t **head, char *key, char *value );
 int set_setint( set_t **head, char *key, int value );
