Index: protocols/msn/msn.c
===================================================================
--- protocols/msn/msn.c	(revision 0a3c243b6659dc10efb227e507f324c2711d6dcd)
+++ protocols/msn/msn.c	(revision 911f2eb7060f6af6fe8e4e02144cfb7c4bb4cc8b)
@@ -26,4 +26,14 @@
 #include "nogaim.h"
 #include "msn.h"
+
+static char *msn_set_display_name( set_t *set, char *value );
+
+static void msn_acc_init( account_t *acc )
+{
+	set_t *s;
+	
+	s = set_add( &acc->set, "display_name", NULL, msn_set_display_name, acc );
+	s->flags |= ACC_SET_NOSAVE | ACC_SET_ONLINE_ONLY;
+}
 
 static void msn_login( account_t *acc )
@@ -210,34 +220,5 @@
 static void msn_set_info( struct gaim_connection *gc, char *info )
 {
-	int i;
-	char buf[1024], *fn, *s;
-	struct msn_data *md = gc->proto_data;
-	
-	if( strlen( info ) > 129 )
-	{
-		do_error_dialog( gc, "Maximum name length exceeded", "MSN" );
-		return;
-	}
-	
-	/* Of course we could use http_encode() here, but when we encode
-	   every character, the server is less likely to complain about the
-	   chosen name. However, the MSN server doesn't seem to like escaped
-	   non-ASCII chars, so we keep those unescaped. */
-	s = fn = g_new0( char, strlen( info ) * 3 + 1 );
-	for( i = 0; info[i]; i ++ )
-		if( info[i] & 128 )
-		{
-			*s = info[i];
-			s ++;
-		}
-		else
-		{
-			g_snprintf( s, 4, "%%%02X", info[i] );
-			s += 3;
-		}
-	
-	g_snprintf( buf, sizeof( buf ), "REA %d %s %s\r\n", ++md->trId, gc->username, fn );
-	msn_write( gc, buf, strlen( buf ) );
-	g_free( fn );
+	msn_set_display_name( set_find( &gc->acc->set, "display_name" ), info );
 }
 
@@ -378,9 +359,58 @@
 }
 
+static char *msn_set_display_name( set_t *set, char *value )
+{
+	account_t *acc = set->data;
+	struct gaim_connection *gc = acc->gc;
+	struct msn_data *md;
+	char buf[1024], *fn, *s;
+	int i;
+	
+	/* Double-check. */
+	if( gc == NULL )
+		return NULL;
+	
+	md = gc->proto_data;
+	
+	if( strlen( value ) > 129 )
+	{
+		serv_got_crap( gc, "Maximum name length exceeded" );
+		return NULL;
+	}
+	
+	/* Of course we could use http_encode() here, but when we encode
+	   every character, the server is less likely to complain about the
+	   chosen name. However, the MSN server doesn't seem to like escaped
+	   non-ASCII chars, so we keep those unescaped. */
+	s = fn = g_new0( char, strlen( value ) * 3 + 1 );
+	for( i = 0; value[i]; i ++ )
+		if( value[i] & 128 )
+		{
+			*s = value[i];
+			s ++;
+		}
+		else
+		{
+			g_snprintf( s, 4, "%%%02X", value[i] );
+			s += 3;
+		}
+	
+	g_snprintf( buf, sizeof( buf ), "REA %d %s %s\r\n", ++md->trId, gc->username, fn );
+	msn_write( gc, buf, strlen( buf ) );
+	g_free( fn );
+	
+	/* Returning NULL would be better, because the server still has to
+	   confirm the name change. However, it looks a bit confusing to the
+	   user. */
+	return value;
+}
+
 void msn_init()
 {
 	struct prpl *ret = g_new0(struct prpl, 1);
+	
 	ret->name = "msn";
 	ret->login = msn_login;
+	ret->acc_init = msn_acc_init;
 	ret->close = msn_close;
 	ret->send_im = msn_send_im;
Index: protocols/msn/ns.c
===================================================================
--- protocols/msn/ns.c	(revision 0a3c243b6659dc10efb227e507f324c2711d6dcd)
+++ protocols/msn/ns.c	(revision 911f2eb7060f6af6fe8e4e02144cfb7c4bb4cc8b)
@@ -223,8 +223,16 @@
 		else if( num_parts == 7 && strcmp( cmd[2], "OK" ) == 0 )
 		{
+			set_t *s;
+			
 			http_decode( cmd[4] );
 			
 			strncpy( gc->displayname, cmd[4], sizeof( gc->displayname ) );
 			gc->displayname[sizeof(gc->displayname)-1] = 0;
+			
+			if( ( s = set_find( &gc->acc->set, "display_name" ) ) )
+			{
+				g_free( s->value );
+				s->value = g_strdup( cmd[4] );
+			}
 			
 			set_login_progress( gc, 1, "Authenticated, getting buddy list" );
@@ -517,7 +525,15 @@
 		if( g_strcasecmp( cmd[3], gc->username ) == 0 )
 		{
+			set_t *s;
+			
 			http_decode( cmd[4] );
 			strncpy( gc->displayname, cmd[4], sizeof( gc->displayname ) );
 			gc->displayname[sizeof(gc->displayname)-1] = 0;
+			
+			if( ( s = set_find( &gc->acc->set, "display_name" ) ) )
+			{
+				g_free( s->value );
+				s->value = g_strdup( cmd[4] );
+			}
 		}
 		else
