Index: irc_im.c
===================================================================
--- irc_im.c	(revision f012a9f0bb363cfcbdb6f2d563254ffba26b9fc8)
+++ irc_im.c	(revision 1d3915951bfbcdfa1a7829a4082e90e154d4a486)
@@ -120,7 +120,49 @@
 }
 
+static gboolean bee_irc_user_fullname( bee_t *bee, bee_user_t *bu )
+{
+	irc_user_t *iu = (irc_user_t *) bu->ui_data;
+	irc_t *irc = (irc_t *) bee->ui_data;
+	char *s;
+	
+	if( iu->fullname != iu->nick )
+		g_free( iu->fullname );
+	iu->fullname = g_strdup( bu->fullname );
+	
+	/* Strip newlines (unlikely, but IRC-unfriendly so they must go)
+	   TODO(wilmer): Do the same with away msgs again! */
+	for( s = iu->fullname; *s; s ++ )
+		if( isspace( *s ) ) *s = ' ';
+	
+	if( ( bu->ic->flags & OPT_LOGGED_IN ) && set_getbool( &bee->set, "display_namechanges" ) )
+	{
+		char *msg = g_strdup_printf( "<< \002BitlBee\002 - Changed name to `%s' >>", iu->fullname );
+		irc_send_msg( iu, "NOTICE", irc->user->nick, msg, NULL );
+	}
+	
+	s = set_getstr( &bu->ic->acc->set, "nick_source" );
+	if( strcmp( s, "handle" ) != 0 )
+	{
+		char *name = g_strdup( bu->fullname );
+		
+		if( strcmp( s, "first_name" ) == 0 )
+		{
+			int i;
+			for( i = 0; name[i] && !isspace( name[i] ); i ++ ) {}
+			name[i] = '\0';
+		}
+		
+		imcb_buddy_nick_hint( bu->ic, bu->handle, name );
+		
+		g_free( name );
+	}
+	
+	return TRUE;
+}
+
 const struct bee_ui_funcs irc_ui_funcs = {
 	bee_irc_user_new,
 	bee_irc_user_free,
+	bee_irc_user_fullname,
 	bee_irc_user_status,
 	bee_irc_user_msg,
Index: irc_send.c
===================================================================
--- irc_send.c	(revision f012a9f0bb363cfcbdb6f2d563254ffba26b9fc8)
+++ irc_send.c	(revision 1d3915951bfbcdfa1a7829a4082e90e154d4a486)
@@ -220,19 +220,29 @@
 	              iu->nick, iu->user, iu->host, iu->fullname );
 	
-	/*
-	if( u->ic )
-		irc_send_num( irc, 312, "%s %s.%s :%s network", u->nick, u->ic->acc->user,
-		           u->ic->acc->server && *u->ic->acc->server ? u->ic->acc->server : "",
-		           u->ic->acc->prpl->name );
+	if( iu->bu )
+	{
+		bee_user_t *bu = iu->bu;
+		
+		irc_send_num( irc, 312, "%s %s.%s :%s network", iu->nick, bu->ic->acc->user,
+		           bu->ic->acc->server && *bu->ic->acc->server ? bu->ic->acc->server : "",
+		           bu->ic->acc->prpl->name );
+		
+		if( bu->status )
+		{
+			if( bu->status_msg )
+				irc_send_num( irc, 301, "%s :%s (%s)", iu->nick, bu->status, bu->status_msg );
+			else
+				irc_send_num( irc, 301, "%s :%s", iu->nick, bu->status );
+		}
+		
+		/*
+		if( u->status_msg )
+			irc_send_num( irc, 333, "%s :Status: %s", u->nick, u->status_msg );
+		*/
+	}
 	else
-		irc_send_num( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO );
-	*/
-	
-	/*
-	if( u->away )
-		irc_send_num( irc, 301, "%s :%s", u->nick, u->away );
-	if( u->status_msg )
-		irc_send_num( irc, 333, "%s :Status: %s", u->nick, u->status_msg );
-	*/
+	{
+		irc_send_num( irc, 312, "%s %s :%s", iu->nick, irc->root->host, IRCD_INFO " " BITLBEE_VERSION );
+	}
 	
 	irc_send_num( irc, 318, "%s :End of /WHOIS list", iu->nick );
Index: protocols/bee.h
===================================================================
--- protocols/bee.h	(revision f012a9f0bb363cfcbdb6f2d563254ffba26b9fc8)
+++ protocols/bee.h	(revision 1d3915951bfbcdfa1a7829a4082e90e154d4a486)
@@ -68,4 +68,5 @@
 	gboolean (*user_new)( bee_t *bee, struct bee_user *bu );
 	gboolean (*user_free)( bee_t *bee, struct bee_user *bu );
+	gboolean (*user_fullname)( bee_t *bee, bee_user_t *bu );
 	gboolean (*user_status)( bee_t *bee, struct bee_user *bu, struct bee_user *old );
 	gboolean (*user_msg)( bee_t *bee, bee_user_t *bu, const char *msg, time_t sent_at );
Index: protocols/bee_user.c
===================================================================
--- protocols/bee_user.c	(revision f012a9f0bb363cfcbdb6f2d563254ffba26b9fc8)
+++ protocols/bee_user.c	(revision 1d3915951bfbcdfa1a7829a4082e90e154d4a486)
@@ -169,5 +169,4 @@
 {
 	bee_t *bee = ic->bee;
-	char *wrapped;
 	bee_user_t *bu;
 	
Index: protocols/nogaim.c
===================================================================
--- protocols/nogaim.c	(revision f012a9f0bb363cfcbdb6f2d563254ffba26b9fc8)
+++ protocols/nogaim.c	(revision 1d3915951bfbcdfa1a7829a4082e90e154d4a486)
@@ -365,5 +365,4 @@
 {
 	bee_user_t *bu;
-	//char nick[MAX_NICK_LENGTH+1], *s;
 	bee_t *bee = ic->bee;
 	
@@ -385,39 +384,19 @@
 }
 
-void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname )
-{
-#if 0
-	user_t *u = user_findhandle( ic, handle );
-	char *set;
-	
-	if( !u || !realname ) return;
-	
-	if( g_strcasecmp( u->realname, realname ) != 0 )
-	{
-		if( u->realname != u->nick ) g_free( u->realname );
-		
-		u->realname = g_strdup( realname );
-		
-		if( ( ic->flags & OPT_LOGGED_IN ) && set_getbool( &ic->bee->set, "display_namechanges" ) )
-			imcb_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname );
-	}
-	
-	set = set_getstr( &ic->acc->set, "nick_source" );
-	if( strcmp( set, "handle" ) != 0 )
-	{
-		char *name = g_strdup( realname );
-		
-		if( strcmp( set, "first_name" ) == 0 )
-		{
-			int i;
-			for( i = 0; name[i] && !isspace( name[i] ); i ++ ) {}
-			name[i] = '\0';
-		}
-		
-		imcb_buddy_nick_hint( ic, handle, name );
-		
-		g_free( name );
-	}
-#endif
+void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *fullname )
+{
+	bee_t *bee = ic->bee;
+	bee_user_t *bu = bee_user_by_handle( bee, ic, handle );
+	
+	if( !bu || !fullname ) return;
+	
+	if( strcmp( bu->fullname, fullname ) != 0 )
+	{
+		g_free( bu->fullname );
+		bu->fullname = g_strdup( fullname );
+		
+		if( bee->ui->user_fullname )
+			bee->ui->user_fullname( bee, bu );
+	}
 }
 
