Index: .bzrignore
===================================================================
--- .bzrignore	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ .bzrignore	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -11,3 +11,2 @@
 encode
 bitlbee.pc
-.gdb_history
Index: doc/user-guide/commands.xml
===================================================================
--- doc/user-guide/commands.xml	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ doc/user-guide/commands.xml	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -197,13 +197,8 @@
 		<syntax>block &lt;nick&gt;</syntax>
 		<syntax>block &lt;connection&gt; &lt;handle&gt;</syntax>
-		<syntax>block &lt;connection&gt;</syntax>
 
 		<description>
 			<para>
 				Puts the specified user on your ignore list. Either specify the user's nick when you have him/her in your contact list or a connection number and a user handle.
-			</para>
-			
-			<para>
-				When called with only a connection specification as an argument, the command displays the current block list for that connection.
 			</para>
 		</description>
@@ -219,8 +214,4 @@
 				Reverse of block. Unignores the specified user or user handle on specified connection.
 			</para>
-			
-			<para>
-				When called with only a connection specification as an argument, the command displays the current allow list for that connection.
-			</para>
 		</description>
 	</bitlbee-command>
Index: help.c
===================================================================
--- help.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ help.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -116,5 +116,5 @@
 		h = h->next;
 	}
-	if( h && h->length > 0 )
+	if( h )
 	{
 		char *s = g_new( char, h->length + 1 );
@@ -123,12 +123,13 @@
 		{
 			g_free( h );
-			*help = NULL;
-			return NULL;
+			*help=NULL;
+			return( NULL );
 		}
 		mtime = stat->st_mtime;
 		
-		if( mtime > h->mtime )
-			return NULL;
-		
+		if( mtime > h->mtime ) {
+			return( NULL );
+			return( g_strdup( "Help file changed during this session. Please restart to get help back." ) );
+		}
 		s[h->length] = 0;
 		if( h->fd >= 0 )
@@ -141,7 +142,7 @@
 			strncpy( s, h->offset.mem_offset, h->length );
 		}
-		return s;
+		return( s );
 	}
 	
-	return NULL;
+	return( NULL );
 }
Index: ipc.c
===================================================================
--- ipc.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ ipc.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -84,4 +84,6 @@
 void ipc_master_cmd_restart( irc_t *data, char **cmd )
 {
+	struct bitlbee_child *child = (void*) data;
+	
 	if( global.conf->runmode != RUNMODE_FORKDAEMON )
 	{
Index: irc.c
===================================================================
--- irc.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ irc.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -232,10 +232,7 @@
 	irc_connection_list = g_slist_remove( irc_connection_list, irc );
 	
-	for (account = irc->accounts; account; account = account->next) {
+	for (account = irc->accounts; account; account = account->next)
 		if (account->gc)
-			account_offline(account->gc);
-		else if (account->reconnect)
-			g_source_remove(account->reconnect);
-	}
+			signoff(account->gc);
 	
 	g_free(irc->sendbuffer);
Index: irc.h
===================================================================
--- irc.h	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ irc.h	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -33,5 +33,5 @@
 #define IRC_PING_STRING "PinglBee"
 
-#define UMODES "abisw"
+#define UMODES "iasw"
 #define UMODES_PRIV "Ro"
 #define CMODES "nt"
Index: irc_commands.c
===================================================================
--- irc_commands.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ irc_commands.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -509,9 +509,4 @@
 	irc->last_pong = gettime();
 	irc->pinging = 0;
-}
-
-static void irc_cmd_version( irc_t *irc, char **cmd )
-{
-	irc_reply( irc, 351, "bitlbee-%s. %s :%s/%s ", BITLBEE_VERSION, irc->myhost, ARCH, CPU );
 }
 
@@ -573,5 +568,4 @@
 	{ "motd",        0, irc_cmd_motd,        IRC_CMD_LOGGED_IN },
 	{ "pong",        0, irc_cmd_pong,        IRC_CMD_LOGGED_IN },
-	{ "version",     0, irc_cmd_version,     IRC_CMD_LOGGED_IN },
 	{ "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN },
 	{ "die",         0, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },
Index: protocols/jabber/jabber.c
===================================================================
--- protocols/jabber/jabber.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ protocols/jabber/jabber.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -1232,5 +1232,7 @@
 	}
 
-	account_online(GJ_GC(gjc));
+	x = jutil_presnew(0, NULL, "Online");
+	gjab_send(gjc, x);
+	xmlnode_free(x);
 }
 
@@ -1248,4 +1250,5 @@
 		} else {
 			gjab_reqroster(gjc);
+			account_online(GJ_GC(gjc));
 			
 			((struct jabber_data *)GJ_GC(gjc)->proto_data)->did_import = TRUE;
Index: protocols/msn/msn.h
===================================================================
--- protocols/msn/msn.h	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ protocols/msn/msn.h	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -66,9 +66,6 @@
 	GSList *msgq;
 	GSList *switchboards;
+	int buddycount;
 	const struct msn_away_state *away_state;
-	
-	int buddycount;
-	int groupcount;
-	char **grouplist;
 };
 
Index: protocols/msn/msn_util.c
===================================================================
--- protocols/msn/msn_util.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ protocols/msn/msn_util.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -46,5 +46,16 @@
 int msn_logged_in( struct gaim_connection *gc )
 {
+	struct msn_data *md = gc->proto_data;
+	char buf[1024];
+	
 	account_online( gc );
+	
+	/* account_online() sets an away state if there is any, so only
+	   execute this code if we're not away. */
+	if( md->away_state == msn_away_state_list )
+	{
+		g_snprintf( buf, sizeof( buf ), "CHG %d %s %d\r\n", ++md->trId, md->away_state->code, 0 );
+		return( msn_write( gc, buf, strlen( buf ) ) );
+	}
 	
 	return( 0 );
Index: protocols/msn/ns.c
===================================================================
--- protocols/msn/ns.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ protocols/msn/ns.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -257,7 +257,4 @@
 		{
 			md->buddycount = atoi( cmd[3] );
-			md->groupcount = atoi( cmd[4] );
-			if( md->groupcount > 0 )
-				md->grouplist = g_new0( char *, md->groupcount );
 			
 			if( !*cmd[3] || md->buddycount == 0 )
@@ -272,4 +269,16 @@
 		}
 	}
+	else if( strcmp( cmd[0], "GTC" ) == 0 )
+	{
+	}
+	else if( strcmp( cmd[0], "BLP" ) == 0 )
+	{
+	}
+	else if( strcmp( cmd[0], "PRP" ) == 0 )
+	{
+	}
+	else if( strcmp( cmd[0], "LSG" ) == 0 )
+	{
+	}
 	else if( strcmp( cmd[0], "LST" ) == 0 )
 	{
@@ -288,11 +297,5 @@
 		if( list & 1 ) /* FL */
 		{
-			char *group = NULL;
-			int num;
-			
-			if( cmd[4] != NULL && sscanf( cmd[4], "%d", &num ) == 1 )
-				group = md->grouplist[num];
-			
-			add_buddy( gc, group, cmd[1], cmd[2] );
+			add_buddy( gc, NULL, cmd[1], cmd[2] );
 		}
 		if( list & 2 ) /* AL */
@@ -324,20 +327,9 @@
 		}
 	}
-	else if( strcmp( cmd[0], "LSG" ) == 0 )
-	{
-		int num;
-		
-		if( num_parts != 4 )
-		{
-			hide_login_progress_error( gc, "Syntax error" );
-			signoff( gc );
-			return( 0 );
-		}
-		
-		http_decode( cmd[2] );
-		num = atoi( cmd[1] );
-		
-		if( num < md->groupcount )
-			md->grouplist[num] = g_strdup( cmd[2] );
+	else if( strcmp( cmd[0], "BPR" ) == 0 )
+	{
+	}
+	else if( strcmp( cmd[0], "CHG" ) == 0 )
+	{
 	}
 	else if( strcmp( cmd[0], "CHL" ) == 0 )
@@ -365,4 +357,10 @@
 		return( msn_write( gc, buf, strlen( buf ) ) );
 	}
+	else if( strcmp( cmd[0], "QRY" ) == 0 )
+	{
+	}
+	else if( strcmp( cmd[0], "QNG" ) == 0 )
+	{
+	}
 	else if( strcmp( cmd[0], "ILN" ) == 0 )
 	{
@@ -480,4 +478,7 @@
 			msn_buddy_ask( gc, cmd[4], cmd[5] );
 		}
+	}
+	else if( strcmp( cmd[0], "REM" ) == 0 )
+	{
 	}
 	else if( strcmp( cmd[0], "OUT" ) == 0 )
Index: protocols/msn/sb.c
===================================================================
--- protocols/msn/sb.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ protocols/msn/sb.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -202,4 +202,7 @@
 	debug( "Destroying switchboard: %s", sb->who ? sb->who : sb->key ? sb->key : "" );
 	
+	if( sb->key ) g_free( sb->key );
+	if( sb->who ) g_free( sb->who );
+	
 	if( sb->msgq )
 	{
@@ -219,9 +222,6 @@
 		serv_got_crap( gc, "Warning: Closing down MSN switchboard connection with "
 		                   "unsent message to %s, you'll have to resend it.",
-		                   sb->who ? sb->who : "(unknown)" );
-	}
-	
-	if( sb->key ) g_free( sb->key );
-	if( sb->who ) g_free( sb->who );
+		                   m->who ? m->who : "(unknown)" );
+	}
 	
 	if( sb->chat )
Index: protocols/nogaim.c
===================================================================
--- protocols/nogaim.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ protocols/nogaim.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -14,5 +14,5 @@
  * (except for the function names).
  *
- * Copyright 2002-2006 Wilmer van der Gaast <wilmer@gaast.net> and others
+ * Copyright 2002-2004 Wilmer van der Gaast <lintux@lintux.cx>
  */
 
@@ -39,5 +39,5 @@
 #include <iconv.h>
 
-static char *proto_away_alias[8][5] =
+static char *proto_away_alias[7][5] =
 {
 	{ "Away from computer", "Away", "Extended away", NULL },
@@ -47,5 +47,4 @@
 	{ "On the phone", "Phone", "On phone", NULL },
 	{ "Out to lunch", "Lunch", "Food", NULL },
-	{ "Invisible", "Hidden" },
 	{ NULL }
 };
@@ -306,5 +305,5 @@
 {
 	va_list params;
-	char text[1024], buf[1024], *acc_id;
+	char text[1024], buf[1024], acc_id[33];
 	char *msg;
 	account_t *a;
@@ -331,11 +330,9 @@
 	/* If we found one, add the screenname to the acc_id. */
 	if( a )
-		acc_id = g_strdup_printf( "%s(%s)", gc->prpl->name, gc->username );
+		g_snprintf( acc_id, 32, "%s(%s)", gc->prpl->name, gc->username );
 	else
-		acc_id = g_strdup( gc->prpl->name );
+		g_snprintf( acc_id, 32, "%s", gc->prpl->name );
 	
 	irc_usermsg( gc->irc, "%s - %s", acc_id, msg );
-	
-	g_free( acc_id );
 }
 
@@ -355,5 +352,5 @@
 	
 	/* MSN servers sometimes redirect you to a different server and do
-	   the whole login sequence again, so these "late" calls to this
+	   the whole login sequence again, so subsequent calls to this
 	   function should be handled correctly. (IOW, ignored) */
 	if( gc->flags & OPT_LOGGED_IN )
@@ -367,9 +364,7 @@
 	gc->flags |= OPT_LOGGED_IN;
 	
-	/* Also necessary when we're not away, at least for some of the
-	   protocols. */
-	proto_away( gc, u->away );
-	
- 	if( strcmp( gc->prpl->name, "ICQ" ) == 0 )
+	if( u && u->away ) proto_away( gc, u->away );
+	
+ 	if( !strcmp(gc->prpl->name, "icq") )
 	{
 		for( u = gc->irc->users; u; u = u->next )
@@ -475,4 +470,14 @@
 /* list.c */
 
+int bud_list_cache_exists( struct gaim_connection *gc )
+{
+	return( 0 );
+}
+
+void do_import( struct gaim_connection *gc, void *null )
+{
+	return;
+}
+
 void add_buddy( struct gaim_connection *gc, char *group, char *handle, char *realname )
 {
@@ -526,5 +531,4 @@
 	u->gc = gc;
 	u->handle = g_strdup( handle );
-	if( group ) u->group = g_strdup( group );
 	u->send_handler = buddy_send_handler;
 	u->last_typing_notice = 0;
@@ -548,4 +552,9 @@
 	
 	return( b );
+}
+
+void do_export( struct gaim_connection *gc )
+{
+	return;
 }
 
@@ -873,4 +882,9 @@
 	
 	return( c );
+}
+
+void serv_finish_login( struct gaim_connection *gc )
+{
+	return;
 }
 
Index: protocols/oscar/oscar.c
===================================================================
--- protocols/oscar/oscar.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ protocols/oscar/oscar.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -356,7 +356,5 @@
 	if (isdigit(*user->username)) {
 		odata->icq = TRUE;
-		/* This is odd but it's necessary for a proper do_import and do_export.
-		   We don't do those anymore, but let's stick with it, just in case
-		   it accidentally fixes something else too... */
+		/* this is odd but it's necessary for a proper do_import and do_export */
 		gc->password[8] = 0;
 	} else {
@@ -1150,5 +1148,5 @@
 		reason = msg + 6;
 	
-	dialog_msg = g_strdup_printf("The user %u wants to add you to their buddy list for the following reason: %s", uin, reason ? reason : "No reason given.");
+	dialog_msg = g_strdup_printf("The user %u wants to add you to their buddy list for the following reason:\n\n%s", uin, reason ? reason : "No reason given.");
 	data->gc = gc;
 	data->uin = uin;
@@ -1739,4 +1737,9 @@
 	odata->rights.maxdenies = (guint)maxdenies;
 
+//	serv_finish_login(gc);
+
+	if (bud_list_cache_exists(gc))
+		do_import(gc, NULL);
+
 	aim_clientready(sess, fr->conn);
 
@@ -2093,4 +2096,6 @@
 	} /* End of for loop */
 
+	if (tmp)
+		do_export(gc);
 	aim_ssi_enable(sess, fr->conn);
 	
Index: protocols/ssl_openssl.c
===================================================================
--- protocols/ssl_openssl.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ protocols/ssl_openssl.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -5,5 +5,5 @@
   \********************************************************************/
 
-/* SSL module - OpenSSL version                                         */
+/* SSL module - OpenTLS version                                          */
 
 /*
@@ -41,11 +41,9 @@
 struct scd
 {
-	ssl_input_function func;
+	SslInputFunction func;
 	gpointer data;
 	int fd;
 	gboolean established;
 	
-	int inpa;
-	int lasterr;		/* Necessary for SSL_get_error */
 	SSL *ssl;
 	SSL_CTX *ssl_ctx;
@@ -56,5 +54,5 @@
 
 
-void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data )
+void *ssl_connect( char *host, int port, SslInputFunction func, gpointer data )
 {
 	struct scd *conn = g_new0( struct scd, 1 );
@@ -95,6 +93,4 @@
 }
 
-static void ssl_handshake( gpointer data, gint source, GaimInputCondition cond );
-
 static void ssl_connected( gpointer data, gint source, GaimInputCondition cond )
 {
@@ -102,36 +98,12 @@
 	
 	if( source == -1 )
-		return ssl_handshake( data, -1, cond );
+		goto ssl_connected_failure;
 	
-	/* Make it non-blocking at least during the handshake... */
-	sock_make_nonblocking( conn->fd );
 	SSL_set_fd( conn->ssl, conn->fd );
 	
-	return ssl_handshake( data, source, cond );
-}	
-
-static void ssl_handshake( gpointer data, gint source, GaimInputCondition cond )
-{
-	struct scd *conn = data;
-	int st;
-	
-	if( conn->inpa != -1 )
-	{
-		gaim_input_remove( conn->inpa );
-		conn->inpa = -1;
-	}
-	
-	if( ( st = SSL_connect( conn->ssl ) ) < 0 )
-	{
-		conn->lasterr = SSL_get_error( conn->ssl, st );
-		if( conn->lasterr != SSL_ERROR_WANT_READ && conn->lasterr != SSL_ERROR_WANT_WRITE )
-			goto ssl_connected_failure;
-		
-		conn->inpa = gaim_input_add( conn->fd, ssl_getdirection( conn ), ssl_handshake, data );
-		return;
-	}
+	if( SSL_connect( conn->ssl ) < 0 )
+		goto ssl_connected_failure;
 	
 	conn->established = TRUE;
-	sock_make_blocking( conn->fd );		/* For now... */
 	conn->func( conn->data, conn, cond );
 	return;
@@ -155,46 +127,16 @@
 int ssl_read( void *conn, char *buf, int len )
 {
-	int st;
+	if( !((struct scd*)conn)->established )
+		return( 0 );
 	
-	if( !((struct scd*)conn)->established )
-	{
-		ssl_errno = SSL_NOHANDSHAKE;
-		return -1;
-	}
-	
-	st = SSL_read( ((struct scd*)conn)->ssl, buf, len );
-	
-	ssl_errno = SSL_OK;
-	if( st <= 0 )
-	{
-		((struct scd*)conn)->lasterr = SSL_get_error( ((struct scd*)conn)->ssl, st );
-		if( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_READ || ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE )
-			ssl_errno = SSL_AGAIN;
-	}
-	
-	return st;
+	return( SSL_read( ((struct scd*)conn)->ssl, buf, len ) );
 }
 
 int ssl_write( void *conn, const char *buf, int len )
 {
-	int st;
+	if( !((struct scd*)conn)->established )
+		return( 0 );
 	
-	if( !((struct scd*)conn)->established )
-	{
-		ssl_errno = SSL_NOHANDSHAKE;
-		return -1;
-	}
-	
-	st = SSL_write( ((struct scd*)conn)->ssl, buf, len );
-	
-	ssl_errno = SSL_OK;
-	if( st <= 0 )
-	{
-		((struct scd*)conn)->lasterr = SSL_get_error( ((struct scd*)conn)->ssl, st );
-		if( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_READ || ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE )
-			ssl_errno = SSL_AGAIN;
-	}
-	
-	return st;
+	return( SSL_write( ((struct scd*)conn)->ssl, buf, len ) );
 }
 
@@ -202,7 +144,4 @@
 {
 	struct scd *conn = conn_;
-	
-	if( conn->inpa != -1 )
-		gaim_input_remove( conn->inpa );
 	
 	if( conn->established )
@@ -220,7 +159,2 @@
 	return( ((struct scd*)conn)->fd );
 }
-
-GaimInputCondition ssl_getdirection( void *conn )
-{
-	return( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ? GAIM_INPUT_WRITE : GAIM_INPUT_READ );
-}
Index: query.c
===================================================================
--- query.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ query.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -39,15 +39,4 @@
 	q->no = no;
 	q->data = data;
-	
-	if( strchr( irc->umode, 'b' ) != NULL )
-	{
-		char *s;
-		
-		/* At least for the machine-parseable version, get rid of
-		   newlines to make "parsing" easier. */
-		for( s = q->question; *s; s ++ )
-			if( *s == '\r' || *s == '\n' )
-				*s = ' ';
-	}
 	
 	if( irc->queries )
@@ -138,4 +127,5 @@
 		disp = 1;
 	}
+	//Using irc_usermsg instead of serv_got_crap because \x02A is a char too, so a SPACE is needed.	
 	if( ans )
 	{
Index: root_commands.c
===================================================================
--- root_commands.c	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ root_commands.c	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -484,25 +484,5 @@
 	account_t *a;
 	
-	if( !cmd[2] && ( a = account_get( irc, cmd[1] ) ) && a->gc )
-	{
-		char *format;
-		GSList *l;
-		
-		if( strchr( irc->umode, 'b' ) != NULL )
-			format = "%s\t%s";
-		else
-			format = "%-32.32  %-16.16s";
-		
-		irc_usermsg( irc, format, "Handle", "Nickname" );
-		for( l = a->gc->deny; l; l = l->next )
-		{
-			user_t *u = user_findhandle( a->gc, l->data );
-			irc_usermsg( irc, format, l->data, u ? u->nick : "(none)" );
-		}
-		irc_usermsg( irc, "End of list." );
-		
-		return;
-	}
-	else if( !cmd[2] )
+	if( !cmd[2] )
 	{
 		user_t *u = user_find( irc, cmd[1] );
@@ -543,25 +523,5 @@
 	account_t *a;
 	
-	if( !cmd[2] && ( a = account_get( irc, cmd[1] ) ) && a->gc )
-	{
-		char *format;
-		GSList *l;
-		
-		if( strchr( irc->umode, 'b' ) != NULL )
-			format = "%s\t%s";
-		else
-			format = "%-32.32  %-16.16s";
-		
-		irc_usermsg( irc, format, "Handle", "Nickname" );
-		for( l = a->gc->deny; l; l = l->next )
-		{
-			user_t *u = user_findhandle( a->gc, l->data );
-			irc_usermsg( irc, format, l->data, u ? u->nick : "(none)" );
-		}
-		irc_usermsg( irc, "End of list." );
-		
-		return;
-	}
-	else if( !cmd[2] )
+	if( !cmd[2] )
 	{
 		user_t *u = user_find( irc, cmd[1] );
@@ -675,6 +635,5 @@
 	int online = 0, away = 0, offline = 0;
 	user_t *u;
-	char s[256];
-	char *format;
+	char s[64];
 	int n_online = 0, n_away = 0, n_offline = 0;
 	
@@ -690,39 +649,24 @@
 		online =  away = 1;
 	
-	if( strchr( irc->umode, 'b' ) != NULL )
-		format = "%s\t%s\t%s";
-	else
-		format = "%-16.16s  %-40.40s  %s";
-	
-	irc_usermsg( irc, format, "Nick", "User/Host/Network", "Status" );
-	
-	for( u = irc->users; u; u = u->next ) if( u->gc && u->online && !u->away )
-	{
-		if( online == 1 )
-		{
-			g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
-			irc_usermsg( irc, format, u->nick, s, "Online" );
-		}
-		
+	irc_usermsg( irc, "%-16.16s  %-40.40s  %s", "Nick", "User/Host/Network", "Status" );
+	
+	if( online == 1 ) for( u = irc->users; u; u = u->next ) if( u->gc && u->online && !u->away )
+	{
+		g_snprintf( s, 63, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
+		irc_usermsg( irc, "%-16.16s  %-40.40s  %s", u->nick, s, "Online" );
 		n_online ++;
 	}
 
-	for( u = irc->users; u; u = u->next ) if( u->gc && u->online && u->away )
-	{
-		if( away == 1 )
-		{
-			g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
-			irc_usermsg( irc, format, u->nick, s, u->away );
-		}
+	if( away == 1 ) for( u = irc->users; u; u = u->next ) if( u->gc && u->online && u->away )
+	{
+		g_snprintf( s, 63, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
+		irc_usermsg( irc, "%-16.16s  %-40.40s  %s", u->nick, s, u->away );
 		n_away ++;
 	}
 	
-	for( u = irc->users; u; u = u->next ) if( u->gc && !u->online )
-	{
-		if( offline == 1 )
-		{
-			g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
-			irc_usermsg( irc, format, u->nick, s, "Offline" );
-		}
+	if( offline == 1 ) for( u = irc->users; u; u = u->next ) if( u->gc && !u->online )
+	{
+		g_snprintf( s, 63, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
+		irc_usermsg( irc, "%-16.16s  %-40.40s  %s", u->nick, s, "Offline" );
 		n_offline ++;
 	}
Index: user.h
===================================================================
--- user.h	(revision 728a981e422539df38d27d87e33829082d376ac6)
+++ user.h	(revision 96ace1b808f4df3f2106fa90c19fdc23408f924d)
@@ -37,5 +37,4 @@
 	
 	char *handle;
-	char *group;
 	struct gaim_connection *gc;
 
