changeset 24864:f977d7dfd1a0

merge of '5a35c52faacfbdaf503309fcdf10842cfd126c3f' and 'ba6f2a0aa47088afe04b45a8eafd245fa72c9985'
author Daniel Atallah <daniel.atallah@gmail.com>
date Fri, 02 Jan 2009 07:42:04 +0000
parents 0ea515a3f70c (diff) b2206f3b8b24 (current diff)
children b26e8a41a937
files
diffstat 49 files changed, 902 insertions(+), 538 deletions(-) [+]
line wrap: on
line diff
--- a/AUTHORS	Fri Dec 19 08:10:19 2008 +0000
+++ b/AUTHORS	Fri Jan 02 07:42:04 2009 +0000
@@ -35,6 +35,7 @@
 
 Crazy Patch Writers:
 -------------------
+Paul Aurich
 Felipe 'shx' Contreras
 Marcus 'malu' Lundblad
 Dennis 'EvilDennisR' Ristuccia
--- a/COPYRIGHT	Fri Dec 19 08:10:19 2008 +0000
+++ b/COPYRIGHT	Fri Jan 02 07:42:04 2009 +0000
@@ -63,6 +63,7 @@
 Damien Carbery
 Michael Carlson
 Keegan Carruthers-Smith
+Ludovico Cavedon
 Steve Cavilia
 Julien Cegarra
 Cerulean Studios, LLC
@@ -228,6 +229,7 @@
 Steve Láposi
 Daniel Larsson
 Peter Lawler
+Vadim Lebedev
 Ho-seok Lee
 Jean-Yves Lefort
 Moses Lei
@@ -345,6 +347,7 @@
 Luciano Miguel Ferreira Rocha
 Andrew Rodland
 Miguel Rodríguez (migrax)
+Martin Rosinski
 Bob Rossi
 Jason Roth
 Jean-Francois Roy
@@ -473,6 +476,7 @@
 Alex Willmer
 Matt Wilson
 Dan Winship
+Michal Witkowski
 Scott Wolchok
 The Written Word, Inc.
 Kevin Wu Won
--- a/ChangeLog	Fri Dec 19 08:10:19 2008 +0000
+++ b/ChangeLog	Fri Jan 02 07:42:04 2009 +0000
@@ -1,6 +1,29 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.5.3 (12/18/2008):
+version 2.5.4 (??/??/????):
+	libpurple:
+	* Fix a connection timeout with empty Gadu-Gady buddy lists. (Martin
+	  Rosinski)
+	* Don't ignore namespace information when parsing XMPP data. (Michal
+	  Witkowski)
+	* Fix a crash that occurred when retrieving certain Offline Messages
+	  on MSN.
+	* Extended purple-url-handler to handle "gtalk" URI's. (Paul Aurich)
+	* Fix the hang on exit in Network Location Awareness for Windows XP
+	  and Windows Vista. (Paul Aurich)
+
+	XMPP:
+	* Support for XEP-0191 blocking.  (Vijay Raghunathan)
+	* Don't put SASL PLAIN or IQ Auth passwords in debug logs. (Paul Aurich)
+
+	Pidgin:
+	* Fix a crash in the Add Account dialog when changing protocols under
+	  certain circumstances.
+
+	Finch:
+	* Redirect stderr outputs to the debug window.
+
+version 2.5.3 (12/20/2008):
 	libpurple:
 	* The Buddy State Notification plugin no longer prints duplicate
 	  notifications when the same buddy is in multiple groups. (Florian
@@ -27,7 +50,7 @@
 	* Fix a crash caused by authorization requests. (Florian Quèze)
 
 	Gadu-Gadu:
-	* Add support for IM images. (Adam Strzelecki)
+	* Add support for IM images. (Tomasz Sałaciński, Adam Strzelecki)
 	* Gadu-Gadu now checks that UID's are valid. (Adam Strzelecki)
 	* Gadu-Gadu now does proper charset translations where needed. (Adam
 	  Strzelecki)
@@ -120,7 +143,7 @@
 	  if no custom smilies have previously been added using the smiley
 	  manager.
 	* Improved support for some message formatting in conversations.
-	* Allow focusing the coversation history or userlist with F6.
+	* Allow focusing the conversation history or userlist with F6.
 	* Fixed the Send Button plugin to avoid duplicate buttons in a single
 	  conversation.
 	* Double-clicking a saved status will now activate it and close the
--- a/ChangeLog.API	Fri Dec 19 08:10:19 2008 +0000
+++ b/ChangeLog.API	Fri Jan 02 07:42:04 2009 +0000
@@ -1,6 +1,6 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.5.3 (12/18/2008):
+version 2.5.3 (12/20/2008):
 	libpurple
 		Changed:
 		* purple_util_fetch_url and purple_util_fetch_url_request can
--- a/ChangeLog.win32	Fri Dec 19 08:10:19 2008 +0000
+++ b/ChangeLog.win32	Fri Jan 02 07:42:04 2009 +0000
@@ -1,4 +1,6 @@
-version 2.5.3 (12/18/2008):
+version 2.5.4 (??/??/????):
+
+version 2.5.3 (12/20/2008):
 	* Upgrade SILC to use the 1.1.8 toolkit
 	* Updated included Meanwhile library to include patch referenced in #7563
 
--- a/configure.ac	Fri Dec 19 08:10:19 2008 +0000
+++ b/configure.ac	Fri Jan 02 07:42:04 2009 +0000
@@ -46,7 +46,7 @@
 m4_define([purple_lt_current], [5])
 m4_define([purple_major_version], [2])
 m4_define([purple_minor_version], [5])
-m4_define([purple_micro_version], [3])
+m4_define([purple_micro_version], [4])
 m4_define([purple_version_suffix], [devel])
 m4_define([purple_version],
           [purple_major_version.purple_minor_version.purple_micro_version])
@@ -55,7 +55,7 @@
 m4_define([gnt_lt_current], [5])
 m4_define([gnt_major_version], [2])
 m4_define([gnt_minor_version], [5])
-m4_define([gnt_micro_version], [3])
+m4_define([gnt_micro_version], [4])
 m4_define([gnt_version_suffix], [devel])
 m4_define([gnt_version],
           [gnt_major_version.gnt_minor_version.gnt_micro_version])
--- a/doc/pidgin.1.in	Fri Dec 19 08:10:19 2008 +0000
+++ b/doc/pidgin.1.in	Fri Jan 02 07:42:04 2009 +0000
@@ -641,6 +641,8 @@
 
 Our crazy patch writers include:
 .br
+  Paul Aurich
+.br
   Felipe 'shx' Contreras
 .br
   Marcus 'malu' Lundblad
--- a/finch/finch.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/finch/finch.c	Fri Jan 02 07:42:04 2009 +0000
@@ -229,7 +229,6 @@
 	gboolean opt_nologin = FALSE;
 	gboolean opt_version = FALSE;
 	char *opt_config_dir_arg = NULL;
-	char *opt_session_arg = NULL;
 	gboolean debug_enabled = FALSE;
 
 	struct option long_options[] = {
@@ -237,7 +236,6 @@
 		{"debug",    no_argument,       NULL, 'd'},
 		{"help",     no_argument,       NULL, 'h'},
 		{"nologin",  no_argument,       NULL, 'n'},
-		{"session",  required_argument, NULL, 's'},
 		{"version",  no_argument,       NULL, 'v'},
 		{0, 0, 0, 0}
 	};
@@ -256,7 +254,7 @@
 	opterr = 1;
 	while ((opt = getopt_long(argc, argv,
 #ifndef _WIN32
-				  "c:dhn::s:v",
+				  "c:dhn::v",
 #else
 				  "c:dhn::v",
 #endif
@@ -275,10 +273,6 @@
 		case 'n':	/* no autologin */
 			opt_nologin = TRUE;
 			break;
-		case 's':	/* use existing session ID */
-			g_free(opt_session_arg);
-			opt_session_arg = g_strdup(optarg);
-			break;
 		case 'v':	/* version */
 			opt_version = TRUE;
 			break;
--- a/finch/gntdebug.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/finch/gntdebug.c	Fri Jan 02 07:42:04 2009 +0000
@@ -43,6 +43,48 @@
 
 #define PREF_ROOT "/finch/debug"
 
+static gboolean
+handle_fprintf_stderr_cb(GIOChannel *source, GIOCondition cond, gpointer null)
+{
+	gssize size;
+	char message[1024];
+
+	size = read(g_io_channel_unix_get_fd(source), message, sizeof(message) - 1);
+	if (size <= 0) {
+		/* Something bad probably happened elsewhere ... let's ignore */
+	} else {
+		message[size] = '\0';
+		g_log("stderr", G_LOG_LEVEL_WARNING, "%s", message);
+	}
+
+	return TRUE;
+}
+
+static void
+handle_fprintf_stderr(gboolean stop)
+{
+	GIOChannel *stderrch;
+	static int readhandle = -1;
+	int pipes[2];
+
+	if (stop) {
+		if (readhandle >= 0) {
+			g_source_remove(readhandle);
+			readhandle = -1;
+		}
+		return;
+	}
+	pipe(pipes);
+	dup2(pipes[1], STDERR_FILENO);
+
+	stderrch = g_io_channel_unix_new(pipes[0]);
+	g_io_channel_set_close_on_unref(stderrch, TRUE);
+	readhandle = g_io_add_watch_full(stderrch, G_PRIORITY_HIGH,
+			G_IO_IN | G_IO_ERR | G_IO_PRI,
+			handle_fprintf_stderr_cb, NULL, NULL);
+	g_io_channel_unref(stderrch);
+}
+
 static struct
 {
 	GntWidget *window;
@@ -143,10 +185,6 @@
 }
 
 static void
-suppress_error_messages(const char *message)
-{}
-
-static void
 toggle_pause(GntWidget *w, gpointer n)
 {
 	debug.paused = !debug.paused;
@@ -348,10 +386,11 @@
 #ifdef USE_GSTREAMER
 	REGISTER_G_LOG_HANDLER("GStreamer");
 #endif
+	REGISTER_G_LOG_HANDLER("stderr");
 
 	g_set_print_handler(print_stderr);   /* Redirect the debug messages to stderr */
 	if (!purple_debug_is_enabled())
-		g_set_printerr_handler(suppress_error_messages);
+		handle_fprintf_stderr(FALSE);
 
 	purple_prefs_add_none(PREF_ROOT);
 	purple_prefs_add_string(PREF_ROOT "/filter", "");
@@ -365,5 +404,6 @@
 
 void finch_debug_uninit()
 {
+	handle_fprintf_stderr(TRUE);
 }
 
--- a/libpurple/blist.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/blist.c	Fri Jan 02 07:42:04 2009 +0000
@@ -1029,7 +1029,7 @@
 		return;
 
 	dest = purple_find_group(new_name);
-	if (dest != NULL) {
+	if (dest != NULL && purple_utf8_strcasecmp(source->name, dest->name) != 0) {
 		/* We're merging two groups */
 		PurpleBlistNode *prev, *child, *next;
 
--- a/libpurple/core.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/core.c	Fri Jan 02 07:42:04 2009 +0000
@@ -219,6 +219,7 @@
 	purple_proxy_uninit();
 	purple_dnsquery_uninit();
 	purple_imgstore_uninit();
+	purple_network_uninit();
 
 	purple_debug_info("main", "Unloading all plugins\n");
 	purple_plugins_destroy_all();
--- a/libpurple/network.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/network.c	Fri Jan 02 07:42:04 2009 +0000
@@ -71,6 +71,11 @@
 
 #elif defined _WIN32
 static int current_network_count;
+
+/* Mutex for the other global vars */
+static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+static gboolean network_initialized;
+static HANDLE network_change_handle;
 #endif
 
 struct _PurpleNetworkListenData {
@@ -535,8 +540,8 @@
 
 static gpointer wpurple_network_change_thread(gpointer data)
 {
-	HANDLE h;
 	WSAQUERYSET qs;
+	WSAEVENT *nla_event;
 	time_t last_trigger = time(NULL);
 
 	int (WSAAPI *MyWSANSPIoctl) (
@@ -549,23 +554,47 @@
 		return NULL;
 	}
 
+	if ((nla_event = WSACreateEvent()) == WSA_INVALID_EVENT) {
+		int errorid = WSAGetLastError();
+		gchar *msg = g_win32_error_message(errorid);
+		purple_debug_warning("network", "Couldn't create WSA event. "
+			"Message: %s (%d).\n", msg, errorid);
+		g_free(msg);
+		g_thread_exit(NULL);
+		return NULL;
+	}
+
 	while (TRUE) {
 		int retval;
 		DWORD retLen = 0;
+		WSACOMPLETION completion;
+		WSAOVERLAPPED overlapped;
+
+		g_static_mutex_lock(&mutex);
+		if (network_initialized == FALSE) {
+			/* purple_network_uninit has been called */
+			WSACloseEvent(nla_event);
+			g_static_mutex_unlock(&mutex);
+			g_thread_exit(NULL);
+			return NULL;
+		}
 
 		memset(&qs, 0, sizeof(WSAQUERYSET));
 		qs.dwSize = sizeof(WSAQUERYSET);
 		qs.dwNameSpace = NS_NLA;
-		if (WSALookupServiceBegin(&qs, 0, &h) == SOCKET_ERROR) {
+		if (WSALookupServiceBegin(&qs, 0, &network_change_handle) == SOCKET_ERROR) {
 			int errorid = WSAGetLastError();
 			gchar *msg = g_win32_error_message(errorid);
 			purple_debug_warning("network", "Couldn't retrieve NLA SP lookup handle. "
 				"NLA service is probably not running. Message: %s (%d).\n",
 				msg, errorid);
 			g_free(msg);
+			WSACloseEvent(nla_event);
+			g_static_mutex_unlock(&mutex);
 			g_thread_exit(NULL);
 			return NULL;
 		}
+		g_static_mutex_unlock(&mutex);
 
 		/* Make sure at least 30 seconds have elapsed since the last
 		 * notification so we don't peg the cpu if this keeps changing. */
@@ -574,19 +603,40 @@
 
 		last_trigger = time(NULL);
 
-		/* This will block until there is a network change */
-		if (MyWSANSPIoctl(h, SIO_NSP_NOTIFY_CHANGE, NULL, 0, NULL, 0, &retLen, NULL) == SOCKET_ERROR) {
+		memset(&completion, 0, sizeof(WSACOMPLETION));
+		completion.Type = NSP_NOTIFY_EVENT;
+		overlapped.hEvent = nla_event;
+		completion.Parameters.Event.lpOverlapped = &overlapped;
+
+		if (MyWSANSPIoctl(network_change_handle, SIO_NSP_NOTIFY_CHANGE, NULL, 0, NULL, 0, &retLen, &completion) == SOCKET_ERROR) {
 			int errorid = WSAGetLastError();
-			gchar *msg = g_win32_error_message(errorid);
-			purple_debug_warning("network", "Unable to wait for changes. Message: %s (%d).\n",
-				msg, errorid);
-			g_free(msg);
+			/* WSA_IO_PENDING indicates successful async notification will happen */
+			if (errorid != WSA_IO_PENDING) {
+				gchar *msg = g_win32_error_message(errorid);
+				purple_debug_warning("network", "Unable to wait for changes. Message: %s (%d).\n",
+					msg, errorid);
+				g_free(msg);
+			}
 		}
 
-		retval = WSALookupServiceEnd(h);
+		/* This will block until NLA notifies us */
+		retval = WaitForSingleObjectEx(nla_event, WSA_INFINITE, TRUE);
+
+		g_static_mutex_lock(&mutex);
+		if (network_initialized == FALSE) {
+			/* Time to die */
+			WSACloseEvent(nla_event);
+			g_static_mutex_unlock(&mutex);
+			g_thread_exit(NULL);
+			return NULL;
+		}
+
+		retval = WSALookupServiceEnd(network_change_handle);
+		network_change_handle = NULL;
+		WSAResetEvent(nla_event);
+		g_static_mutex_unlock(&mutex);
 
 		purple_timeout_add(0, wpurple_network_change_thread_cb, NULL);
-
 	}
 
 	g_thread_exit(NULL);
@@ -714,6 +764,7 @@
 	GError *err = NULL;
 	gint cnt = wpurple_get_connected_network_count();
 
+	network_initialized = TRUE;
 	if (cnt < 0) /* Assume there is a network */
 		current_network_count = 1;
 	/* Don't listen for network changes if we can't tell anyway */
@@ -782,6 +833,25 @@
 		dbus_g_connection_unref(nm_conn);
 #endif
 
+#ifdef _WIN32
+	g_static_mutex_lock(&mutex);
+	network_initialized = FALSE;
+	if (network_change_handle != NULL) {
+		int retval;
+		/* Trigger the NLA thread to stop waiting for network changes. Not
+		 * doing this can cause hangs on WSACleanup. */
+		purple_debug_warning("network", "Terminating the NLA thread\n");
+		if ((retval = WSALookupServiceEnd(network_change_handle)) == SOCKET_ERROR) {
+			int errorid = WSAGetLastError();
+			gchar *msg = g_win32_error_message(errorid);
+			purple_debug_warning("network", "Unable to kill NLA thread. Message: %s (%d).\n",
+				msg, errorid);
+			g_free(msg);
+		}
+	}
+	g_static_mutex_unlock(&mutex);
+
+#endif
 	purple_signal_unregister(purple_network_get_handle(),
 	                         "network-configuration-changed");
 }
--- a/libpurple/prefs.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/prefs.c	Fri Jan 02 07:42:04 2009 +0000
@@ -693,12 +693,15 @@
 	char *name;
 	GSList *l;
 
-	if(!pref || pref == &prefs)
+	if(!pref)
 		return;
 
 	while(pref->first_child)
 		remove_pref(pref->first_child);
 
+	if(pref == &prefs)
+		return;
+
 	if(pref->parent->first_child == pref) {
 		pref->parent->first_child = pref->sibling;
 	} else {
@@ -1452,4 +1455,8 @@
 	}
 
 	purple_prefs_disconnect_by_handle(purple_prefs_get_handle());
+	purple_prefs_destroy();
+	g_hash_table_destroy(prefs_hash);
+	prefs_hash = NULL;
+
 }
--- a/libpurple/protocols/bonjour/mdns_win32.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/bonjour/mdns_win32.c	Fri Jan 02 07:42:04 2009 +0000
@@ -167,7 +167,11 @@
 	ResolveCallbackArgs *args = (ResolveCallbackArgs*) data;
 	Win32BuddyImplData *idata = args->bb->mdns_impl_data;
 	gboolean delete_buddy = FALSE;
-	PurpleBuddy *pb;
+	PurpleBuddy *pb = NULL;
+
+	/* Make sure that the BonjourBuddy associated with this request is still around */
+	if (g_slist_find(pending_buddies, args->bb) == NULL)
+		goto cleanup;
 
 	if ((pb = purple_find_buddy(args->account, args->bb->name)))
 		if (pb->proto_data != args->bb)
@@ -209,6 +213,8 @@
 
 	}
 
+	cleanup:
+
 	/* free the hosts list*/
 	while (hosts != NULL) {
 		hosts = g_slist_remove(hosts, hosts->data);
--- a/libpurple/protocols/gg/buddylist.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/gg/buddylist.c	Fri Jan 02 07:42:04 2009 +0000
@@ -46,7 +46,7 @@
 	PurpleBuddy *buddy;
 	uin_t *userlist = NULL;
 	gchar *types = NULL;
-	int size = 0;
+	int size = 0, ret = 0;
 
 	if ((blist = purple_get_blist()) == NULL)
 	    return;
@@ -79,12 +79,12 @@
 		}
 	}
 
+	ret = gg_notify_ex(info->session, userlist, types, size);
+	purple_debug_info("gg", "send: ret=%d; size=%d\n", ret, size);
+	
 	if (userlist) {
-		int ret = gg_notify_ex(info->session, userlist, types, size);
 		g_free(userlist);
 		g_free(types);
-
-		purple_debug_info("gg", "send: ret=%d; size=%d\n", ret, size);
 	}
 }
 /* }}} */
@@ -216,13 +216,14 @@
 	PurpleBlistNode *gnode, *cnode, *bnode;
 	PurpleGroup *group;
 	PurpleBuddy *buddy;
-
-	char *buddylist = g_strdup("");
+	GString *buddylist;
 	char *ptr;
 
 	if ((blist = purple_get_blist()) == NULL)
 		return NULL;
 
+	buddylist = g_string_sized_new(1024);
+
 	for (gnode = blist->root; gnode != NULL; gnode = gnode->next) {
 		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
 			continue;
@@ -247,19 +248,16 @@
 				alias = buddy->alias ? buddy->alias : buddy->name;
 				gname = group->name;
 
-				ptr = buddylist;
-				buddylist = g_strdup_printf(
-						"%s%s;%s;%s;%s;%s;%s;%s;%s%s\r\n",
-						ptr, alias, alias, alias, alias,
+				g_string_append_printf(buddylist,
+						"%s;%s;%s;%s;%s;%s;%s;%s%s\r\n",
+						alias, alias, alias, alias,
 						"", gname, name, "", "");
-
-				g_free(ptr);
 			}
 		}
 	}
 
-	ptr = charset_convert(buddylist, "UTF-8", "CP1250");
-	g_free(buddylist);
+	ptr = charset_convert(buddylist->str, "UTF-8", "CP1250");
+	g_string_free(buddylist, TRUE);
 	return ptr;
 }
 /* }}} */
--- a/libpurple/protocols/jabber/disco.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/jabber/disco.c	Fri Jan 02 07:42:04 2009 +0000
@@ -355,6 +355,11 @@
 		jabber_adhoc_server_get_list(js);
 	}
 
+	/* If the server supports blocking, request the block list */
+	if (js->server_caps & JABBER_CAP_BLOCKING) {
+		jabber_request_block_list(js);
+	}
+
 	/* If there are manually specified bytestream proxies, query them */
 	ft_proxies = purple_account_get_string(js->gc->account, "ft_proxies", NULL);
 	if (ft_proxies) {
@@ -454,6 +459,8 @@
 			jabber_google_roster_init(js);
 		} else if (!strcmp("http://jabber.org/protocol/commands", var)) {
 			js->server_caps |= JABBER_CAP_ADHOC;
+		} else if (!strcmp("urn:xmpp:blocking", var)) {
+			js->server_caps |= JABBER_CAP_BLOCKING;
 		}
 	}
 
--- a/libpurple/protocols/jabber/jabber.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Fri Jan 02 07:42:04 2009 +0000
@@ -31,6 +31,7 @@
 #include "message.h"
 #include "notify.h"
 #include "pluginpref.h"
+#include "privacy.h"
 #include "proxy.h"
 #include "prpl.h"
 #include "request.h"
@@ -150,7 +151,7 @@
 	char hostname[256]; /* current hostname */
 
 	/* Empty resource == don't send any */
-	if (*input == '\0')
+	if (input == NULL || *input == '\0')
 		return NULL;
 
 	if (strstr(input, "__HOSTNAME__") == NULL)
@@ -350,9 +351,33 @@
 {
 
 	/* because printing a tab to debug every minute gets old */
-	if(strcmp(data, "\t"))
-		purple_debug(PURPLE_DEBUG_MISC, "jabber", "Sending%s: %s\n",
-				js->gsc ? " (ssl)" : "", data);
+	if(strcmp(data, "\t")) {
+		char *text = NULL, *last_part = NULL, *tag_start = NULL;
+
+		/* Because debug logs with plaintext passwords make me sad */
+		if(js->state != JABBER_STREAM_CONNECTED &&
+				/* Either <auth> or <query><password>... */
+				(((tag_start = strstr(data, "<auth ")) &&
+					strstr(data, "xmlns='urn:ietf:params:xml:ns:xmpp-sasl'")) ||
+				((tag_start = strstr(data, "<query ")) &&
+					strstr(data, "xmlns='jabber:iq:auth'>") &&
+					(tag_start = strstr(tag_start, "<password>"))))) {
+			char *data_start, *tag_end = strchr(tag_start, '>');
+			text = g_strdup(data);
+
+			data_start = text + (tag_end - data) + 1;
+
+			last_part = strchr(data_start, '<');
+			*data_start = '\0';
+		}
+
+		purple_debug(PURPLE_DEBUG_MISC, "jabber", "Sending%s: %s%s%s\n",
+				js->gsc ? " (ssl)" : "", text ? text : data,
+				last_part ? "password removed" : "",
+				last_part ? last_part : "");
+
+		g_free(text);
+	}
 
 	/* If we've got a security layer, we need to encode the data,
 	 * splitting it on the maximum buffer length negotiated */
@@ -1454,6 +1479,106 @@
 	js->idle = idle ? time(NULL) - idle : idle;
 }
 
+static void jabber_blocklist_parse(JabberStream *js, xmlnode *packet, gpointer data)
+{
+	xmlnode *blocklist, *item;
+	PurpleAccount *account;
+
+	blocklist = xmlnode_get_child_with_namespace(packet,
+			"blocklist", "urn:xmpp:blocking");
+	account = purple_connection_get_account(js->gc);
+
+	if (blocklist == NULL)
+		return;
+
+	item = xmlnode_get_child(blocklist, "item");
+	while (item != NULL) {
+		const char *jid = xmlnode_get_attrib(item, "jid");
+
+		purple_privacy_deny_add(account, jid, TRUE);
+		item = xmlnode_get_next_twin(item);
+	}
+}
+
+void jabber_request_block_list(JabberStream *js)
+{
+	JabberIq *iq;
+	xmlnode *blocklist;
+
+	iq = jabber_iq_new(js, JABBER_IQ_GET);
+
+	blocklist = xmlnode_new_child(iq->node, "blocklist");
+	xmlnode_set_namespace(blocklist, "urn:xmpp:blocking");
+
+	jabber_iq_set_callback(iq, jabber_blocklist_parse, NULL);
+
+	jabber_iq_send(iq);
+}
+
+void jabber_add_deny(PurpleConnection *gc, const char *who)
+{
+	JabberStream *js;
+	JabberIq *iq;
+	xmlnode *block, *item;
+
+	js = gc->proto_data;
+	if (js == NULL)
+		return;
+
+	if (js->server_caps & JABBER_CAP_GOOGLE_ROSTER)
+	{
+		jabber_google_roster_add_deny(gc, who);
+		return;
+	}
+
+	if (!(js->server_caps & JABBER_CAP_BLOCKING))
+	{
+		purple_notify_error(NULL, _("Server doesn't support blocking"),
+							_("Server doesn't support blocking"), NULL);
+		return;
+	}
+
+	iq = jabber_iq_new(js, JABBER_IQ_SET);
+
+	block = xmlnode_new_child(iq->node, "block");
+	xmlnode_set_namespace(block, "urn:xmpp:blocking");
+
+	item = xmlnode_new_child(block, "item");
+	xmlnode_set_attrib(item, "jid", who);
+
+	jabber_iq_send(iq);
+}
+
+void jabber_rem_deny(PurpleConnection *gc, const char *who)
+{
+	JabberStream *js;
+	JabberIq *iq;
+	xmlnode *unblock, *item;
+
+	js = gc->proto_data;
+	if (js == NULL)
+		return;
+
+	if (js->server_caps & JABBER_CAP_GOOGLE_ROSTER)
+	{
+		jabber_google_roster_rem_deny(gc, who);
+		return;
+	}
+
+	if (!(js->server_caps & JABBER_CAP_BLOCKING))
+		return;
+
+	iq = jabber_iq_new(js, JABBER_IQ_SET);
+
+	unblock = xmlnode_new_child(iq->node, "unblock");
+	xmlnode_set_namespace(unblock, "urn:xmpp:blocking");
+
+	item = xmlnode_new_child(unblock, "item");
+	xmlnode_set_attrib(item, "jid", who);
+
+	jabber_iq_send(iq);
+}
+
 void jabber_add_feature(const char *shortname, const char *namespace, JabberFeatureEnabled cb) {
 	JabberFeature *feat;
 
--- a/libpurple/protocols/jabber/jabber.h	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/jabber/jabber.h	Fri Jan 02 07:42:04 2009 +0000
@@ -42,7 +42,8 @@
 
 	JABBER_CAP_PING			  = 1 << 11,
 	JABBER_CAP_ADHOC		  = 1 << 12,
-	
+	JABBER_CAP_BLOCKING       = 1 << 13,
+
 	JABBER_CAP_RETRIEVED      = 1 << 31
 } JabberCapabilities;
 
@@ -294,6 +295,9 @@
 void jabber_login(PurpleAccount *account);
 void jabber_close(PurpleConnection *gc);
 void jabber_idle_set(PurpleConnection *gc, int idle);
+void jabber_request_block_list(JabberStream *js);
+void jabber_add_deny(PurpleConnection *gc, const char *who);
+void jabber_rem_deny(PurpleConnection *gc, const char *who);
 void jabber_keepalive(PurpleConnection *gc);
 void jabber_register_gateway(JabberStream *js, const char *gateway);
 void jabber_register_account(PurpleAccount *account);
--- a/libpurple/protocols/jabber/libxmpp.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/jabber/libxmpp.c	Fri Jan 02 07:42:04 2009 +0000
@@ -77,9 +77,9 @@
 	jabber_roster_remove_buddy,		/* remove_buddy */
 	NULL,							/* remove_buddies */
 	NULL,							/* add_permit */
-	jabber_google_roster_add_deny,				/* add_deny */
+	jabber_add_deny,				/* add_deny */
 	NULL,							/* rem_permit */
-	jabber_google_roster_rem_deny,				/* rem_deny */
+	jabber_rem_deny,				/* rem_deny */
 	NULL,							/* set_permit_deny */
 	jabber_chat_join,				/* join_chat */
 	NULL,							/* reject_chat */
--- a/libpurple/protocols/jabber/message.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/jabber/message.c	Fri Jan 02 07:42:04 2009 +0000
@@ -291,27 +291,28 @@
 	PurpleAccount *account;
 	PurpleConversation *c;
 	char *username, *str;
-	
+
 	/* Delayed buzz MUST NOT be accepted */
 	if(jm->delayed)
 		return;
-	
+
 	/* Reject buzz when it's not enabled */
 	if(!jm->js->allowBuzz)
 		return;
-	
+
 	account = purple_connection_get_account(jm->js->gc);
-	
-	if ((buddy = purple_find_buddy(account, jm->from)) != NULL)
-		username = g_markup_escape_text(purple_buddy_get_alias(buddy), -1);
-	else
+
+	if ((buddy = purple_find_buddy(account, jm->from)) == NULL)
 		return; /* Do not accept buzzes from unknown people */
 
-	c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, jm->from);
+	c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, jm->from, account);
+	if (c == NULL)
+		c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, jm->from);
 
-	str = g_strdup_printf(_("%s has buzzed you!"), username);
-	
-	purple_conversation_write(c, NULL, str, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL));
+	username = g_markup_escape_text(purple_buddy_get_alias(buddy), -1);
+	/* xmpp only has 1 attention type, so index is 0 */
+	purple_prpl_got_attention(jm->js->gc, username, 0);
+
 	g_free(username);
 	g_free(str);
 }
--- a/libpurple/protocols/jabber/parser.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/jabber/parser.c	Fri Jan 02 07:42:04 2009 +0000
@@ -37,7 +37,7 @@
 {
 	JabberStream *js = user_data;
 	xmlnode *node;
-	int i;
+	int i, j;
 
 	if(!element_name) {
 		return;
@@ -57,7 +57,7 @@
 				g_free(js->stream_id);
 				js->stream_id = attrib;
 			} else {
-				g_free(attrib);	
+				g_free(attrib);
 			}
 		}
 		if(js->protocol_version == JABBER_PROTO_0_9)
@@ -72,8 +72,21 @@
 		else
 			node = xmlnode_new((const char*) element_name);
 		xmlnode_set_namespace(node, (const char*) namespace);
+		xmlnode_set_prefix(node, (const char *)prefix);
 
+		if (nb_namespaces != 0) {
+			node->namespace_map = g_hash_table_new_full(
+				g_str_hash, g_str_equal, g_free, g_free);
+
+			for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) {
+				const char *key = (const char *)namespaces[j];
+				const char *val = (const char *)namespaces[j + 1];
+				g_hash_table_insert(node->namespace_map,
+					g_strdup(key ? key : ""), g_strdup(val ? val : ""));
+			}
+		}
 		for(i=0; i < nb_attributes * 5; i+=5) {
+			const char *prefix = (const char *)attributes[i + 1];
 			char *txt;
 			int attrib_len = attributes[i+4] - attributes[i+3];
 			char *attrib = g_malloc(attrib_len + 1);
@@ -90,6 +103,9 @@
 			attrib = purple_unescape_html(txt);
 			g_free(txt);
 			xmlnode_set_attrib_with_namespace(node, (const char*) attributes[i], attrib_ns, attrib);
+			if (prefix && *prefix) {
+				node->prefix = g_strdup(prefix);
+			}
 			g_free(attrib);
 			g_free(attrib_ns);
 		}
--- a/libpurple/protocols/msn/error.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/msn/error.c	Fri Jan 02 07:42:04 2009 +0000
@@ -27,191 +27,178 @@
 const char *
 msn_error_get_text(unsigned int type, gboolean *debug)
 {
-	static char msg[MSN_BUF_LEN];
+	static char msg[256];
+	const char *result;
 	*debug = FALSE;
 
 	switch (type) {
 		case 0:
-			g_snprintf(msg, sizeof(msg),
-			           _("Unable to parse message"));
+			result = _("Unable to parse message");
 			*debug = TRUE;
 			break;
 		case 200:
-			g_snprintf(msg, sizeof(msg),
-			           _("Syntax Error (probably a client bug)"));
+			result = _("Syntax Error (probably a client bug)");
 			*debug = TRUE;
 			break;
 		case 201:
-			g_snprintf(msg, sizeof(msg),
-			           _("Invalid email address"));
+			result = _("Invalid email address");
 			break;
 		case 205:
-			g_snprintf(msg, sizeof(msg), _("User does not exist"));
+			result = _("User does not exist");
 			break;
 		case 206:
-			g_snprintf(msg, sizeof(msg),
-			           _("Fully qualified domain name missing"));
+			result = _("Fully qualified domain name missing");
 			break;
 		case 207:
-			g_snprintf(msg, sizeof(msg), _("Already logged in"));
+			result = _("Already logged in");
 			break;
 		case 208:
-			g_snprintf(msg, sizeof(msg), _("Invalid username"));
+			result = _("Invalid username");
 			break;
 		case 209:
-			g_snprintf(msg, sizeof(msg), _("Invalid friendly name"));
+			result = _("Invalid friendly name");
 			break;
 		case 210:
-			g_snprintf(msg, sizeof(msg), _("List full"));
+			result = _("List full");
 			break;
 		case 215:
-			g_snprintf(msg, sizeof(msg), _("Already there"));
+			result = _("Already there");
 			*debug = TRUE;
 			break;
 		case 216:
-			g_snprintf(msg, sizeof(msg), _("Not on list"));
+			result = _("Not on list");
 			break;
 		case 217:
-			g_snprintf(msg, sizeof(msg), _("User is offline"));
+			result = _("User is offline");
 			break;
 		case 218:
-			g_snprintf(msg, sizeof(msg), _("Already in the mode"));
+			result = _("Already in the mode");
 			*debug = TRUE;
 			break;
 		case 219:
-			g_snprintf(msg, sizeof(msg), _("Already in opposite list"));
+			result = _("Already in opposite list");
 			*debug = TRUE;
 			break;
 		case 223:
-			g_snprintf(msg, sizeof(msg), _("Too many groups"));
+			result = _("Too many groups");
 			break;
 		case 224:
-			g_snprintf(msg, sizeof(msg), _("Invalid group"));
+			result = _("Invalid group");
 			break;
 		case 225:
-			g_snprintf(msg, sizeof(msg), _("User not in group"));
+			result = _("User not in group");
 			break;
 		case 229:
-			g_snprintf(msg, sizeof(msg), _("Group name too long"));
+			result = _("Group name too long");
 			break;
 		case 230:
-			g_snprintf(msg, sizeof(msg), _("Cannot remove group zero"));
+			result = _("Cannot remove group zero");
 			*debug = TRUE;
 			break;
 		case 231:
-			g_snprintf(msg, sizeof(msg),
-			           _("Tried to add a user to a group "
-			             "that doesn't exist"));
+			result = _("Tried to add a user to a group that doesn't exist");
 			break;
 		case 280:
-			g_snprintf(msg, sizeof(msg), _("Switchboard failed"));
+			result = _("Switchboard failed");
 			*debug = TRUE;
 			break;
 		case 281:
-			g_snprintf(msg, sizeof(msg), _("Notify transfer failed"));
+			result = _("Notify transfer failed");
 			*debug = TRUE;
 			break;
 
 		case 300:
-			g_snprintf(msg, sizeof(msg), _("Required fields missing"));
+			result = _("Required fields missing");
 			*debug = TRUE;
 			break;
 		case 301:
-			g_snprintf(msg, sizeof(msg), _("Too many hits to a FND"));
+			result = _("Too many hits to a FND");
 			*debug = TRUE;
 			break;
 		case 302:
-			g_snprintf(msg, sizeof(msg), _("Not logged in"));
+			result = _("Not logged in");
 			break;
 
 		case 500:
-			g_snprintf(msg, sizeof(msg),
-			           _("Service temporarily unavailable"));
+			result = _("Service temporarily unavailable");
 			break;
 		case 501:
-			g_snprintf(msg, sizeof(msg), _("Database server error"));
+			result = _("Database server error");
 			*debug = TRUE;
 			break;
 		case 502:
-			g_snprintf(msg, sizeof(msg), _("Command disabled"));
+			result = _("Command disabled");
 			*debug = TRUE;
 			break;
 		case 510:
-			g_snprintf(msg, sizeof(msg), _("File operation error"));
+			result = _("File operation error");
 			*debug = TRUE;
 			break;
 		case 520:
-			g_snprintf(msg, sizeof(msg), _("Memory allocation error"));
+			result = _("Memory allocation error");
 			*debug = TRUE;
 			break;
 		case 540:
-			g_snprintf(msg, sizeof(msg),
-			           _("Wrong CHL value sent to server"));
+			result = _("Wrong CHL value sent to server");
 			*debug = TRUE;
 			break;
 
 		case 600:
-			g_snprintf(msg, sizeof(msg), _("Server busy"));
+			result = _("Server busy");
 			break;
 		case 601:
-			g_snprintf(msg, sizeof(msg), _("Server unavailable"));
+			result = _("Server unavailable");
 			break;
 		case 602:
-			g_snprintf(msg, sizeof(msg),
-			           _("Peer notification server down"));
+			result = _("Peer notification server down");
 			*debug = TRUE;
 			break;
 		case 603:
-			g_snprintf(msg, sizeof(msg), _("Database connect error"));
+			result = _("Database connect error");
 			*debug = TRUE;
 			break;
 		case 604:
-			g_snprintf(msg, sizeof(msg),
-					   _("Server is going down (abandon ship)"));
+			result = _("Server is going down (abandon ship)");
 			break;
 		case 605:
-			g_snprintf(msg, sizeof(msg), _("Server unavailable"));
+			result = _("Server unavailable");
 			break;
 
 		case 707:
-			g_snprintf(msg, sizeof(msg),
-			           _("Error creating connection"));
+			result = _("Error creating connection");
 			*debug = TRUE;
 			break;
 		case 710:
-			g_snprintf(msg, sizeof(msg),
-			           _("CVR parameters are either unknown "
-			             "or not allowed"));
+			result = _("CVR parameters are either unknown or not allowed");
 			*debug = TRUE;
 			break;
 		case 711:
-			g_snprintf(msg, sizeof(msg), _("Unable to write"));
+			result = _("Unable to write");
 			break;
 		case 712:
-			g_snprintf(msg, sizeof(msg), _("Session overload"));
+			result = _("Session overload");
 			*debug = TRUE;
 			break;
 		case 713:
-			g_snprintf(msg, sizeof(msg), _("User is too active"));
+			result = _("User is too active");
 			break;
 		case 714:
-			g_snprintf(msg, sizeof(msg), _("Too many sessions"));
+			result = _("Too many sessions");
 			break;
 		case 715:
-			g_snprintf(msg, sizeof(msg), _("Passport not verified"));
+			result = _("Passport not verified");
 			break;
 		case 717:
-			g_snprintf(msg, sizeof(msg), _("Bad friend file"));
+			result = _("Bad friend file");
 			*debug = TRUE;
 			break;
 		case 731:
-			g_snprintf(msg, sizeof(msg), _("Not expected"));
+			result = _("Not expected");
 			*debug = TRUE;
 			break;
 
 		case 800:
-			g_snprintf(msg, sizeof(msg),
-			           _("Friendly name changes too rapidly"));
+			result = _("Friendly name changes too rapidly");
 			break;
 
 		case 910:
@@ -220,37 +207,34 @@
 		case 919:
 		case 921:
 		case 922:
-			g_snprintf(msg, sizeof(msg), _("Server too busy"));
+			result = _("Server too busy");
 			break;
 		case 911:
 		case 917:
-			g_snprintf(msg, sizeof(msg), _("Authentication failed"));
+			result = _("Authentication failed");
 			break;
 		case 913:
-			g_snprintf(msg, sizeof(msg), _("Not allowed when offline"));
+			result = _("Not allowed when offline");
 			break;
 		case 914:
 		case 915:
 		case 916:
-			g_snprintf(msg, sizeof(msg), _("Server unavailable"));
+			result = _("Server unavailable");
 			break;
 		case 920:
-			g_snprintf(msg, sizeof(msg), _("Not accepting new users"));
+			result = _("Not accepting new users");
 			break;
 		case 923:
-			g_snprintf(msg, sizeof(msg),
-			           _("Kids Passport without parental consent"));
+			result = _("Kids Passport without parental consent");
 			break;
 		case 924:
-			g_snprintf(msg, sizeof(msg),
-			           _("Passport account not yet verified"));
+			result = _("Passport account not yet verified");
 			break;
 		case 927:
-			g_snprintf(msg, sizeof(msg),
-			           _("Passport account suspended"));
+			result = _("Passport account suspended");
 			break;
 		case 928:
-			g_snprintf(msg, sizeof(msg), _("Bad ticket"));
+			result = _("Bad ticket");
 			*debug = TRUE;
 			break;
 
@@ -258,23 +242,25 @@
 			g_snprintf(msg, sizeof(msg),
 			           _("Unknown Error Code %d"), type);
 			*debug = TRUE;
+			result = msg;
 			break;
 	}
 
-	return msg;
+	return result;
 }
 
 void
 msn_error_handle(MsnSession *session, unsigned int type)
 {
-	char buf[MSN_BUF_LEN];
+	char *buf;
 	gboolean debug;
 
-	g_snprintf(buf, sizeof(buf), _("MSN Error: %s\n"),
-	           msn_error_get_text(type, &debug));
+	buf = g_strdup_printf(_("MSN Error: %s\n"),
+	                      msn_error_get_text(type, &debug));
 	if (debug)
 		purple_debug_warning("msn", "error %d: %s\n", type, buf);
 	else
 		purple_notify_error(session->account->gc, NULL, buf, NULL);
+	g_free(buf);
 }
 
--- a/libpurple/protocols/msn/oim.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/msn/oim.c	Fri Jan 02 07:42:04 2009 +0000
@@ -596,6 +596,7 @@
 	MsnMessage *message;
 	const char *date;
 	const char *from;
+	const char *boundary;
 	char *decode_msg = NULL;
 	gsize body_len;
 	char **tokens;
@@ -608,27 +609,14 @@
 	                          MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM);
 	purple_debug_info("msn", "oim body:{%s}\n", message->body);
 
-	if (!strcmp(msn_message_get_attr(message, "X-OIMProxy"), "MOSMS")) {
-		char *boundary;
+	boundary = msn_message_get_attr(message, "boundary");
+
+	if (boundary != NULL) {
+		char *bounds;
 		char **part;
 
-		from = msn_message_get_attr(message, "X-OIM-originatingSource");
-
-		/* Match number to user's mobile number, FROM is a phone number
-		   if the other side pages you using your phone number */
-		if (!strncmp(from, "tel:+", 5)) {
-			MsnUser *user =	msn_userlist_find_user_with_mobile_phone(
-					rdata->oim->session->userlist, from + 4);
-
-			if (user && user->passport)
-				passport = g_strdup(user->passport);
-		}
-		if (passport == NULL)
-			passport = g_strdup(from);
-
-		boundary = g_strdup_printf("--%s" MSG_OIM_LINE_DEM,
-		                           msn_message_get_attr(message, "boundary"));
-		tokens = g_strsplit(message->body, boundary, 0);
+		bounds = g_strdup_printf("--%s" MSG_OIM_LINE_DEM, boundary);
+		tokens = g_strsplit(message->body, bounds, 0);
 
 		/* tokens+1 to skip the "This is a multipart message..." text */
 		for (part = tokens+1; *part != NULL; part++) {
@@ -648,18 +636,33 @@
 		}
 
 		g_strfreev(tokens);
-		g_free(boundary);
+		g_free(bounds);
 
 		if (decode_msg == NULL) {
 			purple_debug_error("msn", "Couldn't find text/plain OIM message.\n");
-			g_free(passport);
+			msn_message_destroy(message);
 			return;
 		}
 	} else {
+		decode_msg = (char *)purple_base64_decode(message->body, &body_len);
+	}
+
+	from = msn_message_get_attr(message, "X-OIM-originatingSource");
+
+	/* Match number to user's mobile number, FROM is a phone number
+	   if the other side pages you using your phone number */
+	if (!strncmp(from, "tel:+", 5)) {
+		MsnUser *user =	msn_userlist_find_user_with_mobile_phone(
+				rdata->oim->session->userlist, from + 4);
+
+		if (user && user->passport)
+			passport = g_strdup(user->passport);
+	}
+
+	if (passport == NULL) {
 		char *start, *end;
 
 		from = msn_message_get_attr(message, "From");
-		decode_msg = (char *)purple_base64_decode(message->body, &body_len);
 
 		tokens = g_strsplit(from, " ", 2);
 		if (tokens[1] != NULL)
@@ -687,6 +690,7 @@
 
 	g_free(passport);
 	g_free(decode_msg);
+	msn_message_destroy(message);
 }
 
 /* Parse the XML data,
--- a/libpurple/protocols/myspace/myspace.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/myspace/myspace.c	Fri Jan 02 07:42:04 2009 +0000
@@ -211,7 +211,6 @@
 			/* Don't have uid offhand - need to ask for it, and wait until hear back before sending. */
 			purple_debug_info("msim", ">>> msim_postprocess_outgoing: couldn't find username %s in blist\n",
 					username ? username : "(NULL)");
-			/* TODO: where is cloned message freed? Should be in _cb. */
 			msim_lookup_user(session, username, msim_postprocess_outgoing_cb, msim_msg_clone(msg));
 			return TRUE;       /* not sure of status yet - haven't sent! */
 		}
@@ -1923,8 +1922,7 @@
 
 	msim_process(session, msg);
 
-	/* TODO: Free copy cloned from  msim_preprocess_incoming(). */
-	/* msim_msg_free(msg); */
+	msim_msg_free(msg);
 	msim_msg_free(body);
 }
 
@@ -2731,9 +2729,15 @@
 	 * doesn't seem like it would be necessary, but the official client
 	 * does it)
 	 */
-	if (!msim_update_blocklist_for_buddy(session, buddy->name, FALSE, FALSE))
+	if (!msim_update_blocklist_for_buddy(session, buddy->name, FALSE, FALSE)) {
 		purple_notify_error(NULL, NULL,
 				_("Failed to remove buddy"), _("blocklist command failed"));
+		return;
+	}
+	if (buddy->proto_data) {
+		msim_user_free(buddy->proto_data);
+		buddy->proto_data = NULL;
+	}
 }
 
 /**
@@ -2823,6 +2827,13 @@
 	msim_update_blocklist_for_buddy(session, name, FALSE, FALSE);
 }
 
+static void
+msim_buddy_free(PurpleBuddy *buddy)
+{
+	msim_user_free(buddy->proto_data);
+	buddy->proto_data = NULL;
+}
+
 /**
  * Returns a string of a username in canonical form. Basically removes all the
  * spaces, lowercases the string, and looks up user IDs to usernames.
@@ -3039,7 +3050,7 @@
 	NULL,              /* alias_buddy */
 	NULL,              /* group_buddy */
 	NULL,              /* rename_group */
-	NULL,              /* buddy_free */
+	msim_buddy_free,   /* buddy_free */
 	NULL,              /* convo_closed */
 	msim_normalize,    /* normalize */
 	NULL,              /* set_buddy_icon */
--- a/libpurple/protocols/myspace/session.h	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/myspace/session.h	Fri Jan 02 07:42:04 2009 +0000
@@ -35,7 +35,7 @@
 	guint userid;                       /**< This user's numeric user ID */
 	gchar *username;                    /**< This user's unique username */
 	gboolean show_only_to_list;
-	int privacy_mode;
+	int privacy_mode;                   /**< This is a bitmask */
 	int offline_message_mode;
 	gint fd;                            /**< File descriptor to/from server */
 
--- a/libpurple/protocols/myspace/user.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/myspace/user.c	Fri Jan 02 07:42:04 2009 +0000
@@ -55,10 +55,9 @@
 	if (!buddy->proto_data) {
 		/* No MsimUser for this buddy; make one. */
 
-		/* TODO: where is this freed? */
 		user = g_new0(MsimUser, 1);
 		user->buddy = buddy;
-		user->id = purple_blist_node_get_int(&buddy->node, "UserID");
+		user->id = purple_blist_node_get_int((PurpleBlistNode*)buddy, "UserID");
 		buddy->proto_data = (gpointer)user;
 	}
 
@@ -67,6 +66,23 @@
 	return user;
 }
 
+void msim_user_free(MsimUser *user)
+{
+	if (!user)
+		return;
+
+	g_free(user->client_info);
+	g_free(user->gender);
+	g_free(user->location);
+	g_free(user->headline);
+	g_free(user->display_name);
+	g_free(user->username);
+	g_free(user->band_name);
+	g_free(user->song_name);
+	g_free(user->image_url);
+	g_free(user);
+}
+
 /**
  * Find and return an MsimUser * representing a user on the buddy list, or NULL.
  */
@@ -406,10 +422,11 @@
 	}
 
 	if (msim_msg_get_integer(msg, "dsn") == MG_OWN_IM_INFO_DSN &&
-		msim_msg_get_integer(msg, "lid") == MG_OWN_IM_INFO_LID) {
+		msim_msg_get_integer(msg, "lid") == MG_OWN_IM_INFO_LID)
+	{
 		/*
 		 * Some of this info will be available on the buddy list if the
-		 * has themselves as their own buddy.
+		 * user has themselves as their own buddy.
 		 *
 		 * Much of the info is already available in MsimSession,
 		 * stored in msim_we_are_logged_on().
@@ -431,7 +448,7 @@
 				"idlist", MSIM_TYPE_STRING,
 						g_strdup_printf("w%d|c%d",
 								session->show_only_to_list ? 1 : 0,
-								session->privacy_mode),
+								session->privacy_mode & 1),
 				NULL);
 	} else if (msim_msg_get_integer(msg, "dsn") == MG_OWN_MYSPACE_INFO_DSN &&
 			msim_msg_get_integer(msg, "lid") == MG_OWN_MYSPACE_INFO_LID) {
--- a/libpurple/protocols/myspace/user.h	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/myspace/user.h	Fri Jan 02 07:42:04 2009 +0000
@@ -47,6 +47,7 @@
 typedef void (*MSIM_USER_LOOKUP_CB)(MsimSession *session, const MsimMessage *userinfo, gpointer data);
 
 MsimUser *msim_get_user_from_buddy(PurpleBuddy *buddy);
+void msim_user_free(MsimUser *user);
 MsimUser *msim_find_user(MsimSession *session, const gchar *username);
 void msim_append_user_info(MsimSession *session, PurpleNotifyUserInfo *user_info, MsimUser *user, gboolean full);
 gboolean msim_store_user_info(MsimSession *session, const MsimMessage *msg, MsimUser *user);
--- a/libpurple/protocols/oscar/odc.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/oscar/odc.c	Fri Jan 02 07:42:04 2009 +0000
@@ -567,6 +567,7 @@
 	{
 		purple_debug_info("oscar", "Unknown ODC frame type 0x%04hx, "
 				"subtype 0x%04hx.\n", frame->type, frame->subtype);
+		g_free(frame);
 		return;
 	}
 
@@ -607,6 +608,7 @@
 			g_free(tmp);
 
 			peer_connection_destroy(conn, OSCAR_DISCONNECT_LOCAL_CLOSED, NULL);
+			g_free(frame);
 			return;
 		}
 
--- a/libpurple/protocols/qq/AUTHORS	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/qq/AUTHORS	Fri Jan 02 07:42:04 2009 +0000
@@ -1,7 +1,7 @@
 Code Contributors
 =========
 puzzlebird	: original author
-gfhuang		: patches for libpurple 2.0.0beta2, maintainer
+gfhuang(poppyer): patches for libpurple 2.0.0beta2, maintainer
 Yuan Qingyun	: patches for libpurple 1.5.0, maintainer
 henryouly	: file transfer, udp sock5 proxy and qq_show, maintainer
 hzhr		: maintainer
--- a/libpurple/protocols/qq/ChangeLog	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/qq/ChangeLog	Fri Jan 02 07:42:04 2009 +0000
@@ -1,3 +1,10 @@
+2008.12.25 - flos <lonicerae(at)gmail.com>
+	* References #7821
+	* Updated authors
+
+2008.12.17 - flos <lonicerae(at)gmail.com>
+	* Minor fixed in buddy_info.c
+
 2008.12.06 - flos <lonicerae(at)gmail.com>
 	* Removed version checking script in Makefiles since our developers all migrated to monotone
 	* Use our development revision as OPENQ_VERSION in qq.c
--- a/libpurple/protocols/qq/buddy_info.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/qq/buddy_info.c	Fri Jan 02 07:42:04 2009 +0000
@@ -790,7 +790,7 @@
 		bytes += qq_get32(&onlineTime, data + bytes);
 		bytes += qq_get16(&level, data + bytes);
 		bytes += qq_get16(&timeRemainder, data + bytes);
-		purple_debug_info("QQ", "level: %d, uid %d, tmOnline: %d, tmRemainder: %d\n",
+		purple_debug_info("QQ", "level: %d, uid %u, tmOnline: %d, tmRemainder: %d\n",
 				level, uid, onlineTime, timeRemainder);
 
 		bd = qq_buddy_data_find(gc, uid);
@@ -825,12 +825,12 @@
 	bytes += qq_get32(&onlineTime, data + bytes);
 	bytes += qq_get16(&level, data + bytes);
 	bytes += qq_get16(&timeRemainder, data + bytes);
-	purple_debug_info("QQ", "level: %d, uid %d, tmOnline: %d, tmRemainder: %d\n",
+	purple_debug_info("QQ", "level: %d, uid %u, tmOnline: %d, tmRemainder: %d\n",
 			level, uid, onlineTime, timeRemainder);
 
 	bd = qq_buddy_data_find(gc, uid);
 	if (bd == NULL) {
-		purple_debug_error("QQ", "Got levels of %d not in my buddy list\n", uid);
+		purple_debug_error("QQ", "Got levels of %u not in my buddy list\n", uid);
 		return;
 	}
 
--- a/libpurple/protocols/qq/group_internal.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/qq/group_internal.c	Fri Jan 02 07:42:04 2009 +0000
@@ -30,7 +30,7 @@
 #include "group_internal.h"
 #include "utils.h"
 
-static qq_room_data *room_data_new(guint32 id, guint32 ext_id, gchar *title)
+static qq_room_data *room_data_new(guint32 id, guint32 ext_id, const gchar *title)
 {
 	qq_room_data *rmd;
 
@@ -62,9 +62,9 @@
 
 	value = g_hash_table_lookup(data, QQ_ROOM_KEY_INTERNAL_ID);
 	id = value ? strtoul(value, NULL, 10) : 0;
-	value= g_hash_table_lookup(data, QQ_ROOM_KEY_EXTERNAL_ID);
+	value = g_hash_table_lookup(data, QQ_ROOM_KEY_EXTERNAL_ID);
 	ext_id = value ? strtoul(value, NULL, 10) : 0;
-	value = g_strdup(g_hash_table_lookup(data, QQ_ROOM_KEY_TITLE_UTF8));
+	value = g_hash_table_lookup(data, QQ_ROOM_KEY_TITLE_UTF8);
 
 	rmd = room_data_new(id, ext_id, value);
 	rmd->my_role = QQ_ROOM_ROLE_YES;
--- a/libpurple/protocols/qq/group_opt.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/qq/group_opt.c	Fri Jan 02 07:42:04 2009 +0000
@@ -416,11 +416,6 @@
 
 	bytes += qq_get_vstr(&reason, QQ_CHARSET_DEFAULT, data + bytes);
 
-	add_req = g_new0(qq_room_req, 1);
-	add_req->gc = gc;
-	add_req->id = id;
-	add_req->member = member_id;
-
 	purple_debug_info("QQ", "%u requested to join room, ext id %u\n", member_id, ext_id);
 
 	rmd = qq_room_data_find(gc, id);
@@ -442,6 +437,11 @@
 	who = uid_to_purple_name(member_id);
 	msg = g_strdup_printf(_("%u request to join Qun %u"), member_id, ext_id);
 
+	add_req = g_new0(qq_room_req, 1);
+	add_req->gc = gc;
+	add_req->id = id;
+	add_req->member = member_id;
+
 	purple_request_action(gc, _("QQ Qun Operation"),
 			msg, reason,
 			PURPLE_DEFAULT_ACTION_NONE,
--- a/libpurple/protocols/qq/qq.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/qq/qq.c	Fri Jan 02 07:42:04 2009 +0000
@@ -626,7 +626,7 @@
 	g_string_append(info, "puzzlebird<br>\n");
 	g_string_append(info, "<br>\n");
 	g_string_append(info, _("<p><b>Code Contributors</b>:<br>\n"));
-	g_string_append(info, "gfhuang : patches for libpurple 2.0.0beta2, maintainer<br>\n");
+	g_string_append(info, "gfhuang(poppyer) : patches for libpurple 2.0.0beta2, maintainer<br>\n");
 	g_string_append(info, "Yuan Qingyun : patches for libpurple 1.5.0, maintainer<br>\n");
 	g_string_append(info, "henryouly : file transfer, udp sock5 proxy and qq_show, maintainer<br>\n");
 	g_string_append(info, "hzhr : maintainer<br>\n");
--- a/libpurple/protocols/qq/qq_network.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/qq/qq_network.c	Fri Jan 02 07:42:04 2009 +0000
@@ -468,7 +468,7 @@
 
 static void udp_pending(gpointer data, gint source, PurpleInputCondition cond)
 {
-	PurpleConnection *gc = (PurpleConnection *) data;
+	PurpleConnection *gc = NULL;
 	qq_data *qd;
 	guint8 *buf;
 	gint buf_len;
--- a/libpurple/protocols/sametime/sametime.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/protocols/sametime/sametime.c	Fri Jan 02 07:42:04 2009 +0000
@@ -3724,7 +3724,6 @@
   gc->flags |= PURPLE_CONNECTION_NO_IMAGES;
 
   user = g_strdup(purple_account_get_username(account));
-  pass = g_strdup(purple_account_get_password(account));
 
   host = strrchr(user, ':');
   if(host) {
@@ -3741,10 +3740,12 @@
   if(! host || ! *host) {
     /* somehow, we don't have a host to connect to. Well, we need one
        to actually continue, so let's ask the user directly. */
+    g_free(user);
     prompt_host(gc);
     return;
   }
 
+  pass = g_strdup(purple_account_get_password(account));
   port = purple_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT);
 
   DEBUG_INFO("user: '%s'\n", user);
--- a/libpurple/purple-url-handler	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/purple-url-handler	Fri Jan 02 07:42:04 2009 +0000
@@ -299,6 +299,31 @@
     else:
         goim(account, screenname)
 
+def gtalk(uri):
+    protocol = "prpl-jabber"
+    match = re.match(r"^gtalk:([^?]*)(\?(.*))", uri)
+    if not match:
+        print "Invalid gtalk URI: %s" % uri
+        return
+
+    command = urllib.unquote_plus(match.group(1))
+    paramstring = match.group(3)
+    params = {}
+    if paramstring:
+        for param in paramstring.split("&"):
+            key, value = extendlist(param.split("=", 1), 2, "")
+            params[key] = urllib.unquote_plus(value)
+    accountname = params.get("from_jid", "")
+    jid = params.get("jid", "")
+
+    account = findaccount(protocol, accountname)
+
+    if command.lower() == "chat":
+        goim(account, jid)
+    elif command.lower() == "call":
+        # XXX V&V prompt to establish call
+        goim(account, jid)
+
 def ymsgr(uri):
     protocol = "prpl-yahoo"
     match = re.match(r"^ymsgr:([^?]*)(\?([^&]*)(&(.*))?)", uri)
@@ -355,6 +380,8 @@
             sip(uri)
         elif type == "xmpp":
             xmpp(uri)
+        elif type == "gtalk":
+            gtalk(uri)
         elif type == "ymsgr":
             ymsgr(uri)
         else:
--- a/libpurple/server.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/server.c	Fri Jan 02 07:42:04 2009 +0000
@@ -804,7 +804,7 @@
 {
 	PurpleAccount *account;
 	char buf2[BUF_LONG];
-	struct chat_invite_data *cid = g_new0(struct chat_invite_data, 1);
+	struct chat_invite_data *cid;
 	int plugin_return;
 
 	account = purple_connection_get_account(gc);
@@ -817,6 +817,8 @@
 		}
 	}
 
+	cid = g_new0(struct chat_invite_data, 1);
+
 	plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1(
 					purple_conversations_get_handle(),
 					"chat-invited", account, who, name, message, data));
--- a/libpurple/util.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/util.c	Fri Jan 02 07:42:04 2009 +0000
@@ -1676,20 +1676,18 @@
 							  size = "xx-small";
 							  break;
 							case 2:
-							  size = "x-small";
+							  size = "small";
 							  break;
 							case 3:
-							  size = "small";
+							  size = "medium";
 							  break;
 							case 4:
-							  size = "medium";
+							  size = "large";
 							  break;
 							case 5:
-							  size = "large";
+							  size = "x-large";
 							  break;
 							case 6:
-							  size = "x-large";
-							  break;
 							case 7:
 							  size = "xx-large";
 							  break;
--- a/libpurple/value.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/value.c	Fri Jan 02 07:42:04 2009 +0000
@@ -320,6 +320,7 @@
 purple_value_set_string(PurpleValue *value, const char *data)
 {
 	g_return_if_fail(value != NULL);
+	g_return_if_fail(data == NULL || g_utf8_validate(data, -1, NULL));
 
 	g_free(value->data.string_data);
 	value->data.string_data = g_strdup(data);
--- a/libpurple/win32/libc_interface.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/win32/libc_interface.c	Fri Jan 02 07:42:04 2009 +0000
@@ -31,13 +31,7 @@
 #include "config.h"
 #include "debug.h"
 #include "libc_internal.h"
-#if GLIB_CHECK_VERSION(2,6,0)
-# include <glib/gstdio.h>
-#else
-#define g_remove remove
-#define g_rename rename
-#define g_stat stat
-#endif
+#include <glib/gstdio.h>
 
 #ifdef ENABLE_NLS
 #  include <locale.h>
@@ -58,6 +52,9 @@
 #  define dngettext(Domain, Singular, Plural, Number) ((Number == 1) ? ((const char *)Singular) : ((const char *)Plural))
 #endif
 
+#ifndef S_ISDIR
+# define S_ISDIR(m) (((m)&S_IFDIR)==S_IFDIR)
+#endif
 
 static char errbuf[1024];
 
--- a/libpurple/xmlnode.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/libpurple/xmlnode.c	Fri Jan 02 07:42:04 2009 +0000
@@ -662,7 +662,7 @@
 	vsnprintf(errmsg, sizeof(errmsg), msg, args);
 	va_end(args);
 
-	purple_debug_error("xmlnode", "Error parsing xml file: %s\n", errmsg);
+	purple_debug_error("xmlnode", "Error parsing xml file: %s", errmsg);
 }
 
 static xmlSAXHandler xmlnode_parser_libxml = {
--- a/pidgin/gtkaccount.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/pidgin/gtkaccount.c	Fri Jan 02 07:42:04 2009 +0000
@@ -286,25 +286,27 @@
 screenname_nofocus_cb(GtkWidget *widget, GdkEventFocus *event, AccountPrefsDialog *dialog)
 {
 	GdkColor color = {0, 34952, 35466, 34181};
-	GHashTable *table;
-	const char *label;
-
-	table = dialog->prpl_info->get_account_text_table(NULL);
-	label = g_hash_table_lookup(table, "login_label");
-
-	if (*gtk_entry_get_text(GTK_ENTRY(widget)) == '\0') {
-		/* We have to avoid hitting the screenname_changed_cb function 
-		 * because it enables buttons we don't want enabled yet ;)
-		 */
-		g_signal_handlers_block_by_func(widget, G_CALLBACK(screenname_changed_cb), dialog);
-		gtk_entry_set_text(GTK_ENTRY(widget), label);
-		/* Make sure we can hit it again */
-		g_signal_handlers_unblock_by_func(widget, G_CALLBACK(screenname_changed_cb), dialog);
-		gtk_widget_modify_text(widget, GTK_STATE_NORMAL, &color);
+	GHashTable *table = NULL;
+	const char *label = NULL;
+
+	if(PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(dialog->prpl_info, get_account_text_table)) {
+		table = dialog->prpl_info->get_account_text_table(NULL);
+		label = g_hash_table_lookup(table, "login_label");
+
+		if (*gtk_entry_get_text(GTK_ENTRY(widget)) == '\0') {
+			/* We have to avoid hitting the screenname_changed_cb function 
+			 * because it enables buttons we don't want enabled yet ;)
+			 */
+			g_signal_handlers_block_by_func(widget, G_CALLBACK(screenname_changed_cb), dialog);
+			gtk_entry_set_text(GTK_ENTRY(widget), label);
+			/* Make sure we can hit it again */
+			g_signal_handlers_unblock_by_func(widget, G_CALLBACK(screenname_changed_cb), dialog);
+			gtk_widget_modify_text(widget, GTK_STATE_NORMAL, &color);
+		}
+
+		g_hash_table_destroy(table);
 	}
 
-	g_hash_table_destroy(table);
-
 	return FALSE;
 }
 
--- a/pidgin/gtkblist.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/pidgin/gtkblist.c	Fri Jan 02 07:42:04 2009 +0000
@@ -602,7 +602,7 @@
 			break;
 		case PURPLE_BLIST_GROUP_NODE:
 			dest = purple_find_group(arg2);
-			if (dest != NULL && strcmp(arg2, ((PurpleGroup*) node)->name)) {
+			if (dest != NULL && purple_utf8_strcasecmp(arg2, ((PurpleGroup*) node)->name)) {
 				pidgin_dialogs_merge_groups((PurpleGroup*) node, arg2);
 			} else
 				purple_blist_rename_group((PurpleGroup*)node, arg2);
@@ -7655,6 +7655,7 @@
 	GtkAccelGroup *accel_group = NULL;
 	GList *l = NULL, *accounts = NULL;
 	gboolean disabled_accounts = FALSE;
+	gboolean enabled_accounts = FALSE;
 
 	if (accountmenu == NULL)
 		return;
@@ -7708,10 +7709,16 @@
 				G_CALLBACK(enable_account_cb), account);
 			gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
 			gtk_widget_show(menuitem);
+		} else {
+			enabled_accounts = TRUE;
 		}
 	}
 
+	if (!enabled_accounts)
+		return;
+
 	pidgin_separator(accountmenu);
+	accel_group = gtk_menu_get_accel_group(GTK_MENU(accountmenu));
 
 	for (accounts = purple_accounts_get_all(); accounts; accounts = accounts->next) {
 		char *buf = NULL;
@@ -7723,67 +7730,63 @@
 		PurplePlugin *plugin = NULL;
 
 		account = accounts->data;
-		accel_group = gtk_menu_get_accel_group(GTK_MENU(accountmenu));
-
-		if(purple_account_get_enabled(account, PIDGIN_UI)) {
-			buf = g_strconcat(purple_account_get_username(account), " (",
-					purple_account_get_protocol_name(account), ")", NULL);
-			menuitem = gtk_image_menu_item_new_with_label(buf);
-			accel_path_buf = g_strconcat(N_("<PurpleMain>/Accounts/"), buf, NULL);
-			g_free(buf);
-			pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
-			if (pixbuf != NULL)
-			{
-				if (!purple_account_is_connected(account))
-					gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf,
-							0.0, FALSE);
-				image = gtk_image_new_from_pixbuf(pixbuf);
-				g_object_unref(G_OBJECT(pixbuf));
-				gtk_widget_show(image);
-				gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
-			}
-			gtk_menu_shell_append(GTK_MENU_SHELL(accountmenu), menuitem);
+
+		if (!purple_account_get_enabled(account, PIDGIN_UI))
+			continue;
+
+		buf = g_strconcat(purple_account_get_username(account), " (",
+				purple_account_get_protocol_name(account), ")", NULL);
+		menuitem = gtk_image_menu_item_new_with_label(buf);
+		accel_path_buf = g_strconcat(N_("<PurpleMain>/Accounts/"), buf, NULL);
+		g_free(buf);
+		pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
+		if (pixbuf != NULL) {
+			if (!purple_account_is_connected(account))
+				gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf,
+						0.0, FALSE);
+			image = gtk_image_new_from_pixbuf(pixbuf);
+			g_object_unref(G_OBJECT(pixbuf));
+			gtk_widget_show(image);
+			gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+		}
+		gtk_menu_shell_append(GTK_MENU_SHELL(accountmenu), menuitem);
+		gtk_widget_show(menuitem);
+
+		submenu = gtk_menu_new();
+		gtk_menu_set_accel_group(GTK_MENU(submenu), accel_group);
+		gtk_menu_set_accel_path(GTK_MENU(submenu), accel_path_buf);
+		g_free(accel_path_buf);
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
+		gtk_widget_show(submenu);
+
+
+		menuitem = gtk_menu_item_new_with_mnemonic(_("_Edit Account"));
+		g_signal_connect(G_OBJECT(menuitem), "activate",
+				G_CALLBACK(modify_account_cb), account);
+		gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
+		gtk_widget_show(menuitem);
+
+		pidgin_separator(submenu);
+
+		gc = purple_account_get_connection(account);
+		plugin = gc && PURPLE_CONNECTION_IS_CONNECTED(gc) ? gc->prpl : NULL;
+		if (plugin && PURPLE_PLUGIN_HAS_ACTIONS(plugin)) {
+			build_plugin_actions(submenu, plugin, gc);
+		} else {
+			menuitem = gtk_menu_item_new_with_label(_("No actions available"));
+			gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
+			gtk_widget_set_sensitive(menuitem, FALSE);
 			gtk_widget_show(menuitem);
-
-			submenu = gtk_menu_new();
-			gtk_menu_set_accel_group(GTK_MENU(submenu), accel_group);
-			gtk_menu_set_accel_path(GTK_MENU(submenu), accel_path_buf);
-			g_free(accel_path_buf);
-			gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
-			gtk_widget_show(submenu);
-
-
-			menuitem = gtk_menu_item_new_with_mnemonic(_("_Edit Account"));
-			g_signal_connect(G_OBJECT(menuitem), "activate",
-					G_CALLBACK(modify_account_cb), account);
-			gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
-			gtk_widget_show(menuitem);
-
-			pidgin_separator(submenu);
-
-			gc = purple_account_get_connection(account);
-			plugin = gc && PURPLE_CONNECTION_IS_CONNECTED(gc) ? gc->prpl : NULL;
-			if (plugin && PURPLE_PLUGIN_HAS_ACTIONS(plugin)) {
-				build_plugin_actions(submenu, plugin, gc);
-			} else {
-				menuitem = gtk_menu_item_new_with_label(_("No actions available"));
-				gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
-				gtk_widget_set_sensitive(menuitem, FALSE);
-				gtk_widget_show(menuitem);
-			}
-
-			pidgin_separator(submenu);
-
-			menuitem = gtk_menu_item_new_with_mnemonic(_("_Disable"));
-			g_signal_connect(G_OBJECT(menuitem), "activate",
-					G_CALLBACK(disable_account_cb), account);
-			gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
-			gtk_widget_show(menuitem);
-		} else {
-			disabled_accounts = TRUE;
 		}
-	}
-
+
+		pidgin_separator(submenu);
+
+		menuitem = gtk_menu_item_new_with_mnemonic(_("_Disable"));
+		g_signal_connect(G_OBJECT(menuitem), "activate",
+				G_CALLBACK(disable_account_cb), account);
+		gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
+		gtk_widget_show(menuitem);
+	}
 }
 
 static GList *plugin_submenus = NULL;
--- a/pidgin/gtkdialogs.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/pidgin/gtkdialogs.c	Fri Jan 02 07:42:04 2009 +0000
@@ -100,6 +100,7 @@
 
 /* Order: Alphabetical by Last Name */
 static const struct developer patch_writers[] = {
+	{"Paul Aurich", NULL, NULL },
 	{"Marcus 'malu' Lundblad", NULL, NULL},
 	{"Dennis 'EvilDennisR' Ristuccia",	N_("Senior Contributor/QA"),	NULL},
 	{"Peter 'Fmoo' Ruibal",		NULL,	NULL},
--- a/pidgin/gtkimhtml.c	Fri Dec 19 08:10:19 2008 +0000
+++ b/pidgin/gtkimhtml.c	Fri Jan 02 07:42:04 2009 +0000
@@ -3117,15 +3117,15 @@
 							else if (g_ascii_strcasecmp(size, "smaller") == 0
 								  || g_ascii_strcasecmp(size, "x-small") == 0)
 								font->size = 2;
-							else if (g_ascii_strcasecmp(size, "larger") == 0
-								  || g_ascii_strcasecmp(size, "medium") == 0)
+							else if (g_ascii_strcasecmp(size, "medium") == 0)
+								font->size = 3;
+							else if (g_ascii_strcasecmp(size, "large") == 0
+								  || g_ascii_strcasecmp(size, "larger") == 0)
 								font->size = 4;
-							else if (g_ascii_strcasecmp(size, "large") == 0)
+							else if (g_ascii_strcasecmp(size, "x-large") == 0)
 								font->size = 5;
-							else if (g_ascii_strcasecmp(size, "x-large") == 0)
+							else if (g_ascii_strcasecmp(size, "xx-large") == 0)
 								font->size = 6;
-							else if (g_ascii_strcasecmp(size, "xx-large") == 0)
-								font->size = 7;
 
 							/*
 							 * TODO: Handle other values, like percentages, or
--- a/po/ca.po	Fri Dec 19 08:10:19 2008 +0000
+++ b/po/ca.po	Fri Jan 02 07:42:04 2009 +0000
@@ -33,8 +33,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-12-17 21:51+0100\n"
-"PO-Revision-Date: 2008-12-15 02:34+0100\n"
+"POT-Creation-Date: 2008-12-19 17:53+0100\n"
+"PO-Revision-Date: 2008-12-20 17:15+0100\n"
 "Last-Translator: Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>\n"
 "Language-Team: Catalan <tradgnome@softcatala.net>\n"
 "MIME-Version: 1.0\n"
@@ -442,7 +442,7 @@
 msgstr "Els grups buits"
 
 msgid "Offline buddies"
-msgstr "Els amics desconnectats"
+msgstr "Amics desconnectats"
 
 msgid "Sort"
 msgstr "Ordena"
@@ -1530,10 +1530,10 @@
 msgstr "Fora de línia"
 
 msgid "Online Buddies"
-msgstr "Els amics desconnectats"
+msgstr "Amics connectats"
 
 msgid "Offline Buddies"
-msgstr "Els amics desconnectats"
+msgstr "Amics desconnectats"
 
 msgid "Online/Offline"
 msgstr "En línia/fora de línia"
@@ -4021,7 +4021,7 @@
 msgstr "Directori de cerca"
 
 msgid "_Room:"
-msgstr "Sa_la:"
+msgstr "_Sala:"
 
 msgid "_Server:"
 msgstr "_Servidor:"
@@ -10512,7 +10512,7 @@
 "Introduïu la informació necessària sobre el xat al qual vulgueu entrar.\n"
 
 msgid "_Account:"
-msgstr "_Compte:"
+msgstr "C_ompte:"
 
 msgid "_Block"
 msgstr "_Bloca"
@@ -10568,7 +10568,7 @@
 
 #. join button
 msgid "_Join"
-msgstr "En_tra"
+msgstr "_Entra"
 
 msgid "Auto-Join"
 msgstr "Entra automàticament"
@@ -10615,7 +10615,7 @@
 msgstr "/Amics/_Visualitza el registre de l'usuari..."
 
 msgid "/Buddies/Sh_ow"
-msgstr "/Amics/M_ostra"
+msgstr "/Amics/Mos_tra"
 
 msgid "/Buddies/Show/_Offline Buddies"
 msgstr "/Amics/Mostra/Amics des_connectats"
@@ -10669,7 +10669,7 @@
 msgstr "/Eines/_Connectors"
 
 msgid "/Tools/Pr_eferences"
-msgstr "/Eines/Preferè_ncies"
+msgstr "/Eines/Pre_ferències"
 
 msgid "/Tools/Pr_ivacy"
 msgstr "/Eines/_Privadesa"
@@ -10678,7 +10678,7 @@
 msgstr "/Eines/Em_oticona"
 
 msgid "/Tools/_File Transfers"
-msgstr "/Eines/Transferència de _fitxers"
+msgstr "/Eines/_Transferència de fitxers"
 
 msgid "/Tools/R_oom List"
 msgstr "/Eines/_Llista de sales"
@@ -10897,13 +10897,13 @@
 "la llista d'amics.\n"
 
 msgid "A_lias:"
-msgstr "À_lies:"
+msgstr "Àl_ies:"
 
 msgid "Auto_join when account becomes online."
-msgstr "Entra _automàticament quant el compte estigui connectat."
+msgstr "_Entra automàticament quant el compte estigui connectat."
 
 msgid "_Remain in chat after window is closed."
-msgstr "_Continua al xat quan la finestra es tanqui."
+msgstr "Co_ntinua al xat quan la finestra es tanqui."
 
 msgid "Please enter the name of the group to be added."
 msgstr "Introduïu el nom del grup que vulgueu afegir."
@@ -11787,7 +11787,7 @@
 msgstr "Temps restant:"
 
 msgid "Close this window when all transfers _finish"
-msgstr "Tanca aquesta finestra quan totes les transferències hagin _finalitzat"
+msgstr "Tanca aquesta _finestra quan totes les transferències hagin finalitzat"
 
 msgid "C_lear finished transfers"
 msgstr "_Neteja les transferències acabades"
@@ -12315,7 +12315,7 @@
 msgstr "<b>Nom del fitxer:</b>"
 
 msgid "Configure Pl_ugin"
-msgstr "Config_ura el connector"
+msgstr "_Configura el connector"
 
 msgid "<b>Plugin Details</b>"
 msgstr "<b>Detalls del connector</b>"
@@ -12329,46 +12329,46 @@
 msgstr "Avisa dels Whom"
 
 msgid "_Buddy name:"
-msgstr "Nom de l'_amic:"
+msgstr "_Nom de l'amic:"
 
 msgid "Si_gns on"
-msgstr "Es _connecti"
+msgstr "Es conn_ecti"
 
 msgid "Signs o_ff"
-msgstr "Es _desconnecti"
+msgstr "Es de_sconnecti"
 
 msgid "Goes a_way"
 msgstr "Passi a _absent"
 
 msgid "Ret_urns from away"
-msgstr "To_rni a estar present"
+msgstr "_Torni a estar present"
 
 msgid "Becomes _idle"
 msgstr "Passi a _inactiu"
 
 msgid "Is no longer i_dle"
-msgstr "Ja no estigui i_nactiu"
+msgstr "_Ja no estigui inactiu"
 
 msgid "Starts _typing"
-msgstr "Comenci a _escriure"
+msgstr "Comenci a esc_riure"
 
 msgid "P_auses while typing"
-msgstr "S'_aturi mentre tecleja"
+msgstr "S'at_uri mentre tecleja"
 
 msgid "Stops t_yping"
-msgstr "Pari d'e_scriure"
+msgstr "_Pari d'escriure"
 
 msgid "Sends a _message"
 msgstr "Enviï un _missatge"
 
 msgid "Ope_n an IM window"
-msgstr "Obre u_na finestra de MI"
+msgstr "Obre una _finestra de MI"
 
 msgid "_Pop up a notification"
-msgstr "Mostra una _notificació emergent"
+msgstr "Mostra una notificació emer_gent"
 
 msgid "Send a _message"
-msgstr "Envia un _missatge"
+msgstr "En_via un missatge"
 
 msgid "E_xecute a command"
 msgstr "E_xecuta una ordre"
@@ -12376,17 +12376,21 @@
 msgid "P_lay a sound"
 msgstr "Reproduei_x un so"
 
+# Sense accelerador expressament (josep)
 msgid "Brows_e..."
-msgstr "Nav_ega..."
-
+msgstr "Navega..."
+
+# Sense accelerador expressament (josep)
 msgid "Br_owse..."
-msgstr "Na_vega..."
-
+msgstr "Navega..."
+
+# Sense accelerador expressament (josep)
 msgid "Pre_view"
-msgstr "Pre_visualitza"
-
+msgstr "Previsualitza"
+
+# Sense accelerador expressament (josep)
 msgid "P_ounce only when my status is not Available"
-msgstr "Avisa n_omés quan el meu estat no sigui disponible"
+msgstr "Avisa només quan el meu estat no estigui disponible"
 
 msgid "_Recurring"
 msgstr "_Recurrent"
@@ -12420,7 +12424,7 @@
 msgstr "Icona d'estat"
 
 msgid "_Show system tray icon:"
-msgstr "Mostra la icona d'estat:"
+msgstr "_Mostra la icona d'estat:"
 
 msgid "On unread messages"
 msgstr "Si hi ha missatges sense llegir"
@@ -12440,10 +12444,10 @@
 msgstr "Pestanyes"
 
 msgid "Show IMs and chats in _tabbed windows"
-msgstr "Mostra MI i xats en finestres amb _pestanyes"
+msgstr "Mostra MI i _xats en finestres amb pestanyes"
 
 msgid "Show close b_utton on tabs"
-msgstr "Mosta el b_otó de tancar a les pestanyes"
+msgstr "Mosta el _botó de tancar a les pestanyes"
 
 msgid "_Placement:"
 msgstr "_Posicionament:"
@@ -12467,10 +12471,10 @@
 msgstr "Vertical dret"
 
 msgid "N_ew conversations:"
-msgstr "Converses noves:"
+msgstr "Converses _noves:"
 
 msgid "Show _formatting on incoming messages"
-msgstr "Mostra el format dels missatges entrants"
+msgstr "Mostra el _format dels missatges entrants"
 
 msgid "Close IMs immediately when the tab is closed"
 msgstr "Tanca la missatgeria quan es tanqui la pestanya"
@@ -12485,10 +12489,10 @@
 msgstr "_Notifica als amics quan els escrigui"
 
 msgid "Highlight _misspelled words"
-msgstr "Ressalta les paraules _mal escrites"
+msgstr "_Ressalta les paraules mal escrites"
 
 msgid "Use smooth-scrolling"
-msgstr "Utilitza el desplaçament suau"
+msgstr "Empra el desplaçament suau"
 
 msgid "F_lash window when IMs are received"
 msgstr "_Fes que la finestra faci un flaix quan hi arribin missatges"
@@ -12503,13 +12507,13 @@
 msgstr "Tipus de lletra"
 
 msgid "Use document font from _theme"
-msgstr "Empra el tipus de lletra del document del _tema"
+msgstr "_Empra el tipus de lletra del document del tema"
 
 msgid "Use font from _theme"
 msgstr "Empra el tipus de lletra del _tema"
 
 msgid "Conversation _font:"
-msgstr "_Tipus de lletra de la conversa:"
+msgstr "Tipus de _lletra de la conversa:"
 
 msgid "Default Formatting"
 msgstr "Format per defecte"
@@ -12519,7 +12523,7 @@
 "that support formatting."
 msgstr ""
 "Així és com els missatges de text sortints apareixeran quan feu servir "
-"protocols que implementin el text formatat."
+"protocols que permetin el text formatat."
 
 msgid "Cannot start proxy configuration program."
 msgstr ""
@@ -12538,7 +12542,7 @@
 msgstr "Detecta l'_adreça IP automàticament"
 
 msgid "Public _IP:"
-msgstr "_IP pública:"
+msgstr "IP _pública:"
 
 msgid "Ports"
 msgstr "Ports"
@@ -12547,7 +12551,7 @@
 msgstr "_Habilita la desviació automàtica de ports de l'encaminador"
 
 msgid "_Manually specify range of ports to listen on"
-msgstr "Especifica _manualment el rang de ports on escoltar"
+msgstr "_Especifica manualment el rang de ports on escoltar"
 
 msgid "_Start port:"
 msgstr "Port _inicial:"
@@ -12654,13 +12658,13 @@
 msgstr "_Format del registre:"
 
 msgid "Log all _instant messages"
-msgstr "_Registra tots els missatges instantanis"
+msgstr "Registra tots els _missatges instantanis"
 
 msgid "Log all c_hats"
 msgstr "Registra tots els _xats"
 
 msgid "Log all _status changes to system log"
-msgstr "Regi_stra tots els canvis d'estat al registre del sistema"
+msgstr "Registra tots els _canvis d'estat al registre del sistema"
 
 msgid "Sound Selection"
 msgstr "Selecció de sons"
@@ -12707,10 +12711,10 @@
 "(%s per al nom de fitxer)"
 
 msgid "M_ute sounds"
-msgstr "In_habilita els sons"
+msgstr "_Inhabilita els sons"
 
 msgid "Sounds when conversation has _focus"
-msgstr "Sons quan la conversa tingui el _focus"
+msgstr "_Sons quan la conversa tingui el focus"
 
 msgid "_Enable sounds:"
 msgstr "_Habilita els sons:"
@@ -12722,13 +12726,13 @@
 msgstr "Reprodueix"
 
 msgid "_Browse..."
-msgstr "Nav_ega..."
+msgstr "_Navega..."
 
 msgid "_Reset"
 msgstr "_Reinicia"
 
 msgid "_Report idle time:"
-msgstr "Informa del _temps d'inactivitat:"
+msgstr "_Informa del temps d'inactivitat:"
 
 msgid "Based on keyboard or mouse use"
 msgstr "Basat en l'ús del teclat o el ratolí"
@@ -12744,23 +12748,23 @@
 msgstr "Auto-absència"
 
 msgid "Change status when _idle"
-msgstr "Canvia l'estat quan estigui _inactiu"
+msgstr "_Canvia l'estat quan estigui inactiu"
 
 msgid "_Minutes before becoming idle:"
 msgstr "_Minuts abans de passar a inactiu:"
 
 msgid "Change _status to:"
-msgstr "Canvia l'e_stat a:"
+msgstr "Canvia l'_estat a:"
 
 #. Signon status stuff
 msgid "Status at Startup"
 msgstr "L'estat en iniciar"
 
 msgid "Use status from last _exit at startup"
-msgstr "_En iniciar, empra el mateix estat que en sortir per darrer cop"
+msgstr "En i_niciar, empra el mateix estat que en sortir per darrer cop"
 
 msgid "Status to a_pply at startup:"
-msgstr "Es_tatus a utilitzar en iniciar:"
+msgstr "Estat a _utilitzar en iniciar:"
 
 msgid "Interface"
 msgstr "Interfície"
@@ -12800,7 +12804,7 @@
 
 #. Remove All button
 msgid "Remove Al_l"
-msgstr "Suprimeix-ho _tot"
+msgstr "S_uprimeix-ho tot"
 
 msgid "Permit User"
 msgstr "Permet l'usuari"
@@ -12859,11 +12863,11 @@
 
 #. list button
 msgid "_Get List"
-msgstr "_Aconsegueix la llista"
+msgstr "Aconsegueix la _llista"
 
 #. add button
 msgid "_Add Chat"
-msgstr "_Afegeix el xat"
+msgstr "Afegeix el _xat"
 
 # He omès "saved", que sembla que no hi cal (josep)
 msgid "Are you sure you want to delete the selected saved statuses?"
@@ -13075,7 +13079,7 @@
 msgstr "Tanca les _pestanyes"
 
 msgid "_Get Info"
-msgstr "_Aconsegueix informació"
+msgstr "Aconsegueix _informació"
 
 msgid "_Invite"
 msgstr "Conv_ida"
@@ -13226,7 +13230,7 @@
 msgstr "Missatges ressaltats"
 
 msgid "System Messages"
-msgstr "Missatge del sistema"
+msgstr "Missatges del sistema"
 
 msgid "Sent Messages"
 msgstr "Missatges enviats"
@@ -13349,10 +13353,9 @@
 msgid "New Person"
 msgstr "Nova persona"
 
-# FIXME: seleccioneu un amic?
 #. "Select Buddy" button
 msgid "Select Buddy"
-msgstr "Seleccioneu un amic"
+msgstr "Selecciona"
 
 #. Add the label.
 msgid ""
--- a/po/ca@valencia.po	Fri Dec 19 08:10:19 2008 +0000
+++ b/po/ca@valencia.po	Fri Jan 02 07:42:04 2009 +0000
@@ -33,8 +33,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-12-17 21:53+0100\n"
-"PO-Revision-Date: 2008-12-15 02:34+0100\n"
+"POT-Creation-Date: 2008-12-19 17:53+0100\n"
+"PO-Revision-Date: 2008-12-20 17:15+0100\n"
 "Last-Translator: Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>\n"
 "Language-Team: Catalan <tradgnome@softcatala.net>\n"
 "MIME-Version: 1.0\n"
@@ -100,7 +100,7 @@
 msgstr "No hi ha connectors de protocol instal·lats."
 
 msgid "(You probably forgot to 'make install'.)"
-msgstr "(Segurament vos heu oblidat de fer un «make install».)"
+msgstr "(Segurament us heu oblidat de fer un «make install».)"
 
 msgid "Modify Account"
 msgstr "Modifica el compte"
@@ -412,8 +412,8 @@
 "Please enter the username or alias of the person whose log you would like to "
 "view."
 msgstr ""
-"Introduïu el nom d'usuari o l'àlies de la persona de la qual vulgueu vore el "
-"registre."
+"Introduïu el nom d'usuari o l'àlies de la persona de la qual vulgueu veure "
+"el registre."
 
 #. Create the "Options" frame.
 msgid "Options"
@@ -441,7 +441,7 @@
 msgstr "Els grups buits"
 
 msgid "Offline buddies"
-msgstr "Els amics desconnectats"
+msgstr "Amics desconnectats"
 
 msgid "Sort"
 msgstr "Ordena"
@@ -992,7 +992,7 @@
 msgid ""
 "Please open the debug window and try again to see the exact error message."
 msgstr ""
-"Obriu la finestra de depuració i proveu de nou si podeu vore el missatge "
+"Obriu la finestra de depuració i proveu de nou si podeu veure el missatge "
 "d'error exacte."
 
 msgid "Select plugin to install"
@@ -1112,11 +1112,11 @@
 
 #, c-format
 msgid "%s has started typing to you (%s)"
-msgstr "%s vos ha començat a escriure (%s)"
+msgstr "%s us ha començat a escriure (%s)"
 
 #, c-format
 msgid "%s has paused while typing to you (%s)"
-msgstr "%s s'ha aturat mentre vos escrivia (%s)"
+msgstr "%s s'ha aturat mentre us escrivia (%s)"
 
 #, c-format
 msgid "%s has signed on (%s)"
@@ -1132,7 +1132,7 @@
 
 #, c-format
 msgid "%s has stopped typing to you (%s)"
-msgstr "%s ha deixat d'escriure-vos (%s)"
+msgstr "%s ha deixat d'escriure-us (%s)"
 
 #, c-format
 msgid "%s has signed off (%s)"
@@ -1148,7 +1148,7 @@
 
 #, c-format
 msgid "%s has sent you a message. (%s)"
-msgstr "%s vos ha enviat un missatge. (%s)"
+msgstr "%s us ha enviat un missatge. (%s)"
 
 #, c-format
 msgid "Unknown pounce event. Please report this!"
@@ -1450,7 +1450,7 @@
 
 #, c-format
 msgid "%s sent you a message"
-msgstr "%s vos ha enviat un missatge"
+msgstr "%s us ha enviat un missatge"
 
 #, c-format
 msgid "%s said your nick in %s"
@@ -1458,7 +1458,7 @@
 
 #, c-format
 msgid "%s sent a message in %s"
-msgstr "%s vos ha enviat un missatge a %s"
+msgstr "%s us ha enviat un missatge a %s"
 
 msgid "Buddy signs on/off"
 msgstr "Un amic es connecte/desconnecti"
@@ -1528,10 +1528,10 @@
 msgstr "Fora de línia"
 
 msgid "Online Buddies"
-msgstr "Els amics desconnectats"
+msgstr "Amics connectats"
 
 msgid "Offline Buddies"
-msgstr "Els amics desconnectats"
+msgstr "Amics desconnectats"
 
 msgid "Online/Offline"
 msgstr "En línia/fora de línia"
@@ -1736,7 +1736,7 @@
 "could mean that you are not connecting to the service you believe you are."
 msgstr ""
 "El certificat de «%s» sembla indicar que és de «%s». Això podria voler dir que "
-"vos esteu connectant a un servici diferent del que vos penseu."
+"us esteu connectant a un servici diferent del que us penseu."
 
 #. Make messages
 #, c-format
@@ -1806,7 +1806,7 @@
 
 #, c-format
 msgid "You are now known as %s"
-msgstr "Ara vos feu dir %s"
+msgstr "Ara us feu dir %s"
 
 #, c-format
 msgid "%s is now known as %s"
@@ -1917,11 +1917,11 @@
 
 #, c-format
 msgid "%s wants to send you %s (%s)"
-msgstr "%s vos vol enviar %s (%s)"
+msgstr "%s us vol enviar %s (%s)"
 
 #, c-format
 msgid "%s wants to send you a file"
-msgstr "%s vos vol enviar un fitxer"
+msgstr "%s us vol enviar un fitxer"
 
 #, c-format
 msgid "Accept file transfer request from %s?"
@@ -1939,7 +1939,7 @@
 
 #, c-format
 msgid "%s is offering to send file %s"
-msgstr "%s vos oferix enviar el fitxer %s"
+msgstr "%s us oferix enviar el fitxer %s"
 
 #, c-format
 msgid "%s is not a valid filename.\n"
@@ -2345,7 +2345,7 @@
 #. *  summary
 #. *  description
 msgid "Allows control by entering commands in a file."
-msgstr "Vos permet controlar introduint ordes en un fitxer."
+msgstr "Us permet controlar introduint ordes en un fitxer."
 
 msgid "Minutes"
 msgstr "Minuts"
@@ -2379,7 +2379,7 @@
 msgstr "Desestablix el temps d'inactivitat de tots els comptes inactius"
 
 msgid "Allows you to hand-configure how long you've been idle"
-msgstr "Vos permet configurar a mà durant quant de temps heu estat inactiu"
+msgstr "Us permet configurar a mà durant quant de temps heu estat inactiu"
 
 #. *< type
 #. *< ui_requirement
@@ -2484,7 +2484,7 @@
 msgid ""
 "You are currently disconnected. Messages will not be received unless you are "
 "logged in."
-msgstr "Esteu desconnectat. No rebreu missatges a no ser que vos connecteu."
+msgstr "Esteu desconnectat. No rebreu missatges a no ser que us connecteu."
 
 msgid "Message could not be sent because the maximum length was exceeded."
 msgstr ""
@@ -2681,8 +2681,8 @@
 "Causes conversation windows to appear as other users begin to message you.  "
 "This works for AIM, ICQ, XMPP, Sametime, and Yahoo!"
 msgstr ""
-"Fa que apareguen finestres de conversa així que altres usuaris vos comencen "
-"a enviar missatges. Funciona per a AIM, ICQ, XMPP, Sametime, i Yahoo!"
+"Fa que apareguen finestres de conversa així que altres usuaris us comencen a "
+"enviar missatges. Funciona per a AIM, ICQ, XMPP, Sametime, i Yahoo!"
 
 msgid "You feel a disturbance in the force..."
 msgstr "Sentireu un certa pertorbació en la força..."
@@ -2713,7 +2713,7 @@
 #. *  summary
 #. *  description
 msgid "Test to see that all signals are working properly."
-msgstr "Prova per vore si tots els senyals funcionen correctament."
+msgstr "Prova per veure si tots els senyals funcionen correctament."
 
 #. *< type
 #. *< ui_requirement
@@ -2729,7 +2729,7 @@
 #. *  summary
 #. *  description
 msgid "Tests to see that most things are working."
-msgstr "Proves per vore si la majoria de coses funcionen."
+msgstr "Proves per veure si la majoria de coses funcionen."
 
 #. Scheme name
 msgid "X.509 Certificates"
@@ -3170,7 +3170,7 @@
 msgstr "el tema actual és: %s"
 
 msgid "No topic is set"
-msgstr "No hi ha cap tema establert"
+msgstr "No hi ha cap tema establit"
 
 msgid "File Transfer Failed"
 msgstr "Ha fallat la transferència del fitxer"
@@ -3273,7 +3273,7 @@
 
 #, c-format
 msgid "Ban on %s by %s, set %s ago"
-msgstr "Bandejament a %s de %s, establert fa %s"
+msgstr "Bandejament a %s de %s, establit fa %s"
 
 #, c-format
 msgid "Ban on %s"
@@ -3284,7 +3284,7 @@
 
 #, c-format
 msgid "You are banned from %s."
-msgstr "Vos han bandejat de %s"
+msgstr "Us han bandejat de %s"
 
 msgid "Banned"
 msgstr "Bandejat"
@@ -3374,12 +3374,12 @@
 
 #, c-format
 msgid "You have been kicked by %s: (%s)"
-msgstr "%s vos ha fet fora: (%s)"
+msgstr "%s us ha fet fora: (%s)"
 
 #. Remove user from channel
 #, c-format
 msgid "Kicked by %s (%s)"
-msgstr "%s vos ha fet fora (%s)"
+msgstr "%s us ha fet fora (%s)"
 
 #, c-format
 msgid "mode (%s %s) by %s"
@@ -3730,7 +3730,7 @@
 "All items below are optional. Enter only the information with which you feel "
 "comfortable."
 msgstr ""
-"Les dades següents són opcionals. Introduïu només la informació que vos "
+"Les dades següents són opcionals. Introduïu només la informació que us "
 "sembli."
 
 msgid "Client"
@@ -4018,7 +4018,7 @@
 msgstr "Directori de cerca"
 
 msgid "_Room:"
-msgstr "Sa_la:"
+msgstr "_Sala:"
 
 msgid "_Server:"
 msgstr "_Servidor:"
@@ -4484,7 +4484,7 @@
 
 #, c-format
 msgid "%s has buzzed you!"
-msgstr "%s vos ha botzinat!"
+msgstr "%s us ha botzinat!"
 
 #, c-format
 msgid "Buzzing %s..."
@@ -4541,7 +4541,7 @@
 msgstr "ping &lt;jid&gt;:\tfa ping a un usuari/component/servidor."
 
 msgid "buzz: Buzz a user to get their attention"
-msgstr "buzz: fa sonar una botzina a un usuari per tal de que vos pare atenció"
+msgstr "buzz: fa sonar una botzina a un usuari per tal de que us pare atenció"
 
 #. *< type
 #. *< ui_requirement
@@ -4696,7 +4696,7 @@
 "This information is visible to all contacts on your contact list, so choose "
 "something appropriate."
 msgstr ""
-"Esta informació la poden vore tots els contactes de la vostra llista "
+"Esta informació la poden veure tots els contactes de la vostra llista "
 "d'amics, escolliu quelcom apropiat."
 
 msgid "Set Nickname..."
@@ -4978,7 +4978,7 @@
 
 #, c-format
 msgid "%s has nudged you!"
-msgstr "%s vos ha donat un cop de colze!"
+msgstr "%s us ha donat un cop de colze!"
 
 #, c-format
 msgid "Nudging %s..."
@@ -4994,7 +4994,7 @@
 msgstr "Establiu el vostre nom amistós."
 
 msgid "This is the name that other MSN buddies will see you as."
-msgstr "Este és el nom amb el que els amics de l'MSN vos veuran."
+msgstr "Este és el nom amb el que els amics de l'MSN us veuran."
 
 msgid "Set your home phone number."
 msgstr "Establix el número de telèfon de casa."
@@ -5049,7 +5049,7 @@
 msgstr "Treballant"
 
 msgid "Has you"
-msgstr "Vos té"
+msgstr "Us té"
 
 msgid "Home Phone Number"
 msgstr "Número de telèfon de casa"
@@ -5306,7 +5306,7 @@
 msgstr "Mostra emoticones personalitzades"
 
 msgid "nudge: nudge a user to get their attention"
-msgstr "nudge: doneu un cop de colze a un usuari perquè vos pare atenció"
+msgstr "nudge: doneu un cop de colze a un usuari perquè us pare atenció"
 
 msgid "Windows Live ID authentication:Unable to connect"
 msgstr "Autenticació amb el Windows Live ID: no s'ha pogut connectar"
@@ -5327,7 +5327,7 @@
 
 #, c-format
 msgid "%s just sent you a Nudge!"
-msgstr "%s vos ha donat un cop de colze!"
+msgstr "%s us ha donat un cop de colze!"
 
 #. char *adl = g_strndup(payload, len);
 #, c-format
@@ -5389,16 +5389,16 @@
 "sign in."
 msgstr[0] ""
 "El servidor d'MSN es reiniciarà per raons de manteniment d'ací a %d minut. "
-"Se vos desconnectarà automàticament al cap d'este temps. Finalitzeu "
-"qualsevol conversa en actiu.\n"
-"\n"
-"Després que el manteniment s'haja completat, vos podreu tornar a connectar."
+"Se us desconnectarà automàticament al cap d'este temps. Finalitzeu qualsevol "
+"conversa en actiu.\n"
+"\n"
+"Després que el manteniment s'haja completat, us podreu tornar a connectar."
 msgstr[1] ""
 "El servidor d'MSN es reiniciarà per raons de manteniment d'ací a %d minuts. "
-"Se vos desconnectarà automàticament al cap d'este temps. Finalitzeu "
-"qualsevol conversa en actiu.\n"
-"\n"
-"Després que el manteniment s'haja completat, vos podreu tornar a connectar."
+"Se us desconnectarà automàticament al cap d'este temps. Finalitzeu qualsevol "
+"conversa en actiu.\n"
+"\n"
+"Després que el manteniment s'haja completat, us podreu tornar a connectar."
 
 msgid ""
 "Message was not sent because the system is unavailable. This normally "
@@ -5444,7 +5444,7 @@
 msgstr "S'ha produït un error en analitzar HTTP."
 
 msgid "You have signed on from another location."
-msgstr "Vos heu connectat des d'un altre lloc."
+msgstr "Us heu connectat des d'un altre lloc."
 
 msgid "The MSN servers are temporarily unavailable. Please wait and try again."
 msgstr ""
@@ -5531,11 +5531,11 @@
 
 #, c-format
 msgid "%s has added you to his or her buddy list."
-msgstr "%s vos ha afegit a la seua llista d'amics."
+msgstr "%s us ha afegit a la seua llista d'amics."
 
 #, c-format
 msgid "%s has removed you from his or her buddy list."
-msgstr "%s vos ha suprimit de la seua llista d'amics."
+msgstr "%s us ha suprimit de la seua llista d'amics."
 
 msgid "Delete Buddy from Address Book?"
 msgstr "Voleu suprimir l'amic de la llibreta d'adreces?"
@@ -5767,7 +5767,7 @@
 msgstr "Este nom d'usuari està disponible. Voleu fer-lo servir?"
 
 msgid "ONCE SET, THIS CANNOT BE CHANGED!"
-msgstr "Un cop l'hagueu establert no el podreu canviar!"
+msgstr "Un cop l'hagueu establit no el podreu canviar!"
 
 msgid "MySpaceIM - Please Set a Username"
 msgstr "MySpaceIM - Establiu un nom d'usuari"
@@ -5796,7 +5796,7 @@
 
 #, fuzzy, c-format
 msgid "%s has zapped you!"
-msgstr "%s vos ha afegit [%s]"
+msgstr "%s us ha afegit [%s]"
 
 #, fuzzy, c-format
 msgid "Zapping %s..."
@@ -5809,7 +5809,7 @@
 
 #, fuzzy, c-format
 msgid "%s has whacked you!"
-msgstr "%s vos ha afegit [%s]"
+msgstr "%s us ha afegit [%s]"
 
 #, fuzzy, c-format
 msgid "Whacking %s..."
@@ -5823,7 +5823,7 @@
 
 #, c-format
 msgid "%s has torched you!"
-msgstr "%s vos ha calat foc!"
+msgstr "%s us ha calat foc!"
 
 #, c-format
 msgid "Torching %s..."
@@ -5836,7 +5836,7 @@
 # Sí, sembla que siguem a l'època victoriana... (josep)
 #, c-format
 msgid "%s has smooched you!"
-msgstr "%s vos ha morrejat!"
+msgstr "%s us ha morrejat!"
 
 #, c-format
 msgid "Smooching %s..."
@@ -5848,7 +5848,7 @@
 
 #, c-format
 msgid "%s has hugged you!"
-msgstr "%s vos ha abraçat!"
+msgstr "%s us ha abraçat!"
 
 #, c-format
 msgid "Hugging %s..."
@@ -5860,7 +5860,7 @@
 
 #, c-format
 msgid "%s has slapped you!"
-msgstr "%s vos ha bufetejat!"
+msgstr "%s us ha bufetejat!"
 
 #, c-format
 msgid "Slapping %s..."
@@ -5872,7 +5872,7 @@
 
 #, c-format
 msgid "%s has goosed you!"
-msgstr "%s vos ha pessigat el cul!"
+msgstr "%s us ha pessigat el cul!"
 
 #, c-format
 msgid "Goosing %s..."
@@ -6009,7 +6009,7 @@
 msgstr "La versió del protocol no és compatible"
 
 msgid "The user has blocked you"
-msgstr "L'usuari vos ha blocat"
+msgstr "L'usuari us ha blocat"
 
 msgid ""
 "This evaluation version does not allow more than ten users to log in at one "
@@ -6165,7 +6165,7 @@
 
 msgid "You have been logged out because you logged in at another workstation."
 msgstr ""
-"Se vos ha desconnectat perquè heu entrat a través d'una altra estació de "
+"Se us ha desconnectat perquè heu entrat a través d'una altra estació de "
 "treball."
 
 #, c-format
@@ -6180,7 +6180,7 @@
 "to connect to."
 msgstr ""
 "No s'ha pogut connectar al servidor. Introduïu l'adreça del servidor al qual "
-"vos vulgueu connectar."
+"us vulgueu connectar."
 
 msgid "Error. SSL support is not installed."
 msgstr "Error. No hi ha instal·lades les biblioteques per a SSL."
@@ -6277,15 +6277,15 @@
 msgstr "No s'ha pogut establir una connexió amb l'usuari remot."
 
 msgid "Direct IM established"
-msgstr "S'ha establert una connexió directa de MI"
+msgstr "S'ha establit una connexió directa de MI"
 
 #, c-format
 msgid ""
 "%s tried to send you a %s file, but we only allow files up to %s over Direct "
 "IM.  Try using file transfer instead.\n"
 msgstr ""
-"%s vos ha intentat enviar un fitxer %s, però ara mateix només permetem "
-"enviar fitxers de fins a %s a través de MI directa. Proveu-ho fent servir la "
+"%s us ha intentat enviar un fitxer %s, però ara mateix només permetem enviar "
+"fitxers de fins a %s a través de MI directa. Proveu-ho fent servir la "
 "transferència de fitxers.\n"
 
 # FIXME
@@ -6574,7 +6574,7 @@
 "You may be disconnected shortly.  You may want to use TOC until this is "
 "fixed.  Check %s for updates."
 msgstr ""
-"Se vos pot desconnectar d'ací a poc temps. Si voleu, podeu emprar TOC fins "
+"Se us pot desconnectar d'ací a poc temps. Si voleu, podeu emprar TOC fins "
 "que això es resolgui. Comproveu si hi ha actualitzacions a %s."
 
 # FIXME: hash (josep)
@@ -6584,8 +6584,8 @@
 #, c-format
 msgid "You may be disconnected shortly.  Check %s for updates."
 msgstr ""
-"Se vos pot desconnectar d'ací a poc temps. Comproveu si hi ha "
-"actualitzacions a %s."
+"Se us pot desconnectar d'ací a poc temps. Comproveu si hi ha actualitzacions "
+"a %s."
 
 msgid "Unable to get a valid login hash."
 msgstr "No s'ha pogut obtindre un hash d'entrada vàlid."
@@ -6597,7 +6597,7 @@
 msgstr "No s'ha pogut inicialitzar la connexió"
 
 msgid "Please authorize me so I can add you to my buddy list."
-msgstr "Autoritzeu-me perquè vos puga afegir a la meua llista d'amics."
+msgstr "Autoritzeu-me perquè us puga afegir a la meua llista d'amics."
 
 msgid "Authorization Request Message:"
 msgstr "Missatge de petició d'autorització:"
@@ -6617,7 +6617,7 @@
 "following reason:\n"
 "%s"
 msgstr ""
-"L'usuari %u vos ha denegat la vostra sol·licitud d'afegir-lo a la vostra "
+"L'usuari %u us ha denegat la vostra sol·licitud d'afegir-lo a la vostra "
 "llista d'amics pel següent motiu:\n"
 "%s"
 
@@ -6627,7 +6627,7 @@
 #. Someone has granted you authorization
 #, c-format
 msgid "The user %u has granted your request to add them to your buddy list."
-msgstr "L'usuari %u vos ha permés afegir-lo a la vostra llista d'amics."
+msgstr "L'usuari %u us ha permés afegir-lo a la vostra llista d'amics."
 
 #, c-format
 msgid ""
@@ -6667,7 +6667,7 @@
 
 #, c-format
 msgid "ICQ user %u has sent you a buddy: %s (%s)"
-msgstr "L'usuari %u d'ICQ vos ha enviat un amic: %s (%s)"
+msgstr "L'usuari %u d'ICQ us ha enviat un amic: %s (%s)"
 
 msgid "Do you want to add this buddy to your buddy list?"
 msgstr "Voleu afegir este amic a la vostra llista d'amics?"
@@ -6768,7 +6768,7 @@
 
 #, c-format
 msgid "You have been disconnected from chat room %s."
-msgstr "Se vos ha desconnectat de la conversa %s."
+msgstr "Se us ha desconnectat de la conversa %s."
 
 msgid "Mobile Phone"
 msgstr "Telèfon mòbil"
@@ -6890,7 +6890,7 @@
 "fully connected."
 msgstr ""
 "Probablement heu demanat establir el vostre perfil abans d'acabar amb el "
-"procés de connexió. El vostre perfil seguix sense estar establert; intenteu "
+"procés de connexió. El vostre perfil seguix sense estar establit; intenteu "
 "establir-lo de nou quan el procés de connexió haja finalitzat."
 
 #, c-format
@@ -6971,7 +6971,7 @@
 "The user %s has given you permission to add him or her to your buddy list.  "
 "Do you want to add this user?"
 msgstr ""
-"L'usuari %s vos ha donat permís perquè l'afegiu a la vostra llista d'amics. "
+"L'usuari %s us ha donat permís perquè l'afegiu a la vostra llista d'amics. "
 "Voleu afegir-lo?"
 
 msgid "Authorization Given"
@@ -6980,7 +6980,7 @@
 #. Granted
 #, c-format
 msgid "The user %s has granted your request to add them to your buddy list."
-msgstr "L'usuari %s vos ha permés afegir-lo a la vostra llista d'amics."
+msgstr "L'usuari %s us ha permés afegir-lo a la vostra llista d'amics."
 
 msgid "Authorization Granted"
 msgstr "S'ha concedit l'autorització"
@@ -6992,7 +6992,7 @@
 "following reason:\n"
 "%s"
 msgstr ""
-"L'usuari %s vos ha denegat la petició d'afegir-lo a la vostra llista d'amics "
+"L'usuari %s us ha denegat la petició d'afegir-lo a la vostra llista d'amics "
 "pels motius següents:\n"
 "%s"
 
@@ -7261,7 +7261,7 @@
 msgstr "Número de telèfon"
 
 msgid "Authorize adding"
-msgstr "Autoritzar que vos afegisquen"
+msgstr "Autoritzar que us afegisquen"
 
 msgid "Cellphone Number"
 msgstr "Número de mòbil"
@@ -7369,7 +7369,7 @@
 
 #, c-format
 msgid "Failed removing me from %d's buddy list"
-msgstr "No vos heu pogut suprimir de la llista d'amics de %d"
+msgstr "No us heu pogut suprimir de la llista d'amics de %d"
 
 msgid "No reason given"
 msgstr "No s'ha indicat cap motiu"
@@ -7377,7 +7377,7 @@
 #. only need to get value
 #, c-format
 msgid "You have been added by %s"
-msgstr "%s vos ha afegit"
+msgstr "%s us ha afegit"
 
 msgid "Would you like to add him?"
 msgstr "Voleu afegir-lo?"
@@ -7453,7 +7453,7 @@
 
 #, c-format
 msgid "Qun %u denied from joining"
-msgstr "No se vos ha permés entrar al Qun %u"
+msgstr "No se us ha permés entrar al Qun %u"
 
 msgid "QQ Qun Operation"
 msgstr "Operació Qun QQ"
@@ -7506,8 +7506,7 @@
 
 #, c-format
 msgid "<b>Joining Qun %u is approved by admin %u for %s</b>"
-msgstr ""
-"<b>L'administrador %2$u vos ha permés unir-vos al Qun %1$u per %3$s</b>"
+msgstr "<b>L'administrador %2$u us ha permés unir-vos al Qun %1$u per %3$s</b>"
 
 #, c-format
 msgid "<b>Removed buddy %u.</b>"
@@ -7633,7 +7632,6 @@
 msgid "<p><i>And, all the boys in the backroom...</i><br>\n"
 msgstr "<p><i>I tothom que ho ha fet possible...<i><br>\n"
 
-#, fuzzy
 msgid "<i>Feel free to join us!</i> :)"
 msgstr "<i>No dubteu a col·laborar amb nosaltres!</i> :)"
 
@@ -8488,8 +8486,8 @@
 "able to join."
 msgstr ""
 "L'autenticació del canal es fa servir per evitar-ne l'accés no autoritzat. "
-"L'autenticació es pot basar en frases clau i signatures. Si s'ha establert "
-"una frase clau, serà necessària per a poder-hi entrar. Si s'han establert "
+"L'autenticació es pot basar en frases clau i signatures. Si s'ha establit "
+"una frase clau, serà necessària per a poder-hi entrar. Si s'han establit "
 "claus públiques del canal, només els usuaris que tinguen les seues claus "
 "públiques llistades al canal hi podran entrar."
 
@@ -8641,15 +8639,15 @@
 
 #, c-format
 msgid "You have been kicked off <I>%s</I> by <I>%s</I> (%s)"
-msgstr "<I>%2$s</I> vos ha fet fora de <I>%1$s</I> (%3$s)"
+msgstr "<I>%2$s</I> us ha fet fora de <I>%1$s</I> (%3$s)"
 
 #, c-format
 msgid "You have been killed by %s (%s)"
-msgstr "%s vos ha matat (%s)"
+msgstr "%s us ha matat (%s)"
 
 #, c-format
 msgid "Killed by %s (%s)"
-msgstr "%s vos ha matat (%s)"
+msgstr "%s us ha matat (%s)"
 
 msgid "Server signoff"
 msgstr "Desconnexió del servidor"
@@ -8832,7 +8830,7 @@
 msgstr "El tipus de la clau pública no està suportat"
 
 msgid "Disconnected by server"
-msgstr "El servidor vos ha desconnectat"
+msgstr "El servidor us ha desconnectat"
 
 msgid "Error during connecting to SILC Server"
 msgstr "S'ha produït un error en connectar al servidor SILC"
@@ -8929,7 +8927,7 @@
 msgstr ""
 "Podeu permetre que altres usuaris vegin informació sobre el vostre estat en "
 "línia, així com informació personal. Empleneu la informació que vulgueu que "
-"altres usuaris puguen vore."
+"altres usuaris puguen veure."
 
 msgid "Message of the Day"
 msgstr "Frase del dia"
@@ -9346,7 +9344,7 @@
 msgstr "El connector per al protocol SIP/SIMPLE"
 
 msgid "Publish status (note: everyone may watch you)"
-msgstr "Publica l'estat (nota: tothom vos pot estar observant)"
+msgstr "Publica l'estat (nota: tothom us pot estar observant)"
 
 msgid "Use UDP"
 msgstr "Utilitza UDP"
@@ -9410,7 +9408,7 @@
 
 #, c-format
 msgid "You missed an IM from %s because it was too big."
-msgstr "Vos heu perdut un missatge instantani de %s perquè era massa gran."
+msgstr "Us heu perdut un missatge instantani de %s perquè era massa gran."
 
 #, c-format
 msgid "You missed an IM from %s because it was sent too fast."
@@ -9475,7 +9473,7 @@
 "You have been connecting and disconnecting too frequently.  Wait ten minutes "
 "and try again.  If you continue to try, you will need to wait even longer."
 msgstr ""
-"Vos heu estat connectant i desconnectant amb massa freqüència. Espereu deu "
+"Us heu estat connectant i desconnectant amb massa freqüència. Espereu deu "
 "minuts i torneu-ho a provar. Si continueu intentant-ho, haureu d'esperar "
 "encara més."
 
@@ -9537,7 +9535,7 @@
 
 #, c-format
 msgid "%s requests you to send them a file"
-msgstr "%s vos demana que li envieu un fitxer"
+msgstr "%s us demana que li envieu un fitxer"
 
 #. *< type
 #. *< ui_requirement
@@ -9555,8 +9553,8 @@
 #, c-format
 msgid "%s has sent you a webcam invite, which is not yet supported."
 msgstr ""
-"%s vos ha enviat una invitació a la seua càmera web, però això encara no "
-"està implementat."
+"%s us ha enviat una invitació a la seua càmera web, però això encara no està "
+"implementat."
 
 msgid "Your Yahoo! message did not get sent."
 msgstr "No s'ha pogut enviar el vostre missatge de Yahoo!"
@@ -9570,15 +9568,14 @@
 "%s has (retroactively) denied your request to add them to your list for the "
 "following reason: %s."
 msgstr ""
-"%s vos ha denegat (retroactivament) la petició d'afegir-lo a la vostra "
-"llista pel següent motiu:\n"
+"%s us ha denegat (retroactivament) la petició d'afegir-lo a la vostra llista "
+"pel següent motiu:\n"
 "%s"
 
 #, c-format
 msgid "%s has (retroactively) denied your request to add them to your list."
 msgstr ""
-"%s vos ha denegat (retroactivament) la petició d'afegir-lo a la vostra "
-"llista."
+"%s us ha denegat (retroactivament) la petició d'afegir-lo a la vostra llista."
 
 msgid "Add buddy rejected"
 msgstr "S'ha rebutjat afegir l'amic"
@@ -9590,7 +9587,7 @@
 "Check %s for updates."
 msgstr ""
 "El servidor Yahoo ha demanat l'ús d'un mètode d'autenticació que no és "
-"reconegut. Probablement no vos podreu connectar al Yahoo. Comproveu si hi ha "
+"reconegut. Probablement no us podreu connectar al Yahoo. Comproveu si hi ha "
 "actualitzacions a %s."
 
 msgid "Failed Yahoo! Authentication"
@@ -9700,7 +9697,7 @@
 msgstr "Quin ID voleu activar?"
 
 msgid "Join whom in chat?"
-msgstr "A qui vos voleu unir al xat?"
+msgstr "A qui us voleu unir al xat?"
 
 msgid "Activate ID..."
 msgstr "Activa l'ID..."
@@ -9804,7 +9801,7 @@
 "If you wish to view this profile, you will need to visit this link in your "
 "web browser:"
 msgstr ""
-"Si voleu vore este perfil, haureu de visitar este enllaç amb el navegador:"
+"Si voleu veure este perfil, haureu de visitar este enllaç amb el navegador:"
 
 msgid "Yahoo! ID"
 msgstr "ID de Yahoo!"
@@ -10087,7 +10084,7 @@
 
 #, c-format
 msgid "%s has requested your attention!"
-msgstr "%s vos ha demanat l'atenció!"
+msgstr "%s us ha demanat l'atenció!"
 
 #. *
 #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
@@ -10411,7 +10408,7 @@
 
 #. This is an easter egg. See the comment on the previous line in the source.
 msgid "you can see the butterflies mating"
-msgstr "podreu vore les papallones aparellant-se"
+msgstr "podreu veure les papallones aparellant-se"
 
 msgid "Proxy Options"
 msgstr "Opcions del servidor intermediari"
@@ -10505,7 +10502,7 @@
 "Introduïu la informació necessària sobre el xat al qual vulgueu entrar.\n"
 
 msgid "_Account:"
-msgstr "_Compte:"
+msgstr "C_ompte:"
 
 msgid "_Block"
 msgstr "_Bloca"
@@ -10561,7 +10558,7 @@
 
 #. join button
 msgid "_Join"
-msgstr "En_tra"
+msgstr "_Entra"
 
 msgid "Auto-Join"
 msgstr "Entra automàticament"
@@ -10608,7 +10605,7 @@
 msgstr "/Amics/_Visualitza el registre de l'usuari..."
 
 msgid "/Buddies/Sh_ow"
-msgstr "/Amics/M_ostra"
+msgstr "/Amics/Mos_tra"
 
 msgid "/Buddies/Show/_Offline Buddies"
 msgstr "/Amics/Mostra/Amics des_connectats"
@@ -10662,7 +10659,7 @@
 msgstr "/Eines/_Connectors"
 
 msgid "/Tools/Pr_eferences"
-msgstr "/Eines/Preferè_ncies"
+msgstr "/Eines/Pre_ferències"
 
 msgid "/Tools/Pr_ivacy"
 msgstr "/Eines/_Privadesa"
@@ -10671,7 +10668,7 @@
 msgstr "/Eines/Em_oticona"
 
 msgid "/Tools/_File Transfers"
-msgstr "/Eines/Transferència de _fitxers"
+msgstr "/Eines/_Transferència de fitxers"
 
 msgid "/Tools/R_oom List"
 msgstr "/Eines/_Llista de sales"
@@ -10812,9 +10809,9 @@
 msgid_plural ""
 "%d accounts were disabled because you signed on from another location:"
 msgstr[0] ""
-"S'ha inhabilitat %d compte perquè vos heu connectat des d'un altre lloc:"
+"S'ha inhabilitat %d compte perquè us heu connectat des d'un altre lloc:"
 msgstr[1] ""
-"S'han inhabilitat %d comptes perquè vos heu connectat des d'un altre lloc:"
+"S'han inhabilitat %d comptes perquè us heu connectat des d'un altre lloc:"
 
 msgid "<b>Username:</b>"
 msgstr "<b>Nom d'usuari:</b>"
@@ -10890,13 +10887,13 @@
 "la llista d'amics.\n"
 
 msgid "A_lias:"
-msgstr "À_lies:"
+msgstr "Àl_ies:"
 
 msgid "Auto_join when account becomes online."
-msgstr "Entra _automàticament quant el compte estiga connectat."
+msgstr "_Entra automàticament quant el compte estiga connectat."
 
 msgid "_Remain in chat after window is closed."
-msgstr "_Continua al xat quan la finestra es tanque."
+msgstr "Co_ntinua al xat quan la finestra es tanque."
 
 msgid "Please enter the name of the group to be added."
 msgstr "Introduïu el nom del grup que vulgueu afegir."
@@ -11340,7 +11337,7 @@
 msgstr "Català"
 
 msgid "Valencian-Catalan"
-msgstr "Valencià-català"
+msgstr "Valencià (català meridional)"
 
 msgid "Czech"
 msgstr "Txec"
@@ -11560,7 +11557,7 @@
 "(versió 2 o posterior). Hi ha una còpia de la GPL dins del fitxer «COPYING» "
 "que es distribuix amb el %s. Els drets d'autor del %s pertanyen als seus "
 "col·laboradors. El fitxer «COPYRIGHT» conté una llista completa de tots els "
-"contribuïdors. No vos proporcionem cap mena de garantia amb este programa."
+"contribuïdors. No us proporcionem cap mena de garantia amb este programa."
 "<BR><BR>"
 
 #, c-format
@@ -11601,7 +11598,7 @@
 "Please enter the username or alias of the person whose info you would like "
 "to view."
 msgstr ""
-"Introduïu el nom d'usuari o àlies de la persona de la qual vulgueu vore la "
+"Introduïu el nom d'usuari o àlies de la persona de la qual vulgueu veure la "
 "informació."
 
 msgid "View User Log"
@@ -11780,7 +11777,7 @@
 msgstr "Temps restant:"
 
 msgid "Close this window when all transfers _finish"
-msgstr "Tanca esta finestra quan totes les transferències hagen _finalitzat"
+msgstr "Tanca esta _finestra quan totes les transferències hagen finalitzat"
 
 msgid "C_lear finished transfers"
 msgstr "_Neteja les transferències acabades"
@@ -12308,7 +12305,7 @@
 msgstr "<b>Nom del fitxer:</b>"
 
 msgid "Configure Pl_ugin"
-msgstr "Config_ura el connector"
+msgstr "_Configura el connector"
 
 msgid "<b>Plugin Details</b>"
 msgstr "<b>Detalls del connector</b>"
@@ -12322,46 +12319,46 @@
 msgstr "Avisa dels Whom"
 
 msgid "_Buddy name:"
-msgstr "Nom de l'_amic:"
+msgstr "_Nom de l'amic:"
 
 msgid "Si_gns on"
-msgstr "Es _connecte"
+msgstr "Es conn_ecti"
 
 msgid "Signs o_ff"
-msgstr "Es _desconnecte"
+msgstr "Es de_sconnecti"
 
 msgid "Goes a_way"
 msgstr "Passe a _absent"
 
 msgid "Ret_urns from away"
-msgstr "To_rni a estar present"
+msgstr "_Torne a estar present"
 
 msgid "Becomes _idle"
 msgstr "Passe a _inactiu"
 
 msgid "Is no longer i_dle"
-msgstr "Ja no estiga i_nactiu"
+msgstr "_Ja no estiga inactiu"
 
 msgid "Starts _typing"
-msgstr "Comence a _escriure"
+msgstr "Comence a esc_riure"
 
 msgid "P_auses while typing"
-msgstr "S'_ature mentre tecleja"
+msgstr "S'at_uri mentre tecleja"
 
 msgid "Stops t_yping"
-msgstr "Pare d'e_scriure"
+msgstr "_Pare d'escriure"
 
 msgid "Sends a _message"
 msgstr "Envie un _missatge"
 
 msgid "Ope_n an IM window"
-msgstr "Obri u_na finestra de MI"
+msgstr "Obri una _finestra de MI"
 
 msgid "_Pop up a notification"
-msgstr "Mostra una _notificació emergent"
+msgstr "Mostra una notificació emer_gent"
 
 msgid "Send a _message"
-msgstr "Envia un _missatge"
+msgstr "En_via un missatge"
 
 msgid "E_xecute a command"
 msgstr "E_xecuta una orde"
@@ -12369,17 +12366,21 @@
 msgid "P_lay a sound"
 msgstr "Reproduei_x un so"
 
+# Sense accelerador expressament (josep)
 msgid "Brows_e..."
-msgstr "Nav_ega..."
-
+msgstr "Navega..."
+
+# Sense accelerador expressament (josep)
 msgid "Br_owse..."
-msgstr "Na_vega..."
-
+msgstr "Navega..."
+
+# Sense accelerador expressament (josep)
 msgid "Pre_view"
-msgstr "Pre_visualitza"
-
+msgstr "Previsualitza"
+
+# Sense accelerador expressament (josep)
 msgid "P_ounce only when my status is not Available"
-msgstr "Avisa n_omés quan el meu estat no siga disponible"
+msgstr "Avisa només quan el meu estat no estiga disponible"
 
 msgid "_Recurring"
 msgstr "_Recurrent"
@@ -12413,7 +12414,7 @@
 msgstr "Icona d'estat"
 
 msgid "_Show system tray icon:"
-msgstr "Mostra la icona d'estat:"
+msgstr "_Mostra la icona d'estat:"
 
 msgid "On unread messages"
 msgstr "Si hi ha missatges sense llegir"
@@ -12433,10 +12434,10 @@
 msgstr "Pestanyes"
 
 msgid "Show IMs and chats in _tabbed windows"
-msgstr "Mostra MI i xats en finestres amb _pestanyes"
+msgstr "Mostra MI i _xats en finestres amb pestanyes"
 
 msgid "Show close b_utton on tabs"
-msgstr "Mosta el b_otó de tancar a les pestanyes"
+msgstr "Mosta el _botó de tancar a les pestanyes"
 
 msgid "_Placement:"
 msgstr "_Posicionament:"
@@ -12460,10 +12461,10 @@
 msgstr "Vertical dret"
 
 msgid "N_ew conversations:"
-msgstr "Converses noves:"
+msgstr "Converses _noves:"
 
 msgid "Show _formatting on incoming messages"
-msgstr "Mostra el format dels missatges entrants"
+msgstr "Mostra el _format dels missatges entrants"
 
 msgid "Close IMs immediately when the tab is closed"
 msgstr "Tanca la missatgeria quan es tanque la pestanya"
@@ -12478,10 +12479,10 @@
 msgstr "_Notifica als amics quan els escriga"
 
 msgid "Highlight _misspelled words"
-msgstr "Ressalta les paraules _mal escrites"
+msgstr "_Ressalta les paraules mal escrites"
 
 msgid "Use smooth-scrolling"
-msgstr "Utilitza el desplaçament suau"
+msgstr "Empra el desplaçament suau"
 
 msgid "F_lash window when IMs are received"
 msgstr "_Fes que la finestra faci un flaix quan hi arriben missatges"
@@ -12496,13 +12497,13 @@
 msgstr "Tipus de lletra"
 
 msgid "Use document font from _theme"
-msgstr "Empra el tipus de lletra del document del _tema"
+msgstr "_Empra el tipus de lletra del document del tema"
 
 msgid "Use font from _theme"
 msgstr "Empra el tipus de lletra del _tema"
 
 msgid "Conversation _font:"
-msgstr "_Tipus de lletra de la conversa:"
+msgstr "Tipus de _lletra de la conversa:"
 
 msgid "Default Formatting"
 msgstr "Format per defecte"
@@ -12512,7 +12513,7 @@
 "that support formatting."
 msgstr ""
 "Així és com els missatges de text eixints apareixeran quan feu servir "
-"protocols que implementen el text formatat."
+"protocols que permeten el text formatat."
 
 msgid "Cannot start proxy configuration program."
 msgstr ""
@@ -12531,7 +12532,7 @@
 msgstr "Detecta l'_adreça IP automàticament"
 
 msgid "Public _IP:"
-msgstr "_IP pública:"
+msgstr "IP _pública:"
 
 msgid "Ports"
 msgstr "Ports"
@@ -12540,7 +12541,7 @@
 msgstr "_Habilita la desviació automàtica de ports de l'encaminador"
 
 msgid "_Manually specify range of ports to listen on"
-msgstr "Especifica _manualment el rang de ports on escoltar"
+msgstr "_Especifica manualment el rang de ports on escoltar"
 
 msgid "_Start port:"
 msgstr "Port _inicial:"
@@ -12647,13 +12648,13 @@
 msgstr "_Format del registre:"
 
 msgid "Log all _instant messages"
-msgstr "_Registra tots els missatges instantanis"
+msgstr "Registra tots els _missatges instantanis"
 
 msgid "Log all c_hats"
 msgstr "Registra tots els _xats"
 
 msgid "Log all _status changes to system log"
-msgstr "Regi_stra tots els canvis d'estat al registre del sistema"
+msgstr "Registra tots els _canvis d'estat al registre del sistema"
 
 msgid "Sound Selection"
 msgstr "Selecció de sons"
@@ -12700,10 +12701,10 @@
 "(%s per al nom de fitxer)"
 
 msgid "M_ute sounds"
-msgstr "In_habilita els sons"
+msgstr "_Inhabilita els sons"
 
 msgid "Sounds when conversation has _focus"
-msgstr "Sons quan la conversa tinga el _focus"
+msgstr "_Sons quan la conversa tinga el focus"
 
 msgid "_Enable sounds:"
 msgstr "_Habilita els sons:"
@@ -12715,13 +12716,13 @@
 msgstr "Reproduix"
 
 msgid "_Browse..."
-msgstr "Nav_ega..."
+msgstr "_Navega..."
 
 msgid "_Reset"
 msgstr "_Reinicia"
 
 msgid "_Report idle time:"
-msgstr "Informa del _temps d'inactivitat:"
+msgstr "_Informa del temps d'inactivitat:"
 
 msgid "Based on keyboard or mouse use"
 msgstr "Basat en l'ús del teclat o el ratolí"
@@ -12737,23 +12738,23 @@
 msgstr "Auto-absència"
 
 msgid "Change status when _idle"
-msgstr "Canvia l'estat quan estiga _inactiu"
+msgstr "_Canvia l'estat quan estiga inactiu"
 
 msgid "_Minutes before becoming idle:"
 msgstr "_Minuts abans de passar a inactiu:"
 
 msgid "Change _status to:"
-msgstr "Canvia l'e_stat a:"
+msgstr "Canvia l'_estat a:"
 
 #. Signon status stuff
 msgid "Status at Startup"
 msgstr "L'estat en iniciar"
 
 msgid "Use status from last _exit at startup"
-msgstr "_En iniciar, empra el mateix estat que en eixir per darrer cop"
+msgstr "En i_niciar, empra el mateix estat que en eixir per darrer cop"
 
 msgid "Status to a_pply at startup:"
-msgstr "Es_tatus a utilitzar en iniciar:"
+msgstr "Estat a _utilitzar en iniciar:"
 
 msgid "Interface"
 msgstr "Interfície"
@@ -12793,27 +12794,27 @@
 
 #. Remove All button
 msgid "Remove Al_l"
-msgstr "Suprimix-ho _tot"
+msgstr "S_uprimix-ho tot"
 
 msgid "Permit User"
 msgstr "Permet l'usuari"
 
 msgid "Type a user you permit to contact you."
-msgstr "Escriviu quin usuari permeteu que vos contacti."
+msgstr "Escriviu quin usuari permeteu que us contacti."
 
 msgid "Please enter the name of the user you wish to be able to contact you."
-msgstr "Introduïu el nom de l'usuari que vulgueu que vos puga contactar."
+msgstr "Introduïu el nom de l'usuari que vulgueu que us puga contactar."
 
 msgid "_Permit"
 msgstr "_Permet"
 
 #, c-format
 msgid "Allow %s to contact you?"
-msgstr "Voleu permetre que %s vos puga contactar?"
+msgstr "Voleu permetre que %s us puga contactar?"
 
 #, c-format
 msgid "Are you sure you wish to allow %s to contact you?"
-msgstr "Esteu segur que voleu permetre que %s vos puga contactar?"
+msgstr "Esteu segur que voleu permetre que %s us puga contactar?"
 
 msgid "Block User"
 msgstr "Bloca un usuari"
@@ -12852,11 +12853,11 @@
 
 #. list button
 msgid "_Get List"
-msgstr "_Aconseguix la llista"
+msgstr "Aconseguix la _llista"
 
 #. add button
 msgid "_Add Chat"
-msgstr "_Afig el xat"
+msgstr "Afig el _xat"
 
 # He omès "saved", que sembla que no hi cal (josep)
 msgid "Are you sure you want to delete the selected saved statuses?"
@@ -13068,7 +13069,7 @@
 msgstr "Tanca les _pestanyes"
 
 msgid "_Get Info"
-msgstr "_Aconseguix informació"
+msgstr "Aconseguix _informació"
 
 msgid "_Invite"
 msgstr "Conv_ida"
@@ -13196,14 +13197,14 @@
 msgid ""
 "Allows for controlling the values associated with different buddy states."
 msgstr ""
-"Vos permet canviar els valors associats als diferents estats dels amics."
+"Us permet canviar els valors associats als diferents estats dels amics."
 
 #. *< description
 msgid ""
 "Allows for changing the point values of idle/away/offline states for buddies "
 "in contact priority computations."
 msgstr ""
-"Vos permet canviar els valors dels estats inactiu, absent i desconnectat pel "
+"Us permet canviar els valors dels estats inactiu, absent i desconnectat pel "
 "càlcul de la prioritat dels amics."
 
 msgid "Conversation Colors"
@@ -13219,7 +13220,7 @@
 msgstr "Missatges ressaltats"
 
 msgid "System Messages"
-msgstr "Missatge del sistema"
+msgstr "Missatges del sistema"
 
 msgid "Sent Messages"
 msgstr "Missatges enviats"
@@ -13342,10 +13343,9 @@
 msgid "New Person"
 msgstr "Nova persona"
 
-# FIXME: seleccioneu un amic?
 #. "Select Buddy" button
 msgid "Select Buddy"
-msgstr "Seleccioneu un amic"
+msgstr "Selecciona"
 
 #. Add the label.
 msgid ""
@@ -13442,7 +13442,7 @@
 #. *  description
 msgid "Test to see that all ui signals are working properly."
 msgstr ""
-"Prova per vore si tots els senyals de la interfície d'usuari funcionen "
+"Prova per veure si tots els senyals de la interfície d'usuari funcionen "
 "correctament."
 
 #, c-format
@@ -13631,7 +13631,7 @@
 #. *  description
 msgid "Provides a variety of ways of notifying you of unread messages."
 msgstr ""
-"Vos proporciona diferents maneres de notificar-vos la presència de missatges "
+"Us proporciona diferents maneres de notificar-vos la presència de missatges "
 "sense llegir."
 
 #. *< type
@@ -13657,7 +13657,7 @@
 "- It sends a message to people on your list immediately when they sign on"
 msgstr ""
 "Este és un connector realment interessant que fa moltes coses:\n"
-"- mostra qui ha escrit el programa quan vos connecteu\n"
+"- mostra qui ha escrit el programa quan us connecteu\n"
 "- escriu a l'inrevés tots els missatges rebuts\n"
 "- envia un missatge a tots els amics immediatament després que es connecten"
 
@@ -13754,19 +13754,19 @@
 msgstr "En brut"
 
 msgid "Lets you send raw input to text-based protocols."
-msgstr "Vos permet enviar dades en brut als protocols en mode text."
+msgstr "Us permet enviar dades en brut als protocols en mode text."
 
 msgid ""
 "Lets you send raw input to text-based protocols (XMPP, MSN, IRC, TOC). Hit "
 "'Enter' in the entry box to send. Watch the debug window."
 msgstr ""
-"Vos permet enviar dades en brut als protocols en mode text (XMPP, MSN, IRC, "
+"Us permet enviar dades en brut als protocols en mode text (XMPP, MSN, IRC, "
 "TOC). Premeu la tecla de retorn del quadre d'entrada per enviar-les. "
 "Observeu la finestra de depuració."
 
 #, c-format
 msgid "You can upgrade to %s %s today."
-msgstr "Podeu actualitzar-vos a %s %s avui."
+msgstr "Podeu actualitzar-vos a %s %s hui."
 
 msgid "New Version Available"
 msgstr "Nova versió disponible"
@@ -13797,7 +13797,7 @@
 "Checks periodically for new releases and notifies the user with the "
 "ChangeLog."
 msgstr ""
-"Comprova periòdicament si hi ha versions noves i vos ho notifica juntament "
+"Comprova periòdicament si hi ha versions noves i us ho notifica juntament "
 "amb el seu registre de canvis."
 
 #. *< major version
@@ -13874,7 +13874,7 @@
 msgid "Replaces text in outgoing messages according to user-defined rules."
 msgstr ""
 "Substituix el text dels missatges que s'envien emprant les regles que hàgeu "
-"establert."
+"establit."
 
 # FIXME (josep)
 #. *< type
--- a/po/fr.po	Fri Dec 19 08:10:19 2008 +0000
+++ b/po/fr.po	Fri Jan 02 07:42:04 2009 +0000
@@ -4964,7 +4964,7 @@
 msgstr "Erreur MSN : %s\n"
 
 msgid "Other Contacts"
-msgstr "AUtres contacts"
+msgstr "Autres contacts"
 
 msgid "Non-IM Contacts"
 msgstr "Contacts non instantanés"