changeset 21143:7be910c7cff7

merge of '20236f54c97e87512b7eb716559a4bd86b73f833' and '756265e6ef8651abedbdc0a1aad9d50cc32e140f'
author John Bailey <rekkanoryo@rekkanoryo.org>
date Mon, 05 Nov 2007 00:35:07 +0000 (2007-11-05)
parents 1d92b85ef5d9 (current diff) 846e6800d956 (diff)
children aa3933394eec
files pidgin/pixmaps/animations/16/Makefile.am pidgin/pixmaps/animations/16/Makefile.mingw pidgin/pixmaps/animations/Makefile.am pidgin/pixmaps/animations/Makefile.mingw pidgin/pixmaps/buddy_icons/Makefile.am pidgin/pixmaps/buddy_icons/Makefile.mingw pidgin/pixmaps/dialogs/16/scalable/Makefile.am pidgin/pixmaps/dialogs/64/scalable/Makefile.am pidgin/pixmaps/dialogs/Makefile.am pidgin/pixmaps/dialogs/Makefile.mingw pidgin/pixmaps/emblems/16/scalable/Makefile.am pidgin/pixmaps/emblems/Makefile.am pidgin/pixmaps/emblems/Makefile.mingw pidgin/pixmaps/emotes/Makefile.am pidgin/pixmaps/emotes/Makefile.mingw pidgin/pixmaps/emotes/default/24/scalable/Makefile.am pidgin/pixmaps/emotes/default/Makefile.am pidgin/pixmaps/icons/16/scalable/Makefile.am pidgin/pixmaps/icons/22/scalable/Makefile.am pidgin/pixmaps/icons/24/scalable/Makefile.am pidgin/pixmaps/icons/32/scalable/Makefile.am pidgin/pixmaps/icons/48/scalable/Makefile.am pidgin/pixmaps/icons/Makefile.am pidgin/pixmaps/icons/Makefile.mingw pidgin/pixmaps/protocols/16/scalable/Makefile.am pidgin/pixmaps/protocols/22/scalable/Makefile.am pidgin/pixmaps/protocols/48/scalable/Makefile.am pidgin/pixmaps/protocols/Makefile.am pidgin/pixmaps/protocols/Makefile.mingw pidgin/pixmaps/status/11/scalable/Makefile.am pidgin/pixmaps/status/16/scalable/Makefile.am pidgin/pixmaps/status/22/scalable/Makefile.am pidgin/pixmaps/status/32/scalable/Makefile.am pidgin/pixmaps/status/Makefile.am pidgin/pixmaps/status/Makefile.mingw pidgin/pixmaps/toolbar/16/scalable/Makefile.am pidgin/pixmaps/toolbar/22/scalable/Makefile.am pidgin/pixmaps/toolbar/Makefile.am pidgin/pixmaps/toolbar/Makefile.mingw pidgin/pixmaps/tray/Makefile.am pidgin/pixmaps/tray/Makefile.mingw
diffstat 125 files changed, 2622 insertions(+), 3175 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ b/Makefile.mingw	Mon Nov 05 00:35:07 2007 +0000
@@ -42,19 +42,30 @@
 # Any *.dll or *.exe files included in win32-install-dir that we don't compile
 # should be included in this list so they don't get stripped
 EXTERNAL_DLLS = \
+	comerr32.dll \
 	freebl3.dll \
+	gssapi32.dll \
+	k5sprt32.dll \
+	krb5_32.dll \
 	libgtkspell.dll \
 	libmeanwhile-1.dll \
+	libsasl.dll \
 	libxml2.dll \
 	nspr4.dll \
 	nss3.dll \
 	nssckbi.dll \
 	plc4.dll \
 	plds4.dll \
+	saslANONYMOUS.dll \
+	saslCRAMMD5.dll \
+	saslDIGESTMD5.dll \
+	saslGSSAPI.dll \
+	saslLOGIN.dll \
+	saslPLAIN.dll \
 	silc.dll \
 	silcclient.dll \
+	smime3.dll \
 	softokn3.dll \
-	smime3.dll \
 	ssl3.dll
 
 #build an expression for `find` to use to ignore the above files
--- a/configure.ac	Sun Nov 04 22:17:45 2007 +0000
+++ b/configure.ac	Mon Nov 05 00:35:07 2007 +0000
@@ -2178,66 +2178,34 @@
 		   pidgin/pidgin.pc
 		   pidgin/pidgin-uninstalled.pc
 		   pidgin/pixmaps/Makefile
-		   pidgin/pixmaps/animations/Makefile
-		   pidgin/pixmaps/animations/16/Makefile
-		   pidgin/pixmaps/buddy_icons/Makefile
 		   pidgin/pixmaps/buddy_icons/qq/Makefile
-		   pidgin/pixmaps/dialogs/Makefile
 		   pidgin/pixmaps/dialogs/16/Makefile
-		   pidgin/pixmaps/dialogs/16/scalable/Makefile
 		   pidgin/pixmaps/dialogs/64/Makefile
-		   pidgin/pixmaps/dialogs/64/scalable/Makefile
-		   pidgin/pixmaps/emblems/Makefile
 		   pidgin/pixmaps/emblems/16/Makefile
-		   pidgin/pixmaps/emblems/16/scalable/Makefile
-		   pidgin/pixmaps/emotes/Makefile
-		   pidgin/pixmaps/emotes/default/Makefile
 		   pidgin/pixmaps/emotes/default/24/Makefile
-		   pidgin/pixmaps/emotes/default/24/scalable/Makefile
 		   pidgin/pixmaps/emotes/none/Makefile
-		   pidgin/pixmaps/icons/Makefile
 		   pidgin/pixmaps/icons/16/Makefile
-		   pidgin/pixmaps/icons/16/scalable/Makefile
 		   pidgin/pixmaps/icons/22/Makefile
-		   pidgin/pixmaps/icons/22/scalable/Makefile
 		   pidgin/pixmaps/icons/24/Makefile
-		   pidgin/pixmaps/icons/24/scalable/Makefile
 		   pidgin/pixmaps/icons/32/Makefile
-		   pidgin/pixmaps/icons/32/scalable/Makefile
 		   pidgin/pixmaps/icons/48/Makefile
-		   pidgin/pixmaps/icons/48/scalable/Makefile
-		   pidgin/pixmaps/protocols/Makefile
 		   pidgin/pixmaps/protocols/16/Makefile
-		   pidgin/pixmaps/protocols/16/scalable/Makefile
 		   pidgin/pixmaps/protocols/22/Makefile
-		   pidgin/pixmaps/protocols/22/scalable/Makefile
 		   pidgin/pixmaps/protocols/48/Makefile
-		   pidgin/pixmaps/protocols/48/scalable/Makefile
-		   pidgin/pixmaps/status/Makefile
 		   pidgin/pixmaps/status/11/Makefile
-		   pidgin/pixmaps/status/11/scalable/Makefile
 		   pidgin/pixmaps/status/11/rtl/Makefile
 		   pidgin/pixmaps/status/16/Makefile
 		   pidgin/pixmaps/status/16/rtl/Makefile
-		   pidgin/pixmaps/status/16/scalable/Makefile
 		   pidgin/pixmaps/status/22/Makefile
 		   pidgin/pixmaps/status/22/rtl/Makefile
-		   pidgin/pixmaps/status/22/scalable/Makefile
 		   pidgin/pixmaps/status/32/Makefile
 		   pidgin/pixmaps/status/32/rtl/Makefile
-		   pidgin/pixmaps/status/32/scalable/Makefile
 		   pidgin/pixmaps/status/48/Makefile
 		   pidgin/pixmaps/status/48/rtl/Makefile
-		   pidgin/pixmaps/toolbar/Makefile
 		   pidgin/pixmaps/toolbar/16/Makefile
-		   pidgin/pixmaps/toolbar/16/scalable/Makefile
 		   pidgin/pixmaps/toolbar/22/Makefile
-		   pidgin/pixmaps/toolbar/22/scalable/Makefile
-		   pidgin/pixmaps/tray/Makefile
 		   pidgin/pixmaps/tray/16/Makefile
-		   pidgin/pixmaps/tray/16/scalable/Makefile
 		   pidgin/pixmaps/tray/22/Makefile
-		   pidgin/pixmaps/tray/22/scalable/Makefile
 		   pidgin/pixmaps/tray/32/Makefile
 		   pidgin/pixmaps/tray/48/Makefile
 		   pidgin/plugins/Makefile
--- a/libpurple/buddyicon.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/buddyicon.c	Mon Nov 05 00:35:07 2007 +0000
@@ -116,7 +116,7 @@
 		{
 			purple_debug_error("buddyicon",
 			                   "Unable to create directory %s: %s\n",
-			                   dirname, strerror(errno));
+			                   dirname, g_strerror(errno));
 		}
 	}
 
@@ -125,7 +125,7 @@
 		if (!fwrite(purple_imgstore_get_data(img), purple_imgstore_get_size(img), 1, file))
 		{
 			purple_debug_error("buddyicon", "Error writing %s: %s\n",
-			                   path, strerror(errno));
+			                   path, g_strerror(errno));
 		}
 		else
 			purple_debug_info("buddyicon", "Wrote cache file: %s\n", path);
@@ -135,7 +135,7 @@
 	else
 	{
 		purple_debug_error("buddyicon", "Unable to create file %s: %s\n",
-		                   path, strerror(errno));
+		                   path, g_strerror(errno));
 		g_free(path);
 		return;
 	}
@@ -163,7 +163,7 @@
 		if (g_unlink(path))
 		{
 			purple_debug_error("buddyicon", "Failed to delete %s: %s\n",
-			                   path, strerror(errno));
+			                   path, g_strerror(errno));
 		}
 		else
 		{
@@ -951,7 +951,7 @@
 			if (!fwrite(icon_data, icon_len, 1, file))
 			{
 				purple_debug_error("buddyicon", "Error writing %s: %s\n",
-				                   path, strerror(errno));
+				                   path, g_strerror(errno));
 			}
 			else
 				purple_debug_info("buddyicon", "Wrote migrated cache file: %s\n", path);
@@ -961,7 +961,7 @@
 		else
 		{
 			purple_debug_error("buddyicon", "Unable to create file %s: %s\n",
-			                   path, strerror(errno));
+			                   path, g_strerror(errno));
 			g_free(new_filename);
 			g_free(path);
 
@@ -1056,7 +1056,7 @@
 			{
 				purple_debug_error("buddyicon",
 				                   "Unable to create directory %s: %s\n",
-				                   dirname, strerror(errno));
+				                   dirname, g_strerror(errno));
 			}
 		}
 	}
--- a/libpurple/connection.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/connection.c	Mon Nov 05 00:35:07 2007 +0000
@@ -432,7 +432,7 @@
 {
 	g_return_val_if_fail(gc != NULL, NULL);
 
-	return gc->password;
+	return gc->password ? gc->password : gc->account->password;
 }
 
 const char *
--- a/libpurple/core.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/core.c	Mon Nov 05 00:35:07 2007 +0000
@@ -378,7 +378,7 @@
 	if (g_rename(path, new_name))
 	{
 		purple_debug_error("core", "Error renaming %s to %s: %s. Please report this at http://developer.pidgin.im\n",
-		                   path, new_name, strerror(errno));
+		                   path, new_name, g_strerror(errno));
 		g_free(new_name);
 		return FALSE;
 	}
@@ -391,7 +391,7 @@
 	if (symlink(new_name, old_name))
 	{
 		purple_debug_warning("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n",
-		                     old_name, new_name, strerror(errno));
+		                     old_name, new_name, g_strerror(errno));
 	}
 	g_free(old_name);
 	g_free(new_name);
@@ -447,7 +447,7 @@
 		if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1)
 		{
 			purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n",
-			                   user_dir, strerror(errno));
+			                   user_dir, g_strerror(errno));
 			g_free(status_file);
 			g_free(old_user_dir);
 			return FALSE;
@@ -459,7 +459,7 @@
 	if (!(fp = g_fopen(status_file, "w")))
 	{
 		purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n",
-		                   status_file, strerror(errno));
+		                   status_file, g_strerror(errno));
 		g_free(status_file);
 		g_free(old_user_dir);
 		return FALSE;
@@ -517,7 +517,7 @@
 				{
 					char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL);
 					purple_debug_error("core", "Error reading symlink %s: %s. Please report this at http://developer.pidgin.im\n",
-					                   name_utf8, strerror(errno));
+					                   name_utf8, g_strerror(errno));
 					g_free(name_utf8);
 					g_free(name);
 					g_dir_close(dir);
@@ -555,7 +555,7 @@
 				if (symlink(link, logs_dir))
 				{
 					purple_debug_error("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n",
-					                   logs_dir, link, strerror(errno));
+					                   logs_dir, link, g_strerror(errno));
 					g_free(link);
 					g_free(name);
 					g_free(logs_dir);
@@ -612,7 +612,7 @@
 					if (g_mkdir(new_icons_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1)
 					{
 						purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n",
-						                   new_icons_dir, strerror(errno));
+						                   new_icons_dir, g_strerror(errno));
 						g_free(new_icons_dir);
 						g_dir_close(icons_dir);
 						g_free(name);
@@ -675,7 +675,7 @@
 			if (!(fp = g_fopen(name, "rb")))
 			{
 				purple_debug_error("core", "Error opening file %s for reading: %s. Please report this at http://developer.pidgin.im\n",
-				                   name, strerror(errno));
+				                   name, g_strerror(errno));
 				g_free(name);
 				g_dir_close(dir);
 				g_free(status_file);
@@ -687,7 +687,7 @@
 			if (!(new_file = g_fopen(new_name, "wb")))
 			{
 				purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n",
-				                   new_name, strerror(errno));
+				                   new_name, g_strerror(errno));
 				fclose(fp);
 				g_free(new_name);
 				g_free(name);
@@ -706,7 +706,7 @@
 				if (size != sizeof(buf) && !feof(fp))
 				{
 					purple_debug_error("core", "Error reading %s: %s. Please report this at http://developer.pidgin.im\n",
-					                   name, strerror(errno));
+					                   name, g_strerror(errno));
 					fclose(new_file);
 					fclose(fp);
 					g_free(new_name);
@@ -720,7 +720,7 @@
 				if (!fwrite(buf, size, 1, new_file) && ferror(new_file) != 0)
 				{
 					purple_debug_error("core", "Error writing %s: %s. Please report this at http://developer.pidgin.im\n",
-					                   new_name, strerror(errno));
+					                   new_name, g_strerror(errno));
 					fclose(new_file);
 					fclose(fp);
 					g_free(new_name);
@@ -735,12 +735,12 @@
 			if (fclose(new_file))
 			{
 				purple_debug_error("core", "Error writing: %s: %s. Please report this at http://developer.pidgin.im\n",
-				                   new_name, strerror(errno));
+				                   new_name, g_strerror(errno));
 			}
 			if (fclose(fp))
 			{
 				purple_debug_warning("core", "Error closing %s: %s\n",
-				                     name, strerror(errno));
+				                     name, g_strerror(errno));
 			}
 			g_free(new_name);
 		}
@@ -754,7 +754,7 @@
 	if (g_unlink(status_file))
 	{
 		purple_debug_error("core", "Error unlinking file %s: %s. Please report this at http://developer.pidgin.im\n",
-		                   status_file, strerror(errno));
+		                   status_file, g_strerror(errno));
 		g_free(status_file);
 		return FALSE;
 	}
--- a/libpurple/desktopitem.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/desktopitem.c	Mon Nov 05 00:35:07 2007 +0000
@@ -1155,7 +1155,7 @@
 
 	dfile = g_fopen(filename, "r");
 	if (!dfile) {
-		printf ("Can't open %s: %s", filename, strerror(errno));
+		printf ("Can't open %s: %s", filename, g_strerror(errno));
 		return NULL;
 	}
 	
--- a/libpurple/dnsquery.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/dnsquery.c	Mon Nov 05 00:35:07 2007 +0000
@@ -346,7 +346,7 @@
 	/* Create pipes for communicating with the child process */
 	if (pipe(child_out) || pipe(child_in)) {
 		purple_debug_error("dns",
-				   "Could not create pipes: %s\n", strerror(errno));
+				   "Could not create pipes: %s\n", g_strerror(errno));
 		return NULL;
 	}
 
@@ -374,7 +374,7 @@
 	if (resolver->dns_pid == -1) {
 		purple_debug_error("dns",
 				   "Could not create child process for DNS: %s\n",
-				   strerror(errno));
+				   g_strerror(errno));
 		purple_dnsquery_resolver_destroy(resolver);
 		return NULL;
 	}
@@ -416,7 +416,7 @@
 		return FALSE;
 	} else if (pid < 0) {
 		purple_debug_warning("dns", "Wait for DNS child %d failed: %s\n",
-				resolver->dns_pid, strerror(errno));
+				resolver->dns_pid, g_strerror(errno));
 		purple_dnsquery_resolver_destroy(resolver);
 		return FALSE;
 	}
@@ -430,7 +430,7 @@
 	rc = write(resolver->fd_in, &dns_params, sizeof(dns_params));
 	if (rc < 0) {
 		purple_debug_error("dns", "Unable to write to DNS child %d: %d\n",
-				resolver->dns_pid, strerror(errno));
+				resolver->dns_pid, g_strerror(errno));
 		purple_dnsquery_resolver_destroy(resolver);
 		return FALSE;
 	}
@@ -571,7 +571,7 @@
 		purple_dnsquery_resolved(query_data, hosts);
 
 	} else if (rc == -1) {
-		g_snprintf(message, sizeof(message), _("Error reading from resolver process:\n%s"), strerror(errno));
+		g_snprintf(message, sizeof(message), _("Error reading from resolver process:\n%s"), g_strerror(errno));
 		purple_dnsquery_failed(query_data, message);
 
 	} else if (rc == 0) {
--- a/libpurple/example/nullclient.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/example/nullclient.c	Mon Nov 05 00:35:07 2007 +0000
@@ -269,6 +269,13 @@
 	PurpleAccount *account;
 	PurpleSavedStatus *status;
 
+	/* libpurple's built-in DNS resolution forks processes to perform
+	 * blocking lookups without blocking the main process.  It does not
+	 * handle SIGCHLD itself, so if the UI does not you quickly get an army
+	 * of zombie subprocesses marching around.
+	 */
+	signal(SIGCHLD, SIG_IGN);
+
 	init_libpurple();
 
 	printf("libpurple initialized.\n");
--- a/libpurple/ft.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/ft.c	Mon Nov 05 00:35:07 2007 +0000
@@ -207,15 +207,15 @@
 	switch(xfer_type) {
 		case PURPLE_XFER_SEND:
 			msg = g_strdup_printf(_("Error reading %s: \n%s.\n"),
-								  utf8, strerror(err));
+								  utf8, g_strerror(err));
 			break;
 		case PURPLE_XFER_RECEIVE:
 			msg = g_strdup_printf(_("Error writing %s: \n%s.\n"),
-								  utf8, strerror(err));
+								  utf8, g_strerror(err));
 			break;
 		default:
 			msg = g_strdup_printf(_("Error accessing %s: \n%s.\n"),
-								  utf8, strerror(err));
+								  utf8, g_strerror(err));
 			break;
 	}
 	g_free(utf8);
--- a/libpurple/log.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/log.c	Mon Nov 05 00:35:07 2007 +0000
@@ -756,7 +756,7 @@
 					if (!fwrite(image_data, image_byte_count, 1, image_file))
 					{
 						purple_debug_error("log", "Error writing %s: %s\n",
-						                   path, strerror(errno));
+						                   path, g_strerror(errno));
 						fclose(image_file);
 
 						/* Attempt to not leave half-written files around. */
@@ -771,7 +771,7 @@
 				else
 				{
 					purple_debug_error("log", "Unable to create file %s: %s\n",
-					                   path, strerror(errno));
+					                   path, g_strerror(errno));
 				}
 			}
 
@@ -1108,7 +1108,7 @@
 		return TRUE;
 	else if (ret == -1)
 	{
-		purple_debug_error("log", "Failed to delete: %s - %s\n", data->path, strerror(errno));
+		purple_debug_error("log", "Failed to delete: %s - %s\n", data->path, g_strerror(errno));
 	}
 	else
 	{
@@ -1143,7 +1143,7 @@
 		g_free(dirname);
 		return TRUE;
 	}
-	purple_debug_info("log", "access(%s) failed: %s\n", dirname, strerror(errno));
+	purple_debug_info("log", "access(%s) failed: %s\n", dirname, g_strerror(errno));
 	g_free(dirname);
 #else
 	/* Unless and until someone writes equivalent win32 code,
@@ -1638,7 +1638,7 @@
 			if (!(index = g_fopen(pathstr, "rb")))
 			{
 				purple_debug_error("log", "Failed to open index file \"%s\" for reading: %s\n",
-				                 pathstr, strerror(errno));
+				                 pathstr, g_strerror(errno));
 
 				/* Fall through so that we'll parse the log file. */
 			}
@@ -1675,7 +1675,7 @@
 
 	if (!(file = g_fopen(purple_stringref_value(pathref), "rb"))) {
 		purple_debug_error("log", "Failed to open log file \"%s\" for reading: %s\n",
-		                   purple_stringref_value(pathref), strerror(errno));
+		                   purple_stringref_value(pathref), g_strerror(errno));
 		purple_stringref_unref(pathref);
 		g_free(pathstr);
 		return NULL;
@@ -1684,7 +1684,7 @@
 	index_tmp = g_strdup_printf("%s.XXXXXX", pathstr);
 	if ((index_fd = g_mkstemp(index_tmp)) == -1) {
 		purple_debug_error("log", "Failed to open index temp file: %s\n",
-		                 strerror(errno));
+		                 g_strerror(errno));
 		g_free(pathstr);
 		g_free(index_tmp);
 		index = NULL;
@@ -1692,7 +1692,7 @@
 		if ((index = fdopen(index_fd, "wb")) == NULL)
 		{
 			purple_debug_error("log", "Failed to fdopen() index temp file: %s\n",
-			                 strerror(errno));
+			                 g_strerror(errno));
 			close(index_fd);
 			if (index_tmp != NULL)
 			{
@@ -1828,7 +1828,7 @@
 		if (g_rename(index_tmp, pathstr))
 		{
 			purple_debug_warning("log", "Failed to rename index temp file \"%s\" to \"%s\": %s\n",
-			                   index_tmp, pathstr, strerror(errno));
+			                   index_tmp, pathstr, g_strerror(errno));
 			g_unlink(index_tmp);
 			g_free(index_tmp);
 		}
--- a/libpurple/nat-pmp.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/nat-pmp.c	Mon Nov 05 00:35:07 2007 +0000
@@ -312,7 +312,7 @@
 	
 	if (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) < 0)
 	{
-		purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP public IP request! (%s)\n", strerror(errno));
+		purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP public IP request! (%s)\n", g_strerror(errno));
 		g_free(gateway);
 		pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER;
 		return NULL;
@@ -320,7 +320,7 @@
 
 	if (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) < 0)
 	{
-		purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", strerror(errno));
+		purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", g_strerror(errno));
 		g_free(gateway);
 		pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER;
 		return NULL;
@@ -332,7 +332,7 @@
 	{
 		if (errno != EAGAIN)
 		{
-			purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno));
+			purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", g_strerror(errno));
 			g_free(gateway);
 			pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER;
 			return NULL;
@@ -432,13 +432,13 @@
 	/* TODO: Non-blocking! */
 	success = (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) >= 0);
 	if (!success)
-		purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP mapping request! (%s)\n", strerror(errno));
+		purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP mapping request! (%s)\n", g_strerror(errno));
 
 	if (success)
 	{
 		success = (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) >= 0);
 		if (!success)
-			purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", strerror(errno));
+			purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", g_strerror(errno));
 	}
 
 	if (success)
@@ -448,7 +448,7 @@
 		success = ((recvfrom(sendfd, resp, sizeof(PurplePmpMapResponse), 0, NULL, NULL) >= 0) ||
 				   (errno == EAGAIN));
 		if (!success)
-			purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno));
+			purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", g_strerror(errno));
 	}
 
 	if (success)
--- a/libpurple/network.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/network.c	Mon Nov 05 00:35:07 2007 +0000
@@ -285,7 +285,7 @@
 #ifndef _WIN32
 		purple_debug_warning("network", "getaddrinfo: %s\n", gai_strerror(errnum));
 		if (errnum == EAI_SYSTEM)
-			purple_debug_warning("network", "getaddrinfo: system error: %s\n", strerror(errno));
+			purple_debug_warning("network", "getaddrinfo: system error: %s\n", g_strerror(errno));
 #else
 		purple_debug_warning("network", "getaddrinfo: Error Code = %d\n", errnum);
 #endif
@@ -302,7 +302,7 @@
 		if (listenfd < 0)
 			continue;
 		if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0)
-			purple_debug_warning("network", "setsockopt: %s\n", strerror(errno));
+			purple_debug_warning("network", "setsockopt: %s\n", g_strerror(errno));
 		if (bind(listenfd, next->ai_addr, next->ai_addrlen) == 0)
 			break; /* success */
 		/* XXX - It is unclear to me (datallah) whether we need to be
@@ -318,26 +318,26 @@
 	struct sockaddr_in sockin;
 
 	if ((listenfd = socket(AF_INET, socket_type, 0)) < 0) {
-		purple_debug_warning("network", "socket: %s\n", strerror(errno));
+		purple_debug_warning("network", "socket: %s\n", g_strerror(errno));
 		return NULL;
 	}
 
 	if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0)
-		purple_debug_warning("network", "setsockopt: %s\n", strerror(errno));
+		purple_debug_warning("network", "setsockopt: %s\n", g_strerror(errno));
 
 	memset(&sockin, 0, sizeof(struct sockaddr_in));
 	sockin.sin_family = PF_INET;
 	sockin.sin_port = htons(port);
 
 	if (bind(listenfd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) {
-		purple_debug_warning("network", "bind: %s\n", strerror(errno));
+		purple_debug_warning("network", "bind: %s\n", g_strerror(errno));
 		close(listenfd);
 		return NULL;
 	}
 #endif
 
 	if (socket_type == SOCK_STREAM && listen(listenfd, 4) != 0) {
-		purple_debug_warning("network", "listen: %s\n", strerror(errno));
+		purple_debug_warning("network", "listen: %s\n", g_strerror(errno));
 		close(listenfd);
 		return NULL;
 	}
@@ -426,7 +426,7 @@
 
 	len = sizeof(addr);
 	if (getsockname(fd, (struct sockaddr *) &addr, &len) == -1) {
-		purple_debug_warning("network", "getsockname: %s\n", strerror(errno));
+		purple_debug_warning("network", "getsockname: %s\n", g_strerror(errno));
 		return 0;
 	}
 
--- a/libpurple/plugins/tcl/tcl.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/plugins/tcl/tcl.c	Mon Nov 05 00:35:07 2007 +0000
@@ -198,7 +198,7 @@
 	}
 
 	if (ferror(fp)) {
-		purple_debug(PURPLE_DEBUG_ERROR, "tcl", "error reading %s (%s)\n", plugin->path, strerror(errno));
+		purple_debug(PURPLE_DEBUG_ERROR, "tcl", "error reading %s (%s)\n", plugin->path, g_strerror(errno));
 		g_free(buf);
 		fclose(fp);
 		return FALSE;
--- a/libpurple/protocols/bonjour/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/bonjour/Makefile.mingw	Mon Nov 05 00:35:07 2007 +0000
@@ -29,7 +29,7 @@
 			-I$(GTK_TOP)/include \
 			-I$(GTK_TOP)/include/glib-2.0 \
 			-I$(GTK_TOP)/lib/glib-2.0/include \
-			-I$(BONJOUR_TOP)/include \
+			-I$(BONJOUR_TOP)/Include \
 			-I$(LIBXML2_TOP)/include \
 			-I$(PURPLE_TOP) \
 			-I$(PURPLE_TOP)/win32 \
--- a/libpurple/protocols/bonjour/bonjour.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/bonjour/bonjour.c	Mon Nov 05 00:35:07 2007 +0000
@@ -648,7 +648,7 @@
 	/* TODO: Avoid 'localhost,' if possible */
 	if (gethostname(hostname, 255) != 0) {
 		purple_debug_warning("bonjour", "Error when getting host name: %s.  Using \"localhost.\"\n",
-				strerror(errno));
+				g_strerror(errno));
 		strcpy(hostname, "localhost");
 	}
 	default_hostname = g_strdup(hostname);
--- a/libpurple/protocols/bonjour/jabber.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/bonjour/jabber.c	Mon Nov 05 00:35:07 2007 +0000
@@ -244,7 +244,7 @@
 		return;
 	else if (ret <= 0) {
 		PurpleConversation *conv;
-		const char *error = strerror(errno);
+		const char *error = g_strerror(errno);
 
 		purple_debug_error("bonjour", "Error sending message to buddy %s error: %s\n",
 				   purple_buddy_get_name(pb), error ? error : "(null)");
@@ -287,7 +287,7 @@
 		ret = 0;
 	else if (ret <= 0) {
 		PurpleConversation *conv;
-		const char *error = strerror(errno);
+		const char *error = g_strerror(errno);
 
 		purple_debug_error("bonjour", "Error sending message to buddy %s error: %s\n",
 				   purple_buddy_get_name(pb), error ? error : "(null)");
@@ -337,7 +337,7 @@
 		if (errno != EAGAIN) {
 			BonjourBuddy *bb = pb->proto_data;
 
-			purple_debug_warning("bonjour", "receive error: %s\n", strerror(errno));
+			purple_debug_warning("bonjour", "receive error: %s\n", g_strerror(errno));
 
 			bonjour_jabber_close_conversation(bb->conversation);
 			bb->conversation = NULL;
@@ -427,7 +427,7 @@
 	if (ret == -1 && errno == EAGAIN)
 		return;
 	else if (ret <= 0) {
-		const char *err = strerror(errno);
+		const char *err = g_strerror(errno);
 		PurpleConversation *conv;
 
 		purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n",
@@ -482,7 +482,7 @@
 	if (ret == -1 && errno == EAGAIN)
 		ret = 0;
 	else if (ret <= 0) {
-		const char *err = strerror(errno);
+		const char *err = g_strerror(errno);
 
 		purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n",
 				   purple_buddy_get_name(pb), bb->ip ? bb->ip : "(null)", bb->port_p2pj, err ? err : "(null)");
@@ -583,7 +583,7 @@
 	/* Open a listening socket for incoming conversations */
 	if ((data->socket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
 	{
-		purple_debug_error("bonjour", "Cannot open socket: %s\n", strerror(errno));
+		purple_debug_error("bonjour", "Cannot open socket: %s\n", g_strerror(errno));
 		purple_connection_error(data->account->gc, _("Cannot open socket"));
 		return -1;
 	}
@@ -591,7 +591,7 @@
 	/* Make the socket reusable */
 	if (setsockopt(data->socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0)
 	{
-		purple_debug_error("bonjour", "Error setting socket options: %s\n", strerror(errno));
+		purple_debug_error("bonjour", "Error setting socket options: %s\n", g_strerror(errno));
 		purple_connection_error(data->account->gc, _("Error setting socket options"));
 		return -1;
 	}
@@ -615,7 +615,7 @@
 	/* On no!  We tried 10 ports and could not bind to ANY of them */
 	if (!bind_successful)
 	{
-		purple_debug_error("bonjour", "Cannot bind socket: %s\n", strerror(errno));
+		purple_debug_error("bonjour", "Cannot bind socket: %s\n", g_strerror(errno));
 		purple_connection_error(data->account->gc, _("Could not bind socket to port"));
 		return -1;
 	}
@@ -623,7 +623,7 @@
 	/* Attempt to listen on the bound socket */
 	if (listen(data->socket, 10) != 0)
 	{
-		purple_debug_error("bonjour", "Cannot listen on socket: %s\n", strerror(errno));
+		purple_debug_error("bonjour", "Cannot listen on socket: %s\n", g_strerror(errno));
 		purple_connection_error(data->account->gc, _("Could not listen on socket"));
 		return -1;
 	}
@@ -670,7 +670,7 @@
 	}
 
 	if (!bonjour_jabber_stream_init(pb, source)) {
-		const char *err = strerror(errno);
+		const char *err = g_strerror(errno);
 		PurpleConversation *conv;
 
 		purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n",
--- a/libpurple/protocols/irc/dcc_send.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/irc/dcc_send.c	Mon Nov 05 00:35:07 2007 +0000
@@ -251,7 +251,7 @@
 		 * to the nonblocking nature of the listening socket, so we'll
 		 * just try again next time */
 		/* Let's print an error message anyway */
-		purple_debug_warning("irc", "accept: %s\n", strerror(errno));
+		purple_debug_warning("irc", "accept: %s\n", g_strerror(errno));
 		return;
 	}
 
--- a/libpurple/protocols/jabber/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/jabber/Makefile.mingw	Mon Nov 05 00:35:07 2007 +0000
@@ -88,6 +88,21 @@
 INCLUDE_PATHS += -I$(CYRUS_SASL_TOP)/include
 LIB_PATHS += -L$(CYRUS_SASL_TOP)/lib
 LIBS += -llibsasl
+CYRUS_SASL_DLLS = \
+			$(CYRUS_SASL_TOP)/bin/comerr32.dll \
+			$(CYRUS_SASL_TOP)/bin/gssapi32.dll \
+			$(CYRUS_SASL_TOP)/bin/k5sprt32.dll \
+			$(CYRUS_SASL_TOP)/bin/krb5_32.dll \
+			$(CYRUS_SASL_TOP)/bin/libsasl.dll
+
+CYRUS_SASL_PLUGINS = \
+			$(CYRUS_SASL_TOP)/bin/sasl2/saslANONYMOUS.dll \
+			$(CYRUS_SASL_TOP)/bin/sasl2/saslCRAMMD5.dll \
+			$(CYRUS_SASL_TOP)/bin/sasl2/saslDIGESTMD5.dll \
+			$(CYRUS_SASL_TOP)/bin/sasl2/saslGSSAPI.dll \
+			$(CYRUS_SASL_TOP)/bin/sasl2/saslLOGIN.dll \
+			$(CYRUS_SASL_TOP)/bin/sasl2/saslPLAIN.dll
+
 endif
 
 include $(PIDGIN_COMMON_RULES)
@@ -102,6 +117,11 @@
 install: all $(DLL_INSTALL_DIR)
 	cp $(XMPP_TARGET).dll $(DLL_INSTALL_DIR)
 	cp $(TARGET).dll $(PURPLE_INSTALL_DIR)
+ifeq ($(CYRUS_SASL), 1)
+	mkdir -p $(PURPLE_INSTALL_DIR)/sasl2
+	cp $(CYRUS_SASL_DLLS) $(PURPLE_INSTALL_DIR)
+	cp $(CYRUS_SASL_PLUGINS) $(PURPLE_INSTALL_DIR)/sasl2
+endif
 
 $(OBJECTS): $(PURPLE_CONFIG_H)
 
--- a/libpurple/protocols/jabber/buddy.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Mon Nov 05 00:35:07 2007 +0000
@@ -2252,6 +2252,16 @@
 	xmlnode *query;
 	JabberIq *iq;
 	char *dir_server = data;
+	const char *type;
+
+	/* if they've cancelled the search, we're
+	 * just going to get an error if we send
+	 * a cancel, so skip it */
+	type = xmlnode_get_attrib(result, "type");
+	if(type && !strcmp(type, "cancel")) {
+		g_free(dir_server);
+		return;
+	}
 
 	iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:search");
 	query = xmlnode_get_child(iq->node, "query");
--- a/libpurple/protocols/jabber/libxmpp.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/jabber/libxmpp.c	Mon Nov 05 00:35:07 2007 +0000
@@ -193,6 +193,9 @@
 init_plugin(PurplePlugin *plugin)
 {
 #ifdef HAVE_CYRUS_SASL
+#ifdef _WIN32
+	gchar *sasldir;
+#endif
 	int ret;
 #endif
 	PurpleAccountUserSplit *split;
@@ -237,6 +240,11 @@
 	
 	/* XXX - If any other plugin wants SASL this won't be good ... */
 #ifdef HAVE_CYRUS_SASL
+#ifdef _WIN32
+	sasldir = g_build_filename(wpurple_install_dir(), "sasl2", NULL);
+	sasl_set_path(SASL_PATH_TYPE_PLUGIN, sasldir);
+	g_free(sasldir);
+#endif
 	if ((ret = sasl_client_init(NULL)) != SASL_OK) {
 		purple_debug_error("xmpp", "Error (%d) initializing SASL.\n", ret);
 	}
--- a/libpurple/protocols/jabber/si.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/jabber/si.c	Mon Nov 05 00:35:07 2007 +0000
@@ -536,7 +536,7 @@
 	if(acceptfd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
 		return;
 	else if(acceptfd == -1) {
-		purple_debug_warning("jabber", "accept: %s\n", strerror(errno));
+		purple_debug_warning("jabber", "accept: %s\n", g_strerror(errno));
 		return;
 	}
 
--- a/libpurple/protocols/msn/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -52,6 +52,8 @@
 	slpsession.h \
 	soap.c\
 	soap.h\
+	soap2.c \
+	soap2.h \
 	state.c \
 	state.h \
 	switchboard.c \
--- a/libpurple/protocols/msn/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/Makefile.mingw	Mon Nov 05 00:35:07 2007 +0000
@@ -61,6 +61,7 @@
 			slpmsg.c \
 			slpsession.c \
 			soap.c\
+            soap2.c\
 			state.c \
 			switchboard.c \
 			sync.c \
--- a/libpurple/protocols/msn/contact.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/contact.c	Mon Nov 05 00:35:07 2007 +0000
@@ -28,6 +28,7 @@
 #include "contact.h"
 #include "xmlnode.h"
 #include "group.h"
+#include "soap2.h"
 
 const char *MsnSoapPartnerScenarioText[] =
 {
@@ -47,6 +48,11 @@
 	"Pending"
 };
 
+typedef struct {
+	MsnContact *contact;
+	MsnSoapPartnerScenario which;
+} GetContactListCbData;
+
 /* new a contact */
 MsnContact *
 msn_contact_new(MsnSession *session)
@@ -55,7 +61,6 @@
 
 	contact = g_new0(MsnContact, 1);
 	contact->session = session;
-	contact->soapconn = msn_soap_new(session,contact,1);
 
 	return contact;
 }
@@ -64,15 +69,18 @@
 void
 msn_contact_destroy(MsnContact *contact)
 {
-	msn_soap_destroy(contact->soapconn);
 	g_free(contact);
 }
 
 MsnCallbackState *
-msn_callback_state_new(void)
+msn_callback_state_new(MsnSession *session)
 {
-	return g_new0(MsnCallbackState, 1);
-}
+	MsnCallbackState *state = g_new0(MsnCallbackState, 1);
+
+	state->session = session;
+
+	return state;
+}	
 
 void
 msn_callback_state_free(MsnCallbackState *state)
@@ -92,46 +100,56 @@
 void
 msn_callback_state_set_who(MsnCallbackState *state, const gchar *who)
 {
+	gchar *nval;
 	g_return_if_fail(state != NULL);
 
+	nval = g_strdup(who);
 	g_free(state->who);
-	state->who = g_strdup(who);
+	state->who = nval;
 }
 
 void
 msn_callback_state_set_uid(MsnCallbackState *state, const gchar *uid)
 {
+	gchar *nval;
 	g_return_if_fail(state != NULL);
 
+	nval = g_strdup(uid);
 	g_free(state->uid);
-	state->uid = g_strdup(uid);
+	state->uid = nval;
 }
 
 void
 msn_callback_state_set_old_group_name(MsnCallbackState *state, const gchar *old_group_name)
 {
+	gchar *nval;
 	g_return_if_fail(state != NULL);
 
+	nval = g_strdup(old_group_name);
 	g_free(state->old_group_name);
-	state->old_group_name = g_strdup(old_group_name);
+	state->old_group_name = nval;
 }
 
 void
 msn_callback_state_set_new_group_name(MsnCallbackState *state, const gchar *new_group_name)
 {
+	gchar *nval;
 	g_return_if_fail(state != NULL);
 
+	nval = g_strdup(new_group_name);
 	g_free(state->new_group_name);
-	state->new_group_name = g_strdup(new_group_name);
+	state->new_group_name = nval;
 }
 
 void
 msn_callback_state_set_guid(MsnCallbackState *state, const gchar *guid)
 {
+	gchar *nval;
 	g_return_if_fail(state != NULL);
 
+	nval = g_strdup(guid);
 	g_free(state->guid);
-	state->guid = g_strdup(guid);
+	state->guid = nval;
 }
 
 
@@ -151,36 +169,6 @@
 	state->action |= action;
 }
 
-/*contact SOAP server login error*/
-static void
-msn_contact_login_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error)
-{
-	MsnSession *session;
-
-	session = soapconn->session;
-	g_return_if_fail(session != NULL);
-
-	msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to contact server"));
-}
-
-/*msn contact SOAP server connect process*/
-static gboolean
-msn_contact_login_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc)
-{
-	MsnSession * session;
-	MsnContact *contact;
-
-	contact = soapconn->parent;
-	g_return_val_if_fail(contact != NULL, TRUE);
-
-	session = contact->session;
-	g_return_val_if_fail(session != NULL, FALSE);
-
-	/*login ok!We can retrieve the contact list*/
-//	msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
-	return TRUE;
-}
-
 /*get MSN member role utility*/
 static MsnListId
 msn_get_memberrole(const char *role)
@@ -219,37 +207,20 @@
 }
 
 /* Create the AddressBook in the server, if we don't have one */
-static gboolean
-msn_create_address_cb(MsnSoapConn *soapconn)
+static void
+msn_create_address_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
 {
-	MsnContact *contact;
-
-	if (soapconn->body == NULL)
-		return TRUE;
-
-	contact = soapconn->parent;
-	g_return_val_if_fail(contact != NULL, TRUE);
-
-	purple_debug_info("MSN AddressBook", "Address Book successfully created!\n");
-	msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL);
-
-//	msn_soap_free_read_buf(soapconn);
-	return TRUE;
-}
-
-static void
-msn_create_address_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSN AddressBook","AddressBookAdd written\n");
-	soapconn->read_cb = msn_create_address_cb;
-
-	return;
+	if (resp && msn_soap_xml_get(resp->xml, "Body/Fault") == NULL) {
+		purple_debug_info("msnab", "Address Book successfully created!\n");
+		msn_get_address_book((MsnContact *)data, MSN_PS_INITIAL, NULL, NULL);
+	} else {
+		purple_debug_info("msnab", "Address Book creation failed!\n");
+	}
 }
 
 static void
 msn_create_address_book(MsnContact * contact)
 {
-	MsnSoapReq *soap_request;
 	gchar *body;
 
 	g_return_if_fail(contact != NULL);
@@ -257,323 +228,185 @@
 	g_return_if_fail(contact->session->user != NULL);
 	g_return_if_fail(contact->session->user->passport != NULL);
 	
-	purple_debug_info("MSN AddressBook","Creating an Address Book.\n");
+	purple_debug_info("msnab","Creating an Address Book.\n");
 
 	body = g_strdup_printf(MSN_ADD_ADDRESSBOOK_TEMPLATE, contact->session->user->passport);
 
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					MSN_ADDRESS_BOOK_POST_URL,MSN_ADD_ADDRESSBOOK_SOAP_ACTION,
-					body,
-					NULL,
-					msn_create_address_cb,
-					msn_create_address_written_cb,
-					msn_contact_connect_init);
-	msn_soap_post(contact->soapconn, soap_request);
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_ADD_ADDRESSBOOK_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, msn_create_address_cb,
+		contact);
 
 	g_free(body);
-	
-	return;
+}
+
+static void
+msn_parse_each_member(MsnSession *session, xmlnode *member, const char *node,
+	MsnListId list)
+{
+	char *passport = xmlnode_get_data(xmlnode_get_child(member, node));
+	char *type = xmlnode_get_data(xmlnode_get_child(member, "Type"));
+	char *member_id = xmlnode_get_data(xmlnode_get_child(member, "MembershipId"));
+	MsnUser *user = msn_userlist_find_add_user(session->userlist, passport, NULL);
+
+	purple_debug_info("msncl","%s name: %s, Type: %s, MembershipID: %s\n",
+		node, passport, type, member_id == NULL ? "(null)" : member_id);
+
+	if (member_id) {
+		user->membership_id[list] = atoi(member_id);
+	}
+
+	msn_got_lst_user(session, user, 1 << list, NULL);         
+
+	g_free(passport);
+	g_free(type);
+	g_free(member_id);
+}
+
+static void
+msn_parse_each_service(MsnSession *session, xmlnode *service)
+{
+	xmlnode *type;
+
+	if ((type = msn_soap_xml_get(service, "Info/Handle/Type"))) {
+		char *type_str = xmlnode_get_data(type);
+
+		if (g_str_equal(type_str, "Profile")) {
+			/* Process Windows Live 'Messenger Roaming Identity' */
+		} else if (g_str_equal(type_str, "Messenger")) {
+			xmlnode *lastchange = xmlnode_get_child(service, "LastChange");
+			char *lastchange_str = xmlnode_get_data(lastchange);
+			xmlnode *membership;
+
+			purple_debug_info("msncl","last change: %s\n", lastchange_str);	
+			purple_account_set_string(session->account,	"CLLastChange",
+				lastchange_str);
+
+			for (membership = msn_soap_xml_get(service,
+					"Memberships/Membership");
+				 membership; membership = xmlnode_get_next_twin(membership)) {
+
+				xmlnode *role = xmlnode_get_child(membership, "MemberRole");
+				char *role_str = xmlnode_get_data(role);
+				MsnListId list = msn_get_memberrole(role_str);
+				xmlnode *member;
+
+				purple_debug_info("msncl", "MemberRole role: %s, list: %d\n",
+					role_str, list);
+
+				for (member = msn_soap_xml_get(membership, "Members/Member");
+					 member; member = xmlnode_get_next_twin(member)) {
+					const char *member_type = xmlnode_get_attrib(member, "type");
+					if (g_str_equal(member_type, "PassportMember")) {
+						msn_parse_each_member(session, member, "PassportName",
+							list);
+					} else if (g_str_equal(member_type, "PhoneMember")) {
+
+					} else if (g_str_equal(member_type, "EmailMember")) {
+						msn_parse_each_member(session, member, "Email",	list);
+					}
+				}
+
+				g_free(role_str);
+			}
+
+			g_free(lastchange_str);
+		}
+
+		g_free(type_str);
+	}
 }
 
 /*parse contact list*/
 static void
-msn_parse_contact_list(MsnContact * contact)
+msn_parse_contact_list(MsnContact *contact, xmlnode *node)
 {
-	MsnSession * session;
-	MsnListOp list_op = 0;
-	MsnListId list;
-	char * passport, *typedata;
-	xmlnode *fault, *faultstringnode, *faultdetail, *errorcode;
-	xmlnode *node, *body, *response, *result, *services;
-	xmlnode *service, *memberships, *info, *handle, *handletype;
-	xmlnode *membershipnode, *members, *member, *passportNode;
-
-	session = contact->session;
-	node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len);
-
-	if (node == NULL) {
-		purple_debug_error("MSNCL","Unable to parse SOAP data!\n");
-		return;
-	}
-
-	purple_debug_misc("MSNCL","Parsing contact list with size %d\n", contact->soapconn->body_len);
+	xmlnode *fault, *faultnode;
 
-	purple_debug_misc("MSNCL","Root node @ %p: Name: '%s', child: '%s', lastchild: '%s'\n", node,
-		node->name ? node->name : "(null)",
-		(node->child && node->child->name) ? node->child->name : "(null)",
-		(node->lastchild && node->lastchild->name) ? node->lastchild->name : "(null)");
-
-	body = xmlnode_get_child(node, "Body");
-
-	if (body == NULL) {
-		purple_debug_warning("MSNCL", "Failed to parse contact list Body node\n");
-		xmlnode_free(node);
-		return;
-	}
-	purple_debug_info("MSNCL","Body @ %p:  Name: '%s'\n",body,body->name);
-
-	/* Did we receive a <Fault> ? */
-	if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) {
-	        purple_debug_info("MSNCL","Fault received from SOAP server!\n");
-
-		if ( (faultstringnode = xmlnode_get_child(fault, "faultstring")) != NULL ) {
-			gchar * faultstring = xmlnode_get_data(faultstringnode);
-			purple_debug_info("MSNCL", "Faultstring: %s\n", faultstring ? faultstring : "(null)");
+	/* we may get a response if our cache data is too old:
+	 *
+	 * <faultstring>Need to do full sync. Can't sync deltas Client
+	 * has too old a copy for us to do a delta sync</faultstring>
+	 *
+	 * this is not handled yet
+	 */
+	if ((fault = msn_soap_xml_get(node, "Body/Fault"))) {
+		if ((faultnode = xmlnode_get_child(fault, "faultstring"))) {
+			char *faultstring = xmlnode_get_data(faultnode);
+			purple_debug_info("msncl", "Retrieving contact list failed: %s\n",
+				faultstring);
 			g_free(faultstring);
 		}
-		if ( (faultdetail = xmlnode_get_child(fault, "detail")) != NULL ) {
-			purple_debug_info("MSNCL","detail @ %p, name: %s\n",faultdetail, faultdetail->name);
-
-			if ( (errorcode = xmlnode_get_child(faultdetail, "errorcode")) != NULL ) {
-				purple_debug_info("MSNCL","errorcode @ %p, name: %s\n", errorcode, errorcode->name);
-
-				if (errorcode->child != NULL) {
-					gchar *errorcodestring = xmlnode_get_data(errorcode);
-					purple_debug_info("MSNCL", "Error Code: %s\n", errorcodestring ? errorcodestring : "(null)");
-
-					if (errorcodestring && !strncmp(errorcodestring, "ABDoesNotExist", 14) ) {
-						xmlnode_free(node);
-						g_free(errorcodestring);
-						msn_create_address_book(contact);
-						return;
-					}
-					g_free(errorcodestring);
-				}
-			}
-		}
-		xmlnode_free(node);
-		msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
-		return;
-	}
-
-	response = xmlnode_get_child(body,"FindMembershipResponse");
-
-	if (response == NULL) {
-		/* we may get a response if our cache data is too old:
-		 *
-		 * <faultstring>Need to do full sync. Can't sync deltas Client
-		 * has too old a copy for us to do a delta sync</faultstring>
-		 */
-		xmlnode_free(node);
-		msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
-		return;
-	}
-	purple_debug_info("MSNCL","FindMembershipResponse @ %p: Name: '%s'\n",response,response->name);
+		if ((faultnode = msn_soap_xml_get(fault, "detail/errorcode"))) {
+			char *errorcode = xmlnode_get_data(faultnode);
 
-	result = xmlnode_get_child(response,"FindMembershipResult");
-	if (result == NULL) {
-		purple_debug_warning("MSNCL","Received No Update!\n");
-		xmlnode_free(node);
-		return;
-	}
-	purple_debug_info("MSNCL","Result @ %p: Name: '%s'\n", result, result->name);
-
-	if ( (services = xmlnode_get_child(result,"Services")) == NULL) {
-		purple_debug_misc("MSNCL","No <Services> received.\n");
-		xmlnode_free(node);
-		return;
-	}
-
-	purple_debug_info("MSNCL","Services @ %p\n",services);
-	
-	for (service = xmlnode_get_child(services, "Service"); service;
-	                                service = xmlnode_get_next_twin(service)) {
-		purple_debug_info("MSNCL","Service @ %p\n",service);
+			if (g_str_equal(errorcode, "ABDoesNotExist")) {
+				msn_create_address_book(contact);
+				g_free(errorcode);
+				return;
+			}
 
-		if ( (info = xmlnode_get_child(service,"Info")) == NULL ) {
-			purple_debug_error("MSNCL","Error getting 'Info' child node\n");
-			continue;
-		}
-		if ( (handle = xmlnode_get_child(info,"Handle")) == NULL ) {
-			purple_debug_error("MSNCL","Error getting 'Handle' child node\n");
-			continue;
-		}
-		if ( (handletype = xmlnode_get_child(handle,"Type")) == NULL ) {
-			purple_debug_error("MSNCL","Error getting 'Type' child node\n");
-			continue;
-		}
-
-		if ( (typedata = xmlnode_get_data(handletype)) == NULL) {
-			purple_debug_error("MSNCL","Error retrieving data from 'Type' child node\n");
-			continue;
-		}
-
-		purple_debug_info("MSNCL","processing '%s' Service\n", typedata);
-
-		if ( !g_strcasecmp(typedata, "Profile") ) {
-			/* Process Windows Live 'Messenger Roaming Identity' */
-			g_free(typedata);
-			continue;
+			g_free(errorcode);
 		}
 
-		if ( !g_strcasecmp(typedata, "Messenger") ) {
-			char *LastChangeStr = NULL;
-			xmlnode *LastChangeNode;
-
-			/*Last Change Node*/
-			if ((LastChangeNode = xmlnode_get_child(service, "LastChange")))
-				LastChangeStr = xmlnode_get_data(LastChangeNode);
-			purple_debug_info("MSNCL","LastChangeNode: '%s'\n",LastChangeStr ? LastChangeStr : "(null)");
-			purple_account_set_string(session->account, "CLLastChange", LastChangeStr);
-			g_free(LastChangeStr);
-
-			memberships = xmlnode_get_child(service,"Memberships");
-			if (memberships == NULL) {
-				purple_debug_warning("MSNCL","Memberships = NULL, cleaning up and returning.\n");
-				g_free(typedata);
-				xmlnode_free(node);
-				return;
-			}
-			purple_debug_info("MSNCL","Memberships @ %p: Name: '%s'\n",memberships,memberships->name);
-			for (membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode;
-							membershipnode = xmlnode_get_next_twin(membershipnode)){
-				xmlnode *roleNode;
-				char *role = NULL;
-				list = 0;
-
-				if ((roleNode = xmlnode_get_child(membershipnode,"MemberRole"))) {
-					role = xmlnode_get_data(roleNode);
-					list = msn_get_memberrole(role);
-				}
-				list_op = 1 << list;
-
-				purple_debug_info("MSNCL","MemberRole role: %s, list_op: %d\n", role ? role : "(null)", list_op);
-
-				g_free(role);
-
-				members = xmlnode_get_child(membershipnode, "Members");
-				for (member = xmlnode_get_child(members, "Member"); member;
-						member = xmlnode_get_next_twin(member)){
-					MsnUser *user = NULL;
-					xmlnode *typeNode, *membershipIdNode = NULL;
-					gchar *type, *membershipId = NULL;
-					const char *member_type = xmlnode_get_attrib(member, "type");
-
-					if (!member_type) {
-						purple_debug_error("msn", "No Member Type specified for Member.\n");
-						continue;
-					}
-
-					if(!g_strcasecmp(member_type, "PassportMember") ) {
-						passport = type = NULL;
-						if ((passportNode = xmlnode_get_child(member, "PassportName")))
-							passport = xmlnode_get_data(passportNode);
-						if ((typeNode = xmlnode_get_child(member, "Type")))
-							type = xmlnode_get_data(typeNode);
-						purple_debug_info("MSNCL","Passport name: '%s', Type: %s\n", passport ? passport : "(null)", type ? type : "(null)");
-						/* Why do we even bother parsing it just to free it??? */
-						g_free(type);
-
-						user = msn_userlist_find_add_user(session->userlist,passport,NULL);
-						g_free(passport);
-
-						membershipIdNode = xmlnode_get_child(member,"MembershipId");
-						if (membershipIdNode != NULL) {
-							membershipId = xmlnode_get_data(membershipIdNode);
-							if (membershipId != NULL) {
-								user->membership_id[list] = atoi(membershipId);
-								g_free(membershipId);
-							}
-						}
+		msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
+	} else {
+		xmlnode *service;
 
-						msn_got_lst_user(session, user, list_op, NULL);
-					}
-					else if (!g_strcasecmp(member_type, "PhoneMember")) {
-						purple_debug_info("msn", "Recieved Phone Member; ignoring.\n");
-					}
-					else if (!g_strcasecmp(member_type, "EmailMember")) {
-						xmlnode *emailNode;
-						passport = NULL;
-
-						if ((emailNode = xmlnode_get_child(member, "Email")))
-							passport = xmlnode_get_data(emailNode);
-						purple_debug_info("MSNCL","Email Member: Name: '%s', list_op: %d\n", passport ? passport : "(null)", list_op);
-
-						user = msn_userlist_find_add_user(session->userlist, passport, NULL);
-						g_free(passport);
-
-						membershipIdNode = xmlnode_get_child(member,"MembershipId");
-						if (membershipIdNode != NULL) {
-							membershipId = xmlnode_get_data(membershipIdNode);
-							if (membershipId != NULL) {
-								user->membership_id[list] = atoi(membershipId);
-								g_free(membershipId);
-							}
-						}
-
-						msn_got_lst_user(session, user, list_op, NULL);
-					} else {
-						purple_debug_info("msn", "Unknown Member type: %s\n", member_type);
-					}
-				}
-			}
+		for (service = msn_soap_xml_get(node, "Body/FindMembershipResponse/"
+				"FindMembershipResult/Services/Service");
+			 service; service = xmlnode_get_next_twin(service)) {
+			msn_parse_each_service(contact->session, service);
 		}
-		g_free(typedata);
 	}
-
-	xmlnode_free(node);	/* Free the whole XML tree */
-}
-
-static gboolean
-msn_get_contact_list_cb(MsnSoapConn *soapconn)
-{
-	MsnContact *contact;
-	MsnSession *session;
-	const char *abLastChange;
-	const char *dynamicItemLastChange;
-	gchar *partner_scenario;
-
-	if (soapconn->body == NULL)
-		return TRUE;
-
-	purple_debug_misc("MSNCL","Got the contact list!\n");
-
-	contact = soapconn->parent;
-	g_return_val_if_fail(contact != NULL, TRUE);
-	session = soapconn->session;
-	g_return_val_if_fail(session != NULL, FALSE);
-	g_return_val_if_fail(soapconn->data_cb != NULL, TRUE);
-
-	partner_scenario = soapconn->data_cb;
-
-	msn_parse_contact_list(contact);
-	/*free the read buffer*/
-	msn_soap_free_read_buf(soapconn);
-
-	abLastChange = purple_account_get_string(session->account, "ablastChange", NULL);
-	dynamicItemLastChange = purple_account_get_string(session->account, "dynamicItemLastChange", NULL);
-
-	if (!strcmp(partner_scenario, MsnSoapPartnerScenarioText[MSN_PS_INITIAL])) {
-
-#ifdef MSN_PARTIAL_LISTS
-		/* XXX: this should be enabled when we can correctly do partial
-	 	  syncs with the server. Currently we need to retrieve the whole
-	 	  list to detect sync issues */
-		msn_get_address_book(contact, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange);
-#else
-		msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL);
-#endif
-	} else {
-		msn_soap_free_read_buf(soapconn);
-	}
-
-	return TRUE;
 }
 
 static void
-msn_get_contact_written_cb(MsnSoapConn *soapconn)
+msn_get_contact_list_cb(MsnSoapMessage *req, MsnSoapMessage *resp,
+	gpointer data)
 {
-	purple_debug_misc("MSNCL","Sent SOAP request for the contact list.\n");
-	soapconn->read_cb = msn_get_contact_list_cb;
+	GetContactListCbData *cb_data = data;
+	MsnContact *contact = cb_data->contact;
+	MsnSession *session = contact->session;
+
+	g_return_if_fail(session != NULL);
+
+	if (resp != NULL) {
+		const char *abLastChange;
+		const char *dynamicItemLastChange;
+
+		purple_debug_misc("msncl","Got the contact list!\n");
+
+		msn_parse_contact_list(cb_data->contact, resp->xml);
+		abLastChange = purple_account_get_string(session->account,
+			"ablastChange", NULL);
+		dynamicItemLastChange = purple_account_get_string(session->account,
+			"dynamicItemLastChange", NULL);
+
+		if (cb_data->which == MSN_PS_INITIAL) {
+#ifdef MSN_PARTIAL_LISTS
+			/* XXX: this should be enabled when we can correctly do partial
+			   syncs with the server. Currently we need to retrieve the whole
+			   list to detect sync issues */
+			msn_get_address_book(contact, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange);
+#else
+			msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL);
+#endif
+		}
+	}
+
+	g_free(cb_data);
 }
 
-/* SOAP  get contact list*/
+/*SOAP  get contact list*/
 void
-msn_get_contact_list(MsnContact * contact, const MsnSoapPartnerScenario partner_scenario, const char *update_time)
+msn_get_contact_list(MsnContact * contact,
+	const MsnSoapPartnerScenario partner_scenario, const char *update_time)
 {
-	MsnSoapReq *soap_request;
-	gchar *body;
+	gchar *body = NULL;
 	gchar *update_str = NULL;
+	GetContactListCbData cb_data = { contact, partner_scenario };
 	const gchar *partner_scenario_str = MsnSoapPartnerScenarioText[partner_scenario];
 
 	purple_debug_misc("MSNCL","Getting Contact List.\n");
@@ -584,17 +417,14 @@
 	}
 
 	body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, partner_scenario_str, update_str ? update_str : "");
-	g_free(update_str);
 
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					MSN_GET_CONTACT_POST_URL,
-					MSN_GET_CONTACT_SOAP_ACTION,
-					body,
-					(gpointer) partner_scenario_str,
-					msn_get_contact_list_cb,
-					msn_get_contact_written_cb,
-					msn_contact_connect_init);
-	msn_soap_post(contact->soapconn,soap_request);
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_GET_CONTACT_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_GET_CONTACT_POST_URL,
+		msn_get_contact_list_cb, g_memdup(&cb_data, sizeof(cb_data)));
+
+	g_free(update_str);
 	g_free(body);
 }
 
@@ -604,7 +434,7 @@
 	MsnSession *session = contact->session;
 	xmlnode *group;
 
-	purple_debug_info("MsnAb","msn_parse_addressbook_groups()\n");
+	purple_debug_info("MSNAB","msn_parse_addressbook_groups()\n");
 
 	for(group = xmlnode_get_child(node, "Group"); group;
 					group = xmlnode_get_next_twin(group)){
@@ -756,81 +586,48 @@
 }
 
 static gboolean
-msn_parse_addressbook(MsnContact * contact)
+msn_parse_addressbook(MsnContact * contact, xmlnode *node)
 {
-	MsnSession *session;
-	xmlnode * node,*body,*response,*result;
+	MsnSession * session;
+	xmlnode *result;
 	xmlnode *groups;
 	xmlnode *contacts;
 	xmlnode *abNode;
-	xmlnode *fault, *faultstringnode, *faultdetail, *errorcode;
+	xmlnode *fault;
 
 	session = contact->session;
 
-	node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len);
-	if ( node == NULL ) {
-		purple_debug_error("MSN AddressBook","Error parsing Address Book with size %d\n", contact->soapconn->body_len);
+	if ((fault = msn_soap_xml_get(node, "Body/Fault"))) {
+		xmlnode *faultnode;
+
+		if ((faultnode = xmlnode_get_child(fault, "faultstring"))) {
+			gchar *faultstring = xmlnode_get_data(faultnode);
+			purple_debug_info("MSNAB","Faultstring: %s\n", faultstring);
+			g_free(faultstring);
+		}
+
+		if ((faultnode = msn_soap_xml_get(fault, "detail/errorcode"))) {
+			gchar *errorcode = xmlnode_get_data(faultnode);
+
+			purple_debug_info("MSNAB", "Error Code: %s\n", errorcode);
+						
+			if (g_str_equal(errorcode, "ABDoesNotExist")) {
+				g_free(errorcode);
+				return TRUE;
+			}
+		}
+
 		return FALSE;
 	}
 
-	purple_debug_misc("MSN AddressBook", "Parsing Address Book with size %d\n", contact->soapconn->body_len);
-
-	purple_debug_misc("MSN AddressBook","node{%p},name:%s,child:%s,last:%s\n", node,
-		node->name ? node->name : "(null)",
-		(node->child && node->child->name) ? node->child->name : "(null)",
-		(node->lastchild && node->lastchild->name) ? node->lastchild->name : "(null)");
-
-	body = xmlnode_get_child(node,"Body");
-	purple_debug_misc("MSN AddressBook","body{%p},name:%s\n",body,body->name);
-
-	/* TODO: This appears to be used in a number of places and should be de-duplicated */
-	if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) {
-		purple_debug_info("MSN AddressBook","Fault received from SOAP server!\n");
-		
-		if ( (faultstringnode = xmlnode_get_child(fault, "faultstring")) != NULL ) {
-			gchar *faultstring = xmlnode_get_data(faultstringnode);
-			purple_debug_info("MSN AddressBook","Faultstring: %s\n", faultstring ? faultstring : "(null)");
-			g_free(faultstring);
-		}
-		if ( (faultdetail = xmlnode_get_child(fault, "detail")) != NULL ) {
-			purple_debug_info("MSN AddressBook","detail @ %p, name: %s\n",faultdetail, faultdetail->name);
-
-			if ( (errorcode = xmlnode_get_child(faultdetail, "errorcode")) != NULL ) {
-				gchar *errorcodestring;
-				purple_debug_info("MSN AddressBook","errorcode @ %p, name: %s\n",errorcode, errorcode->name);
-
-				errorcodestring = xmlnode_get_data(errorcode);
-				purple_debug_info("MSN AddressBook", "Error Code: %s\n", errorcodestring ? errorcodestring : "(null)");
-						
-				if (errorcodestring && !strncmp(errorcodestring, "ABDoesNotExist", 14) ) {
-					g_free(errorcodestring);
-					xmlnode_free(node);
-					return TRUE;
-				}
-				g_free(errorcodestring);
-			}
-		}
-		xmlnode_free(node);
-		return FALSE;
+	result = msn_soap_xml_get(node, "Body/ABFindAllResponse/ABFindAllResult");
+	if(result == NULL){
+		purple_debug_misc("MSNAB","receive no address book update\n");
+		return TRUE;
 	}
 
-
-	response = xmlnode_get_child(body,"ABFindAllResponse");
-
-	if (response == NULL) {
-		xmlnode_free(node);
-		return FALSE;
-	}
-
-	purple_debug_misc("MSN SOAP","response{%p},name:%s\n",response,response->name);
-	result = xmlnode_get_child(response,"ABFindAllResult");
-	if(result == NULL){
-		purple_debug_misc("MSNAB","receive no address book update\n");
-		xmlnode_free(node);
-		return TRUE;
-	}
-	purple_debug_info("MSN SOAP","result{%p},name:%s\n",result,result->name);
-
+	/* I don't see this "groups" tag documented on msnpiki, need to find out
+	   if they are really there, and update msnpiki */
 	/*Process Group List*/
 	groups = xmlnode_get_child(result,"groups");
 	if (groups != NULL) {
@@ -840,7 +637,7 @@
 	/*add a default No group to set up the no group Membership*/
 	msn_group_new(session->userlist, MSN_INDIVIDUALS_GROUP_ID,
 				  MSN_INDIVIDUALS_GROUP_NAME);
-	purple_debug_misc("MsnAB","group_id:%s name:%s\n",
+	purple_debug_misc("MSNAB","group_id:%s name:%s\n",
 					  MSN_INDIVIDUALS_GROUP_ID, MSN_INDIVIDUALS_GROUP_NAME);
 	if ((purple_find_group(MSN_INDIVIDUALS_GROUP_NAME)) == NULL){
 		PurpleGroup *g = purple_group_new(MSN_INDIVIDUALS_GROUP_NAME);
@@ -849,7 +646,7 @@
 
 	/*add a default No group to set up the no group Membership*/
 	msn_group_new(session->userlist, MSN_NON_IM_GROUP_ID, MSN_NON_IM_GROUP_NAME);
-	purple_debug_misc("MsnAB","group_id:%s name:%s\n", MSN_NON_IM_GROUP_ID, MSN_NON_IM_GROUP_NAME);
+	purple_debug_misc("MSNAB","group_id:%s name:%s\n", MSN_NON_IM_GROUP_ID, MSN_NON_IM_GROUP_NAME);
 	if ((purple_find_group(MSN_NON_IM_GROUP_NAME)) == NULL){
 		PurpleGroup *g = purple_group_new(MSN_NON_IM_GROUP_NAME);
 		purple_blist_add_group(g, NULL);
@@ -869,7 +666,7 @@
 
 		if ((node2 = xmlnode_get_child(abNode, "lastChange")))
 			tmp = xmlnode_get_data(node2);
-		purple_debug_info("MsnAB"," lastchanged Time:{%s}\n", tmp ? tmp : "(null)");
+		purple_debug_info("MSNAB"," lastchanged Time:{%s}\n", tmp ? tmp : "(null)");
 		purple_account_set_string(session->account, "ablastChange", tmp);
 
 		g_free(tmp); tmp = NULL;
@@ -880,68 +677,51 @@
 		g_free(tmp);
 	}
 
-	xmlnode_free(node);
-	msn_soap_free_read_buf(contact->soapconn);
 	return TRUE;
 }
 
-static gboolean
-msn_get_address_cb(MsnSoapConn *soapconn)
+static void
+msn_get_address_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
 {
-	MsnContact *contact;
+	MsnContact *contact = data;
 	MsnSession *session;
 
-	if (soapconn->body == NULL)
-		return TRUE;
+	if (resp == NULL)
+		return;
 
-	contact = soapconn->parent;
-	g_return_val_if_fail(contact != NULL, TRUE);
-	session = soapconn->session;
-	g_return_val_if_fail(session != NULL, FALSE);
+	g_return_if_fail(contact != NULL);
+	session = contact->session;
+	g_return_if_fail(session != NULL);
 
-	purple_debug_misc("MSN AddressBook", "Got the Address Book!\n");
+	purple_debug_misc("MSNAB", "Got the Address Book!\n");
 
-	if ( msn_parse_addressbook(contact) ) {
-		//msn_soap_free_read_buf(soapconn);
-
+	if (msn_parse_addressbook(contact, resp->xml)) {
 		if (!session->logged_in) {
 			msn_send_privacy(session->account->gc);
 			msn_notification_dump_contact(session);
 		}
-
-		/*free the read buffer*/
-		msn_soap_free_read_buf(soapconn);
-		return TRUE;
 	} else {
-		/* This is making us loop infinitely when we fail to parse the address book,
-		  disable for now (we should re-enable when we send timestamps)
+		/* This is making us loop infinitely when we fail to parse the
+		  address book, disable for now (we should re-enable when we
+		  send timestamps)
 		*/
 		/*
 		msn_get_address_book(contact, NULL, NULL);
 		*/
 		msn_session_disconnect(session);
 		purple_connection_error(session->account->gc, _("Unable to retrieve MSN Address Book"));
-		return FALSE;
 	}
 }
 
-/**/
-static void
-msn_address_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_misc("MSN AddressBook","Sent SOAP request for the Address Book.\n");
-	soapconn->read_cb = msn_get_address_cb;
-}
-
 /*get the address book*/
 void
-msn_get_address_book(MsnContact *contact, const MsnSoapPartnerScenario partner_scenario, const char *LastChanged, const char *dynamicItemLastChange)
+msn_get_address_book(MsnContact *contact,
+	MsnSoapPartnerScenario partner_scenario, const char *LastChanged,
+	const char *dynamicItemLastChange)
 {
-	MsnSoapReq *soap_request;
-	char *body;
-	char *update_str = NULL;
+	char *body, *update_str = NULL;
 
-	purple_debug_misc("MSN AddressBook","Getting Address Book\n");
+	purple_debug_misc("MSNAB","Getting Address Book\n");
 
 	/*build SOAP and POST it*/
 	if (dynamicItemLastChange != NULL)
@@ -949,79 +729,58 @@
 	else if (LastChanged != NULL)
 		update_str = g_strdup_printf(MSN_GET_ADDRESS_UPDATE_XML, LastChanged);
 
-
 	body = g_strdup_printf(MSN_GET_ADDRESS_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], update_str ? update_str : "");
-	g_free(update_str);
 
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					MSN_ADDRESS_BOOK_POST_URL,MSN_GET_ADDRESS_SOAP_ACTION,
-					body,
-					NULL,
-					msn_get_address_cb,
-					msn_address_written_cb,
-					msn_contact_connect_init);
-	msn_soap_post(contact->soapconn,soap_request);
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_GET_ADDRESS_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, msn_get_address_cb,
+		contact);
+
+	g_free(update_str);
 	g_free(body);
 }
 
-static gboolean
-msn_add_contact_read_cb(MsnSoapConn *soapconn)
+static void
+msn_add_contact_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp,
+	gpointer data)
 {
-	MsnCallbackState *state = NULL;
-	MsnUserList *userlist;
-	MsnUser *user;
-	
-	g_return_val_if_fail(soapconn->data_cb != NULL, TRUE);
-	g_return_val_if_fail(soapconn->session != NULL, FALSE);
-	g_return_val_if_fail(soapconn->session->userlist != NULL, TRUE);
+	MsnCallbackState *state = data;
+	MsnSession *session = state->session;
 
-	state = (MsnCallbackState *) soapconn->data_cb;
+	g_return_if_fail(session != NULL);
 
-	if (soapconn->body == NULL) {
-		msn_callback_state_free(state);
-		return TRUE;
-	}
+	if (resp != NULL) {
+		MsnUserList *userlist = session->userlist;
+		MsnUser *user;
 	
-	userlist = soapconn->session->userlist;
-	
-	purple_debug_info("MSNCL","Contact added successfully\n");
+		purple_debug_info("MSNCL","Contact added successfully\n");
 
-	// the code this block is replacing didn't send ADL for yahoo contacts,
-	// but i haven't confirmed this is WLM's behaviour wrt yahoo contacts
-
-	if ( !msn_user_is_yahoo(soapconn->session->account, state->who) ) {
-		
-		msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL);
-		msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL);
-	}
-	msn_notification_send_fqy(soapconn->session, state->who);
+		// the code this block is replacing didn't send ADL for yahoo contacts,
+		// but i haven't confirmed this is WLM's behaviour wrt yahoo contacts
+		if ( !msn_user_is_yahoo(session->account, state->who) ) {
+			msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL);
+			msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL);
+		}
 
-	user = msn_userlist_find_add_user(userlist, state->who, state->who);
-	msn_user_add_group_id(user, state->guid);
-
-	msn_soap_free_read_buf(soapconn);
-	msn_callback_state_free(state);
+		msn_notification_send_fqy(session, state->who);
 
-	return TRUE;
-}
+		user = msn_userlist_find_add_user(userlist, state->who, state->who);
+		msn_user_add_group_id(user, state->guid);
+	}
 
-static void
-msn_add_contact_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSNCL","Add contact request written\n");
-	soapconn->read_cb = msn_add_contact_read_cb;
+	msn_callback_state_free(state);
 }
 
 /* add a Contact in MSN_INDIVIDUALS_GROUP */
 void
 msn_add_contact(MsnContact *contact, MsnCallbackState *state, const char *passport)
 {
-	MsnSoapReq *soap_request;
 	gchar *body = NULL;
 	gchar *contact_xml = NULL;
 
-	g_return_if_fail(passport != NULL);
-/*	gchar *escaped_displayname;
+#if 0
+	gchar *escaped_displayname;
 
 
 	 if (displayname != NULL) {
@@ -1030,87 +789,71 @@
 		escaped_displayname = passport;
 	 }
 	contact_xml = g_strdup_printf(MSN_XML_ADD_CONTACT, escaped_displayname, passport);
-*/
+#endif
+
 	purple_debug_info("MSNCL","Adding contact %s to contact list\n", passport);
 
-//	if ( !strcmp(state->guid, MSN_INDIVIDUALS_GROUP_ID) ) {
-		contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport);
-//	}
+	contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport);
 	body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE, contact_xml);
 
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_CONTACT_ADD_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
+		msn_add_contact_read_cb, state);
+
 	g_free(contact_xml);
-
-	/*build SOAP and POST it*/
-
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					MSN_ADDRESS_BOOK_POST_URL,
-					MSN_CONTACT_ADD_SOAP_ACTION,
-					body,
-					state,
-					msn_add_contact_read_cb,
-					msn_add_contact_written_cb,
-					msn_contact_connect_init);
-	msn_soap_post(contact->soapconn,soap_request);
-
 	g_free(body);
 }
 
-static gboolean
-msn_add_contact_to_group_read_cb(MsnSoapConn *soapconn)
+static void
+msn_add_contact_to_group_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp,
+	gpointer data)
 {
-	MsnCallbackState *state; 
+	MsnCallbackState *state = data;
 	MsnUserList *userlist;
 
-	g_return_val_if_fail(soapconn->data_cb != NULL, TRUE);
-	g_return_val_if_fail(soapconn->session != NULL, FALSE);
-	g_return_val_if_fail(soapconn->session->userlist != NULL, TRUE);
+	g_return_if_fail(data != NULL);
+
+	userlist = state->session->userlist;
 
-	userlist = soapconn->session->userlist;
+	if (resp != NULL) {
+		if (msn_userlist_add_buddy_to_group(userlist, state->who,
+				state->new_group_name)) {
+			purple_debug_info("MSNCL", "Contact %s added to group %s successfully!\n", state->who, state->new_group_name);
+		} else {
+			purple_debug_info("MSNCL","Contact %s added to group %s successfully on server, but failed in the local list\n", state->who, state->new_group_name);
+		}
 
-	state = (MsnCallbackState *) soapconn->data_cb;
+		if (state->action & MSN_ADD_BUDDY) {
+			MsnUser *user = msn_userlist_find_user(userlist, state->who);
 
-	if (soapconn->body == NULL) {
-		msn_callback_state_free(state);
-		return TRUE;
-	}
-	
-	if (msn_userlist_add_buddy_to_group(userlist, state->who, state->new_group_name) == TRUE) {
-		purple_debug_info("MSNCL", "Contact %s added to group %s successfully!\n", state->who, state->new_group_name);
-	} else {
-		purple_debug_info("MSNCL","Contact %s added to group %s successfully on server, but failed in the local list\n", state->who, state->new_group_name);
+        	if ( !msn_user_is_yahoo(state->session->account, state->who) ) {
+
+				msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL);
+				msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL);
+	        }
+	        msn_notification_send_fqy(state->session, state->who);
+
+			if (msn_userlist_user_is_in_list(user, MSN_LIST_PL)) {
+				msn_del_contact_from_list(state->session->contact, NULL, state->who, MSN_LIST_PL);
+				msn_callback_state_free(state);
+				return;
+			}
+		}
+
+		if (state->action & MSN_MOVE_BUDDY) {
+			msn_del_contact_from_group(state->session->contact, state->who, state->old_group_name);
+		}
 	}
 
-	if (state->action & MSN_ADD_BUDDY) {
-
-        	if ( !msn_user_is_yahoo(soapconn->session->account, state->who) ) {
-
-		                msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL);
-		                msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL);
-	        }
-	        msn_notification_send_fqy(soapconn->session, state->who);
-	}
-
-	if (state->action & MSN_MOVE_BUDDY) {
-		msn_del_contact_from_group(soapconn->session->contact, state->who, state->old_group_name);
-	} else {
-		msn_callback_state_free(state);
-		msn_soap_free_read_buf(soapconn);
-	}
-	return TRUE;
-}
-
-static void
-msn_add_contact_to_group_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSNCL","Add contact to group request sent!\n");
-	soapconn->read_cb = msn_add_contact_to_group_read_cb;
+	msn_callback_state_free(state);
 }
 
 void
 msn_add_contact_to_group(MsnContact *contact, MsnCallbackState *state, 
 			 const char *passport, const char *groupId)
 {
-	MsnSoapReq *soap_request;
 	MsnUserList *userlist;
 	MsnUser *user;
 	gchar *body = NULL, *contact_xml;
@@ -1143,13 +886,14 @@
 		return;
 	}
 
-
 	purple_debug_info("MSNCL", "Adding user %s to group %s\n", passport, 
 			  msn_userlist_find_group_name(userlist, groupId));
 
 	user = msn_userlist_find_user(userlist, passport);
 	if (user == NULL) {
-		purple_debug_warning("MSN CL", "Unable to retrieve user %s from the userlist!\n", passport);
+		purple_debug_warning("MSNCL", "Unable to retrieve user %s from the userlist!\n", passport);
+		msn_callback_state_free(state);                                     
+		return; /* guess this never happened! */
 	}
 
 	if (user != NULL && user->uid != NULL) {
@@ -1159,60 +903,35 @@
 	}
 
 	body = g_strdup_printf(MSN_ADD_CONTACT_GROUP_TEMPLATE, groupId, contact_xml);
-	g_free(contact_xml);
-
-	/*build SOAP and POST it*/
 
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					MSN_ADDRESS_BOOK_POST_URL,
-					MSN_ADD_CONTACT_GROUP_SOAP_ACTION,
-					body,
-					state,
-					msn_add_contact_to_group_read_cb,
-					msn_add_contact_to_group_written_cb,
-					msn_contact_connect_init);
-	msn_soap_post(contact->soapconn,soap_request);
+	msn_soap_message_send(state->session,
+		msn_soap_message_new(MSN_ADD_CONTACT_GROUP_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
+		msn_add_contact_to_group_read_cb, state);
 
+	g_free(contact_xml);
 	g_free(body);
 }
 
-
-
-static gboolean
-msn_delete_contact_read_cb(MsnSoapConn *soapconn)
+static void
+msn_delete_contact_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp,
+	gpointer data)
 {
-	MsnUser *user;
-	MsnCallbackState *state = (MsnCallbackState *) soapconn->data_cb;
-	MsnUserList *userlist; 
-
-	g_return_val_if_fail(soapconn->session != NULL, FALSE);
-	g_return_val_if_fail(soapconn->session->userlist != NULL, TRUE);
+	MsnCallbackState *state = data;
 
-	userlist = soapconn->session->userlist;
+	if (resp != NULL) {
+		MsnUserList *userlist = state->session->userlist;
+		MsnUser *user = msn_userlist_find_user_with_id(userlist, state->uid);
 
-        if (soapconn->body == NULL) {
-                msn_callback_state_free(state);
-                return TRUE;
-        }
+		purple_debug_info("MSNCL","Delete contact successful\n");
 
-	purple_debug_info("MSNCL","Delete contact successful\n");
-
-	user = msn_userlist_find_user_with_id(userlist, state->uid);
-	if (user != NULL) {
-		msn_userlist_remove_user(userlist, user);
+		if (user != NULL) {
+			msn_userlist_remove_user(userlist, user);
+		}
 	}
 
 	msn_callback_state_free(state);
-	msn_soap_free_read_buf(soapconn);
-
-	return TRUE;
-}
-
-static void
-msn_delete_contact_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSNCL","Delete contact request written\n");
-	soapconn->read_cb = msn_delete_contact_read_cb;
 }
 
 /*delete a Contact*/
@@ -1221,72 +940,52 @@
 {	
 	gchar *body = NULL;
 	gchar *contact_id_xml = NULL ;
-	MsnSoapReq *soap_request;
 	MsnCallbackState *state;
 
 	g_return_if_fail(contactId != NULL);
 	contact_id_xml = g_strdup_printf(MSN_CONTACT_ID_XML, contactId);
 
-	state = msn_callback_state_new();
+	state = msn_callback_state_new(contact->session);
 	msn_callback_state_set_uid(state, contactId);
 
 	/* build SOAP request */
 	purple_debug_info("MSNCL","Deleting contact with contactId: %s\n", contactId);
 	body = g_strdup_printf(MSN_DEL_CONTACT_TEMPLATE, contact_id_xml);
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					MSN_ADDRESS_BOOK_POST_URL,
-					MSN_CONTACT_DEL_SOAP_ACTION,
-					body,
-					state,
-					msn_delete_contact_read_cb,
-					msn_delete_contact_written_cb,
-					msn_contact_connect_init);
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_CONTACT_DEL_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
+		msn_delete_contact_read_cb, state);
 
 	g_free(contact_id_xml);
-
-	/* POST the SOAP request */
-	msn_soap_post(contact->soapconn, soap_request);
-
 	g_free(body);
 }
 
-static gboolean
-msn_del_contact_from_group_read_cb(MsnSoapConn *soapconn)
+static void
+msn_del_contact_from_group_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp,
+	gpointer data)
 {
-	MsnCallbackState *state = (MsnCallbackState *) soapconn->data_cb;
+	MsnCallbackState *state = data;
 
-	if (soapconn->body == NULL) {
-		msn_callback_state_free(state);
-		return TRUE;
-	}
-	
-	if (msn_userlist_rem_buddy_from_group(soapconn->session->userlist, state->who, state->old_group_name)) {
-		purple_debug_info("MSN CL", "Contact %s deleted successfully from group %s\n", state->who, state->old_group_name);
-	} else {
-		purple_debug_info("MSN CL", "Contact %s deleted successfully from group %s in the server, but failed in the local list\n", state->who, state->old_group_name);
+	if (resp != NULL) {
+		if (msn_userlist_rem_buddy_from_group(state->session->userlist,
+				state->who, state->old_group_name)) {
+			purple_debug_info("MSNCL", "Contact %s deleted successfully from group %s\n", state->who, state->old_group_name);
+		} else {
+			purple_debug_info("MSNCL", "Contact %s deleted successfully from group %s in the server, but failed in the local list\n", state->who, state->old_group_name);
+		}
 	}
 	
 	msn_callback_state_free(state);
-	msn_soap_free_read_buf(soapconn);
-
-	return TRUE;
-}
-
-static void
-msn_del_contact_from_group_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSN CL","Del contact from group request sent!\n");
-	soapconn->read_cb = msn_del_contact_from_group_read_cb;
 }
 
 void
 msn_del_contact_from_group(MsnContact *contact, const char *passport, const char *group_name)
 {
-	MsnSoapReq *soap_request;
 	MsnUserList * userlist;
 	MsnUser *user;
 	MsnCallbackState *state;
-	gchar *body = NULL, *contact_id_xml;
+	gchar *body, *contact_id_xml;
 	const gchar *groupId;
 	
 	g_return_if_fail(passport != NULL);
@@ -1299,16 +998,16 @@
 	
 	groupId = msn_userlist_find_group_id(userlist, group_name);
 	if (groupId != NULL) {
-		purple_debug_info("MSN CL", "Deleting user %s from group %s\n", passport, group_name);
+		purple_debug_info("MSNCL", "Deleting user %s from group %s\n", passport, group_name);
 	} else {
-		purple_debug_warning("MSN CL", "Unable to retrieve group id from group %s !\n", group_name);
+		purple_debug_warning("MSNCL", "Unable to retrieve group id from group %s !\n", group_name);
 		return;
 	}
 	
 	user = msn_userlist_find_user(userlist, passport);
 	
 	if (user == NULL) {
-		purple_debug_warning("MSN CL", "Unable to retrieve user from passport %s!\n", passport);
+		purple_debug_warning("MSNCL", "Unable to retrieve user from passport %s!\n", passport);
 		return;
 	}
 
@@ -1317,58 +1016,40 @@
 		return;
 	}
 
-	state = msn_callback_state_new();
+	state = msn_callback_state_new(contact->session);
 	msn_callback_state_set_who(state, passport);
 	msn_callback_state_set_guid(state, groupId);
 	msn_callback_state_set_old_group_name(state, group_name);
 
 	contact_id_xml = g_strdup_printf(MSN_CONTACT_ID_XML, user->uid);
 	body = g_strdup_printf(MSN_CONTACT_DEL_GROUP_TEMPLATE, contact_id_xml, groupId);
+
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_CONTACT_DEL_GROUP_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
+		msn_del_contact_from_group_read_cb, state);
+	
 	g_free(contact_id_xml);
-
-	/*build SOAP and POST it*/
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					    MSN_ADDRESS_BOOK_POST_URL,
-					    MSN_CONTACT_DEL_GROUP_SOAP_ACTION,
-					    body,
-					    state,
-					    msn_del_contact_from_group_read_cb,
-					    msn_del_contact_from_group_written_cb,
-					    msn_contact_connect_init);
-	msn_soap_post(contact->soapconn,soap_request);
-
 	g_free(body);
 }
 
 
-static gboolean
-msn_update_contact_read_cb(MsnSoapConn *soapconn)
+static void
+msn_update_contact_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp,
+	gpointer data)
 {
-	if (soapconn->body == NULL)
-		return TRUE;
-
-	purple_debug_info("MSN CL","Contact updated successfully\n");
-
-	return TRUE;
-}
-
-static void
-msn_update_contact_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSN CL","Update contact information request sent\n");
-	soapconn->read_cb = msn_update_contact_read_cb;
+	if (resp)
+		purple_debug_info("MSN CL","Contact updated successfully\n");
+	else
+		purple_debug_info("MSN CL","Contact updated successfully\n");
 }
 
 /* Update a contact's nickname */
-
 void
 msn_update_contact(MsnContact *contact, const char* nickname)
 {
-	MsnSoapReq *soap_request;
-	gchar *body, *escaped_nickname;
-
-	/* I'm not sure this is right, but if it isn't, the rest of this function will need to be fixed */
-	g_return_if_fail(nickname != NULL);
+	gchar *body = NULL, *escaped_nickname;
 
 	purple_debug_info("MSN CL","Update contact information with new friendly name: %s\n", nickname);
 
@@ -1376,83 +1057,50 @@
 
 	body = g_strdup_printf(MSN_CONTACT_UPDATE_TEMPLATE, escaped_nickname);
 
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_CONTACT_UPDATE_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
+		msn_update_contact_read_cb, NULL);
+
 	g_free(escaped_nickname);
-	/*build SOAP and POST it*/
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					MSN_ADDRESS_BOOK_POST_URL,
-					MSN_CONTACT_UPDATE_SOAP_ACTION,
-					body,
-					NULL,
-					msn_update_contact_read_cb,
-					msn_update_contact_written_cb,
-					msn_contact_connect_init);
-	msn_soap_post(contact->soapconn, soap_request);
-
 	g_free(body);
 }
 
-
-static gboolean
-msn_del_contact_from_list_read_cb(MsnSoapConn *soapconn)
+static void
+msn_del_contact_from_list_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp,
+	gpointer data)
 {
-	MsnCallbackState *state = NULL;
+	MsnCallbackState *state = data;
+	MsnSession *session = state->session;
 
-	g_return_val_if_fail(soapconn->data_cb != NULL, TRUE);
-	g_return_val_if_fail(soapconn->session != NULL, FALSE);
-	g_return_val_if_fail(soapconn->session->contact != NULL, FALSE);
-	g_return_val_if_fail(soapconn->session->userlist != NULL, FALSE);
-
-	state = (MsnCallbackState *) soapconn->data_cb;
+	if (resp != NULL) {
+		purple_debug_info("MSN CL", "Contact %s deleted successfully from %s list on server!\n", state->who, MsnMemberRole[state->list_id]);
 
-	if (soapconn->body == NULL) {
-		msn_callback_state_free(state);
-		return TRUE;
-	}
-	
-	purple_debug_info("MSN CL", "Contact %s deleted successfully from %s list on server!\n", state->who, MsnMemberRole[state->list_id]);
+		if (state->list_id == MSN_LIST_PL) {
+			MsnUser *user = msn_userlist_find_user(session->userlist, state->who);
 
-	if (state->list_id == MSN_LIST_PL) {
-		MsnUser *user = msn_userlist_find_user(soapconn->session->userlist, state->who);
-		
-		if (user != NULL)
-			msn_user_unset_op(user, MSN_LIST_PL_OP);
-
-		msn_add_contact_to_list(soapconn->session->contact, state, state->who, MSN_LIST_RL);
-		return TRUE;
-	}
+			if (user != NULL)
+				msn_user_unset_op(user, MSN_LIST_PL_OP);
 
-	if (state->list_id == MSN_LIST_AL) {
-		purple_privacy_permit_remove(soapconn->session->account, state->who, TRUE);
-		msn_add_contact_to_list(soapconn->session->contact, NULL, state->who, MSN_LIST_BL);
-		msn_callback_state_free(state);
-		return TRUE;
-	}
-
-	if (state->list_id == MSN_LIST_BL) {
-		purple_privacy_deny_remove(soapconn->session->account, state->who, TRUE);
-		msn_add_contact_to_list(soapconn->session->contact, NULL, state->who, MSN_LIST_AL);
-		msn_callback_state_free(state);
-		return TRUE;
+			msn_add_contact_to_list(session->contact, state, state->who, MSN_LIST_RL);
+			return;
+		} else if (state->list_id == MSN_LIST_AL) {
+			purple_privacy_permit_remove(session->account, state->who, TRUE);
+			msn_add_contact_to_list(session->contact, NULL, state->who, MSN_LIST_BL);
+		} else if (state->list_id == MSN_LIST_BL) {
+			purple_privacy_deny_remove(session->account, state->who, TRUE);
+			msn_add_contact_to_list(session->contact, NULL, state->who, MSN_LIST_AL);
+		}
 	}
 
 	msn_callback_state_free(state);
-	msn_soap_free_read_buf(soapconn);
-
-	return TRUE;
-}
-
-static void
-msn_del_contact_from_list_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSN CL","Delete contact from list SOAP request sent!\n");
-	soapconn->read_cb = msn_del_contact_from_list_read_cb;
 }
 
 void
 msn_del_contact_from_list(MsnContact *contact, MsnCallbackState *state,
 			  const gchar *passport, const MsnListId list)
 {
-	MsnSoapReq *soap_request;
 	gchar *body = NULL, *member = NULL;
 	MsnSoapPartnerScenario partner_scenario;
 	MsnUser *user;
@@ -1464,7 +1112,7 @@
 	purple_debug_info("MSN CL", "Deleting contact %s from %s list\n", passport, MsnMemberRole[list]);
 
 	if (state == NULL) {
-		state = msn_callback_state_new();
+		state = msn_callback_state_new(contact->session);
 	}
 	msn_callback_state_set_list_id(state, list);
 	msn_callback_state_set_who(state, passport);
@@ -1488,79 +1136,55 @@
 			        MsnSoapPartnerScenarioText[partner_scenario],
 			        MsnMemberRole[list],
 			        member);
-	g_free(member);
 
-	soap_request = msn_soap_request_new( MSN_CONTACT_SERVER,
-					     MSN_SHARE_POST_URL,
-					     MSN_DELETE_MEMBER_FROM_LIST_SOAP_ACTION,
-					     body,
-					     state,
-					     msn_del_contact_from_list_read_cb,
-					     msn_del_contact_from_list_written_cb,
-					     msn_contact_connect_init);
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_DELETE_MEMBER_FROM_LIST_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_SHARE_POST_URL,
+		msn_del_contact_from_list_read_cb, state);
 
-	msn_soap_post(contact->soapconn,soap_request);
-	
+	g_free(member);
 	g_free(body);
 }
 
-static gboolean
-msn_add_contact_to_list_read_cb(MsnSoapConn *soapconn)
+static void
+msn_add_contact_to_list_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp,
+	gpointer data)
 {
-	MsnCallbackState *state = NULL;
+	MsnCallbackState *state = data;
 
-	g_return_val_if_fail(soapconn->data_cb != NULL, TRUE);
-	g_return_val_if_fail(soapconn->session != NULL, FALSE);
-	g_return_val_if_fail(soapconn->session->userlist != NULL, FALSE);
-
-	state = (MsnCallbackState *) soapconn->data_cb;
+	g_return_if_fail(state != NULL);
+	g_return_if_fail(state->session != NULL);
+	g_return_if_fail(state->session->contact != NULL);
 	
-	if (soapconn->body == NULL) {
-		msn_callback_state_free(state);
-		return TRUE;
-	}
-	
-	purple_debug_info("MSN CL", "Contact %s added successfully to %s list on server!\n", state->who, MsnMemberRole[state->list_id]);
+	if (resp != NULL) {
+		purple_debug_info("MSN CL", "Contact %s added successfully to %s list on server!\n", state->who, MsnMemberRole[state->list_id]);
 
-	if (state->list_id == MSN_LIST_RL) {
-		MsnUser *user = msn_userlist_find_user(soapconn->session->userlist, state->who);
+		if (state->list_id == MSN_LIST_RL) {
+			MsnUser *user = msn_userlist_find_user(state->session->userlist, state->who);
 		
-		if (user != NULL) {
-			msn_user_set_op(user, MSN_LIST_RL_OP);
-		}
+			if (user != NULL) {
+				msn_user_set_op(user, MSN_LIST_RL_OP);
+			}
+
+			if (state->action & MSN_DENIED_BUDDY) {
 
-		if (state->action & MSN_DENIED_BUDDY) {
-			g_return_val_if_fail(soapconn->session->contact != NULL, FALSE);
-
-			msn_add_contact_to_list(soapconn->session->contact, NULL, state->who, MSN_LIST_BL);
-			return TRUE;
+				msn_add_contact_to_list(state->session->contact, NULL, state->who, MSN_LIST_BL);
+			} else if (state->list_id == MSN_LIST_AL) {
+				purple_privacy_permit_add(state->session->account, state->who, TRUE);
+			} else if (state->list_id == MSN_LIST_BL) {
+				purple_privacy_deny_add(state->session->account, state->who, TRUE);
+			}
 		}
 	}
 
-	if (state->list_id == MSN_LIST_AL) {
-		purple_privacy_permit_add(soapconn->session->account, state->who, TRUE);
-	} else if (state->list_id == MSN_LIST_BL) {
-		purple_privacy_deny_add(soapconn->session->account, state->who, TRUE);
-	}
-
 	msn_callback_state_free(state);
-	msn_soap_free_read_buf(soapconn);
-	return TRUE;
-}
-
-
-static void
-msn_add_contact_to_list_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSN CL","Add contact to list SOAP request sent!\n");
-	soapconn->read_cb = msn_add_contact_to_list_read_cb;
 }
 
 void
 msn_add_contact_to_list(MsnContact *contact, MsnCallbackState *state,
 			const gchar *passport, const MsnListId list)
 {
-	MsnSoapReq *soap_request;
 	gchar *body = NULL, *member = NULL;
 	MsnSoapPartnerScenario partner_scenario;
 
@@ -1571,51 +1195,38 @@
 	purple_debug_info("MSN CL", "Adding contact %s to %s list\n", passport, MsnMemberRole[list]);
 
 	if (state == NULL) {
-		state = msn_callback_state_new();
+		state = msn_callback_state_new(contact->session);
 	}
 	msn_callback_state_set_list_id(state, list);
 	msn_callback_state_set_who(state, passport);
 
 	partner_scenario = (list == MSN_LIST_RL) ? MSN_PS_CONTACT_API : MSN_PS_BLOCK_UNBLOCK;
 
-	member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, passport);
+	member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, state->who);
 
 	body = g_strdup_printf(MSN_CONTACT_ADD_TO_LIST_TEMPLATE, 
 			       MsnSoapPartnerScenarioText[partner_scenario],
 			       MsnMemberRole[list], 
 			       member);
 
-	g_free(member);
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_ADD_MEMBER_TO_LIST_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_SHARE_POST_URL,
+		msn_add_contact_to_list_read_cb, state);
 
-	soap_request = msn_soap_request_new( MSN_CONTACT_SERVER,
-					     MSN_SHARE_POST_URL,
-					     MSN_ADD_MEMBER_TO_LIST_SOAP_ACTION,
-					     body,
-					     state,
-					     msn_add_contact_to_list_read_cb,
-					     msn_add_contact_to_list_written_cb,
-					     msn_contact_connect_init);
-
-	msn_soap_post(contact->soapconn, soap_request);
-
+	g_free(member);
 	g_free(body);
 }
 
-
 #if 0
-static gboolean
-msn_gleams_read_cb(MsnSoapConn * soapconn)
+static void
+msn_gleams_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
 {
-	purple_debug_info("MSN CL","Gleams read done\n");
-	return TRUE;
-}
-
-static void
-msn_gleams_written_cb(MsnSoapConn * soapconn)
-{
-	purple_debug_info("MSNP14","finish Group written\n");
-	soapconn->read_cb = msn_gleams_read_cb;
-//	msn_soap_read_cb(data,source,cond);
+	if (resp != NULL)
+		purple_debug_info("MSNP14","Gleams read done\n");
+	else
+		purple_debug_info("MSNP14","Gleams read failed\n");
 }
 
 /*get the gleams info*/
@@ -1625,16 +1236,11 @@
 	MsnSoapReq *soap_request;
 
 	purple_debug_info("MSNP14","msn get gleams info...\n");
-	/*build SOAP and POST it*/
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					MSN_ADDRESS_BOOK_POST_URL,
-					MSN_GET_GLEAMS_SOAP_ACTION,
-					MSN_GLEAMS_TEMPLATE,
-					NULL,
-					msn_gleams_read_cb,
-					msn_gleams_written_cb,
-					msn_contact_connect_init);
-	msn_soap_post(contact->soapconn,soap_request);
+	msn_soap_message_send(contact->session,
+		msn_soap_message_new(MSN_GET_GLEAMS_SOAP_ACTION,
+			xmlnode_from_str(MSN_GLEAMS_TEMPLATE, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
+		msn_gleams_read_cb, NULL);
 }
 #endif
 
@@ -1643,100 +1249,88 @@
  * Group Operations
  ***************************************************************/
 
-static gboolean
-msn_group_read_cb(MsnSoapConn *soapconn)
+static void
+msn_group_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
 {
-	MsnUserList *userlist;
-	MsnCallbackState *state = NULL;
+	MsnCallbackState *state = data;
 	
-	purple_debug_info("MSN CL", "Group request successful.\n");
+	purple_debug_info("MSNCL", "Group request successful.\n");
 	
-	g_return_val_if_fail(soapconn->session != NULL, FALSE);
-	g_return_val_if_fail(soapconn->session->userlist != NULL, TRUE);
-	g_return_val_if_fail(soapconn->session->contact != NULL, FALSE);
+	g_return_if_fail(state->session != NULL);
+	g_return_if_fail(state->session->userlist != NULL);
+	g_return_if_fail(state->session->contact != NULL);
 
-	state = (MsnCallbackState *) soapconn->data_cb;
-	
-	if (soapconn->body == NULL) {
+	if (resp == NULL) {
 		msn_callback_state_free(state);
-		return TRUE;
+		return;
 	}
-	
+
 	if (state) {
-		userlist = soapconn->session->userlist;
+		MsnSession *session = state->session;
+		MsnUserList *userlist = session->userlist;
 		
 		if (state->action & MSN_RENAME_GROUP) {
-			msn_userlist_rename_group_id(soapconn->session->userlist,
+			msn_userlist_rename_group_id(session->userlist,
 						     state->guid,
 						     state->new_group_name);
 		}
 		
 		if (state->action & MSN_ADD_GROUP) {
-			gchar *guid, *endguid;
-			
-			guid = g_strstr_len(soapconn->read_buf, soapconn->read_len, "<guid>");
-			guid += 6;
-			endguid = g_strstr_len(soapconn->read_buf, soapconn->read_len, "</guid>");
-			*endguid = '\0';
-			/* create and add the new group to the userlist */
-			purple_debug_info("MSN CL", "Adding group %s with guid = %s to the userlist\n", state->new_group_name, guid);
-			msn_group_new(soapconn->session->userlist, guid, state->new_group_name);
+			/* the response is taken from
+			   http://telepathy.freedesktop.org/wiki/Pymsn/MSNP/ContactListActions
+			   should copy it to msnpiki some day */
+			xmlnode *guid_node = msn_soap_xml_get(resp->xml,
+				"Body/ABGroupAddResponse/ABGroupAddResult/guid");
+
+			if (guid_node) {
+				char *guid = xmlnode_get_data(guid_node);
+
+				/* create and add the new group to the userlist */
+				purple_debug_info("MSNCL", "Adding group %s with guid = %s to the userlist\n", state->new_group_name, guid);
+				msn_group_new(session->userlist, guid, state->new_group_name);
 
-			if (state->action & MSN_ADD_BUDDY) {
-				msn_userlist_add_buddy(soapconn->session->userlist,
-						       state->who,
-						       state->new_group_name);
-				msn_callback_state_free(state);
-				return TRUE;
-			}
-			
-			if (state->action & MSN_MOVE_BUDDY) {
-				msn_add_contact_to_group(soapconn->session->contact, state, state->who, guid); 
-				return TRUE;
+				g_free(guid);
+
+				if (state->action & MSN_ADD_BUDDY) {
+					msn_userlist_add_buddy(session->userlist,
+						state->who,
+						state->new_group_name);
+				} else if (state->action & MSN_MOVE_BUDDY) {
+					msn_add_contact_to_group(session->contact, state, state->who, guid); 
+					return;
+				}
+			} else {
+				purple_debug_info("MSNCL", "Adding group %s failed\n",
+					state->new_group_name);
 			}
 		}
 		
 		if (state->action & MSN_DEL_GROUP) {
 			GList *l;
 			
-			msn_userlist_remove_group_id(soapconn->session->userlist, state->guid);
+			msn_userlist_remove_group_id(session->userlist, state->guid);
 			for (l = userlist->users; l != NULL; l = l->next) {
 				msn_user_remove_group_id( (MsnUser *)l->data, state->guid);
 			}
-			
 		}
 			
 		msn_callback_state_free(state);
 	}
-	
-	msn_soap_free_read_buf(soapconn);
-	return TRUE;
-}
-
-static void
-msn_group_written_cb(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSN CL","Sent group request.\n");
-	soapconn->read_cb = msn_group_read_cb;
 }
 
 /* add group */
 void
 msn_add_group(MsnSession *session, MsnCallbackState *state, const char* group_name)
 {
-	MsnSoapReq *soap_request;
-	MsnContact *contact;
 	char *body = NULL;
-	gchar *escaped_group_name;
 
 	g_return_if_fail(session != NULL);
 	g_return_if_fail(group_name != NULL);
 	
-	contact = session->contact;
-	purple_debug_info("MSN CL","Adding group %s to contact list.\n", group_name);
+	purple_debug_info("MSNCL","Adding group %s to contact list.\n", group_name);
 
 	if (state == NULL) {
-		state = msn_callback_state_new();
+		state = msn_callback_state_new(session);
 	}
 
 	msn_callback_state_set_action(state, MSN_ADD_GROUP);
@@ -1745,21 +1339,14 @@
 	/* escape group name's html special chars so it can safely be sent
 	* in a XML SOAP request
 	*/
-	escaped_group_name = g_markup_escape_text(group_name, -1);
-	body = g_strdup_printf(MSN_GROUP_ADD_TEMPLATE, escaped_group_name);
-	g_free(escaped_group_name);
+	body = g_markup_printf_escaped(MSN_GROUP_ADD_TEMPLATE, group_name);
 
-	/*build SOAP and POST it*/
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					MSN_ADDRESS_BOOK_POST_URL,
-					MSN_GROUP_ADD_SOAP_ACTION,
-					body,
-					state,
-					msn_group_read_cb,
-					msn_group_written_cb,
-					msn_contact_connect_init);
-	msn_soap_post(contact->soapconn,soap_request);
-	
+	msn_soap_message_send(session,
+		msn_soap_message_new(MSN_GROUP_ADD_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
+		msn_group_read_cb, state);
+
 	g_free(body);
 }
 
@@ -1767,8 +1354,6 @@
 void
 msn_del_group(MsnSession *session, const gchar *group_name)
 {
-	MsnSoapReq *soap_request;
-	MsnContact *contact;
 	MsnCallbackState *state;
 	char *body = NULL;
 	const gchar *guid;
@@ -1776,8 +1361,7 @@
 	g_return_if_fail(session != NULL);
 	
 	g_return_if_fail(group_name != NULL);
-	contact = session->contact;
-	purple_debug_info("MSN CL","Deleting group %s from contact list\n", group_name);
+	purple_debug_info("MSNCL","Deleting group %s from contact list\n", group_name);
 	
 	guid = msn_userlist_find_group_id(session->userlist, group_name);
 	
@@ -1785,7 +1369,7 @@
 	*  we need to delete nothing
 	*/
 	if (guid == NULL) {
-		purple_debug_info("MSN CL", "Group %s guid not found, returning.\n", group_name);
+		purple_debug_info("MSNCL", "Group %s guid not found, returning.\n", group_name);
 		return;
 	}
 
@@ -1794,21 +1378,17 @@
 		return;
 	}
 
-	state = msn_callback_state_new();
+	state = msn_callback_state_new(session);
 	msn_callback_state_set_action(state, MSN_DEL_GROUP);
 	msn_callback_state_set_guid(state, guid);
 	
 	body = g_strdup_printf(MSN_GROUP_DEL_TEMPLATE, guid);
-	/*build SOAP and POST it*/
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					    MSN_ADDRESS_BOOK_POST_URL,
-					    MSN_GROUP_DEL_SOAP_ACTION,
-					    body,
-					    state,
-					    msn_group_read_cb,
-					    msn_group_written_cb,
-					    msn_contact_connect_init);
-	msn_soap_post(contact->soapconn, soap_request);
+
+	msn_soap_message_send(session,
+		msn_soap_message_new(MSN_GROUP_DEL_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
+		msn_group_read_cb, state);
 
 	g_free(body);
 }
@@ -1817,24 +1397,22 @@
 void
 msn_contact_rename_group(MsnSession *session, const char *old_group_name, const char *new_group_name)
 {
-	MsnSoapReq *soap_request;
-	MsnContact *contact;
-	gchar * escaped_group_name, *body = NULL;
+	gchar *body = NULL;
 	const gchar * guid;
-	MsnCallbackState *state = msn_callback_state_new();
+	MsnCallbackState *state;
 	
 	g_return_if_fail(session != NULL);
 	g_return_if_fail(session->userlist != NULL);
 	g_return_if_fail(old_group_name != NULL);
 	g_return_if_fail(new_group_name != NULL);
 	
-	contact = session->contact;
 	purple_debug_info("MSN CL", "Renaming group %s to %s.\n", old_group_name, new_group_name);
 	
 	guid = msn_userlist_find_group_id(session->userlist, old_group_name);
 	if (guid == NULL)
 		return;
 
+	state = msn_callback_state_new(session);
 	msn_callback_state_set_guid(state, guid);
 	msn_callback_state_set_new_group_name(state, new_group_name);
 
@@ -1845,31 +1423,14 @@
 
 	msn_callback_state_set_action(state, MSN_RENAME_GROUP);
 	
-	/* escape group name's html special chars so it can safely be sent
-	 * in a XML SOAP request
-	*/
-	escaped_group_name = g_markup_escape_text(new_group_name, -1);
-	
-	body = g_strdup_printf(MSN_GROUP_RENAME_TEMPLATE, guid, escaped_group_name);
+	body = g_markup_printf_escaped(MSN_GROUP_RENAME_TEMPLATE,
+		guid, new_group_name);
 	
-	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
-					    MSN_ADDRESS_BOOK_POST_URL,
-					    MSN_GROUP_RENAME_SOAP_ACTION,
-					    body,
-					    state,
-					    msn_group_read_cb,
-					    msn_group_written_cb,
-					    msn_contact_connect_init);
-	msn_soap_post(contact->soapconn, soap_request);
-	
-	g_free(escaped_group_name);
+	msn_soap_message_send(session,
+		msn_soap_message_new(MSN_GROUP_RENAME_SOAP_ACTION,
+			xmlnode_from_str(body, -1)),
+		MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
+		msn_group_read_cb, state);
+
 	g_free(body);
 }
-
-void
-msn_contact_connect_init(MsnSoapConn *soapconn)
-{
-	msn_soap_init(soapconn, MSN_CONTACT_SERVER, TRUE,
-		      msn_contact_login_connect_cb,
-		      msn_contact_login_error_cb);
-}
--- a/libpurple/protocols/msn/contact.h	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/contact.h	Mon Nov 05 00:35:07 2007 +0000
@@ -380,6 +380,7 @@
 	gchar * guid;
 	MsnListId list_id;
 	MsnCallbackAction action;
+	MsnSession *session;
 };
 
 typedef enum 
@@ -397,7 +398,7 @@
 MsnContact * msn_contact_new(MsnSession *session);
 void msn_contact_destroy(MsnContact *contact);
 
-MsnCallbackState * msn_callback_state_new(void);
+MsnCallbackState * msn_callback_state_new(MsnSession *session);
 void msn_callback_state_free(MsnCallbackState *state);
 void msn_callback_state_set_who(MsnCallbackState *state, const gchar *who);
 void msn_callback_state_set_uid(MsnCallbackState *state, const gchar *uid);
--- a/libpurple/protocols/msn/msn.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/msn.c	Mon Nov 05 00:35:07 2007 +0000
@@ -580,14 +580,20 @@
 		psm = purple_status_get_attr_string(status, "message");
 		currentmedia = purple_status_get_attr_string(status, PURPLE_TUNE_FULL);
 
-		if (!purple_presence_is_available(presence)) {
+		if (!purple_status_is_available(status)) {
 			name = purple_status_get_name(status);
 		} else {
 			name = NULL;
 		}
 
 		if (name != NULL && *name) {
-			char *tmp2 = g_markup_escape_text(name, -1);
+			char *tmp2;
+
+			if (purple_presence_is_idle(presence)) {
+				tmp2 = g_markup_printf_escaped("%s/%s", name, _("Idle"));
+			} else {
+				tmp2 = g_markup_escape_text(name, -1);
+			}
 
 			if (psm != NULL && *psm) {
 				tmp = g_markup_escape_text(psm, -1);
@@ -601,8 +607,20 @@
 		} else {
 			if (psm != NULL && *psm) {
 				tmp = g_markup_escape_text(psm, -1);
-				purple_notify_user_info_add_pair(user_info, _("Status"), tmp);
+				if (purple_presence_is_idle(presence)) {
+					purple_notify_user_info_add_pair(user_info, _("Idle"), tmp);
+				} else {
+					purple_notify_user_info_add_pair(user_info, _("Status"), tmp);
+				}
 				g_free(tmp);
+			} else {
+				if (purple_presence_is_idle(presence)) {
+					purple_notify_user_info_add_pair(user_info, _("Status"),
+						_("Idle"));
+				} else {
+					purple_notify_user_info_add_pair(user_info, _("Status"),
+						purple_status_get_name(status));
+				}
 			}
 		}
 
@@ -956,21 +974,17 @@
 	}else	{
 		/*send Offline Instant Message,only to MSN Passport User*/
 		MsnSession *session;
-		MsnOim *oim;
 		char *friendname;
 
 		purple_debug_info("MSNP14","prepare to send offline Message\n");
 		session = gc->proto_data;
-		/* XXX/khc: hack */
-		if (!session->oim)
-			session->oim = msn_oim_new(session);
 
-		oim = session->oim;
 		friendname = msn_encode_mime(account->username);
-		msn_oim_prep_send_msg_info(oim, purple_account_get_username(account),
-								   friendname, who,	message);
+		msn_oim_prep_send_msg_info(session->oim,
+			purple_account_get_username(account),
+			friendname, who,	message);
+		msn_oim_send_msg(session->oim);
 		g_free(friendname);
-		msn_oim_send_msg(oim);
 	}
 
 	return 1;
--- a/libpurple/protocols/msn/nexus.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/nexus.c	Mon Nov 05 00:35:07 2007 +0000
@@ -22,15 +22,12 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 #include "msn.h"
-#include "soap.h"
+#include "soap2.h"
 #include "nexus.h"
 #include "notification.h"
 
 #undef NEXUS_LOGIN_TWN
 
-/*Local Function Prototype*/
-static gboolean nexus_login_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc);
-
 /**************************************************************************
  * Main
  **************************************************************************/
@@ -42,8 +39,6 @@
 
 	nexus = g_new0(MsnNexus, 1);
 	nexus->session = session;
-	/*we must use SSL connection to do Windows Live ID authentication*/
-	nexus->soapconn = msn_soap_new(session,nexus,1);
 
 	nexus->challenge_data = g_hash_table_new_full(g_str_hash,
 		g_str_equal, g_free, g_free);
@@ -57,193 +52,98 @@
 	if (nexus->challenge_data != NULL)
 		g_hash_table_destroy(nexus->challenge_data);
 
-	msn_soap_destroy(nexus->soapconn);
 	g_free(nexus);
 }
 
-#if 0 /* khc */
-/**************************************************************************
- * Util
- **************************************************************************/
-
-static gssize
-msn_ssl_read(MsnNexus *nexus)
-{
-	gssize len;
-	char temp_buf[4096];
-
-	if ((len = purple_ssl_read(nexus->gsc, temp_buf,
-			sizeof(temp_buf))) > 0)
-	{
-		nexus->read_buf = g_realloc(nexus->read_buf,
-			nexus->read_len + len + 1);
-		strncpy(nexus->read_buf + nexus->read_len, temp_buf, len);
-		nexus->read_len += len;
-		nexus->read_buf[nexus->read_len] = '\0';
-	}
-
-	return len;
-}
-
-static void
-nexus_write_cb(gpointer data, gint source, PurpleInputCondition cond)
-{
-	MsnNexus *nexus = data;
-	int len, total_len;
-
-	total_len = strlen(nexus->write_buf);
-
-	len = purple_ssl_write(nexus->gsc,
-		nexus->write_buf + nexus->written_len,
-		total_len - nexus->written_len);
-
-	if (len < 0 && errno == EAGAIN)
-		return;
-	else if (len <= 0) {
-		purple_input_remove(nexus->input_handler);
-		nexus->input_handler = 0;
-		/* TODO: notify of the error */
-		return;
-	}
-	nexus->written_len += len;
-
-	if (nexus->written_len < total_len)
-		return;
-
-	purple_input_remove(nexus->input_handler);
-	nexus->input_handler = 0;
-
-	g_free(nexus->write_buf);
-	nexus->write_buf = NULL;
-	nexus->written_len = 0;
-
-	nexus->written_cb(nexus, source, 0);
-}
-
-#endif
 /**************************************************************************
  * Login
  **************************************************************************/
+
 static void
-nexus_login_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error)
+nexus_got_response_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
 {
-	MsnSession *session;
+	MsnNexus *nexus = data;
+	MsnSession *session = nexus->session;
+	xmlnode *node;
+
+	if (resp == NULL) {
+		msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication:Unable to connect"));
+		return;
+	}
+
+	node = msn_soap_xml_get(resp->xml,	"Body/"
+		"RequestSecurityTokenResponseCollection/RequestSecurityTokenResponse");
+
+	for (; node; node = node->next) {
+		xmlnode *token = msn_soap_xml_get(node,
+			"RequestedSecurityToken/BinarySecurityToken");
+
+		if (token) {
+			char *token_str = xmlnode_get_data(token);
+			char **elems, **cur, **tokens;
+			char *msn_twn_t, *msn_twn_p, *cert_str;
+
+			if (token_str == NULL) continue;
+
+			elems = g_strsplit(token_str, "&", 0);
 
-	session = soapconn->session;
-	g_return_if_fail(session != NULL);
+			for (cur = elems; *cur != NULL; cur++){
+				tokens = g_strsplit(*cur, "=", 2);
+				g_hash_table_insert(nexus->challenge_data, tokens[0], tokens[1]);
+				/* Don't free each of the tokens, only the array. */
+				g_free(tokens);
+			}
+
+			g_free(token_str);
+			g_strfreev(elems);
+
+			msn_twn_t = g_hash_table_lookup(nexus->challenge_data, "t");
+			msn_twn_p = g_hash_table_lookup(nexus->challenge_data, "p");
+
+			/*setup the t and p parameter for session*/
+			if (session->passport_info.t != NULL){
+				g_free(session->passport_info.t);
+			}
+			session->passport_info.t = g_strdup(msn_twn_t);
 
-	soapconn->gsc = NULL;
+			if (session->passport_info.p != NULL)
+				g_free(session->passport_info.p);
+			session->passport_info.p = g_strdup(msn_twn_p);
+
+			cert_str = g_strdup_printf("t=%s&p=%s",msn_twn_t,msn_twn_p);
+			msn_got_login_params(session, cert_str);
 
-	msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication:Unable to connect"));
-	/* the above line will result in nexus being destroyed, so we don't want
-	 * to destroy it here, or we'd crash */
+			purple_debug_info("MSN Nexus","Close nexus connection!\n");
+			g_free(cert_str);
+			msn_nexus_destroy(nexus);
+			session->nexus = NULL;
+
+			return;
+		}
+	}
+
+	/* we must have failed! */
+	msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication: cannot find authenticate token in server response"));
 }
 
-/*process the SOAP reply, get the Authentication Info*/
-static gboolean
-nexus_login_read_cb(MsnSoapConn *soapconn)
+/*when connect, do the SOAP Style windows Live ID authentication */
+void
+msn_nexus_connect(MsnNexus *nexus)
 {
-	MsnNexus *nexus;
-	MsnSession *session;
-
-	char *base, *c;
-	char *msn_twn_t,*msn_twn_p;
-	char *login_params;
-	char **elems, **cur, **tokens;
-	char * cert_str;
-
-	nexus = soapconn->parent;
-	g_return_val_if_fail(nexus != NULL, TRUE);
-	session = nexus->session;
-	g_return_val_if_fail(session != NULL, FALSE);
-
-	/*reply OK, we should process the SOAP body*/
-	purple_debug_info("MSN Nexus","TWN Server Windows Live ID Reply OK!\n");
-
-	//TODO: we should parse it using XML
-#ifdef NEXUS_LOGIN_TWN
-	base  = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_START_TOKEN);
-	base += strlen(TWN_START_TOKEN);
-	c     = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_END_TOKEN);
-#else
-	base  = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_LIVE_START_TOKEN);
-	base += strlen(TWN_LIVE_START_TOKEN);
-	c     = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_LIVE_END_TOKEN);
-#endif
-	login_params = g_strndup(base, c - base);
-
-	//		purple_debug_info("msn", "TWN Cert: {%s}\n", login_params);
-
-	/* Parse the challenge data. */
-	elems = g_strsplit(login_params, "&amp;", 0);
-
-	for (cur = elems; *cur != NULL; cur++){
-			tokens = g_strsplit(*cur, "=", 2);
-			g_hash_table_insert(nexus->challenge_data, tokens[0], tokens[1]);
-			/* Don't free each of the tokens, only the array. */
-			g_free(tokens);
-	}
-
-	g_strfreev(elems);
-
-	msn_twn_t = (char *)g_hash_table_lookup(nexus->challenge_data, "t");
-	msn_twn_p = (char *)g_hash_table_lookup(nexus->challenge_data, "p");
-
-	/*setup the t and p parameter for session*/
-	g_free(session->passport_info.t);
-	session->passport_info.t = g_strdup(msn_twn_t);
-
-	g_free(session->passport_info.p);
-	session->passport_info.p = g_strdup(msn_twn_p);
-
-	cert_str = g_strdup_printf("t=%s&p=%s",msn_twn_t,msn_twn_p);
-	msn_got_login_params(session, cert_str);
-
-	purple_debug_info("MSN Nexus","Close nexus connection!\n");
-	g_free(cert_str);
-	g_free(login_params);
-	msn_nexus_destroy(nexus);
-	session->nexus = NULL;
-
-	return FALSE;
-}
-
-static void
-nexus_login_written_cb(MsnSoapConn *soapconn)
-{
-	soapconn->read_cb = nexus_login_read_cb;
-//	msn_soap_read_cb(data,source,cond);
-}
-
-
-/*when connect, do the SOAP Style windows Live ID authentication */
-gboolean
-nexus_login_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc)
-{
-	MsnNexus * nexus;
-	MsnSession *session;
+	MsnSession *session = nexus->session;
 	char *ru,*lc,*id,*tw,*ct,*kpp,*kv,*ver,*rn,*tpf;
 	char *fs0,*fs;
 	char *username, *password;
-	char *request_str, *tail;
+	char *tail;
 #ifdef NEXUS_LOGIN_TWN
 	char *challenge_str;
 #else
 	char *rst1_str,*rst2_str,*rst3_str;
 #endif
-	
-	purple_debug_info("MSN Nexus","Starting Windows Live ID authentication\n");
-
-	g_return_val_if_fail(soapconn != NULL, FALSE);
 
-	nexus = soapconn->parent;
-	g_return_val_if_fail(nexus != NULL, TRUE);
+	MsnSoapMessage *soap;
 
-	session = soapconn->session;
-	g_return_val_if_fail(session != NULL, FALSE);
-
-	msn_soap_set_process_step(soapconn, MSN_SOAP_PROCESSING);
-
+	purple_debug_info("MSN Nexus","Starting Windows Live ID authentication\n");
 	msn_session_set_login_step(session, MSN_LOGIN_STEP_GET_COOKIE);
 
 	/*prepare the Windows Live ID authentication token*/
@@ -272,10 +172,9 @@
 		msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication Failed"));
 		g_free(username);
 		g_free(password);
-		purple_ssl_close(gsc);
 		msn_nexus_destroy(nexus);
 		session->nexus = NULL;
-		return FALSE;
+		return;
 	}
 
 	/*
@@ -314,151 +213,8 @@
 #endif
 	g_free(fs);
 
-	soapconn->login_path = g_strdup(TWN_POST_URL);
-	request_str = g_strdup_printf(
-					"POST %s HTTP/1.1\r\n"
-					"Accept: text/*\r\n"
-					"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"
-					"Host: %s\r\n"
-					"Content-Length: %" G_GSIZE_FORMAT "\r\n"
-					"Connection: Keep-Alive\r\n"
-					"Cache-Control: no-cache\r\n\r\n"
-					"%s",
-					soapconn->login_path, soapconn->login_host, strlen(tail),
-					tail);
-
-#ifdef MSN_SOAP_DEBUG	
-	purple_debug_misc("MSN Nexus", "TWN Sending:\n%s\n", request_str);
-#endif
-	g_free(tail);
-	g_free(username);
-	g_free(password);
-
-	/*prepare to send the SOAP request*/
-	msn_soap_write(soapconn, request_str, nexus_login_written_cb);
-
-	return TRUE;
+	soap = msn_soap_message_new(NULL, xmlnode_from_str(tail, -1));
+	msn_soap_message_send(nexus->session, soap, MSN_TWN_SERVER, TWN_POST_URL,
+		nexus_got_response_cb, nexus);
 }
 
-#if 0 /* khc */
-static void
-nexus_connect_written_cb(gpointer data, gint source, PurpleInputCondition cond)
-{
-	MsnNexus *nexus = data;
-	int len;
-
-	char *da_login;
-	char *base, *c;
-
-	if (nexus->input_handler == 0)
-		/* TODO: Use purple_ssl_input_add()? */
-		nexus->input_handler = purple_input_add(nexus->gsc->fd,
-			PURPLE_INPUT_READ, nexus_connect_written_cb, nexus);
-
-
-	/* Get the PassportURLs line. */
-	len = msn_ssl_read(nexus);
-
-	if (len < 0 && errno == EAGAIN)
-		return;
-	else if (len < 0) {
-		purple_input_remove(nexus->input_handler);
-		nexus->input_handler = 0;
-		g_free(nexus->read_buf);
-		nexus->read_buf = NULL;
-		nexus->read_len = 0;
-		/* TODO: error handling */
-		return;
-	}
-
-	if (g_strstr_len(nexus->read_buf, nexus->read_len,
-			"\r\n\r\n") == NULL)
-		return;
-
-	purple_input_remove(nexus->input_handler);
-	nexus->input_handler = 0;
-
-	base = strstr(nexus->read_buf, "PassportURLs");
-
-	if (base == NULL)
-	{
-		g_free(nexus->read_buf);
-		nexus->read_buf = NULL;
-		nexus->read_len = 0;
-		return;
-	}
-
-	if ((da_login = strstr(base, "DALogin=")) != NULL)
-	{
-		/* skip over "DALogin=" */
-		da_login += 8;
-
-		if ((c = strchr(da_login, ',')) != NULL)
-			*c = '\0';
-
-		if ((c = strchr(da_login, '/')) != NULL)
-		{
-			nexus->login_path = g_strdup(c);
-			*c = '\0';
-		}
-
-		nexus->login_host = g_strdup(da_login);
-	}
-
-	g_free(nexus->read_buf);
-	nexus->read_buf = NULL;
-	nexus->read_len = 0;
-
-	purple_ssl_close(nexus->gsc);
-
-	/* Now begin the connection to the login server. */
-	nexus->gsc = purple_ssl_connect(nexus->session->account,
-			nexus->login_host, PURPLE_SSL_DEFAULT_PORT,
-			login_connect_cb, login_error_cb, nexus);
-}
-
-
-#endif
-
-/**************************************************************************
- * Connect
- **************************************************************************/
-
-#if 0 /* khc */
-static void
-nexus_connect_cb(gpointer data, PurpleSslConnection *gsc,
-				 PurpleInputCondition cond)
-{
-	MsnNexus *nexus;
-	MsnSession *session;
-
-	nexus = data;
-	g_return_if_fail(nexus != NULL);
-
-	session = nexus->session;
-	g_return_if_fail(session != NULL);
-
-	msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH);
-
-	nexus->write_buf = g_strdup("GET /rdr/pprdr.asp\r\n\r\n");
-	nexus->written_len = 0;
-
-	nexus->read_len = 0;
-
-	nexus->written_cb = nexus_connect_written_cb;
-
-	nexus->input_handler = purple_input_add(gsc->fd, PURPLE_INPUT_WRITE,
-		nexus_write_cb, nexus);
-
-	nexus_write_cb(nexus, gsc->fd, PURPLE_INPUT_WRITE);
-}
-
-#endif
-
-void
-msn_nexus_connect(MsnNexus *nexus)
-{
-	/*  Authenticate via Windows Live ID. */
-	msn_soap_init(nexus->soapconn, MSN_TWN_SERVER, TRUE, nexus_login_connect_cb, nexus_login_error_cb);
-	msn_soap_connect(nexus->soapconn);
-}
--- a/libpurple/protocols/msn/nexus.h	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/nexus.h	Mon Nov 05 00:35:07 2007 +0000
@@ -139,7 +139,6 @@
 struct _MsnNexus
 {
 	MsnSession *session;
-	MsnSoapConn *soapconn;
 	char * challenge_data_str;
 	GHashTable *challenge_data;
 };
--- a/libpurple/protocols/msn/notification.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/notification.c	Mon Nov 05 00:35:07 2007 +0000
@@ -1411,7 +1411,7 @@
 	{
 		purple_debug_error("msn",
 						 "Error opening temp passport file: %s\n",
-						 strerror(errno));
+						 g_strerror(errno));
 	}
 	else
 	{
@@ -1460,7 +1460,7 @@
 		{
 			purple_debug_error("msn",
 							 "Error closing temp passport file: %s\n",
-							 strerror(errno));
+							 g_strerror(errno));
 
 			g_unlink(session->passport_info.file);
 			g_free(session->passport_info.file);
@@ -1790,9 +1790,7 @@
 		return;
 
 	/*new a oim session*/
-	/* There are several things that call this */
-	if (session->oim == NULL)
-		session->oim = msn_oim_new(session);
+//	session->oim = msn_oim_new(session);
 //	msn_oim_connect(session->oim);
 
 	table = msn_message_get_hashtable_from_body(msg);
--- a/libpurple/protocols/msn/oim.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/oim.c	Mon Nov 05 00:35:07 2007 +0000
@@ -24,24 +24,31 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include "msn.h"
-#include "soap.h"
+#include "soap2.h"
 #include "oim.h"
 #include "msnutils.h"
 
+typedef struct _MsnOimSendReq {
+	char *from_member;
+	char *friendname;
+	char *to_member;
+	char *oim_msg;
+} MsnOimSendReq;
+
+typedef struct {
+	MsnOim *oim;
+	char *msg_id;
+} MsnOimRecvData;
+
 /*Local Function Prototype*/
-static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid);
+static void msn_oim_post_single_get_msg(MsnOim *oim, char *msgid);
 static MsnOimSendReq *msn_oim_new_send_req(const char *from_member,
-					   const char *friendname,
-					   const char* to_member,
-					   gint send_seq,
-					   const char *msg);
-static void msn_oim_retrieve_connect_init(MsnSoapConn *soapconn);
-static void msn_oim_send_connect_init(MsnSoapConn *soapconn);
+										   const char *friendname,
+										   const char* to_member,
+										   const char *msg);
 static void msn_oim_free_send_req(MsnOimSendReq *req);
-static void msn_oim_report_to_user(MsnOim *oim, const char *msg_str);
-static void msn_oim_get_process(MsnOim *oim, const char *oim_msg);
-static gchar *msn_oim_msg_to_str(MsnOim *oim, const char *body);
-static void msn_oim_send_process(MsnOim *oim, const char *body, int len);
+static void msn_oim_report_to_user(MsnOimRecvData *rdata, const char *msg_str);
+static char *msn_oim_msg_to_str(MsnOim *oim, const char *body);
 
 /*new a OIM object*/
 MsnOim *
@@ -51,10 +58,7 @@
 
 	oim = g_new0(MsnOim, 1);
 	oim->session = session;
-	oim->retrieveconn = msn_soap_new(session, oim, TRUE);
-	
-	oim->oim_list = NULL;
-	oim->sendconn = msn_soap_new(session, oim, TRUE);
+	oim->oim_list	= NULL;
 	oim->run_id = rand_guid();
 	oim->challenge = NULL;
 	oim->send_queue = g_queue_new();
@@ -69,8 +73,6 @@
 	MsnOimSendReq *request;
 	
 	purple_debug_info("OIM","destroy the OIM \n");
-	msn_soap_destroy(oim->retrieveconn);
-	msn_soap_destroy(oim->sendconn);
 	g_free(oim->run_id);
 	g_free(oim->challenge);
 	
@@ -84,8 +86,7 @@
 
 static MsnOimSendReq *
 msn_oim_new_send_req(const char *from_member, const char*friendname,
-					 const char* to_member, gint send_seq,
-					 const char *msg)
+	const char* to_member, const char *msg)
 {
 	MsnOimSendReq *request;
 	
@@ -93,7 +94,6 @@
 	request->from_member	=g_strdup(from_member);
 	request->friendname		= g_strdup(friendname);
 	request->to_member		= g_strdup(to_member);
-	request->send_seq		= send_seq;
 	request->oim_msg		= g_strdup(msg);
 	return request;
 }
@@ -130,135 +130,75 @@
 	return oim_body;
 }
 
-/*oim SOAP server login error*/
-static void
-msn_oim_send_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error)
-{
-	MsnSession *session;
-
-	session = soapconn->session;
-	g_return_if_fail(session != NULL);
-
-	msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server"));
-}
-
-/*msn oim SOAP server connect process*/
-static gboolean
-msn_oim_send_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc)
-{
-	MsnSession * session;
-	MsnOim *oim;
-
-	oim = soapconn->parent;
-	g_return_val_if_fail(oim != NULL, TRUE);
-
-	session = oim->session;
-	g_return_val_if_fail(session != NULL, FALSE);
-
-	return TRUE;
-}
-
 /*
  * Process the send return SOAP string
  * If got SOAP Fault,get the lock key,and resend it.
  */
 static void
-msn_oim_send_process(MsnOim *oim, const char *body, int len)
+msn_oim_send_read_cb(MsnSoapMessage *request, MsnSoapMessage *response,
+	gpointer data)
 {
-	xmlnode *responseNode, *bodyNode;
-	xmlnode *faultNode = NULL, *faultCodeNode, *faultstringNode;
-	xmlnode *detailNode, *challengeNode;
-	char *fault_code, *fault_text;
+	MsnOim *oim = data;
+	MsnOimSendReq *msg = g_queue_pop_head(oim->send_queue);
+
+	g_return_if_fail(msg != NULL);
 
-	responseNode = xmlnode_from_str(body,len);
+	if (response == NULL) {
+		purple_debug_info("MSNP14", "cannot send OIM: %s\n", msg->oim_msg);
+	} else {
+		xmlnode	*faultNode = msn_soap_xml_get(response->xml, "Body/Fault");
 
-	g_return_if_fail(responseNode != NULL);
+		if (faultNode == NULL) {
+			/*Send OK! return*/
+			purple_debug_info("MSNP14", "sent OIM: %s\n", msg->oim_msg);
+		} else {
+			xmlnode *faultcode = xmlnode_get_child(faultNode, "faultcode");
+
+			if (faultcode) {
+				char *faultcode_str = xmlnode_get_data(faultcode);
 
-	if ((bodyNode = xmlnode_get_child(responseNode, "Body")))
-		faultNode = xmlnode_get_child(bodyNode, "Fault");
+				if (g_str_equal(faultcode_str, "q0:AuthenticationFailed")) {
+					xmlnode *challengeNode = msn_soap_xml_get(faultNode,
+						"detail/LockKeyChallenge");
 
-	if (faultNode == NULL) {
-		/*Send OK! return*/
-		MsnOimSendReq *request;
+					if (challengeNode == NULL) {
+						if (oim->challenge) {
+							g_free(oim->challenge);
+							oim->challenge = NULL;
 
-		xmlnode_free(responseNode);
-		request = g_queue_pop_head(oim->send_queue);
-		msn_oim_free_send_req(request);
-		/*send next buffered Offline Message*/
-		msn_soap_post(oim->sendconn, NULL);
-
-		return;
-	}
+							purple_debug_info("msnoim","resending OIM: %s\n",
+								msg->oim_msg);
+							g_queue_push_head(oim->send_queue, msg);
+							msn_oim_send_msg(oim);
+							return;
+						} else {
+							purple_debug_info("msnoim",
+								"can't find lock key for OIM: %s\n",
+								msg->oim_msg);
+						}
+					} else {
+						char buf[33];
 
-	/*get the challenge,and repost it*/
-	if (faultNode)
-		faultCodeNode = xmlnode_get_child(faultNode, "faultcode");
+						char *challenge = xmlnode_get_data(challengeNode);
+						msn_handle_chl(challenge, buf);
+
+						g_free(oim->challenge);
+						oim->challenge = g_strndup(buf, sizeof(buf));
+						g_free(challenge);
+						purple_debug_info("MSNP14","lockkey:{%s}\n",oim->challenge);
 
-	if(faultCodeNode == NULL){
-		purple_debug_info("MSN OIM", "No faultcode for failed Offline Message.\n");
-		xmlnode_free(responseNode);
-		return;
+						/*repost the send*/
+						purple_debug_info("MSNP14","resending OIM: %s\n", msg->oim_msg);
+						g_queue_push_head(oim->send_queue, msg);
+						msn_oim_send_msg(oim);
+						return;
+					}
+				}
+			}
+		}
 	}
 
-	fault_code = xmlnode_get_data(faultCodeNode);
-#if 0
-	if(!strcmp(fault_code,"q0:AuthenticationFailed")){
-		/*other Fault Reason?*/
-		goto oim_send_process_fail;
-	}
-#endif
-
-	faultstringNode = xmlnode_get_child(faultNode, "faultstring");
-	fault_text = xmlnode_get_data(faultstringNode);
-	purple_debug_info("MSN OIM", "Error sending Offline Message: %s (%s)\n",
-		fault_text ? fault_text : "(null)", fault_code ? fault_code : "(null)");
-
-	/* lock key fault reason,
-	 * compute the challenge and resend it
-	 */
-	if ((detailNode = xmlnode_get_child(faultNode, "detail"))
-			&& (challengeNode = xmlnode_get_child(detailNode, "LockKeyChallenge"))) {
-		g_free(oim->challenge);
-		oim->challenge = xmlnode_get_data(challengeNode);
-
-		purple_debug_info("MSN OIM", "Retrying Offline IM with lockkey:{%s}\n",
-			oim->challenge ? oim->challenge : "(null)");
-
-		/*repost the send*/
-		msn_oim_send_msg(oim);
-
-		/* XXX: This needs to give up eventually (1 retry, maybe?) */
-	}
-
-	g_free(fault_text);
-	g_free(fault_code);
-	xmlnode_free(responseNode);
-}
-
-static gboolean
-msn_oim_send_read_cb(MsnSoapConn *soapconn)
-{
-	MsnSession *session = soapconn->session;
-	MsnOim * oim;
-
-	if (soapconn->body == NULL)
-		return TRUE;
-
-	g_return_val_if_fail(session != NULL, FALSE);
-	oim = soapconn->session->oim;
-	g_return_val_if_fail(oim != NULL, TRUE);
-
-	purple_debug_info("MSN OIM","read buffer:{%s}\n", soapconn->body);
-	msn_oim_send_process(oim,soapconn->body,soapconn->body_len);
-
-	return TRUE;
-}
-
-static void
-msn_oim_send_written_cb(MsnSoapConn *soapconn)
-{
-	soapconn->read_cb = msn_oim_send_read_cb;
-//	msn_soap_read_cb(data,source,cond);
+	msn_oim_free_send_req(msg);
 }
 
 void
@@ -266,45 +206,36 @@
 						   const char* friendname, const char *tomember,
 						   const char * msg)
 {
-	MsnOimSendReq *request;
-
 	g_return_if_fail(oim != NULL);
 
-	request = msn_oim_new_send_req(membername,friendname,tomember,oim->send_seq,msg);
-	g_queue_push_tail(oim->send_queue,request);
+	g_queue_push_tail(oim->send_queue,
+		msn_oim_new_send_req(membername, friendname, tomember, msg));
 }
 
 /*post send single message request to oim server*/
 void 
 msn_oim_send_msg(MsnOim *oim)
 {
-	MsnSoapReq *soap_request;
 	MsnOimSendReq *oim_request;
 	char *soap_body,*mspauth;
-	gchar *msg_body;
-	char buf[33];
+	char *msg_body;
 
 	g_return_if_fail(oim != NULL);
-	oim_request = g_queue_pop_head(oim->send_queue);
+	oim_request = g_queue_peek_head(oim->send_queue);
 	g_return_if_fail(oim_request != NULL);
 
-	purple_debug_info("MSN OIM","send single OIM Message\n");
+	purple_debug_info("MSNP14","sending OIM: %s\n", oim_request->oim_msg);
 	mspauth = g_strdup_printf("t=%s&amp;p=%s",
 		oim->session->passport_info.t,
 		oim->session->passport_info.p
 		);
-	g_queue_push_head(oim->send_queue,oim_request);
 
 	/* if we got the challenge lock key, we compute it
 	 * else we go for the SOAP fault and resend it.
 	 */
-	if(oim->challenge != NULL){
-		msn_handle_chl(oim->challenge, buf);
-	}else{
-		purple_debug_info("MSN OIM","no lock key challenge,wait for SOAP Fault and Resend\n");
-		buf[0]='\0';
+	if(oim->challenge == NULL){
+		purple_debug_info("MSNP14","no lock key challenge,wait for SOAP Fault and Resend\n");
 	}
-	purple_debug_info("MSN OIM","get the lock key challenge {%s}\n",buf);
 
 	msg_body = msn_oim_msg_to_str(oim, oim_request->oim_msg);
 	soap_body = g_strdup_printf(MSN_OIM_SEND_TEMPLATE,
@@ -313,117 +244,71 @@
 					oim_request->to_member,
 					mspauth,
 					MSNP13_WLM_PRODUCT_ID,
-					buf,
-					oim_request->send_seq,
+					oim->challenge ? oim->challenge : "",
+					oim->send_seq,
 					msg_body);
 
-	soap_request = msn_soap_request_new(MSN_OIM_SEND_HOST,
-					MSN_OIM_SEND_URL,
-					MSN_OIM_SEND_SOAP_ACTION,
-					soap_body,
-					NULL,
-					msn_oim_send_read_cb,
-					msn_oim_send_written_cb,
-					msn_oim_send_connect_init);
+	msn_soap_message_send(oim->session,
+		msn_soap_message_new(MSN_OIM_SEND_SOAP_ACTION,
+			xmlnode_from_str(soap_body, -1)),
+		MSN_OIM_SEND_HOST, MSN_OIM_SEND_URL, msn_oim_send_read_cb, oim);
+
+	/*increase the offline Sequence control*/
+	if (oim->challenge != NULL) {
+		oim->send_seq++;
+	}
+
 	g_free(mspauth);
 	g_free(msg_body);
 	g_free(soap_body);
-
-	/*increase the offline Sequence control*/
-	if(oim->challenge != NULL){
-		oim->send_seq++;
-	}
-	msn_soap_post(oim->sendconn,soap_request);
 }
 
 /****************************************
  * OIM delete SOAP request
  * **************************************/
-static gboolean
-msn_oim_delete_read_cb(MsnSoapConn *soapconn)
+static void
+msn_oim_delete_read_cb(MsnSoapMessage *request, MsnSoapMessage *response,
+	gpointer data)
 {
-	if (soapconn->body == NULL)
-		return TRUE;
-	purple_debug_info("MSN OIM","OIM delete read buffer:{%s}\n",soapconn->body);
+	MsnOimRecvData *rdata = data;
 
-	msn_soap_free_read_buf(soapconn);
-	/*get next single Offline Message*/
-//	msn_soap_post(soapconn,NULL);	/* we already do this in soap.c */
-	return TRUE;
-}
+	if (response && msn_soap_xml_get(response->xml, "Body/Fault") == NULL) {
+		purple_debug_info("msnoim", "delete OIM success\n");
+		rdata->oim->oim_list = g_list_remove(rdata->oim->oim_list,
+			rdata->msg_id);
+		g_free(rdata->msg_id);
+	} else {
+		purple_debug_info("msnoim", "delete OIM failed\n");
+	}
 
-static void
-msn_oim_delete_written_cb(MsnSoapConn *soapconn)
-{
-	soapconn->read_cb = msn_oim_delete_read_cb;
+	g_free(rdata);
 }
 
 /*Post to get the Offline Instant Message*/
 static void
-msn_oim_post_delete_msg(MsnOim *oim,const char *msgid)
+msn_oim_post_delete_msg(MsnOimRecvData *rdata)
 {
-	MsnSoapReq *soap_request;
-	gchar *soap_body;
-	const char *t,*p;
+	MsnOim *oim = rdata->oim;
+	char *msgid = rdata->msg_id;
+	char *soap_body;
 
-	g_return_if_fail(oim != NULL);
-	g_return_if_fail(msgid != NULL);
-
-	purple_debug_info("MSN OIM","Delete single OIM Message {%s}\n",msgid);
-	t = oim->session->passport_info.t;
-	p = oim->session->passport_info.p;
+	purple_debug_info("MSNP14","Delete single OIM Message {%s}\n",msgid);
 
 	soap_body = g_strdup_printf(MSN_OIM_DEL_TEMPLATE,
-					t,
-					p,
-					msgid
-					);
-	soap_request = msn_soap_request_new(MSN_OIM_RETRIEVE_HOST,
-					MSN_OIM_RETRIEVE_URL,
-					MSN_OIM_DEL_SOAP_ACTION,
-					soap_body,
-					NULL,
-					msn_oim_delete_read_cb,
-					msn_oim_delete_written_cb,
-					msn_oim_retrieve_connect_init);
+		oim->session->passport_info.t, oim->session->passport_info.p, msgid);
+
+	msn_soap_message_send(oim->session,
+		msn_soap_message_new(MSN_OIM_DEL_SOAP_ACTION,
+			xmlnode_from_str(soap_body, -1)),
+		MSN_OIM_RETRIEVE_HOST, MSN_OIM_RETRIEVE_URL,
+		msn_oim_delete_read_cb, rdata);
+
 	g_free(soap_body);
-	msn_soap_post(oim->retrieveconn,soap_request);
 }
 
 /****************************************
  * OIM get SOAP request
  * **************************************/
-/*oim SOAP server login error*/
-static void
-msn_oim_get_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error)
-{
-	MsnSession *session;
-
-	session = soapconn->session;
-	g_return_if_fail(session != NULL);
-	msn_soap_clean_unhandled_requests(soapconn);
-
-//	msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server"));
-}
-
-/*msn oim SOAP server connect process*/
-static gboolean
-msn_oim_get_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc)
-{
-	MsnSession * session;
-	MsnOim *oim;
-
-	oim = soapconn->parent;
-	g_return_val_if_fail(oim != NULL, TRUE);
-
-	session = oim->session;
-	g_return_val_if_fail(session != NULL, FALSE);
-
-	purple_debug_info("MSN OIM","Connected and ready to get OIM!\n");
-
-	return TRUE;
-}
-
 /* like purple_str_to_time, but different. The format of the timestamp
  * is like this: 5 Sep 2007 21:42:12 -0700 */
 static time_t
@@ -435,9 +320,13 @@
 		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
 		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL
 	};
+	time_t tval = 0;
 	struct tm t;
 	memset(&t, 0, sizeof(t));
 
+	time(&tval);
+	localtime_r(&tval, &t);
+
 	if (sscanf(timestamp, "%02d %03s %04d %02d:%02d:%02d %05s",
 					&t.tm_mday, month_str, &t.tm_year,
 					&t.tm_hour, &t.tm_min, &t.tm_sec, tz_str) == 7) {
@@ -466,14 +355,13 @@
 					tzoff *= -1;
 
 				t.tm_year -= 1900;
-				t.tm_isdst = 0;
 
 #ifdef _WIN32
 				if ((sys_tzoff = wpurple_get_tz_offset()) != -1)
 					tzoff += sys_tzoff;
 #else
 #ifdef HAVE_TM_GMTOFF
-				tzoff += t.tm_gmtoff;
+				tzoff -= t.tm_gmtoff;
 #else
 #	ifdef HAVE_TIMEZONE
 				tzset();    /* making sure */
@@ -487,13 +375,13 @@
 		}
 	}
 
-	purple_debug_info("MSN OIM:OIM", "Can't parse timestamp %s\n", timestamp);
-	return time(NULL);
+	purple_debug_info("MSNP14:OIM", "Can't parse timestamp %s\n", timestamp);
+	return tval;
 }
 
 /*Post the Offline Instant Message to User Conversation*/
 static void
-msn_oim_report_to_user(MsnOim *oim, const char *msg_str)
+msn_oim_report_to_user(MsnOimRecvData *rdata, const char *msg_str)
 {
 	MsnMessage *message;
 	char *date,*from,*decode_msg;
@@ -502,14 +390,13 @@
 	char *start,*end;
 	int has_nick = 0;
 	char *passport_str, *passport;
-	char *msg_id;
 	time_t stamp;
 
 	message = msn_message_new(MSN_MSG_UNKNOWN);
 
 	msn_message_parse_payload(message, msg_str, strlen(msg_str),
 							  MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM);
-	purple_debug_info("MSN OIM","oim body:{%s}\n",message->body);
+	purple_debug_info("MSNP14","oim body:{%s}\n",message->body);
 	decode_msg = (char *)purple_base64_decode(message->body,&body_len);
 	date =	(char *)g_hash_table_lookup(message->attr_table, "Date");
 	from =	(char *)g_hash_table_lookup(message->attr_table, "From");
@@ -519,12 +406,12 @@
 	if(has_nick){
 		tokens = g_strsplit(from , " " , 2);
 		passport_str = g_strdup(tokens[1]);
-		purple_debug_info("MSN OIM","oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n",
+		purple_debug_info("MSNP14","oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n",
 							date,tokens[0],tokens[1],passport_str);
 		g_strfreev(tokens);
 	}else{
 		passport_str = g_strdup(from);
-		purple_debug_info("MSN OIM","oim Date:{%s},passport{%s}\n",
+		purple_debug_info("MSNP14","oim Date:{%s},passport{%s}\n",
 					date,passport_str);
 	}
 	start = strstr(passport_str,"<");
@@ -536,66 +423,43 @@
 
 	stamp = msn_oim_parse_timestamp(date);
 
-	serv_got_im(oim->session->account->gc, passport, decode_msg, 0, stamp);
+	serv_got_im(rdata->oim->session->account->gc, passport, decode_msg, 0,
+		stamp);
 
 	/*Now get the oim message ID from the oim_list.
 	 * and append to read list to prepare for deleting the Offline Message when sign out
 	 */
-	if(oim->oim_list != NULL){
-		msg_id = oim->oim_list->data;
-		msn_oim_post_delete_msg(oim,msg_id);
-		oim->oim_list = g_list_remove(oim->oim_list, oim->oim_list->data);
-		g_free(msg_id);
-	}
+	msn_oim_post_delete_msg(rdata);
 
 	g_free(passport);
+	g_free(decode_msg);
 }
 
 /* Parse the XML data,
  * prepare to report the OIM to user
  */
 static void
-msn_oim_get_process(MsnOim *oim, const char *oim_msg)
-{
-	xmlnode *oim_node,*bodyNode,*responseNode,*msgNode;
-	char *msg_str;
-
-	oim_node = xmlnode_from_str(oim_msg, strlen(oim_msg));
-	bodyNode = xmlnode_get_child(oim_node,"Body");
-	responseNode = xmlnode_get_child(bodyNode,"GetMessageResponse");
-	msgNode = xmlnode_get_child(responseNode,"GetMessageResult");
-	msg_str = xmlnode_get_data(msgNode);
-	purple_debug_info("OIM","msg:{%s}\n",msg_str);
-	msn_oim_report_to_user(oim,msg_str);
-
-	g_free(msg_str);
-	xmlnode_free(oim_node);
-}
-
-static gboolean
-msn_oim_get_read_cb(MsnSoapConn *soapconn)
+msn_oim_get_read_cb(MsnSoapMessage *request, MsnSoapMessage *response,
+	gpointer data)
 {
-	MsnOim * oim = soapconn->session->oim;
-
-	if (soapconn->body == NULL)
-		return TRUE;
+	MsnOimRecvData *rdata = data;
 
-	purple_debug_info("MSN OIM","OIM get read buffer:{%s}\n",soapconn->body);
-
-	/*we need to process the read message!*/
-	msn_oim_get_process(oim,soapconn->body);
-	msn_soap_free_read_buf(soapconn);
+	if (response != NULL) {
+		xmlnode *msg_node = msn_soap_xml_get(response->xml,
+			"Body/GetMessageResponse/GetMessageResult");
 
-	/*get next single Offline Message*/
-//	msn_soap_post(soapconn,NULL); /* we already do this in soap.c */
-	return TRUE;
-}
-
-static void
-msn_oim_get_written_cb(MsnSoapConn *soapconn)
-{
-	soapconn->read_cb = msn_oim_get_read_cb;
-//	msn_soap_read_cb(data,source,cond);
+		if (msg_node) {
+			char *msg_str = xmlnode_get_data(msg_node);
+			msn_oim_report_to_user(rdata, msg_str);
+			g_free(msg_str);
+		} else {
+			char *str = xmlnode_to_str(response->xml, NULL);
+			purple_debug_info("msnoim", "Unknown response: %s\n", str);
+			g_free(str);
+		}
+	} else {
+		purple_debug_info("msnoim", "Failed to get OIM\n");
+	}
 }
 
 /* parse the oim XML data 
@@ -604,116 +468,88 @@
 void
 msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg)
 {
-	xmlnode *node, *mNode,*ENode,*INode,*rtNode,*nNode;
-	char *passport,*msgid,*nickname, *unread, *rTime = NULL;
+	xmlnode *node, *mNode;
+	xmlnode *iu_node;
 	MsnSession *session = oim->session;
 
-	purple_debug_info("MSN OIM:OIM", "%s", xmlmsg);
+	purple_debug_info("MSNP14:OIM", "%s", xmlmsg);
 
-	node = xmlnode_from_str(xmlmsg, strlen(xmlmsg));
-	if (!node || !node->name || strcmp(node->name, "MD") != 0) {
-		if (node)
-			xmlnode_free(node);
+	node = xmlnode_from_str(xmlmsg, -1);
+	if (strcmp(node->name, "MD") != 0) {
+		purple_debug_info("msnoim", "WTF is this? %s\n", xmlmsg);
+		xmlnode_free(node);
 		return;
 	}
 
-	ENode = xmlnode_get_child(node, "E");
-	INode = xmlnode_get_child(ENode, "IU");
-	unread = xmlnode_get_data(INode);
-
-	if (unread != NULL && purple_account_get_check_mail(session->account))
-	{
-		int count = atoi(unread);
+	iu_node = msn_soap_xml_get(node, "E/IU");
 
-		if (count > 0)
-		{
-			const char *passport;
-			const char *url;
+	if (iu_node != NULL && purple_account_get_check_mail(session->account))
+	{
+		char *unread = xmlnode_get_data(iu_node);
+		const char *passport = msn_user_get_passport(session->user);
+		const char *url = session->passport_info.file;
 
-			passport = msn_user_get_passport(session->user);
-			url = session->passport_info.file;
-
-			purple_notify_emails(session->account->gc, atoi(unread), FALSE, NULL, NULL,
-					&passport, &url, NULL, NULL);
-		}
+		/* XXX/khc: pretty sure this is wrong */
+		purple_notify_emails(session->account->gc, atoi(unread), FALSE, NULL,
+			NULL, &passport, &url, NULL, NULL);
+		g_free(unread);
 	}
 
 	for(mNode = xmlnode_get_child(node, "M"); mNode;
 					mNode = xmlnode_get_next_twin(mNode)){
-		/*email Node*/
-		ENode = xmlnode_get_child(mNode,"E");
-		passport = xmlnode_get_data(ENode);
-		/*Index */
-		INode = xmlnode_get_child(mNode,"I");
-		msgid = xmlnode_get_data(INode);
-		/*Nickname*/
-		nNode = xmlnode_get_child(mNode,"N");
-		nickname = xmlnode_get_data(nNode);
-		/*receive time*/
-		rtNode = xmlnode_get_child(mNode,"RT");
-		if(rtNode != NULL)
-			rTime = xmlnode_get_data(rtNode);
-/*		purple_debug_info("MSN OIM","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */
+		char *passport, *msgid, *nickname, *rtime = NULL;
+		xmlnode *e_node, *i_node, *n_node, *rt_node;
+
+		e_node = xmlnode_get_child(mNode, "E");
+		passport = xmlnode_get_data(e_node);
+
+		i_node = xmlnode_get_child(mNode, "I");
+		msgid = xmlnode_get_data(i_node);
+
+		n_node = xmlnode_get_child(mNode, "N");
+		nickname = xmlnode_get_data(n_node);
 
-		oim->oim_list = g_list_append(oim->oim_list,strdup(msgid));
-		msn_oim_post_single_get_msg(oim,msgid);
+		rt_node = xmlnode_get_child(mNode, "RT");
+		if (rt_node != NULL) {
+			rtime = xmlnode_get_data(rt_node);
+		}
+/*		purple_debug_info("msnoim","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */
+
+		if (!g_list_find_custom(oim->oim_list, msgid, (GCompareFunc)strcmp)) {
+			oim->oim_list = g_list_append(oim->oim_list, msgid);
+			msn_oim_post_single_get_msg(oim, msgid);
+			msgid = NULL;
+		}
+
 		g_free(passport);
 		g_free(msgid);
-		g_free(rTime);
-		rTime = NULL;
+		g_free(rtime);
 		g_free(nickname);
 	}
-	g_free(unread);
+
 	xmlnode_free(node);
 }
 
 /*Post to get the Offline Instant Message*/
 static void
-msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid)
+msn_oim_post_single_get_msg(MsnOim *oim, char *msgid)
 {
-	MsnSoapReq *soap_request;
-	gchar *soap_body;
-	const char *t,*p;
+	char *soap_body;
+	MsnOimRecvData *data = g_new0(MsnOimRecvData, 1);
 
-	purple_debug_info("MSN OIM","Get single OIM Message\n");
-	t = oim->session->passport_info.t;
-	p = oim->session->passport_info.p;
+	purple_debug_info("MSNP14","Get single OIM Message\n");
+
+	data->oim = oim;
+	data->msg_id = msgid;
 
 	soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE,
-					t,
-					p,
-					msgid
-					);
-	soap_request = msn_soap_request_new(MSN_OIM_RETRIEVE_HOST,
-					MSN_OIM_RETRIEVE_URL,
-					MSN_OIM_GET_SOAP_ACTION,
-					soap_body,
-					NULL,
-					msn_oim_get_read_cb,
-					msn_oim_get_written_cb,
-					msn_oim_retrieve_connect_init);
-	g_free(soap_body);
-	msn_soap_post(oim->retrieveconn,soap_request);
-}
+		oim->session->passport_info.t, oim->session->passport_info.p, msgid);
 
-/*msn oim retrieve server connect init */
-static void
-msn_oim_retrieve_connect_init(MsnSoapConn *soapconn)
-{
-	purple_debug_info("MSN OIM","Initializing OIM retrieve connection\n");
-	msn_soap_init(soapconn, MSN_OIM_RETRIEVE_HOST, TRUE,
-		      msn_oim_get_connect_cb,
-		      msn_oim_get_error_cb);
-}
+	msn_soap_message_send(oim->session,
+		msn_soap_message_new(MSN_OIM_GET_SOAP_ACTION,
+			xmlnode_from_str(soap_body, -1)),
+		MSN_OIM_RETRIEVE_HOST, MSN_OIM_RETRIEVE_URL,
+		msn_oim_get_read_cb, data);
 
-/*Msn OIM Send Server Connect Init Function*/
-static void
-msn_oim_send_connect_init(MsnSoapConn *sendconn)
-{
-	purple_debug_info("MSN OIM","Initializing OIM send connection\n");
-	msn_soap_init(sendconn, MSN_OIM_SEND_HOST, TRUE,
-		      msn_oim_send_connect_cb,
-		      msn_oim_send_error_cb);
+	g_free(soap_body);
 }
-
-/* EOF oim.c*/
--- a/libpurple/protocols/msn/oim.h	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/oim.h	Mon Nov 05 00:35:07 2007 +0000
@@ -95,17 +95,6 @@
 	"</soap:Body>"\
 "</soap:Envelope>"
 
-typedef struct _MsnOimSendReq MsnOimSendReq;
-
-struct _MsnOimSendReq
-{
-	char *from_member;
-	char *friendname;
-	char *to_member;
-	char *oim_msg;
-	gint send_seq;
-};
-
 typedef struct _MsnOim MsnOim;
 
 struct _MsnOim
@@ -127,7 +116,6 @@
  * **************************************************/
 MsnOim * msn_oim_new(MsnSession *session);
 void msn_oim_destroy(MsnOim *oim);
-void msn_oim_connect(MsnOim *oim);
 
 void msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg);
 
@@ -138,11 +126,5 @@
 
 void msn_oim_send_msg(MsnOim *oim);
 
-/*get the OIM message*/
-void msn_oim_get_msg(MsnOim *oim);
-
-/*report the oim message to the conversation*/
-void msn_oim_report_user(MsnOim *oim,const char *passport,char *msg);
-
 #endif/* _MSN_OIM_H_*/
 /*endof oim.h*/
--- a/libpurple/protocols/msn/servconn.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/servconn.c	Mon Nov 05 00:35:07 2007 +0000
@@ -402,7 +402,7 @@
 	
 			default: purple_debug_error("msn", "servconn read error,"
 						"len: %d, errno: %d, error: %s\n",
-						len, errno, strerror(errno));
+						len, errno, g_strerror(errno));
 				 msn_servconn_got_error(servconn, 
 						 MSN_SERVCONN_ERROR_READ);
 				 return;
--- a/libpurple/protocols/msn/session.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/session.c	Mon Nov 05 00:35:07 2007 +0000
@@ -24,6 +24,7 @@
 #include "msn.h"
 #include "session.h"
 #include "notification.h"
+#include "oim.h"
 
 #include "dialog.h"
 
@@ -42,6 +43,7 @@
 
 	session->user = msn_user_new(session->userlist,
 								 purple_account_get_username(account), NULL);
+	session->oim = msn_oim_new(session);
 
 	/*if you want to chat with Yahoo Messenger*/
 	//session->protocol_ver = WLM_YAHOO_PROT_VER;
@@ -99,6 +101,12 @@
 	if (session->user != NULL)
 		msn_user_destroy(session->user);
 
+	if (session->soap_table)
+		g_hash_table_destroy(session->soap_table);
+
+	if (session->soap_cleanup_handle)
+		purple_timeout_remove(session->soap_cleanup_handle);
+
 	g_free(session);
 }
 
--- a/libpurple/protocols/msn/session.h	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/session.h	Mon Nov 05 00:35:07 2007 +0000
@@ -126,6 +126,9 @@
 		char *client_ip;
 		int client_port;
 	} passport_info;
+
+	GHashTable *soap_table;
+	int soap_cleanup_handle;
 };
 
 /**
--- a/libpurple/protocols/msn/slplink.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/slplink.c	Mon Nov 05 00:35:07 2007 +0000
@@ -39,22 +39,17 @@
 	char *tmp;
 	char *dir;
 	char *pload;
-	FILE *tf;
 	int c;
 	gsize pload_size;
 
 	dir = send ? "send" : "recv";
 	c = send ? m_sc++ : m_rc++;
 	tmp = g_strdup_printf("%s/msntest/%s/%03d", g_get_home_dir(), dir, c);
-	tf = g_fopen(tmp, "wb");
-	if (tf == NULL)
+	pload = msn_message_gen_payload(msg, &pload_size);
+	if (!purple_util_write_data_to_file_absolute(tmp, pload, pload_size))
 	{
-		purple_debug_error("msn", "could not open debug file\n");
-		return;
+		purple_debug_error("msn", "could not save debug file");
 	}
-	pload = msn_message_gen_payload(msg, &pload_size);
-	fwrite(pload, 1, pload_size, tf);
-	fclose(tf);
 	g_free(tmp);
 }
 #endif
--- a/libpurple/protocols/msn/soap.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/soap.c	Mon Nov 05 00:35:07 2007 +0000
@@ -274,7 +274,7 @@
 
 			default : purple_debug_error("MSN SOAP", "Read error!"
 						"read len: %d, error = %s\n",
-						len, strerror(errno));
+						len, g_strerror(errno));
 				  purple_input_remove(soapconn->input_handler);
 				  //soapconn->input_handler = 0;
 				  g_free(soapconn->read_buf);
@@ -308,7 +308,7 @@
 }
 
 /*read the whole SOAP server response*/
-void 
+static void 
 msn_soap_read_cb(gpointer data, gint source, PurpleInputCondition cond)
 {
 	MsnSoapConn *soapconn = data;
--- a/libpurple/protocols/msn/soap.h	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/soap.h	Mon Nov 05 00:35:07 2007 +0000
@@ -154,7 +154,6 @@
 void msn_soap_free_read_buf(MsnSoapConn *soapconn);
 void msn_soap_free_write_buf(MsnSoapConn *soapconn);
 void msn_soap_connect_cb(gpointer data, PurpleSslConnection *gsc, PurpleInputCondition cond);
-void msn_soap_read_cb(gpointer data, gint source, PurpleInputCondition cond);
 
 /*clean the unhandled requests*/
 void msn_soap_clean_unhandled_requests(MsnSoapConn *soapconn);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msn/soap2.c	Mon Nov 05 00:35:07 2007 +0000
@@ -0,0 +1,677 @@
+/**
+ * @file soap2.c
+ * 	C file for SOAP connection related process
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "internal.h"
+
+#include "soap2.h"
+
+#include "session.h"
+
+#include "debug.h"
+#include "xmlnode.h"
+
+#include <glib.h>
+#include <error.h>
+
+#define SOAP_TIMEOUT (5 * 60)
+
+typedef struct _MsnSoapRequest {
+	char *path;
+	MsnSoapMessage *message;
+	MsnSoapCallback cb;
+	gpointer cb_data;
+} MsnSoapRequest;
+
+typedef struct _MsnSoapConnection {
+	MsnSession *session;
+	char *host;
+
+	time_t last_used;
+	PurpleSslConnection *ssl;
+	gboolean connected;
+
+	guint event_handle;
+	GString *buf;
+	gsize handled_len;
+	gsize body_len;
+	int response_code;
+	gboolean headers_done;
+	gboolean close_when_done;
+
+	MsnSoapMessage *message;
+
+	GQueue *queue;
+	MsnSoapRequest *current_request;
+} MsnSoapConnection;
+
+static void msn_soap_connection_destroy_foreach_cb(gpointer item, gpointer data);
+static gboolean msn_soap_connection_run(gpointer data);
+
+static MsnSoapConnection *msn_soap_connection_new(MsnSession *session,
+	const char *host);
+static void msn_soap_connection_handle_next(MsnSoapConnection *conn);
+static void msn_soap_connection_destroy(MsnSoapConnection *conn);
+
+static void msn_soap_message_send_internal(MsnSession *session,
+	MsnSoapMessage *message, const char *host, const char *path,
+	MsnSoapCallback cb, gpointer cb_data, gboolean first);
+
+static void msn_soap_request_destroy(MsnSoapRequest *req);
+static void msn_soap_connection_sanitize(MsnSoapConnection *conn, gboolean disconnect);
+
+static gboolean
+msn_soap_cleanup_each(gpointer key, gpointer value, gpointer data)
+{
+	MsnSoapConnection *conn = value;
+	time_t *t = data;
+
+	if ((*t - conn->last_used) > SOAP_TIMEOUT * 2) {
+		purple_debug_info("soap", "cleaning up soap conn %p\n", conn);
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+static gboolean
+msn_soap_cleanup_for_session(gpointer data)
+{
+	MsnSession *sess = data;
+	time_t t = time(NULL);
+
+	purple_debug_info("soap", "session cleanup timeout\n");
+
+	if (sess->soap_table) {
+		g_hash_table_foreach_remove(sess->soap_table, msn_soap_cleanup_each,
+			&t);
+
+		if (g_hash_table_size(sess->soap_table) == 0) {
+			purple_timeout_remove(sess->soap_cleanup_handle);
+			sess->soap_cleanup_handle = 0;
+		}
+	}
+
+	return TRUE;
+}
+
+static MsnSoapConnection *
+msn_soap_get_connection(MsnSession *session, const char *host)
+{
+	MsnSoapConnection *conn = NULL;
+
+	if (session->soap_table) {
+		conn = g_hash_table_lookup(session->soap_table, host);
+	} else {
+		session->soap_table = g_hash_table_new_full(g_str_hash, g_str_equal,
+			NULL, (GDestroyNotify)msn_soap_connection_destroy);
+	}
+
+	if (session->soap_cleanup_handle == 0)
+		session->soap_cleanup_handle = purple_timeout_add(SOAP_TIMEOUT * 1000,
+			msn_soap_cleanup_for_session, session);
+
+	if (conn == NULL) {
+		conn = msn_soap_connection_new(session, host);
+		g_hash_table_insert(session->soap_table, conn->host, conn);
+	}
+
+	conn->last_used = time(NULL);
+
+	return conn;
+}
+
+static MsnSoapConnection *
+msn_soap_connection_new(MsnSession *session, const char *host)
+{
+	MsnSoapConnection *conn = g_new0(MsnSoapConnection, 1);
+	conn->session = session;
+	conn->host = g_strdup(host);
+	conn->queue = g_queue_new();
+	return conn;
+}
+
+static void
+msn_soap_connected_cb(gpointer data, PurpleSslConnection *ssl,
+		PurpleInputCondition cond)
+{
+	MsnSoapConnection *conn = data;
+
+	conn->connected = TRUE;
+
+	if (conn->event_handle == 0)
+		conn->event_handle = purple_timeout_add(0, msn_soap_connection_run, conn);
+}
+
+static void
+msn_soap_error_cb(PurpleSslConnection *ssl, PurpleSslErrorType error,
+		gpointer data)
+{
+	MsnSoapConnection *conn = data;
+
+	g_hash_table_remove(conn->session->soap_table, conn->host);
+}
+
+static gboolean
+msn_soap_handle_redirect(MsnSoapConnection *conn, const char *url)
+{
+	char *c;
+
+	/* Skip the http:// */
+	if ((c = strchr(url, '/')) != NULL)
+		url += 2;
+
+	if ((c = strchr(url, '/')) != NULL) {
+		char *host, *path;
+
+		host = g_strndup(url, c - url);
+		path = g_strdup(c);
+
+		msn_soap_message_send_internal(conn->session,
+			conn->current_request->message,	host, path,
+			conn->current_request->cb, conn->current_request->cb_data, TRUE);
+
+		msn_soap_request_destroy(conn->current_request);
+		conn->current_request = NULL;
+
+		g_free(host);
+		g_free(path);
+
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+static gboolean
+msn_soap_handle_body(MsnSoapConnection *conn, MsnSoapMessage *response)
+{
+	xmlnode *body = xmlnode_get_child(response->xml, "Body");
+
+	if (body) {
+		MsnSoapRequest *request;
+
+		if (strcmp(body->name, "Fault") == 0) {
+			xmlnode *fault = xmlnode_get_child(body, "faultcode");
+
+			if (fault != NULL) {
+				char *faultdata = xmlnode_get_data(fault);
+
+				if (strcmp(faultdata, "psf:Redirect") == 0) {
+					xmlnode *url = xmlnode_get_child(body, "redirectUrl");
+
+					if (url) {
+						char *urldata = xmlnode_get_data(url);
+						msn_soap_handle_redirect(conn, urldata);
+						g_free(urldata);
+					}
+
+					g_free(faultdata);
+					return TRUE;
+				} else if (strcmp(faultdata, "wsse:FailedAuthentication") == 0) {
+					xmlnode *reason = xmlnode_get_child(body, "faultstring");
+					char *reasondata = xmlnode_get_data(reason);
+
+					msn_soap_connection_sanitize(conn, TRUE);
+					msn_session_set_error(conn->session, MSN_ERROR_AUTH,
+						reasondata);
+
+					g_free(reasondata);
+					g_free(faultdata);
+					return FALSE;
+				}
+
+				g_free(faultdata);
+			}
+		}
+
+		request = conn->current_request;
+		conn->current_request = NULL;
+		request->cb(request->message, response,
+			request->cb_data);
+		msn_soap_request_destroy(request);
+	}
+
+	return TRUE;
+}
+
+static void
+msn_soap_read_cb(gpointer data, gint fd, PurpleInputCondition cond)
+{
+    MsnSoapConnection *conn = data;
+	int count = 0, cnt;
+	char buf[8192];
+	char *linebreak;
+	char *cursor;
+	gboolean handled = FALSE;
+
+	if (conn->message == NULL) {
+		conn->message = msn_soap_message_new(NULL, NULL);
+	}
+
+	while ((cnt = purple_ssl_read(conn->ssl, buf, sizeof(buf))) > 0) {
+		purple_debug_info("soap", "read %d bytes\n", cnt);
+		count += cnt;
+		if (conn->buf == NULL) {
+			conn->buf = g_string_new_len(buf, cnt);
+		} else {
+			g_string_append_len(conn->buf, buf, cnt);
+		}
+	}
+
+	if (cnt < 0) {
+		if (errno != EAGAIN) {
+			purple_debug_info("soap", "read: %s\n", g_strerror(errno));
+			purple_ssl_close(conn->ssl);
+			conn->ssl = NULL;
+			msn_soap_connection_handle_next(conn);
+			return;
+		} else if (count == 0) {
+			return;
+		}
+	}
+
+	if (cnt == 0 && count == 0) {
+		purple_debug_info("soap", "msn_soap_read_cb() called, but no data available?\n");
+		purple_ssl_close(conn->ssl);
+		conn->ssl = NULL;
+		msn_soap_connection_handle_next(conn);
+		return;
+	}
+
+	purple_debug_info("soap", "current %s\n", conn->buf->str);
+
+	cursor = conn->buf->str + conn->handled_len;
+
+	if (!conn->headers_done) {
+		while ((linebreak = strstr(cursor, "\r\n"))	!= NULL) {
+			conn->handled_len = linebreak - conn->buf->str + 2;
+
+			if (conn->response_code == 0) {
+				if (sscanf(cursor, "HTTP/1.1 %d", &conn->response_code) != 1) {
+					/* something horribly wrong */
+					purple_ssl_close(conn->ssl);
+					conn->ssl = NULL;
+					msn_soap_connection_handle_next(conn);
+					handled = TRUE;
+					break;
+				} else if (conn->response_code == 503) {
+					msn_soap_connection_sanitize(conn, TRUE);
+					msn_session_set_error(conn->session, MSN_ERROR_SERV_UNAVAILABLE, NULL);
+					return;
+				}
+			} else if (cursor == linebreak) {
+				/* blank line */
+				conn->headers_done = TRUE;
+				cursor = conn->buf->str + conn->handled_len;
+				break;
+			} else {
+				char *line = g_strndup(cursor, linebreak - cursor);
+				char *sep = strstr(line, ": ");
+				char *key = line;
+				char *value;
+
+				if (sep == NULL) {
+					purple_debug_info("soap", "ignoring malformed line: %s\n", line);
+					g_free(line);
+					goto loop_end;
+				}
+
+				value = sep + 2;
+				*sep = '\0';
+				msn_soap_message_add_header(conn->message, key, value);
+
+				if ((conn->response_code == 301 || conn->response_code == 300)
+					&& strcmp(key, "Location") == 0) {
+
+					msn_soap_handle_redirect(conn, value);
+
+					handled = TRUE;
+					g_free(line);
+					break;
+				} else if (conn->response_code == 401 &&
+					strcmp(key, "WWW-Authenticate") == 0) {
+					char *error = strstr(value, "cbtxt=");
+
+					if (error) {
+						error += strlen("cbtxt=");
+					}
+
+					msn_soap_connection_sanitize(conn, TRUE);
+					msn_session_set_error(conn->session, MSN_ERROR_AUTH,
+						error ? purple_url_decode(error) : NULL);
+
+					g_free(line);
+					return;
+				} else if (strcmp(key, "Content-Length") == 0) {
+					conn->body_len = atoi(value);
+				} else if (strcmp(key, "Connection") == 0) {
+					if (strcmp(value, "close") == 0) {
+						conn->close_when_done = TRUE;
+					}
+				}
+				g_free(line);
+			}
+
+		loop_end:
+			cursor = conn->buf->str + conn->handled_len;
+		}
+	}
+
+	if (!handled && conn->headers_done) {
+		if (conn->buf->len - conn->handled_len >= 
+			conn->body_len) {
+			xmlnode *node = xmlnode_from_str(cursor, conn->body_len);
+
+			if (node == NULL) {
+				purple_debug_info("soap", "Malformed SOAP response: %s\n",
+					cursor);
+			} else {
+				MsnSoapMessage *message = conn->message;
+				conn->message = NULL;
+				message->xml = node;
+
+				if (!msn_soap_handle_body(conn, message))
+					return;
+			}
+
+			msn_soap_connection_handle_next(conn);
+		}
+
+		return;
+	}
+
+	if (handled) {
+		msn_soap_connection_handle_next(conn);
+	}
+}
+
+static void
+msn_soap_write_cb(gpointer data, gint fd, PurpleInputCondition cond)
+{
+	MsnSoapConnection *conn = data;
+	int written;
+
+	g_return_if_fail(cond == PURPLE_INPUT_WRITE);
+
+	written = purple_ssl_write(conn->ssl, conn->buf->str + conn->handled_len,
+		conn->buf->len - conn->handled_len);
+
+	if (written < 0 && errno == EAGAIN)
+		return;
+	else if (written <= 0) {
+		purple_ssl_close(conn->ssl);
+		conn->ssl = NULL;
+		msn_soap_connection_handle_next(conn);
+		return;
+	}
+
+	conn->handled_len += written;
+
+	if (conn->handled_len < conn->buf->len)
+		return;
+
+	/* we are done! */
+	g_string_free(conn->buf, TRUE);
+	conn->buf = NULL;
+	conn->handled_len = 0;
+	conn->body_len = 0;
+	conn->response_code = 0;
+	conn->headers_done = FALSE;
+	conn->close_when_done = FALSE;
+
+	purple_input_remove(conn->event_handle);
+	conn->event_handle = purple_input_add(conn->ssl->fd, PURPLE_INPUT_READ,
+		msn_soap_read_cb, conn);
+}
+
+static gboolean
+msn_soap_connection_run(gpointer data)
+{
+	MsnSoapConnection *conn = data;
+	MsnSoapRequest *req = g_queue_peek_head(conn->queue);
+
+	conn->event_handle = 0;
+
+	if (req) {
+		if (conn->ssl == NULL) {
+			conn->ssl = purple_ssl_connect(conn->session->account, conn->host,
+				443, msn_soap_connected_cb, msn_soap_error_cb, conn);
+		} else if (conn->connected) {
+			int len = -1;
+			char *body = xmlnode_to_str(req->message->xml, &len);
+			GSList *iter;
+			char *authstr = NULL;
+
+			g_queue_pop_head(conn->queue);
+
+			conn->buf = g_string_new("");
+
+			if (conn->session->passport_info.mspauth)
+				authstr = g_strdup_printf("Cookie: MSPAuth=%s\r\n",
+					conn->session->passport_info.mspauth);
+
+
+			g_string_append_printf(conn->buf,
+				"POST %s HTTP/1.1\r\n"
+				"SOAPAction: %s\r\n"
+				"Content-Type:text/xml; charset=utf-8\r\n"
+				"%s"
+				"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"
+				"Accept: */*\r\n"
+				"Host: %s\r\n"
+				"Content-Length: %d\r\n"
+				"Connection: Keep-Alive\r\n"
+				"Cache-Control: no-cache\r\n",
+				req->path, req->message->action ? req->message->action : "",
+				authstr ? authstr : "",	conn->host, len);
+
+			for (iter = req->message->headers; iter; iter = iter->next) {
+				g_string_append(conn->buf, (char *)iter->data);
+				g_string_append(conn->buf, "\r\n");
+			}
+
+			g_string_append(conn->buf, "\r\n");
+			g_string_append(conn->buf, body);
+
+			purple_debug_info("soap", "%s\n", conn->buf->str);
+
+			conn->handled_len = 0;
+			conn->current_request = req;
+
+			conn->event_handle = purple_input_add(conn->ssl->fd,
+				PURPLE_INPUT_WRITE, msn_soap_write_cb, conn);
+			msn_soap_write_cb(conn, conn->ssl->fd, PURPLE_INPUT_WRITE);
+
+			g_free(authstr);
+			g_free(body);
+		}		
+	}
+
+	return FALSE;
+}
+
+void
+msn_soap_message_send(MsnSession *session, MsnSoapMessage *message,
+	const char *host, const char *path,
+	MsnSoapCallback cb, gpointer cb_data)
+{
+	msn_soap_message_send_internal(session, message, host, path, cb, cb_data,
+		FALSE);
+}
+
+static void
+msn_soap_message_send_internal(MsnSession *session,
+	MsnSoapMessage *message, const char *host, const char *path,
+	MsnSoapCallback cb, gpointer cb_data, gboolean first)
+{
+	MsnSoapConnection *conn = msn_soap_get_connection(session, host);
+	MsnSoapRequest *req = g_new0(MsnSoapRequest, 1);
+
+	req->path = g_strdup(path);
+	req->message = message;
+	req->cb = cb;
+	req->cb_data = cb_data;
+
+	if (first) {
+		g_queue_push_head(conn->queue, req);
+	} else {
+		g_queue_push_tail(conn->queue, req);
+	}
+
+	if (conn->event_handle == 0)
+		conn->event_handle = purple_timeout_add(0, msn_soap_connection_run,
+			conn);
+}
+
+static void
+msn_soap_connection_sanitize(MsnSoapConnection *conn, gboolean disconnect)
+{
+	if (conn->event_handle) {
+		purple_input_remove(conn->event_handle);
+		conn->event_handle = 0;
+	}
+
+	if (conn->message) {
+		msn_soap_message_destroy(conn->message);
+		conn->message = NULL;
+	}
+
+	if (conn->buf) {
+		g_string_free(conn->buf, TRUE);
+		conn->buf = NULL;
+	}
+
+	if (conn->ssl && (disconnect || conn->close_when_done)) {
+		purple_ssl_close(conn->ssl);
+		conn->ssl = NULL;
+	}
+
+	if (conn->current_request) {
+		msn_soap_request_destroy(conn->current_request);
+		conn->current_request = NULL;
+	}
+}
+
+static void
+msn_soap_connection_handle_next(MsnSoapConnection *conn)
+{
+	msn_soap_connection_sanitize(conn, FALSE);
+
+	conn->event_handle = purple_timeout_add(0, msn_soap_connection_run,	conn);
+
+	if (conn->current_request) {
+		MsnSoapRequest *req = conn->current_request;
+		conn->current_request = NULL;
+		msn_soap_connection_destroy_foreach_cb(req, conn);
+	}
+}
+
+static void
+msn_soap_connection_destroy_foreach_cb(gpointer item, gpointer data)
+{
+	MsnSoapRequest *req = item;
+
+	if (req->cb)
+		req->cb(req->message, NULL, req->cb_data);
+
+	msn_soap_request_destroy(req);
+}
+
+static void
+msn_soap_connection_destroy(MsnSoapConnection *conn)
+{
+	if (conn->current_request) {
+		MsnSoapRequest *req = conn->current_request;
+		conn->current_request = NULL;
+		msn_soap_connection_destroy_foreach_cb(req, conn);
+	}
+
+	msn_soap_connection_sanitize(conn, TRUE);
+	g_queue_foreach(conn->queue, msn_soap_connection_destroy_foreach_cb, conn);
+	g_queue_free(conn->queue);
+
+	g_free(conn->host);
+	g_free(conn);
+}
+
+MsnSoapMessage *
+msn_soap_message_new(const char *action, xmlnode *xml)
+{
+	MsnSoapMessage *message = g_new0(MsnSoapMessage, 1);
+
+	message->action = g_strdup(action);
+	message->xml = xml;
+
+	return message;
+}
+
+void
+msn_soap_message_destroy(MsnSoapMessage *message)
+{
+	if (message) {
+		g_slist_foreach(message->headers, (GFunc)g_free, NULL);
+		g_slist_free(message->headers);
+		g_free(message->action);
+		if (message->xml)
+			xmlnode_free(message->xml);
+		g_free(message);
+	}
+}
+
+void
+msn_soap_message_add_header(MsnSoapMessage *req,
+		const char *name, const char *value)
+{
+	char *header = g_strdup_printf("%s: %s\r\n", name, value);
+
+	req->headers = g_slist_prepend(req->headers, header);
+}
+
+static void
+msn_soap_request_destroy(MsnSoapRequest *req)
+{
+	g_free(req->path);
+	msn_soap_message_destroy(req->message);
+	g_free(req);
+}
+
+xmlnode *
+msn_soap_xml_get(xmlnode *parent, const char *node)
+{
+	xmlnode *ret = NULL;
+	char **tokens = g_strsplit(node, "/", -1);
+	int i;
+
+	for (i = 0; tokens[i]; i++) {
+		if ((ret = xmlnode_get_child(parent, tokens[i])) != NULL)
+			parent = ret;
+		else
+			break;
+	}
+
+	g_strfreev(tokens);
+	return ret;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msn/soap2.h	Mon Nov 05 00:35:07 2007 +0000
@@ -0,0 +1,58 @@
+/**
+ * @file soap2.h
+ * 	header file for SOAP connection related process
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef _MSN_SOAP2_H
+#define _MSN_SOAP2_H
+
+#include "session.h"
+#include "sslconn.h"
+#include "xmlnode.h"
+
+#include <glib.h>
+
+typedef struct _MsnSoapMessage MsnSoapMessage;
+typedef void (*MsnSoapCallback)(MsnSoapMessage *request,
+	MsnSoapMessage *response, gpointer cb_data);
+
+struct _MsnSoapMessage {
+	char *action;
+	xmlnode *xml;
+	GSList *headers;
+};
+
+MsnSoapMessage *msn_soap_message_new(const char *action, xmlnode *xml);
+
+void msn_soap_message_add_header(MsnSoapMessage *req,
+	const char *name, const char *value);
+
+void msn_soap_message_send(MsnSession *session,
+	MsnSoapMessage *message, const char *host, const char *path,
+	MsnSoapCallback cb, gpointer cb_data);
+
+void msn_soap_message_destroy(MsnSoapMessage *message);
+
+xmlnode *msn_soap_xml_get(xmlnode *parent, const char *node);
+
+#endif
--- a/libpurple/protocols/msn/userlist.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/msn/userlist.c	Mon Nov 05 00:35:07 2007 +0000
@@ -70,7 +70,7 @@
 	{
 		MsnSession *session = pa->gc->proto_data;
 		MsnUserList *userlist = session->userlist;
-		MsnCallbackState *state = msn_callback_state_new();
+		MsnCallbackState *state = msn_callback_state_new(session);
 
 		msn_callback_state_set_action(state, MSN_DENIED_BUDDY);
 
@@ -680,7 +680,7 @@
 	
 	purple_debug_info("MSN Userlist", "Add user: %s to group: %s\n", who, new_group_name);
 
-	state = msn_callback_state_new();
+	state = msn_callback_state_new(userlist->session);
 	msn_callback_state_set_who(state, who);
 	msn_callback_state_set_new_group_name(state, new_group_name);
 
@@ -841,7 +841,7 @@
 	g_return_if_fail(userlist->session != NULL);
 	g_return_if_fail(userlist->session->contact != NULL);
 
-	state = msn_callback_state_new();
+	state = msn_callback_state_new(userlist->session);
 	msn_callback_state_set_who(state, who);
 	msn_callback_state_set_action(state, MSN_MOVE_BUDDY);
 	msn_callback_state_set_old_group_name(state, old_group_name);
--- a/libpurple/protocols/myspace/myspace.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/myspace/myspace.c	Mon Nov 05 00:35:07 2007 +0000
@@ -2353,7 +2353,7 @@
 	} else if (n < 0) {
 		purple_debug_error("msim", "msim_input_cb: read error, ret=%d, "
 			"error=%s, source=%d, fd=%d (%X))\n", 
-			n, strerror(errno), source, session->fd, session->fd);
+			n, g_strerror(errno), source, session->fd, session->fd);
 		purple_connection_error(gc, _("Read error"));
 		return;
 	} else if (n == 0) {
--- a/libpurple/protocols/oscar/flap_connection.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/oscar/flap_connection.c	Mon Nov 05 00:35:07 2007 +0000
@@ -468,7 +468,7 @@
  * @param error_message A brief error message that gives more detail
  *        regarding the reason for the disconnecting.  This should
  *        be NULL for everything except OSCAR_DISCONNECT_LOST_CONNECTION,
- *        in which case it should contain the value of strerror(errno),
+ *        in which case it should contain the value of g_strerror(errno),
  *        and OSCAR_DISCONNECT_COULD_NOT_CONNECT, in which case it
  *        should contain the error_message passed back from the call
  *        to purple_proxy_connect().
@@ -812,7 +812,7 @@
 
 				/* Error! */
 				flap_connection_schedule_destroy(conn,
-						OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno));
+						OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
 				break;
 			}
 
@@ -873,7 +873,7 @@
 
 				/* Error! */
 				flap_connection_schedule_destroy(conn,
-						OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno));
+						OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
 				break;
 			}
 
@@ -924,7 +924,7 @@
 		close(conn->fd);
 		conn->fd = -1;
 		flap_connection_schedule_destroy(conn,
-				OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno));
+				OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
 		return;
 	}
 
--- a/libpurple/protocols/oscar/odc.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/oscar/odc.c	Mon Nov 05 00:35:07 2007 +0000
@@ -456,7 +456,7 @@
 			return;
 
 		peer_connection_destroy(conn,
-				OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno));
+				OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
 		return;
 	}
 
--- a/libpurple/protocols/oscar/oft.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/oscar/oft.c	Mon Nov 05 00:35:07 2007 +0000
@@ -212,7 +212,7 @@
 	if (checksum_data->file == NULL)
 	{
 		purple_debug_error("oscar", "Unable to open %s for checksumming: %s\n",
-				purple_xfer_get_local_filename(xfer), strerror(errno));
+				purple_xfer_get_local_filename(xfer), g_strerror(errno));
 		callback(checksum_data);
 		g_free(checksum_data);
 	}
--- a/libpurple/protocols/oscar/oscar.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Mon Nov 05 00:35:07 2007 +0000
@@ -778,7 +778,7 @@
 	gchar *utf8;
 	
 	if (value && value[0] && (utf8 = oscar_utf8_try_convert(account, value))) {
-		purple_notify_user_info_add_pair(user_info, name, value);
+		purple_notify_user_info_add_pair(user_info, name, utf8);
 		g_free(utf8);
 	}
 }
--- a/libpurple/protocols/oscar/peer.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/oscar/peer.c	Mon Nov 05 00:35:07 2007 +0000
@@ -317,7 +317,7 @@
 				return;
 
 			peer_connection_destroy(conn,
-					OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno));
+					OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
 			return;
 		}
 
@@ -367,7 +367,7 @@
 			return;
 
 		peer_connection_destroy(conn,
-				OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno));
+				OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
 		return;
 	}
 
--- a/libpurple/protocols/qq/qq_proxy.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/qq/qq_proxy.c	Mon Nov 05 00:35:07 2007 +0000
@@ -237,7 +237,7 @@
 		close(source);
 		purple_input_remove(phb->inpa);
 
-		purple_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", strerror(error));
+		purple_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", g_strerror(error));
 
 		phb->func(phb->data, -1, _("Unable to connect"));
 		return;
@@ -265,7 +265,7 @@
 
 	if (fd < 0) {
 		purple_debug(PURPLE_DEBUG_ERROR, "QQ Redirect", 
-			"Unable to create socket: %s\n", strerror(errno));
+			"Unable to create socket: %s\n", g_strerror(errno));
 		return -1;
 	}
 
@@ -297,7 +297,7 @@
 			purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Connect in asynchronous mode.\n");
 			phb->inpa = purple_input_add(fd, PURPLE_INPUT_WRITE, no_one_calls, phb);
 		} else {
-			purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Connection failed: %d\n", strerror(errno));
+			purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Connection failed: %d\n", g_strerror(errno));
 			close(fd);
 			return -1;
 		}		/* if errno */
@@ -497,7 +497,7 @@
 		ret = send(qd->fd, data, len, 0);
 	}
 	if (ret == -1)
-		purple_connection_error(qd->gc, strerror(errno));
+		purple_connection_error(qd->gc, g_strerror(errno));
 
 	return ret;
 }
--- a/libpurple/protocols/qq/udp_proxy_s5.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/qq/udp_proxy_s5.c	Mon Nov 05 00:35:07 2007 +0000
@@ -74,7 +74,7 @@
 	memcpy(&sin.sin_port, buf + 8, 2);
 
 	if (connect(phb->udpsock, (struct sockaddr *) &sin, sizeof(struct sockaddr_in)) < 0) {
-		purple_debug(PURPLE_DEBUG_INFO, "s5_canread_again", "connect failed: %s\n", strerror(errno));
+		purple_debug(PURPLE_DEBUG_INFO, "s5_canread_again", "connect failed: %s\n", g_strerror(errno));
 		close(phb->udpsock);
 		close(source);
 		g_free(phb->host);
@@ -120,7 +120,7 @@
 
 	ctllen = sizeof(ctlsin);
 	if (getsockname(source, (struct sockaddr *) &ctlsin, &ctllen) < 0) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "getsockname: %s\n", strerror(errno));
+		purple_debug(PURPLE_DEBUG_INFO, "QQ", "getsockname: %s\n", g_strerror(errno));
 		close(source);
 		g_free(phb->host);
 		g_free(phb);
@@ -300,7 +300,7 @@
 
 	len = sizeof(error);
 	if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
-		purple_debug(PURPLE_DEBUG_INFO, "getsockopt", "%s\n", strerror(errno));
+		purple_debug(PURPLE_DEBUG_INFO, "getsockopt", "%s\n", g_strerror(errno));
 		close(source);
 		if (phb->account == NULL || purple_account_get_connection(phb->account) != NULL) {
 
@@ -329,7 +329,7 @@
 	}
 
 	if (write(source, buf, i) < i) {
-		purple_debug(PURPLE_DEBUG_INFO, "write", "%s\n", strerror(errno));
+		purple_debug(PURPLE_DEBUG_INFO, "write", "%s\n", g_strerror(errno));
 		purple_debug(PURPLE_DEBUG_ERROR, "socks5 proxy", "Unable to write\n");
 		close(source);
 
--- a/libpurple/protocols/sametime/sametime.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/sametime/sametime.c	Mon Nov 05 00:35:07 2007 +0000
@@ -1702,7 +1702,7 @@
     purple_connection_error(pd->gc, _("Connection reset"));
 
   } else if(ret < 0) {
-    char *msg = strerror(err);
+    char *msg = g_strerror(err);
 
     DEBUG_INFO("error in read callback: %s\n", msg);
 
@@ -2167,7 +2167,7 @@
   } else {
     int err = errno;
     DEBUG_WARN("problem reading from file %s: %s\n",
-	       NSTR(mwFileTransfer_getFileName(ft)), strerror(err));
+	       NSTR(mwFileTransfer_getFileName(ft)), g_strerror(err));
 
     mwFileTransfer_cancel(ft);
   }
@@ -5009,7 +5009,7 @@
   fp = g_fopen(filename, "rb");
   if(! fp) {
     char *msg = g_strdup_printf(_("Error reading file %s: \n%s\n"),
-				filename, strerror(errno));
+				filename, g_strerror(errno));
     purple_xfer_error(purple_xfer_get_type(xfer), acct, xfer->who, msg);
     g_free(msg);
     return;
--- a/libpurple/protocols/silc/util.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/silc/util.c	Mon Nov 05 00:35:07 2007 +0000
@@ -79,7 +79,7 @@
 
 	pw = getpwuid(getuid());
 	if (!pw) {
-		purple_debug_error("silc", "silc: %s\n", strerror(errno));
+		purple_debug_error("silc", "silc: %s\n", g_strerror(errno));
 		return FALSE;
 	}
 
@@ -108,7 +108,7 @@
 				return FALSE;
 			}
 		} else {
-			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", filename, strerror(errno));
+			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", filename, g_strerror(errno));
 			return FALSE;
 		}
 	} else {
@@ -140,7 +140,7 @@
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n",
-							 servfilename, strerror(errno));
+							 servfilename, g_strerror(errno));
 			return FALSE;
 		}
 	}
@@ -163,7 +163,7 @@
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n",
-							 clientfilename, strerror(errno));
+							 clientfilename, g_strerror(errno));
 			return FALSE;
 		}
 	}
@@ -186,7 +186,7 @@
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n",
-							 friendsfilename, strerror(errno));
+							 friendsfilename, g_strerror(errno));
 			return FALSE;
 		}
 	}
@@ -218,12 +218,12 @@
 
 			if ((g_stat(file_public_key, &st)) == -1) {
 				purple_debug_error("silc", "Couldn't stat '%s' public key, error: %s\n",
-						   file_public_key, strerror(errno));
+						   file_public_key, g_strerror(errno));
 				return FALSE;
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' public key, error: %s\n",
-					   file_public_key, strerror(errno));
+					   file_public_key, g_strerror(errno));
 			return FALSE;
 		}
 	}
@@ -239,7 +239,7 @@
 	if ((fd = g_open(file_private_key, O_RDONLY, 0)) != -1) {
 		if ((fstat(fd, &st)) == -1) {
 			purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n",
-					   file_private_key, strerror(errno));
+					   file_private_key, g_strerror(errno));
 			close(fd);
 			return FALSE;
 		}
@@ -261,7 +261,7 @@
 			if ((fd = g_open(file_private_key, O_RDONLY, 0)) != -1) {
 				if ((fstat(fd, &st)) == -1) {
 					purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n",
-							   file_private_key, strerror(errno));
+							   file_private_key, g_strerror(errno));
 					close(fd);
 					return FALSE;
 				}
@@ -270,12 +270,12 @@
 			 * will set the permissions */
 			else if ((g_stat(file_private_key, &st)) == -1) {
 				purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n",
-						   file_private_key, strerror(errno));
+						   file_private_key, g_strerror(errno));
 				return FALSE;
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n",
-					   file_private_key, strerror(errno));
+					   file_private_key, g_strerror(errno));
 			return FALSE;
 		}
 	}
--- a/libpurple/protocols/silc10/silc.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/silc10/silc.c	Mon Nov 05 00:35:07 2007 +0000
@@ -331,7 +331,7 @@
 							(char *)purple_account_get_string(account, "private-key", prd),
 				(gc->password == NULL) ? "" : gc->password, &client->pkcs,
 				&client->public_key, &client->private_key)) {
-		g_snprintf(pkd, sizeof(pkd), _("Could not load SILC key pair: %s"), strerror(errno));
+		g_snprintf(pkd, sizeof(pkd), _("Could not load SILC key pair: %s"), g_strerror(errno));
 		purple_connection_error(gc, pkd);
 		return;
 	}
--- a/libpurple/protocols/silc10/util.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/silc10/util.c	Mon Nov 05 00:35:07 2007 +0000
@@ -79,7 +79,7 @@
 
 	pw = getpwuid(getuid());
 	if (!pw) {
-		purple_debug_error("silc", "silc: %s\n", strerror(errno));
+		purple_debug_error("silc", "silc: %s\n", g_strerror(errno));
 		return FALSE;
 	}
 
@@ -108,7 +108,7 @@
 				return FALSE;
 			}
 		} else {
-			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", filename, strerror(errno));
+			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", filename, g_strerror(errno));
 			return FALSE;
 		}
 	} else {
@@ -140,7 +140,7 @@
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n",
-							 servfilename, strerror(errno));
+							 servfilename, g_strerror(errno));
 			return FALSE;
 		}
 	}
@@ -163,7 +163,7 @@
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n",
-							 clientfilename, strerror(errno));
+							 clientfilename, g_strerror(errno));
 			return FALSE;
 		}
 	}
@@ -186,7 +186,7 @@
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n",
-							 friendsfilename, strerror(errno));
+							 friendsfilename, g_strerror(errno));
 			return FALSE;
 		}
 	}
@@ -216,12 +216,12 @@
 
 			if ((g_stat(file_public_key, &st)) == -1) {
 				purple_debug_error("silc", "Couldn't stat '%s' public key, error: %s\n",
-					file_public_key, strerror(errno));
+					file_public_key, g_strerror(errno));
 				return FALSE;
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' public key, error: %s\n",
-							 file_public_key, strerror(errno));
+							 file_public_key, g_strerror(errno));
 			return FALSE;
 		}
 	}
@@ -237,7 +237,7 @@
 	if ((fd = g_open(file_private_key, O_RDONLY, 0)) != -1) {
 		if ((fstat(fd, &st)) == -1) {
 			purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n",
-							 file_private_key, strerror(errno));
+							 file_private_key, g_strerror(errno));
 			close(fd);
 			return FALSE;
 		}
@@ -257,7 +257,7 @@
 			if ((fd = g_open(file_private_key, O_RDONLY, 0)) != -1) {
 				if ((fstat(fd, &st)) == -1) {
 					purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n",
-							 file_private_key, strerror(errno));
+							 file_private_key, g_strerror(errno));
 					close(fd);
 					return FALSE;
 				}
@@ -266,12 +266,12 @@
 			 * will set the permissions */
 			else if ((g_stat(file_private_key, &st)) == -1) {
 				purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n",
-					file_private_key, strerror(errno));
+					file_private_key, g_strerror(errno));
 				return FALSE;
 			}
 		} else {
 			purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n",
-							 file_private_key, strerror(errno));
+							 file_private_key, g_strerror(errno));
 			return FALSE;
 		}
 	}
--- a/libpurple/protocols/toc/toc.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/toc/toc.c	Mon Nov 05 00:35:07 2007 +0000
@@ -1795,7 +1795,7 @@
 			ft->file = g_fopen(ft->filename, "w");
 			if (!ft->file) {
 				buf = g_strdup_printf(_("Could not open %s for writing!"), ft->filename);
-				purple_notify_error(ft->gc, NULL, buf, strerror(errno));
+				purple_notify_error(ft->gc, NULL, buf, g_strerror(errno));
 				g_free(buf);
 				purple_input_remove(ft->inpa);
 				close(source);
@@ -1812,7 +1812,7 @@
 			if (!ft->file) {
 				buf = g_strdup_printf("Could not open %s/%s for writing!", ft->filename,
 						ft->hdr.name);
-				purple_notify_error(ft->gc, NULL, buf, strerror(errno));
+				purple_notify_error(ft->gc, NULL, buf, g_strerror(errno));
 				g_free(buf);
 				purple_input_remove(ft->inpa);
 				close(source);
--- a/libpurple/protocols/yahoo/yahoo.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/yahoo/yahoo.c	Mon Nov 05 00:35:07 2007 +0000
@@ -2463,7 +2463,7 @@
 			return;
 
 		tmp = g_strdup_printf(_("Lost connection with server:\n%s"),
-				strerror(errno));
+				g_strerror(errno));
 		purple_connection_error(gc, tmp);
 		g_free(tmp);
 		return;
@@ -2630,7 +2630,7 @@
 			return;
 
 		tmp = g_strdup_printf(_("Lost connection with server:\n%s"),
-				strerror(errno));
+				g_strerror(errno));
 		purple_connection_error(gc, tmp);
 		g_free(tmp);
 		return;
@@ -2701,7 +2701,7 @@
 			purple_input_remove(gc->inpa);
 		gc->inpa = 0;
 		tmp = g_strdup_printf(_("Lost connection with %s:\n%s"),
-				"login.yahoo.com:80", strerror(errno));
+				"login.yahoo.com:80", g_strerror(errno));
 		purple_connection_error(gc, tmp);
 		g_free(tmp);
 		return;
--- a/libpurple/protocols/yahoo/ycht.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/protocols/yahoo/ycht.c	Mon Nov 05 00:35:07 2007 +0000
@@ -473,7 +473,7 @@
 			return;
 
 		tmp = g_strdup_printf(_("Lost connection with server\n%s"),
-				strerror(errno));
+				g_strerror(errno));
 		ycht_connection_error(ycht, tmp);
 		g_free(tmp);
 		return;
--- a/libpurple/proxy.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/proxy.c	Mon Nov 05 00:35:07 2007 +0000
@@ -429,9 +429,9 @@
 		if (ret != 0)
 			error = errno;
 		purple_debug_info("proxy", "Error connecting to %s:%d (%s).\n",
-						connect_data->host, connect_data->port, strerror(error));
+						connect_data->host, connect_data->port, g_strerror(error));
 
-		purple_proxy_connect_data_disconnect(connect_data, strerror(error));
+		purple_proxy_connect_data_disconnect(connect_data, g_strerror(error));
 		return;
 	}
 
@@ -458,7 +458,7 @@
 	if (connect_data->fd < 0)
 	{
 		purple_proxy_connect_data_disconnect_formatted(connect_data,
-				_("Unable to create socket:\n%s"), strerror(errno));
+				_("Unable to create socket:\n%s"), g_strerror(errno));
 		return;
 	}
 
@@ -478,7 +478,7 @@
 		}
 		else
 		{
-			purple_proxy_connect_data_disconnect(connect_data, strerror(errno));
+			purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno));
 		}
 	}
 	else
@@ -496,7 +496,7 @@
 		{
 			if (ret != 0)
 				error = errno;
-			purple_proxy_connect_data_disconnect(connect_data, strerror(error));
+			purple_proxy_connect_data_disconnect(connect_data, g_strerror(error));
 			return;
 		}
 
@@ -534,7 +534,7 @@
 			return;
 
 		/* Error! */
-		purple_proxy_connect_data_disconnect(connect_data, strerror(errno));
+		purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno));
 		return;
 	}
 	if (ret < request_len) {
@@ -593,7 +593,7 @@
 
 		/* Error! */
 		purple_proxy_connect_data_disconnect_formatted(connect_data,
-				_("Lost connection with server:\n%s"), strerror(errno));
+				_("Lost connection with server:\n%s"), g_strerror(errno));
 		return;
 	}
 
@@ -832,7 +832,7 @@
 	{
 		if (ret != 0)
 			error = errno;
-		purple_proxy_connect_data_disconnect(connect_data, strerror(error));
+		purple_proxy_connect_data_disconnect(connect_data, g_strerror(error));
 		return;
 	}
 
@@ -899,7 +899,7 @@
 	if (connect_data->fd < 0)
 	{
 		purple_proxy_connect_data_disconnect_formatted(connect_data,
-				_("Unable to create socket:\n%s"), strerror(errno));
+				_("Unable to create socket:\n%s"), g_strerror(errno));
 		return;
 	}
 
@@ -937,7 +937,7 @@
 		}
 		else
 		{
-			purple_proxy_connect_data_disconnect(connect_data, strerror(errno));
+			purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno));
 		}
 	}
 	else
@@ -978,7 +978,7 @@
 		}
 	}
 
-	purple_proxy_connect_data_disconnect(connect_data, strerror(errno));
+	purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno));
 }
 
 static void
@@ -1003,7 +1003,7 @@
 	{
 		if (ret != 0)
 			error = errno;
-		purple_proxy_connect_data_disconnect(connect_data, strerror(error));
+		purple_proxy_connect_data_disconnect(connect_data, g_strerror(error));
 		return;
 	}
 
@@ -1058,7 +1058,7 @@
 	if (connect_data->fd < 0)
 	{
 		purple_proxy_connect_data_disconnect_formatted(connect_data,
-				_("Unable to create socket:\n%s"), strerror(errno));
+				_("Unable to create socket:\n%s"), g_strerror(errno));
 		return;
 	}
 
@@ -1078,7 +1078,7 @@
 		}
 		else
 		{
-			purple_proxy_connect_data_disconnect(connect_data, strerror(errno));
+			purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno));
 		}
 	}
 	else
@@ -1138,7 +1138,7 @@
 
 		/* Error! */
 		purple_proxy_connect_data_disconnect_formatted(connect_data,
-				_("Lost connection with server:\n%s"), strerror(errno));
+				_("Lost connection with server:\n%s"), g_strerror(errno));
 		return;
 	}
 
@@ -1247,7 +1247,7 @@
 
 		/* Error! */
 		purple_proxy_connect_data_disconnect_formatted(connect_data,
-				_("Lost connection with server:\n%s"), strerror(errno));
+				_("Lost connection with server:\n%s"), g_strerror(errno));
 		return;
 	}
 
@@ -1347,7 +1347,7 @@
 
 		/* Error! */
 		purple_proxy_connect_data_disconnect_formatted(connect_data,
-				_("Lost connection with server:\n%s"), strerror(errno));
+				_("Lost connection with server:\n%s"), g_strerror(errno));
 		return;
 	}
 
@@ -1475,7 +1475,7 @@
 
 		/* Error! */
 		purple_proxy_connect_data_disconnect_formatted(connect_data,
-				_("Lost connection with server:\n%s"), strerror(errno));
+				_("Lost connection with server:\n%s"), g_strerror(errno));
 		return;
 	}
 
@@ -1584,7 +1584,7 @@
 	{
 		if (ret != 0)
 			error = errno;
-		purple_proxy_connect_data_disconnect(connect_data, strerror(error));
+		purple_proxy_connect_data_disconnect(connect_data, g_strerror(error));
 		return;
 	}
 
@@ -1629,7 +1629,7 @@
 	if (connect_data->fd < 0)
 	{
 		purple_proxy_connect_data_disconnect_formatted(connect_data,
-				_("Unable to create socket:\n%s"), strerror(errno));
+				_("Unable to create socket:\n%s"), g_strerror(errno));
 		return;
 	}
 
@@ -1649,7 +1649,7 @@
 		}
 		else
 		{
-			purple_proxy_connect_data_disconnect(connect_data, strerror(errno));
+			purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno));
 		}
 	}
 	else
--- a/libpurple/util.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/util.c	Mon Nov 05 00:35:07 2007 +0000
@@ -2505,7 +2505,7 @@
 		}
 
 		if (g_mkdir(dir, mode) < 0) {
-			purple_debug_warning("build_dir", "mkdir: %s\n", strerror(errno));
+			purple_debug_warning("build_dir", "mkdir: %s\n", g_strerror(errno));
 			g_strfreev(components);
 			g_free(dir);
 			return -1;
@@ -2541,7 +2541,7 @@
 		if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1)
 		{
 			purple_debug_error("util", "Error creating directory %s: %s\n",
-							 user_dir, strerror(errno));
+							 user_dir, g_strerror(errno));
 			return FALSE;
 		}
 	}
@@ -2576,7 +2576,7 @@
 		{
 			purple_debug_error("util", "Error removing old file "
 					   "%s: %s\n",
-					   filename_temp, strerror(errno));
+					   filename_temp, g_strerror(errno));
 		}
 	}
 
@@ -2586,7 +2586,7 @@
 	{
 		purple_debug_error("util", "Error opening file %s for "
 				   "writing: %s\n",
-				   filename_temp, strerror(errno));
+				   filename_temp, g_strerror(errno));
 		g_free(filename_temp);
 		return FALSE;
 	}
@@ -2599,7 +2599,7 @@
 	if (fclose(file) != 0)
 	{
 		purple_debug_error("util", "Error closing file %s: %s\n",
-				   filename_temp, strerror(errno));
+				   filename_temp, g_strerror(errno));
 		g_free(filename_temp);
 		return FALSE;
 	}
@@ -2631,7 +2631,7 @@
 	if (chmod(filename_temp, S_IRUSR | S_IWUSR) == -1)
 	{
 		purple_debug_error("util", "Error setting permissions of file %s: %s\n",
-						 filename_temp, strerror(errno));
+						 filename_temp, g_strerror(errno));
 	}
 #endif
 
@@ -2640,7 +2640,7 @@
 	{
 		purple_debug_error("util", "Error renaming %s to %s: %s\n",
 				   filename_temp, filename_full,
-				   strerror(errno));
+				   g_strerror(errno));
 	}
 
 	g_free(filename_temp);
@@ -3688,7 +3688,7 @@
 					if(new_data == NULL) {
 						purple_debug_error("util",
 								"Failed to allocate %u bytes: %s\n",
-								content_len, strerror(errno));
+								content_len, g_strerror(errno));
 						purple_util_fetch_url_error(gfud,
 								_("Unable to allocate enough memory to hold "
 								  "the contents from %s.  The web server may "
@@ -3726,7 +3726,7 @@
 			return;
 		} else {
 			purple_util_fetch_url_error(gfud, _("Error reading from %s: %s"),
-					gfud->website.address, strerror(errno));
+					gfud->website.address, g_strerror(errno));
 			return;
 		}
 	}
@@ -3757,7 +3757,7 @@
 		return;
 	else if (len < 0) {
 		purple_util_fetch_url_error(gfud, _("Error writing to %s: %s"),
-				gfud->website.address, strerror(errno));
+				gfud->website.address, g_strerror(errno));
 		return;
 	}
 	gfud->request_written += len;
--- a/libpurple/win32/libc_interface.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/libpurple/win32/libc_interface.c	Mon Nov 05 00:35:07 2007 +0000
@@ -300,7 +300,7 @@
 		return errbuf;
 	}
 	else
-		return strerror( errornum );
+		return g_strerror( errornum );
 }
 
 /* unistd.h */
--- a/pidgin/gtkdialogs.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/gtkdialogs.c	Mon Nov 05 00:35:07 2007 +0000
@@ -71,6 +71,7 @@
 static const struct developer developers[] = {
 	{"Sean Egan",					N_("lead developer"), "sean.egan@gmail.com"},
 	{"Daniel 'datallah' Atallah",	N_("developer"), NULL},
+	{"John 'rekkanoryo' Bailey",	N_("developer"), NULL},
 	{"Ethan 'Paco-Paco' Blanton",	N_("developer"), NULL},
 	{"Thomas Butter",				N_("developer"), NULL},
 	{"Ka-Hing Cheung",				N_("developer"), NULL},
@@ -95,7 +96,6 @@
 
 /* Order: Alphabetical by Last Name */
 static const struct developer patch_writers[] = {
-	{"John 'rekkanoryo' Bailey",	NULL,	NULL},
 	{"Dennis 'EvilDennisR' Ristuccia",	N_("Senior Contributor/QA"),	NULL},
 	{"Peter 'Fmoo' Ruibal",		NULL,	NULL},
 	{"Gabriel 'Nix' Schulhof", 	NULL, 	NULL},
@@ -147,7 +147,7 @@
 	{N_("Danish"),              "da", "Morten Brix Pedersen", "morten@wtf.dk"},
 	{N_("Danish"),              "da", "Peter Bach", "bach.peter@gmail.com"},
 	{N_("German"),              "de", "Bj旦rn Voigt", "bjoern@cs.tu-berlin.de"},
-	{N_("German"),              "de", "Jochen Kemnade", "kemnade@gmail.com"},
+	{N_("German"),              "de", "Jochen Kemnade", "jochenkemnade@web.de"},
 	{N_("Dzongkha"),            "dz", "Norbu", "nor_den@hotmail.com"},
 	{N_("Dzongkha"),            "dz", "Jurmey Rabgay", "jur_gay@yahoo.com"},
 	{N_("Dzongkha"),            "dz", "Wangmo Sherpa", "rinwanshe@yahoo.com"},
--- a/pidgin/gtkprefs.c	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/gtkprefs.c	Mon Nov 05 00:35:07 2007 +0000
@@ -1126,13 +1126,26 @@
 	g_error_free(err);
 }
 
+static void
+browser_button_clicked_cb(GtkWidget *button, gpointer null)
+{
+	GError *err = NULL;
+
+	if (g_spawn_command_line_async ("gnome-default-applications-properties", &err))
+		return;
+
+	purple_notify_error(NULL, NULL, _("Cannot start browser configuration program."), err->message);
+	g_error_free(err);
+}
+
 static GtkWidget *
 network_page()
 {
 	GtkWidget *ret;
 	GtkWidget *vbox, *hbox, *entry;
 	GtkWidget *table, *label, *auto_ip_checkbox, *ports_checkbox, *spin_button;
-	GtkWidget *warning = NULL, *proxy_button = NULL;
+	GtkWidget *proxy_warning = NULL, *browser_warning = NULL;
+	GtkWidget *proxy_button = NULL, *browser_button = NULL;
 	GtkSizeGroup *sg;
 	PurpleProxyInfo *proxy_info = NULL;
 
@@ -1217,11 +1230,11 @@
 	g_signal_connect(G_OBJECT(ports_checkbox), "clicked",
 					 G_CALLBACK(pidgin_toggle_sensitive), spin_button);
 
-	vbox = pidgin_make_frame(ret, _("Proxy Server"));
-	prefs_proxy_frame = gtk_vbox_new(FALSE, 0);
-
 	if (purple_running_gnome()) {
-		warning = hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
+		vbox = pidgin_make_frame(ret, _("Proxy Server &amp; Browser"));
+		prefs_proxy_frame = gtk_vbox_new(FALSE, 0);
+
+		proxy_warning = hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
 		gtk_container_add(GTK_CONTAINER(vbox), hbox);
 
 		label = gtk_label_new(NULL);
@@ -1229,10 +1242,18 @@
 		                     _("<b>Proxy configuration program was not found.</b>"));
 		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 
+		browser_warning = hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
+		gtk_container_add(GTK_CONTAINER(vbox), hbox);
+
+		label = gtk_label_new(NULL);
+		gtk_label_set_markup(GTK_LABEL(label),
+		                     _("<b>Browser configuration program was not found.</b>"));
+		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+
 		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
 		gtk_container_add(GTK_CONTAINER(vbox), hbox);
-		label = gtk_label_new(_("Proxy preferences are configured in\n"
-		                        "GNOME Control Center: Desktop Preferences"));
+		label = gtk_label_new(_("Proxy & Browser preferences are configured\n"
+		                        "in GNOME Preferences"));
 		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 		gtk_widget_show(label);
 
@@ -1243,7 +1264,15 @@
 		                 G_CALLBACK(proxy_button_clicked_cb), NULL);
 		gtk_box_pack_start(GTK_BOX(hbox), proxy_button, FALSE, FALSE, 0);
 		gtk_widget_show(proxy_button);
+		browser_button = gtk_button_new_with_mnemonic(_("Configure _Browser"));
+		g_signal_connect(G_OBJECT(browser_button), "clicked",
+		                 G_CALLBACK(browser_button_clicked_cb), NULL);
+		gtk_box_pack_start(GTK_BOX(hbox), browser_button, FALSE, FALSE, 0);
+		gtk_widget_show(browser_button);
 	} else {
+		vbox = pidgin_make_frame(ret, _("Proxy Server"));
+		prefs_proxy_frame = gtk_vbox_new(FALSE, 0);
+
 		pidgin_prefs_dropdown(vbox, _("Proxy _type:"), PURPLE_PREF_STRING,
 					"/purple/proxy/type",
 					_("No proxy"), "none",
@@ -1351,11 +1380,20 @@
 		path = g_find_program_in_path("gnome-network-preferences");
 		if (path != NULL) {
 			gtk_widget_set_sensitive(proxy_button, TRUE);
-			gtk_widget_hide(warning);
+			gtk_widget_hide(proxy_warning);
 			g_free(path);
 		} else {
 			gtk_widget_set_sensitive(proxy_button, FALSE);
-			gtk_widget_show(warning);
+			gtk_widget_show(proxy_warning);
+		}
+		path = g_find_program_in_path("gnome-default-applications-properties");
+		if (path != NULL) {
+			gtk_widget_set_sensitive(browser_button, TRUE);
+			gtk_widget_hide(browser_warning);
+			g_free(path);
+		} else {
+			gtk_widget_set_sensitive(browser_button, FALSE);
+			gtk_widget_show(browser_warning);
 		}
 	}
 
--- a/pidgin/pixmaps/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,4 +1,416 @@
-SUBDIRS = animations buddy_icons dialogs emblems emotes icons protocols status toolbar tray
+pidginpixmapdir = $(datadir)/pixmaps/pidgin
+
+SUBDIRS = buddy_icons/qq dialogs/16 dialogs/64 emblems/16 \
+          emotes/default/24 emotes/none \
+          icons/16 icons/22 icons/24 icons/32 icons/48 \
+          protocols/16 protocols/22 protocols/48 \
+          status/11 status/16 status/22 status/32 status/48 \
+          toolbar/16 toolbar/22 tray/16 tray/22 tray/32 tray/48
+
+MAKEFILE_MINGW = \
+		buddy_icons/qq/Makefile.mingw \
+		dialogs/16/Makefile.mingw \
+		dialogs/64/Makefile.mingw \
+		icons/16/Makefile.mingw \
+		icons/24/Makefile.mingw \
+		icons/32/Makefile.mingw \
+		icons/48/Makefile.mingw \
+		emotes/default/Makefile.mingw \
+		emotes/default/24/Makefile.mingw \
+		emotes/none/Makefile.mingw \
+		emblems/16/Makefile.mingw \
+		protocols/22/Makefile.mingw \
+		protocols/48/Makefile.mingw \
+		status/11/Makefile.mingw \
+		status/11/rtl/Makefile.mingw \
+		status/16/Makefile.mingw \
+		status/16/rtl/Makefile.mingw \
+		status/22/Makefile.mingw \
+		status/22/rtl/Makefile.mingw \
+		status/32/Makefile.mingw \
+		status/32/rtl/Makefile.mingw \
+		status/48/Makefile.mingw \
+		status/48/rtl/Makefile.mingw \
+		toolbar/16/Makefile.mingw \
+		toolbar/22/Makefile.mingw \
+		tray/16/Makefile.mingw \
+		tray/22/Makefile.mingw \
+		tray/32/Makefile.mingw \
+		tray/48/Makefile.mingw
+
+ANIMATIONS_16 = \
+		animations/16/connect0.png \
+		animations/16/connect1.png \
+		animations/16/connect2.png \
+		animations/16/connect3.png \
+		animations/16/connect4.png \
+		animations/16/connect5.png \
+		animations/16/connect6.png \
+		animations/16/connect7.png \
+		animations/16/connect8.png \
+		animations/16/typing0.png \
+		animations/16/typing1.png \
+		animations/16/typing2.png \
+		animations/16/typing3.png \
+		animations/16/typing4.png \
+		animations/16/typing5.png
+
+DIALOGS_16_SCALABLE = \
+		dialogs/16/scalable/error.svg \
+		dialogs/16/scalable/info.svg \
+		dialogs/16/scalable/mail.svg
+
+DIALOGS_64_SCALABLE = \
+		dialogs/64/scalable/auth.svg \
+		dialogs/64/scalable/cool.svg \
+		dialogs/64/scalable/dialog.svg \
+		dialogs/64/scalable/error.svg \
+		dialogs/64/scalable/info.svg \
+		dialogs/64/scalable/question.svg \
+		dialogs/64/scalable/warning.svg
+
+EMBLEMS_16_SCALABLE = \
+		emblems/16/scalable/aol-client.svg \
+		emblems/16/scalable/blocked.svg \
+		emblems/16/scalable/bot.svg \
+		emblems/16/scalable/external.svg \
+		emblems/16/scalable/female.svg \
+		emblems/16/scalable/free-for-chat.svg \
+		emblems/16/scalable/game.svg \
+		emblems/16/scalable/male.svg \
+		emblems/16/scalable/mobile.svg \
+		emblems/16/scalable/music.svg \
+		emblems/16/scalable/not-authorized.svg \
+		emblems/16/scalable/qq-member.svg \
+		emblems/16/scalable/secure.svg \
+		emblems/16/scalable/unavailable.svg \
+		emblems/16/scalable/video.svg \
+		emblems/16/scalable/voice.svg
+
+EMOTES_DEFAULT_24_SCALABLE = \
+		emotes/default/24/scalable/act-up.svg \
+		emotes/default/24/scalable/airplane.svg \
+		emotes/default/24/scalable/alien.svg \
+		emotes/default/24/scalable/angel.svg \
+		emotes/default/24/scalable/angry.svg \
+		emotes/default/24/scalable/arrogant.svg \
+		emotes/default/24/scalable/at-wits-end.svg \
+		emotes/default/24/scalable/bad.svg \
+		emotes/default/24/scalable/bashful.svg \
+		emotes/default/24/scalable/beat-up.svg \
+		emotes/default/24/scalable/beauty.svg \
+		emotes/default/24/scalable/beer.svg \
+		emotes/default/24/scalable/blowkiss.svg \
+		emotes/default/24/scalable/bomb.svg \
+		emotes/default/24/scalable/bowl.svg \
+		emotes/default/24/scalable/boy.svg \
+		emotes/default/24/scalable/brb.svg \
+		emotes/default/24/scalable/bulgy-eyes.svg \
+		emotes/default/24/scalable/bye.svg \
+		emotes/default/24/scalable/cake.svg \
+		emotes/default/24/scalable/call-me.svg \
+		emotes/default/24/scalable/camera.svg \
+		emotes/default/24/scalable/can.svg \
+		emotes/default/24/scalable/car.svg \
+		emotes/default/24/scalable/cat.svg \
+		emotes/default/24/scalable/chicken.svg \
+		emotes/default/24/scalable/clap.svg \
+		emotes/default/24/scalable/clock.svg \
+		emotes/default/24/scalable/cloudy.svg \
+		emotes/default/24/scalable/clover.svg \
+		emotes/default/24/scalable/clown.svg \
+		emotes/default/24/scalable/coffee.svg \
+		emotes/default/24/scalable/coins.svg \
+		emotes/default/24/scalable/computer.svg \
+		emotes/default/24/scalable/confused.svg \
+		emotes/default/24/scalable/console.svg \
+		emotes/default/24/scalable/cowboy.svg \
+		emotes/default/24/scalable/cow.svg \
+		emotes/default/24/scalable/crying.svg \
+		emotes/default/24/scalable/curl-lip.svg \
+		emotes/default/24/scalable/curse.svg \
+		emotes/default/24/scalable/cute.svg \
+		emotes/default/24/scalable/cyclops.svg \
+		emotes/default/24/scalable/dance.svg \
+		emotes/default/24/scalable/dazed.svg \
+		emotes/default/24/scalable/desire.svg \
+		emotes/default/24/scalable/devil.svg \
+		emotes/default/24/scalable/disapointed.svg \
+		emotes/default/24/scalable/disdain.svg \
+		emotes/default/24/scalable/doctor.svg \
+		emotes/default/24/scalable/dog.svg \
+		emotes/default/24/scalable/doh.svg \
+		emotes/default/24/scalable/dont-know.svg \
+		emotes/default/24/scalable/drink.svg \
+		emotes/default/24/scalable/drool.svg \
+		emotes/default/24/scalable/eat.svg \
+		emotes/default/24/scalable/embarrassed.svg \
+		emotes/default/24/scalable/excruciating.svg \
+		emotes/default/24/scalable/eyeroll.svg \
+		emotes/default/24/scalable/female-fighter.svg \
+		emotes/default/24/scalable/film.svg \
+		emotes/default/24/scalable/fingers-crossed.svg \
+		emotes/default/24/scalable/flag.svg \
+		emotes/default/24/scalable/foot-in-mouth.svg \
+		emotes/default/24/scalable/freaked-out.svg \
+		emotes/default/24/scalable/ghost.svg \
+		emotes/default/24/scalable/giggle.svg \
+		emotes/default/24/scalable/girl.svg \
+		emotes/default/24/scalable/glasses-cool.svg \
+		emotes/default/24/scalable/glasses-nerdy.svg \
+		emotes/default/24/scalable/goat.svg \
+		emotes/default/24/scalable/go-away.svg \
+		emotes/default/24/scalable/good.svg \
+		emotes/default/24/scalable/hammer.svg \
+		emotes/default/24/scalable/handcuffs.svg \
+		emotes/default/24/scalable/handshake.svg \
+		emotes/default/24/scalable/highfive.svg \
+		emotes/default/24/scalable/hug-left.svg \
+		emotes/default/24/scalable/hug-right.svg \
+		emotes/default/24/scalable/hypnotized.svg \
+		emotes/default/24/scalable/in-love.svg \
+		emotes/default/24/scalable/island.svg \
+		emotes/default/24/scalable/jump.svg \
+		emotes/default/24/scalable/kissed.svg \
+		emotes/default/24/scalable/kissing.svg \
+		emotes/default/24/scalable/kiss.svg \
+		emotes/default/24/scalable/knife.svg \
+		emotes/default/24/scalable/lamp.svg \
+		emotes/default/24/scalable/lashes.svg \
+		emotes/default/24/scalable/laugh.svg \
+		emotes/default/24/scalable/liquor.svg \
+		emotes/default/24/scalable/loser.svg \
+		emotes/default/24/scalable/love-over.svg \
+		emotes/default/24/scalable/love.svg \
+		emotes/default/24/scalable/lying.svg \
+		emotes/default/24/scalable/madtongue.svg \
+		emotes/default/24/scalable/mail.svg \
+		emotes/default/24/scalable/male-fighter1.svg \
+		emotes/default/24/scalable/male-fighter2.svg \
+		emotes/default/24/scalable/mean.svg \
+		emotes/default/24/scalable/meeting.svg \
+		emotes/default/24/scalable/messed.svg \
+		emotes/default/24/scalable/mobile.svg \
+		emotes/default/24/scalable/mohawk.svg \
+		emotes/default/24/scalable/moneymouth.svg \
+		emotes/default/24/scalable/monkey.svg \
+		emotes/default/24/scalable/moon.svg \
+		emotes/default/24/scalable/msn-away.svg \
+		emotes/default/24/scalable/msn-busy.svg \
+		emotes/default/24/scalable/msn_online.svg \
+		emotes/default/24/scalable/msn.svg \
+		emotes/default/24/scalable/musical-note.svg \
+		emotes/default/24/scalable/music.svg \
+		emotes/default/24/scalable/nailbiting.svg \
+		emotes/default/24/scalable/neutral.svg \
+		emotes/default/24/scalable/on-the-phone.svg \
+		emotes/default/24/scalable/party.svg \
+		emotes/default/24/scalable/peace.svg \
+		emotes/default/24/scalable/phone.svg \
+		emotes/default/24/scalable/pig.svg \
+		emotes/default/24/scalable/pill.svg \
+		emotes/default/24/scalable/pirate.svg \
+		emotes/default/24/scalable/pissed-off.svg \
+		emotes/default/24/scalable/pizza.svg \
+		emotes/default/24/scalable/plate.svg \
+		emotes/default/24/scalable/poop.svg \
+		emotes/default/24/scalable/pray.svg \
+		emotes/default/24/scalable/present.svg \
+		emotes/default/24/scalable/qq.svg \
+		emotes/default/24/scalable/question.svg \
+		emotes/default/24/scalable/quiet.svg \
+		emotes/default/24/scalable/rainbow.svg \
+		emotes/default/24/scalable/rain.svg \
+		emotes/default/24/scalable/rose-dead.svg \
+		emotes/default/24/scalable/rose.svg \
+		emotes/default/24/scalable/rotfl.svg \
+		emotes/default/24/scalable/sad.svg \
+		emotes/default/24/scalable/sarcastic.svg \
+		emotes/default/24/scalable/search.svg \
+		emotes/default/24/scalable/secret.svg \
+		emotes/default/24/scalable/shame.svg \
+		emotes/default/24/scalable/sheep.svg \
+		emotes/default/24/scalable/shock.svg \
+		emotes/default/24/scalable/shout.svg \
+		emotes/default/24/scalable/shut-mouth.svg \
+		emotes/default/24/scalable/sick.svg \
+		emotes/default/24/scalable/sidefrown.svg \
+		emotes/default/24/scalable/sigarette.svg \
+		emotes/default/24/scalable/silly.svg \
+		emotes/default/24/scalable/sinister.svg \
+		emotes/default/24/scalable/skeleton.svg \
+		emotes/default/24/scalable/skywalker.svg \
+		emotes/default/24/scalable/sleepy.svg \
+		emotes/default/24/scalable/smile-big.svg \
+		emotes/default/24/scalable/smile.svg \
+		emotes/default/24/scalable/smirk.svg \
+		emotes/default/24/scalable/snail.svg \
+		emotes/default/24/scalable/snicker.svg \
+		emotes/default/24/scalable/snowman.svg \
+		emotes/default/24/scalable/soccerball.svg \
+		emotes/default/24/scalable/soldier.svg \
+		emotes/default/24/scalable/star.svg \
+		emotes/default/24/scalable/starving.svg \
+		emotes/default/24/scalable/stop.svg \
+		emotes/default/24/scalable/struggle.svg \
+		emotes/default/24/scalable/sun.svg \
+		emotes/default/24/scalable/sweat.svg \
+		emotes/default/24/scalable/talktohand.svg \
+		emotes/default/24/scalable/teeth.svg \
+		emotes/default/24/scalable/terror.svg \
+		emotes/default/24/scalable/thinking.svg \
+		emotes/default/24/scalable/thunder.svg \
+		emotes/default/24/scalable/time-out.svg \
+		emotes/default/24/scalable/tongue.svg \
+		emotes/default/24/scalable/tremble.svg \
+		emotes/default/24/scalable/turtle.svg \
+		emotes/default/24/scalable/tv.svg \
+		emotes/default/24/scalable/umbrella.svg \
+		emotes/default/24/scalable/vampire.svg \
+		emotes/default/24/scalable/victory.svg \
+		emotes/default/24/scalable/waiting.svg \
+		emotes/default/24/scalable/watermelon.svg \
+		emotes/default/24/scalable/waving.svg \
+		emotes/default/24/scalable/weep.svg \
+		emotes/default/24/scalable/wilt.svg \
+		emotes/default/24/scalable/wink.svg \
+		emotes/default/24/scalable/worship.svg \
+		emotes/default/24/scalable/yawn.svg \
+		emotes/default/24/scalable/yin-yang.svg
+
+PROTOCOLS_16_SCALABLE = \
+		protocols/16/scalable/aim.svg \
+		protocols/16/scalable/bonjour.svg \
+		protocols/16/scalable/gadu-gadu.svg \
+		protocols/16/scalable/novell.svg \
+		protocols/16/scalable/icq.svg \
+		protocols/16/scalable/irc.svg \
+		protocols/16/scalable/jabber.svg \
+		protocols/16/scalable/meanwhile.svg \
+		protocols/16/scalable/msn.svg \
+		protocols/16/scalable/qq.svg \
+		protocols/16/scalable/silc.svg \
+		protocols/16/scalable/simple.svg \
+		protocols/16/scalable/yahoo.svg \
+		protocols/16/scalable/zephyr.svg
+
+ICONS_16_SCALABLE = \
+		icons/16/scalable/pidgin.svg
+
+ICONS_22_SCALABLE = \
+		icons/22/scalable/pidgin.svg
+
+ICONS_24_SCALABLE = \
+		icons/24/scalable/pidgin.svg
+
+ICONS_32_SCALABLE = \
+		icons/32/scalable/pidgin.svg
+
+ICONS_48_SCALABLE = \
+		icons/48/scalable/pidgin.svg
+
+PROTOCOLS_22_SCALABLE = \
+		protocols/22/scalable/aim.svg \
+		protocols/22/scalable/bonjour.svg \
+		protocols/22/scalable/gadu-gadu.svg \
+		protocols/22/scalable/novell.svg \
+		protocols/22/scalable/icq.svg \
+		protocols/22/scalable/irc.svg \
+		protocols/22/scalable/jabber.svg \
+		protocols/22/scalable/meanwhile.svg \
+		protocols/22/scalable/msn.svg \
+		protocols/22/scalable/qq.svg \
+		protocols/22/scalable/silc.svg \
+		protocols/22/scalable/simple.svg \
+		protocols/22/scalable/yahoo.svg \
+		protocols/22/scalable/zephyr.svg
+
+PROTOCOLS_48_SCALABLE = \
+		protocols/48/scalable/aim.svg \
+		protocols/48/scalable/bonjour.svg \
+		protocols/48/scalable/gadu-gadu.svg \
+		protocols/48/scalable/google-talk.svg \
+		protocols/48/scalable/novell.svg \
+		protocols/48/scalable/icq.svg \
+		protocols/48/scalable/irc.svg \
+		protocols/48/scalable/jabber.svg \
+		protocols/48/scalable/meanwhile.svg \
+		protocols/48/scalable/msn.svg \
+		protocols/48/scalable/qq.svg \
+		protocols/48/scalable/silc.svg \
+		protocols/48/scalable/simple.svg \
+		protocols/48/scalable/yahoo.svg \
+		protocols/48/scalable/zephyr.svg
+
+STATUS_11_SCALABLE = \
+		status/11/scalable/available.svg \
+		status/11/scalable/away.svg \
+		status/11/scalable/busy.svg \
+		status/11/scalable/chat.svg \
+		status/11/scalable/extended-away.svg \
+		status/11/scalable/invisible.svg \
+		status/11/scalable/offline.svg \
+		status/11/scalable/person.svg
+
+STATUS_16_SCALABLE = \
+		status/16/scalable/available.svg \
+		status/16/scalable/away.svg \
+		status/16/scalable/busy.svg \
+		status/16/scalable/chat.svg \
+		status/16/scalable/extended-away.svg \
+		status/16/scalable/log-in.svg \
+		status/16/scalable/log-out.svg \
+		status/16/scalable/message-pending.svg \
+		status/16/scalable/offline.svg \
+		status/16/scalable/person.svg
+
+STATUS_22_SCALABLE = \
+		status/22/scalable/available.svg \
+		status/22/scalable/away.svg \
+		status/22/scalable/busy.svg \
+		status/22/scalable/chat.svg \
+		status/22/scalable/extended-away.svg \
+		status/22/scalable/log-in.svg \
+		status/22/scalable/log-out.svg \
+		status/22/scalable/offline.svg \
+		status/22/scalable/person.svg
+
+STATUS_32_SCALABLE = \
+		status/32/scalable/available.svg \
+		status/32/scalable/away.svg \
+		status/32/scalable/busy.svg \
+		status/32/scalable/chat.svg \
+		status/32/scalable/extended-away.svg \
+		status/32/scalable/log-in.svg \
+		status/32/scalable/log-out.svg \
+		status/32/scalable/offline.svg \
+		status/32/scalable/person.svg
+
+TOOLBAR_11 = \
+		toolbar/11/message-new.png
+
+TOOLBAR_16_SCALABLE = \
+		toolbar/16/scalable/change-bgcolor.svg \
+		toolbar/16/scalable/change-fgcolor.svg \
+		toolbar/16/scalable/emote-select.svg \
+		toolbar/16/scalable/font-size-down.svg \
+		toolbar/16/scalable/font-size-up.svg
+
+TOOLBAR_22_SCALABLE = \
+		toolbar/22/scalable/select-avatar.svg
+
+TRAY_16_SCALABLE = \
+		tray/16/scalable/tray-away.svg \
+		tray/16/scalable/tray-busy.svg \
+		tray/16/scalable/tray-connecting.svg \
+		tray/16/scalable/tray-extended-away.svg \
+		tray/16/scalable/tray-invisible.svg \
+		tray/16/scalable/tray-message.svg \
+		tray/16/scalable/tray-offline.svg \
+		tray/16/scalable/tray-online.svg
+
+TRAY_22_SCALABLE = \
+		tray/22/scalable/tray-invisible.svg
 
 EXTRA_DIST = \
 		edit.png			\
@@ -10,7 +422,29 @@
 		arrow-right.xpm		\
 		arrow-left.xpm		\
 		Makefile.mingw			\
-		pidgin.ico
+		pidgin.ico		\
+		$(MAKEFILE_MINGW)	\
+		$(DIALOGS_16_SCALABLE)	\
+		$(DIALOGS_64_SCALABLE)	\
+		$(ICONS_16_SCALABLE)	\
+		$(ICONS_22_SCALABLE)	\
+		$(ICONS_24_SCALABLE)	\
+		$(ICONS_32_SCALABLE)	\
+		$(ICONS_48_SCALABLE)	\
+		$(EMBLEMS_16_SCALABLE)	\
+		$(EMOTES_DEFAULT_24_SCALABLE)	\
+		$(PROTOCOLS_16_SCALABLE)	\
+		$(PROTOCOLS_22_SCALABLE)	\
+		$(PROTOCOLS_48_SCALABLE)	\
+		$(STATUS_11_SCALABLE)	\
+		$(STATUS_16_SCALABLE)	\
+		$(STATUS_22_SCALABLE)   \
+		$(STATUS_32_SCALABLE)	\
+		$(TOOLBAR_11)		\
+		$(TOOLBAR_16_SCALABLE)	\
+		$(TOOLBAR_22_SCALABLE)	\
+		$(TRAY_16_SCALABLE)	\
+		$(TRAY_22_SCALABLE)
 
 pidginbuttonpixdir = $(datadir)/pixmaps/pidgin/buttons
 pidginbuttonpix_DATA = edit.png pause.png info.png
@@ -18,3 +452,4 @@
 pidgindistpixdir = $(datadir)/pixmaps/pidgin
 pidgindistpix_DATA = logo.png arrow-down.xpm arrow-left.xpm arrow-right.xpm arrow-up.xpm
 
+nobase_dist_pidginpixmap_DATA = $(ANIMATIONS_16)
--- a/pidgin/pixmaps/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/Makefile.mingw	Mon Nov 05 00:35:07 2007 +0000
@@ -15,7 +15,16 @@
 install:
 	if test '$(SUBDIRS)'; then \
 	  list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if [ "$$subdir" != "icons/22" ]; then \
 	    $(MAKE) -C $$subdir -f $(MINGW_MAKEFILE) install || exit 1 ;\
+	  fi \
+	  done; \
+	fi;
+	if test '$(nobase_dist_pidginpixmap_DATA)'; then \
+	  list='$(nobase_dist_pidginpixmap_DATA)'; for file in $$list; do \
+	    dir=`dirname $$file`; \
+	    mkdir -p $(pidginpixmapdir)/$$dir; \
+	    cp $$file $(pidginpixmapdir)/$$dir/; \
 	  done; \
 	fi;
 	if test '$(pidginbuttonpix_DATA)'; then \
--- a/pidgin/pixmaps/animations/16/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-EXTRA_DIST = 	connect0.png \
-		connect1.png \
-		connect2.png \
-		connect3.png \
-		connect4.png \
-		connect5.png \
-		connect6.png \
-		connect7.png \
-		connect8.png \
-		typing0.png \
-		typing1.png \
-		typing2.png \
-		typing3.png \
-		typing4.png \
-		typing5.png
-
-pidginanimpixdir = $(datadir)/pixmaps/pidgin/animations/16
-pidginanimpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/animations/16/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginanimpix_DATA)'; then \
-	  mkdir -p $(pidginanimpixdir); \
-	  cp $(pidginanimpix_DATA) $(pidginanimpixdir); \
-	fi;
-
--- a/pidgin/pixmaps/animations/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-SUBDIRS = 16
-
-EXTRA_DIST = \
-	Makefile.mingw \
-	16/Makefile.mingw
--- a/pidgin/pixmaps/animations/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
--- a/pidgin/pixmaps/buddy_icons/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-SUBDIRS = qq
-
-EXTRA_DIST = \
-	Makefile.mingw \
-	qq/Makefile.mingw
--- a/pidgin/pixmaps/buddy_icons/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
--- a/pidgin/pixmaps/dialogs/16/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/dialogs/16/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = 	auth.png \
 		error.png \
 		info.png \
--- a/pidgin/pixmaps/dialogs/16/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-EXTRA_DIST = 	error.svg \
-	     	info.svg \
-		mail.svg
--- a/pidgin/pixmaps/dialogs/64/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/dialogs/64/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = 	auth.png \
 		cool.png \
 		dialog.png \
--- a/pidgin/pixmaps/dialogs/64/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-EXTRA_DIST =	auth.svg \
-		cool.svg \
-		dialog.svg \
-		error.svg \
-		info.svg \
-		question.svg \
-		warning.svg
--- a/pidgin/pixmaps/dialogs/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-SUBDIRS = 16 64
-
-EXTRA_DIST = \
-	Makefile.mingw \
-	16/Makefile.mingw \
-	64/Makefile.mingw
--- a/pidgin/pixmaps/dialogs/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
--- a/pidgin/pixmaps/emblems/16/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/emblems/16/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = 	aol-client.png \
 		birthday.png \
 		blocked.png \
--- a/pidgin/pixmaps/emblems/16/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-EXTRA_DIST =	aol-client.svg \
-		blocked.svg \
-		bot.svg \
-		external.svg \
-		female.svg \
-		free-for-chat.svg \
-		game.svg \
-		male.svg \
-		mobile.svg \
-		music.svg \
-		not-authorized.svg \
-		qq-member.svg \
-		secure.svg \
-		unavailable.svg \
-		video.svg \
-		voice.svg
--- a/pidgin/pixmaps/emblems/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-SUBDIRS = 16
-
-EXTRA_DIST = \
-	Makefile.mingw \
-	16/Makefile.mingw
--- a/pidgin/pixmaps/emblems/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
--- a/pidgin/pixmaps/emotes/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-SUBDIRS=default none
-
-EXTRA_DIST = Makefile.mingw
--- a/pidgin/pixmaps/emotes/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-.PHONY: install clean
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
-
-clean:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw clean || exit 1; \
-	  done; \
-	fi;
--- a/pidgin/pixmaps/emotes/default/24/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/emotes/default/24/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 SMILEYS = 	act-up.png \
     airplane.png \
     alien.png \
--- a/pidgin/pixmaps/emotes/default/24/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,189 +0,0 @@
-SMILEYS = 	act-up.svg \
-    airplane.svg \
-    alien.svg \
-    angel.svg \
-    angry.svg \
-    arrogant.svg \
-    at-wits-end.svg \
-    bad.svg \
-    bashful.svg \
-    beat-up.svg \
-    beauty.svg \
-    beer.svg \
-    blowkiss.svg \
-    bomb.svg \
-    bowl.svg \
-    boy.svg \
-    brb.svg \
-    bulgy-eyes.svg \
-    bye.svg \
-    cake.svg \
-    call-me.svg \
-    camera.svg \
-    can.svg \
-    car.svg \
-    cat.svg \
-    chicken.svg \
-    clap.svg \
-    clock.svg \
-    cloudy.svg \
-    clover.svg \
-    clown.svg \
-    coffee.svg \
-    coins.svg \
-    computer.svg \
-    confused.svg \
-    console.svg \
-    cowboy.svg \
-    cow.svg \
-    crying.svg \
-    curl-lip.svg \
-    curse.svg \
-    cute.svg \
-    cyclops.svg \
-    dance.svg \
-    dazed.svg \
-    desire.svg \
-    devil.svg \
-    disapointed.svg \
-    disdain.svg \
-    doctor.svg \
-    dog.svg \
-    doh.svg \
-    dont-know.svg \
-    drink.svg \
-    drool.svg \
-    eat.svg \
-    embarrassed.svg \
-    excruciating.svg \
-    eyeroll.svg \
-    female-fighter.svg \
-    film.svg \
-    fingers-crossed.svg \
-    flag.svg \
-    foot-in-mouth.svg \
-    freaked-out.svg \
-    ghost.svg \
-    giggle.svg \
-    girl.svg \
-    glasses-cool.svg \
-    glasses-nerdy.svg \
-    goat.svg \
-    go-away.svg \
-    good.svg \
-    hammer.svg \
-    handcuffs.svg \
-    handshake.svg \
-    highfive.svg \
-    hug-left.svg \
-    hug-right.svg \
-    hypnotized.svg \
-    in-love.svg \
-    island.svg \
-    jump.svg \
-    kissed.svg \
-    kissing.svg \
-    kiss.svg \
-    knife.svg \
-    lamp.svg \
-    lashes.svg \
-    laugh.svg \
-    liquor.svg \
-    loser.svg \
-    love-over.svg \
-    love.svg \
-    lying.svg \
-    madtongue.svg \
-    mail.svg \
-    male-fighter1.svg \
-    male-fighter2.svg \
-    mean.svg \
-    meeting.svg \
-    messed.svg \
-    mobile.svg \
-    mohawk.svg \
-    moneymouth.svg \
-    monkey.svg \
-    moon.svg \
-    msn-away.svg \
-    msn-busy.svg \
-    msn_online.svg \
-    msn.svg \
-    musical-note.svg \
-    music.svg \
-    nailbiting.svg \
-    neutral.svg \
-    on-the-phone.svg \
-    party.svg \
-    peace.svg \
-    phone.svg \
-    pig.svg \
-    pill.svg \
-    pirate.svg \
-    pissed-off.svg \
-    pizza.svg \
-    plate.svg \
-    poop.svg \
-    pray.svg \
-    present.svg \
-    qq.svg \
-    question.svg \
-    quiet.svg \
-    rainbow.svg \
-    rain.svg \
-    rose-dead.svg \
-    rose.svg \
-    rotfl.svg \
-    sad.svg \
-    sarcastic.svg \
-    search.svg \
-    secret.svg \
-    shame.svg \
-    sheep.svg \
-    shock.svg \
-    shout.svg \
-    shut-mouth.svg \
-    sick.svg \
-    sidefrown.svg \
-    sigarette.svg \
-    silly.svg \
-    sinister.svg \
-    skeleton.svg \
-    skywalker.svg \
-    sleepy.svg \
-    smile-big.svg \
-    smile.svg \
-    smirk.svg \
-    snail.svg \
-    snicker.svg \
-    snowman.svg \
-    soccerball.svg \
-    soldier.svg \
-    star.svg \
-    starving.svg \
-    stop.svg \
-    struggle.svg \
-    sun.svg \
-    sweat.svg \
-    talktohand.svg \
-    teeth.svg \
-    terror.svg \
-    thinking.svg \
-    thunder.svg \
-    time-out.svg \
-    tongue.svg \
-    tremble.svg \
-    turtle.svg \
-    tv.svg \
-    umbrella.svg \
-    vampire.svg \
-    victory.svg \
-    waiting.svg \
-    watermelon.svg \
-    waving.svg \
-    weep.svg \
-    wilt.svg \
-    wink.svg \
-    worship.svg \
-    yawn.svg \
-    yin-yang.svg
--- a/pidgin/pixmaps/emotes/default/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-SUBDIRS=24
-
-EXTRA_DIST= \
-	Makefile.mingw \
-	24/Makefile.mingw
--- a/pidgin/pixmaps/icons/16/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/icons/16/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = pidgin.png 
 
 pidginiconspixdir = $(datadir)/icons/hicolor/16x16/apps
--- a/pidgin/pixmaps/icons/16/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-EXTRA_DIST = 	pidgin.svg
--- a/pidgin/pixmaps/icons/22/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/icons/22/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = pidgin.png 
 
 pidginiconspixdir = $(datadir)/icons/hicolor/22x22/apps
--- a/pidgin/pixmaps/icons/22/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-EXTRA_DIST = 	pidgin.svg
--- a/pidgin/pixmaps/icons/24/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/icons/24/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = pidgin.png 
 
 pidginiconspixdir = $(datadir)/icons/hicolor/24x24/apps
--- a/pidgin/pixmaps/icons/24/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-EXTRA_DIST = 	pidgin.svg
--- a/pidgin/pixmaps/icons/32/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/icons/32/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = pidgin.png 
 
 pidginiconspixdir = $(datadir)/icons/hicolor/32x32/apps
--- a/pidgin/pixmaps/icons/32/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-EXTRA_DIST = 	pidgin.svg
--- a/pidgin/pixmaps/icons/48/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/icons/48/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = pidgin.png 
 
 pidginiconspixdir = $(datadir)/icons/hicolor/48x48/apps
--- a/pidgin/pixmaps/icons/48/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = pidgin.svg 
-
-pidginiconspixdir = $(datadir)/icons/hicolor/scalable/apps
-
-pidginiconspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/icons/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-SUBDIRS = 16 22 24 32 48
-
-EXTRA_DIST = \
-	Makefile.mingw \
-	16/Makefile.mingw \
-	24/Makefile.mingw \
-	32/Makefile.mingw \
-	48/Makefile.mingw
-
--- a/pidgin/pixmaps/icons/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-install:
-
-install_real:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if [ "$$subdir" != "22" ]; then \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  fi; \
-	  done; \
-	fi;
-
--- a/pidgin/pixmaps/protocols/16/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/protocols/16/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST =	aim.png \
 		bonjour.png \
 		gadu-gadu.png \
--- a/pidgin/pixmaps/protocols/16/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-EXTRA_DIST = 	aim.svg \
-		bonjour.svg \
-		gadu-gadu.svg \
-		novell.svg \
-		icq.svg \
-		irc.svg \
-		jabber.svg \
-		meanwhile.svg \
-		msn.svg \
-		qq.svg \
-		silc.svg \
-		simple.svg \
-		yahoo.svg \
-		zephyr.svg
--- a/pidgin/pixmaps/protocols/22/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/protocols/22/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST =	aim.png \
 		bonjour.png \
 		gadu-gadu.png \
--- a/pidgin/pixmaps/protocols/22/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-EXTRA_DIST = 	aim.svg \
-		bonjour.svg \
-		gadu-gadu.svg \
-		novell.svg \
-		icq.svg \
-		irc.svg \
-		jabber.svg \
-		meanwhile.svg \
-		msn.svg \
-		qq.svg \
-		silc.svg \
-		simple.svg \
-		yahoo.svg \
-		zephyr.svg
--- a/pidgin/pixmaps/protocols/48/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/protocols/48/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST =	aim.png \
 		bonjour.png \
 		gadu-gadu.png \
--- a/pidgin/pixmaps/protocols/48/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-EXTRA_DIST = 	aim.svg \
-		bonjour.svg \
-		gadu-gadu.svg \
-		google-talk.svg \
-		novell.svg \
-		icq.svg \
-		irc.svg \
-		jabber.svg \
-		meanwhile.svg \
-		msn.svg \
-		qq.svg \
-		silc.svg \
-		simple.svg \
-		yahoo.svg \
-		zephyr.svg
--- a/pidgin/pixmaps/protocols/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-SUBDIRS = 16 22 48
-
-EXTRA_DIST = \
-	Makefile.mingw \
-	16/Makefile.mingw \
-	22/Makefile.mingw \
-	48/Makefile.mingw
-
--- a/pidgin/pixmaps/protocols/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
--- a/pidgin/pixmaps/status/11/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/status/11/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,4 +1,4 @@
-SUBDIRS = scalable rtl
+SUBDIRS = rtl
 
 EXTRA_DIST = 	available.png \
 		away.png \
--- a/pidgin/pixmaps/status/11/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-EXTRA_DIST = 	available.svg \
-		away.svg \
-		busy.svg \
-		chat.svg \
-		extended-away.svg \
-		invisible.svg \
-		offline.svg \
-		person.svg
--- a/pidgin/pixmaps/status/16/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/status/16/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,4 +1,4 @@
-SUBDIRS = rtl scalable
+SUBDIRS = rtl
 
 EXTRA_DIST = 	available.png \
 		away.png \
--- a/pidgin/pixmaps/status/16/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-EXTRA_DIST = 	available.svg \
-		away.svg \
-		busy.svg \
-		chat.svg \
-		extended-away.svg \
-		log-in.svg \
-		log-out.svg \
-		message-pending.svg \
-		offline.svg \
-		person.svg
-
-#		half-operator.svg
-#		operator.svg
--- a/pidgin/pixmaps/status/22/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/status/22/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,4 +1,4 @@
-SUBDIRS = rtl scalable
+SUBDIRS = rtl
 
 EXTRA_DIST = 	available.png \
 		away.png \
--- a/pidgin/pixmaps/status/22/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-EXTRA_DIST = 	available.svg \
-		away.svg \
-		busy.svg \
-		chat.svg \
-		extended-away.svg \
-		log-in.svg \
-		log-out.svg \
-		offline.svg \
-		person.svg
--- a/pidgin/pixmaps/status/32/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/status/32/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,4 +1,4 @@
-SUBDIRS = rtl scalable
+SUBDIRS = rtl
 
 EXTRA_DIST = 	available.png \
 		away.png \
--- a/pidgin/pixmaps/status/32/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-EXTRA_DIST = 	available.svg \
-		away.svg \
-		busy.svg \
-		chat.svg \
-		extended-away.svg \
-		log-in.svg \
-		log-out.svg \
-		offline.svg \
-		person.svg
--- a/pidgin/pixmaps/status/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-SUBDIRS = 11 16 22 32 48
-
-EXTRA_DIST = \
-	Makefile.mingw \
-	11/Makefile.mingw \
-	11/rtl/Makefile.mingw \
-	16/Makefile.mingw \
-	16/rtl/Makefile.mingw \
-	22/Makefile.mingw \
-	22/rtl/Makefile.mingw \
-	32/Makefile.mingw \
-	32/rtl/Makefile.mingw \
-	48/Makefile.mingw \
-	48/rtl/Makefile.mingw
-
--- a/pidgin/pixmaps/status/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
--- a/pidgin/pixmaps/toolbar/16/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/toolbar/16/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = change-bgcolor.png \
 		change-fgcolor.png \
 		emote-select.png \
--- a/pidgin/pixmaps/toolbar/16/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-EXTRA_DIST = change-bgcolor.svg \
-		change-fgcolor.svg \
-		emote-select.svg \
-		font-size-down.svg \
-		font-size-up.svg
--- a/pidgin/pixmaps/toolbar/22/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/toolbar/22/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 EXTRA_DIST = select-avatar.png
 
 pidgintoolbarpixdir = $(datadir)/pixmaps/pidgin/toolbar/22
--- a/pidgin/pixmaps/toolbar/22/scalable/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-EXTRA_DIST = select-avatar.svg
--- a/pidgin/pixmaps/toolbar/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-SUBDIRS = 16 22
-
-TINY_ICONS = 11/message-new.png
-EXTRA_DIST = \
-	Makefile.mingw \
-	16/Makefile.mingw \
-	22/Makefile.mingw \
-	$(TINY_ICONS)
-
-pidgintinytoolbarpixdir = $(datadir)/pixmaps/pidgin/toolbar/11
-pidgintinytoolbarpix_DATA = $(TINY_ICONS)
--- a/pidgin/pixmaps/toolbar/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
--- a/pidgin/pixmaps/tray/16/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/tray/16/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 TRAY_ICONS =	tray-away.png \
 		tray-busy.png \
 		tray-invisible.png \
--- a/pidgin/pixmaps/tray/22/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/pixmaps/tray/22/Makefile.am	Mon Nov 05 00:35:07 2007 +0000
@@ -1,5 +1,3 @@
-SUBDIRS = scalable
-
 TRAY_ICONS =	tray-away.png \
 		tray-busy.png \
 		tray-connecting.png \
--- a/pidgin/pixmaps/tray/Makefile.am	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-SUBDIRS = 16 22 32 48
-
-EXTRA_DIST = \
-	Makefile.mingw \
-	16/Makefile.mingw \
-	22/Makefile.mingw \
-	32/Makefile.mingw \
-	48/Makefile.mingw
-
--- a/pidgin/pixmaps/tray/Makefile.mingw	Sun Nov 04 22:17:45 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
--- a/pidgin/win32/nsis/pidgin-installer.nsi	Sun Nov 04 22:17:45 2007 +0000
+++ b/pidgin/win32/nsis/pidgin-installer.nsi	Mon Nov 05 00:35:07 2007 +0000
@@ -698,6 +698,7 @@
 
     Delete "$INSTDIR\ca-certs\Equifax_Secure_CA.pem"
     Delete "$INSTDIR\ca-certs\GTE_CyberTrust_Global_Root.pem"
+    Delete "$INSTDIR\ca-certs\Microsoft_Secure_Server_Authority.pem"
     Delete "$INSTDIR\ca-certs\Verisign_Class3_Extended_Validation_CA.pem"
     Delete "$INSTDIR\ca-certs\Verisign_Class3_Primary_CA.pem"
     Delete "$INSTDIR\ca-certs\Verisign_RSA_Secure_Server_CA.pem"
@@ -750,6 +751,7 @@
     Delete "$INSTDIR\plugins\win2ktrans.dll"
     Delete "$INSTDIR\plugins\winprefs.dll"
     RMDir "$INSTDIR\plugins"
+    RMDir /r "$INSTDIR\sasl2"
     Delete "$INSTDIR\sounds\purple\alert.wav"
     Delete "$INSTDIR\sounds\purple\login.wav"
     Delete "$INSTDIR\sounds\purple\logout.wav"
@@ -757,23 +759,28 @@
     Delete "$INSTDIR\sounds\purple\send.wav"
     RMDir "$INSTDIR\sounds\purple"
     RMDir "$INSTDIR\sounds"
+    Delete "$INSTDIR\comerr32.dll"
     Delete "$INSTDIR\freebl3.dll"
+    Delete "$INSTDIR\gssapi32.dll"
     Delete "$INSTDIR\idletrack.dll"
+    Delete "$INSTDIR\k5sprt32.dll"
+    Delete "$INSTDIR\krb5_32.dll"
     Delete "$INSTDIR\libgtkspell.dll"
     Delete "$INSTDIR\libjabber.dll"
+    Delete "$INSTDIR\libmeanwhile-1.dll"
     Delete "$INSTDIR\liboscar.dll"
     Delete "$INSTDIR\libpurple.dll"
-    Delete "$INSTDIR\libmeanwhile-1.dll"
+    Delete "$INSTDIR\libsasl.dll"
+    Delete "$INSTDIR\libsilc-1-1-2.dll"
+    Delete "$INSTDIR\libsilcclient-1-1-2.dll"
     Delete "$INSTDIR\libxml2.dll"
     Delete "$INSTDIR\nspr4.dll"
     Delete "$INSTDIR\nss3.dll"
     Delete "$INSTDIR\nssckbi.dll"
+    Delete "$INSTDIR\pidgin.dll"
     Delete "$INSTDIR\pidgin.exe"
-    Delete "$INSTDIR\pidgin.dll"
     Delete "$INSTDIR\plc4.dll"
     Delete "$INSTDIR\plds4.dll"
-    Delete "$INSTDIR\libsilc-1-1-2.dll"
-    Delete "$INSTDIR\libsilcclient-1-1-2.dll"
     Delete "$INSTDIR\smime3.dll"
     Delete "$INSTDIR\softokn3.dll"
     Delete "$INSTDIR\ssl3.dll"
--- a/po/mk.po	Sun Nov 04 22:17:45 2007 +0000
+++ b/po/mk.po	Mon Nov 05 00:35:07 2007 +0000
@@ -11,7 +11,7 @@
 "Project-Id-Version: mk\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2007-09-28 15:32-0500\n"
-"PO-Revision-Date: 2007-09-09 21:21+0200\n"
+"PO-Revision-Date: 2007-11-03 22:57+0100\n"
 "Last-Translator: Arangel Angov <arangel@linux.net.mk>\n"
 "Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
 "MIME-Version: 1.0\n"
@@ -484,8 +484,7 @@
 
 #: ../finch/gntblist.c:1079
 msgid "Removing this contact will also remove all the buddies in the contact"
-msgstr ""
-"�����舒仆�于舒�亠 仆舒 仂于仂� 从仂仆�舒从� �亠 亞亳 仂����舒仆亳 亳 亟��亞亳�亠 仗�亳�舒�亠仍亳 于仂 从仂仆�舒从�仂�"
+msgstr "�����舒仆�于舒�亠 仆舒 仂于仂� 从仂仆�舒从� �亠 亞亳 仂����舒仆亳 亳 亟��亞亳�亠 仗�亳�舒�亠仍亳 于仂 从仂仆�舒从�仂�"
 
 #: ../finch/gntblist.c:1087
 msgid "Removing this group will also remove all the buddies in the group"
@@ -623,8 +622,7 @@
 msgstr "�仂于舒 亳仆��舒仆� 仗仂�舒从舒"
 
 #: ../finch/gntblist.c:2218 ../pidgin/gtkdialogs.c:769
-msgid ""
-"Please enter the screen name or alias of the person you would like to IM."
+msgid "Please enter the screen name or alias of the person you would like to IM."
 msgstr ""
 "�仆亠�亠�亠 亞仂 亳仄亠�仂 亳仍亳 舒仍亳�舒�仂� 仆舒 仗�亳�舒�亠仍仂� 仆舒 从仂� ��仂 �舒从舒�亠 亟舒 仄� "
 "亳�仗�舒�亳�亠 仗仂�舒从舒."
@@ -676,12 +674,10 @@
 msgstr "��仗�舒�亳 ��..."
 
 #: ../finch/gntblist.c:2251
-#, fuzzy
 msgid "Show empty groups"
 msgstr "�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳"
 
 #: ../finch/gntblist.c:2257
-#, fuzzy
 msgid "Show offline buddies"
 msgstr "�仂从舒亢亳 亳�从仍��亠仆亳 仗�亳�舒�亠仍亳"
 
@@ -698,17 +694,16 @@
 msgstr "�仂亟�亠亟亳 仗仂 亞仂仍亠仄亳仆舒 仆舒 仍仂亞"
 
 #: ../finch/gntcertmgr.c:86 ../pidgin/gtkcertmgr.c:188
-#, fuzzy
 msgid "Certificate Import"
-msgstr "�仂�� 亰舒 仗仂于�亰�于舒�亠"
+msgstr "丕于仂亰 仆舒 �亠��亳�亳从舒�"
 
 #: ../finch/gntcertmgr.c:87 ../pidgin/gtkcertmgr.c:189
 msgid "Specify a hostname"
-msgstr ""
+msgstr "�亟�亠亟亠�亠 亳仄亠 仆舒 �仂��"
 
 #: ../finch/gntcertmgr.c:88 ../pidgin/gtkcertmgr.c:190
 msgid "Type the host name this certificate is for."
-msgstr ""
+msgstr "�仆亠�亠�亠 亳仄亠 仆舒 �仂�� 亰舒 �亠��亳�亳从舒�仂�."
 
 #: ../finch/gntcertmgr.c:97 ../pidgin/gtkcertmgr.c:210
 #, c-format
@@ -716,19 +711,20 @@
 "File %s could not be imported.\n"
 "Make sure that the file is readable and in PEM format.\n"
 msgstr ""
+"�舒�仂�亠从舒�舒 %s 仆亠 仄仂亢亠 亟舒 弍亳亟亠 �于亠亰亠仆舒.\n"
+"��亳亞��舒��亠 �亠 亟亠从舒 亟舒�仂�亠从舒�舒 亠 �亳�仍亳于舒 于仂 PEM �仂�仄舒�.\n"
 
 #: ../finch/gntcertmgr.c:99 ../pidgin/gtkcertmgr.c:212
 msgid "Certificate Import Error"
-msgstr ""
+msgstr "��亠�从舒 仗�亳 �于仂亰 仆舒 �亠��亳�亳从舒�仂�"
 
 #: ../finch/gntcertmgr.c:100 ../pidgin/gtkcertmgr.c:213
 msgid "X.509 certificate import failed"
-msgstr ""
+msgstr "丕于仂亰仂� 仆舒 X.509 �亠��亳�亳从舒�仂� 仆亠 ��仗亠舒"
 
 #: ../finch/gntcertmgr.c:110 ../pidgin/gtkcertmgr.c:224
-#, fuzzy
 msgid "Select a PEM certificate"
-msgstr "�亰弍亠�亠�亠 亟舒�仂�亠从舒"
+msgstr "�亰弍亠�亠�亠 PEM �亠��亳�亳从舒�"
 
 #: ../finch/gntcertmgr.c:127 ../pidgin/gtkcertmgr.c:245
 #, c-format
@@ -739,20 +735,20 @@
 
 #: ../finch/gntcertmgr.c:129 ../pidgin/gtkcertmgr.c:247
 msgid "Certificate Export Error"
-msgstr ""
+msgstr "��亠�从舒 仗�亳 亳亰于仂亰 仆舒 �亠��亳�亳从舒�仂�"
 
 #: ../finch/gntcertmgr.c:130 ../pidgin/gtkcertmgr.c:248
 msgid "X.509 certificate export failed"
-msgstr ""
+msgstr "�亠 ��仗亠舒 亳亰于仂亰仂� 仆舒 X.509 �亠��亳�亳从舒�仂�"
 
 #: ../finch/gntcertmgr.c:159 ../pidgin/gtkcertmgr.c:299
 msgid "PEM X.509 Certificate Export"
-msgstr ""
+msgstr "�亰于仂亰 仆舒 �亠��亳�亳从舒� PEM X.509"
 
 #: ../finch/gntcertmgr.c:188
-#, fuzzy, c-format
+#, c-format
 msgid "Certificate for %s"
-msgstr "弌�舒��� 亰舒 %s"
+msgstr "弌亠��亳�亳从舒� 亰舒 %s"
 
 #: ../finch/gntcertmgr.c:195
 #, c-format
@@ -762,23 +758,27 @@
 "SHA1 fingerprint:\n"
 "%s"
 msgstr ""
+"Common name: %s\n"
+"\n"
+"SHA1 fingerprint:\n"
+"%s"
 
 #: ../finch/gntcertmgr.c:198
 msgid "SSL Host Certificate"
-msgstr ""
+msgstr "SSL �仂�� �亠��亳�亳从舒�"
 
 #: ../finch/gntcertmgr.c:233 ../pidgin/gtkcertmgr.c:372
 #, c-format
 msgid "Really delete certificate for %s?"
-msgstr ""
+msgstr "弌�于舒�仆仂 亟舒 亞仂 亳亰弍�亳�舒仆仄 �亠��亳�亳从舒�仂� 亰舒 %s?"
 
 #: ../finch/gntcertmgr.c:236 ../pidgin/gtkcertmgr.c:374
 msgid "Confirm certificate delete"
-msgstr ""
+msgstr "�仂�于�亟舒 亰舒 弍�亳�亠�亠 仆舒 �亠��亳�亳从舒�仂�"
 
 #: ../finch/gntcertmgr.c:293 ../pidgin/gtkcertmgr.c:602
 msgid "Certificate Manager"
-msgstr ""
+msgstr "�亠仆舒�亠� 亰舒 �亠��亳�亳从舒�亳"
 
 #. Creating the user splits
 #: ../finch/gntcertmgr.c:298 ../libpurple/protocols/bonjour/bonjour.c:652
@@ -835,8 +835,7 @@
 
 #: ../finch/gntconv.c:143 ../pidgin/gtkconv.c:489
 msgid "Syntax Error:  You typed the wrong number of arguments to that command."
-msgstr ""
-"��亠�从舒 于仂 �亳仆�舒从�舒�舒:  �仆亠�仂于�亠 仗仂亞�亠�亠仆 弍�仂� 仆舒 舒�亞�仄亠仆�亳 亰舒 �舒舒 从仂仄舒仆亟舒."
+msgstr "��亠�从舒 于仂 �亳仆�舒从�舒�舒:  �仆亠�仂于�亠 仗仂亞�亠�亠仆 弍�仂� 仆舒 舒�亞�仄亠仆�亳 亰舒 �舒舒 从仂仄舒仆亟舒."
 
 #: ../finch/gntconv.c:148 ../pidgin/gtkconv.c:495
 msgid "Your command failed for an unknown reason."
@@ -855,9 +854,8 @@
 msgstr "�于舒舒 从仂仄舒仆亟舒 仆亠 �舒弍仂�亳 �仂 仂于仂� 仗�仂�仂从仂仍."
 
 #: ../finch/gntconv.c:168
-#, fuzzy
 msgid "Message was not sent, because you are not signed on."
-msgstr "�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 仗�舒�舒�亠 仗�亠仄仆仂亞� 弍�亰仂:"
+msgstr "�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 仆亠 ��亠 仆舒�舒于亠仆亳."
 
 #: ../finch/gntconv.c:251
 #, c-format
@@ -887,10 +885,8 @@
 msgstr "�仂亞亳�舒�亠�仂 亰舒仗仂�仆舒. �亟仆亳�亠 仗仂�舒从亳 于仂 仂于仂� �舒亰亞仂于仂� �亠 弍亳亟舒� 仍仂亞亳�舒仆亳."
 
 #: ../finch/gntconv.c:393 ../pidgin/gtkconv.c:1370
-msgid ""
-"Logging stopped. Future messages in this conversation will not be logged."
-msgstr ""
-"�仂亞亳�舒�亠�仂 亠 亰舒仗�亠仆仂. �亟仆亳�亠 仗仂�舒从亳 于仂 仂于仂� �舒亰亞仂于仂� 仆亠仄舒 亟舒 弍亳亟舒� 仍仂亞亳�舒仆亳."
+msgid "Logging stopped. Future messages in this conversation will not be logged."
+msgstr "�仂亞亳�舒�亠�仂 亠 亰舒仗�亠仆仂. �亟仆亳�亠 仗仂�舒从亳 于仂 仂于仂� �舒亰亞仂于仂� 仆亠仄舒 亟舒 弍亳亟舒� 仍仂亞亳�舒仆亳."
 
 #: ../finch/gntconv.c:442
 msgid "Send To"
@@ -913,14 +909,12 @@
 msgstr "�仂亟舒� 亟亠���于仂 亰舒 仗�亳�舒�亠仍..."
 
 #: ../finch/gntconv.c:527
-#, fuzzy
 msgid "Enable Logging"
-msgstr "/�仗�亳亳/�于仂亰仄仂亢亳 仍仂亞亳�舒�亠"
+msgstr "�从仍��亳 仍仂亞亳�舒�亠"
 
 #: ../finch/gntconv.c:533
-#, fuzzy
 msgid "Enable Sounds"
-msgstr "�从仍��亳 亰于��亳:"
+msgstr "�从仍��亳 亰于��亳"
 
 #: ../finch/gntconv.c:739
 msgid "<AUTO-REPLY> "
@@ -1113,7 +1107,7 @@
 #: ../finch/gntft.c:431
 #, c-format
 msgid "The file was saved as %s."
-msgstr ""
+msgstr "�舒�仂�亠从舒�舒 亠 亰舒��于舒仆舒 从舒从仂 %s."
 
 #: ../finch/gntft.c:432 ../finch/gntft.c:433 ../pidgin/gtkft.c:163
 #: ../pidgin/gtkft.c:1116
@@ -1341,18 +1335,16 @@
 msgstr "�亟 于�亠仄亠 仆舒 于�亠仄亠"
 
 #: ../finch/gntpounce.c:618
-#, fuzzy
 msgid "Cannot create pounce"
-msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 仗�仂仄亠仆舒仄 仗�亠从舒�仂�"
+msgstr "�亠 仄仂亢舒仄 亟舒 从�亠亳�舒仄 亟亠���于仂"
 
 #: ../finch/gntpounce.c:619
-#, fuzzy
 msgid "You do not have any accounts."
-msgstr "�仂�舒 亟舒 仂亟�亠亟亳�亠 �仄亠�从舒."
+msgstr "�亠仄舒�亠 仆亳亠亟仆舒 �仄亠�从舒."
 
 #: ../finch/gntpounce.c:620
 msgid "You must create an account first before you can create a pounce."
-msgstr ""
+msgstr "�仂�舒 亟舒 从�亠亳�舒�亠 �仄亠�从舒 仗�亠亟 亟舒 从�亠亳�舒�亠 亟亠���于仂."
 
 #: ../finch/gntpounce.c:662 ../pidgin/gtkpounce.c:1096
 #, c-format
@@ -1771,7 +1763,7 @@
 
 #: ../finch/gntui.c:85
 msgid "Certificates"
-msgstr ""
+msgstr "弌亠��亳�亳从舒�亳"
 
 #: ../finch/gntui.c:89 ../pidgin/gtkprefs.c:2035
 msgid "Sounds"
@@ -1783,23 +1775,20 @@
 
 #: ../finch/plugins/gntclipboard.c:115 ../finch/plugins/gntclipboard.c:121
 #: ../finch/plugins/gntclipboard.c:128
-#, fuzzy
 msgid "Error loading the plugin."
-msgstr "弌亠 仗仂�舒于亳�舒 亞�亠�从亳 仗�亳 于舒亟亠�亠 仆舒 亟仂亟舒�仂从仂�."
+msgstr "��亠�从舒 仗�亳 于�亳��于舒�亠 仆舒 亟仂亟舒�仂从仂�."
 
 #: ../finch/plugins/gntclipboard.c:116
-#, fuzzy
 msgid "Couldn't find X display"
-msgstr "�亠 仄仂亢舒仄 亟舒 �舒 仂�于仂�舒仄 亟舒�仂�亠从舒�舒"
+msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 仆舒�亟舒仄 X 仗�亳从舒亰仂�"
 
 #: ../finch/plugins/gntclipboard.c:122
-#, fuzzy
 msgid "Couldn't find window"
-msgstr "�亠 仄仂亢舒仄 亟舒 �舒 仂�于仂�舒仄 亟舒�仂�亠从舒�舒"
+msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 仆舒�亟舒仄 仗�仂亰仂�亠�仂�"
 
 #: ../finch/plugins/gntclipboard.c:129
 msgid "This plugin cannot be loaded because it was not built with X11 support."
-msgstr ""
+msgstr "�仂亟舒�仂从仂� 仆亠 仄仂亢亠 亟舒 弍亳亟亠 于�亳�舒仆 仗仂�舒亟亳 �仂舒 ��仂 仆亠 亠 亳亰弍亳仍亟舒仆 �仂 仗仂亟��从舒 X11."
 
 #: ../finch/plugins/gntclipboard.c:158
 msgid "GntClipboard"
@@ -2026,7 +2015,7 @@
 
 #: ../libpurple/certificate.c:545
 msgid "(DOES NOT MATCH)"
-msgstr ""
+msgstr "(�� 弌� 弌������)"
 
 #. Make messages
 #: ../libpurple/certificate.c:549
@@ -2060,20 +2049,19 @@
 
 #. Make messages
 #: ../libpurple/certificate.c:1171
-#, fuzzy, c-format
+#, c-format
 msgid "Accept certificate for %s?"
-msgstr "��亳�舒�亳 �舒 仗仂从舒仆舒�舒 亰舒 �舒亰亞仂于仂�?"
+msgstr "��亳�舒�亳 �亠��亳�亳从舒� 亰舒 %s?"
 
 #. TODO: Find what the handle ought to be
 #: ../libpurple/certificate.c:1177
 msgid "SSL Certificate Verification"
-msgstr ""
+msgstr "��仂于亠�从舒 仆舒 SSL �亠��亳�亳从舒�"
 
 #. Number of actions
 #: ../libpurple/certificate.c:1186
-#, fuzzy
 msgid "Accept"
-msgstr "_��亳�舒�亳"
+msgstr "��亳�舒�亳"
 
 #: ../libpurple/certificate.c:1187 ../libpurple/protocols/qq/buddy_opt.c:214
 #: ../libpurple/protocols/qq/group_im.c:144
@@ -2085,7 +2073,7 @@
 
 #: ../libpurple/certificate.c:1188
 msgid "_View Certificate..."
-msgstr ""
+msgstr "_�亳亟亳 �亠��亳�亳从舒�..."
 
 #. Prompt the user to authenticate the certificate
 #. TODO: Provide the user with more guidance about why he is
@@ -2118,14 +2106,12 @@
 #. TODO: Probably wrong.
 #. TODO: Probably wrong
 #: ../libpurple/certificate.c:1339 ../libpurple/certificate.c:1416
-#, fuzzy
 msgid "SSL Certificate Error"
-msgstr "��亠�从舒 于仂 亰舒仗亳��于舒�亠�仂"
+msgstr "��亠�从舒 于仂 SSL �亠��亳�亳从舒�仂�"
 
 #: ../libpurple/certificate.c:1340
-#, fuzzy
 msgid "Invalid certificate chain"
-msgstr "�亠于舒仍亳亟亠仆 仆舒�仍仂于"
+msgstr "�亠于舒仍亳亟亠仆 �亳仆�亳� 仆舒 �亠��亳�亳从舒�亳"
 
 #. vrq will be completed by user_auth
 #: ../libpurple/certificate.c:1360
@@ -2136,8 +2122,7 @@
 
 #. vrq will be completed by user_auth
 #: ../libpurple/certificate.c:1382
-msgid ""
-"The root certificate this one claims to be issued by is unknown to Pidgin."
+msgid "The root certificate this one claims to be issued by is unknown to Pidgin."
 msgstr ""
 
 #: ../libpurple/certificate.c:1408
@@ -2166,18 +2151,16 @@
 
 #. TODO: Find what the handle ought to be
 #: ../libpurple/certificate.c:1890
-#, fuzzy
 msgid "Certificate Information"
-msgstr "�仆�仂�仄舒�亳亳 亰舒 �亠�于亠�仂�"
+msgstr "�仆�仂�仄舒�亳亳 亰舒 �亠��亳�亳从舒�仂�"
 
 #: ../libpurple/connection.c:107
 msgid "Registration Error"
 msgstr "��亠�从舒 于仂 �亠亞亳���舒�亳�舒�舒"
 
 #: ../libpurple/connection.c:180
-#, fuzzy
 msgid "Unregistration Error"
-msgstr "��亠�从舒 于仂 �亠亞亳���舒�亳�舒�舒"
+msgstr "��亠�从舒 仗�亳 亟亠�亠亞亠���舒�亳�舒"
 
 #: ../libpurple/connection.c:350
 #, c-format
@@ -2269,8 +2252,7 @@
 
 #: ../libpurple/dbus-server.h:85
 msgid "Purple's D-BUS server is not running for the reason listed below"
-msgstr ""
-"D-BUS �亠�于亠�仂� 仆舒 Purple 仆亠 �亠 亳亰于���于舒 仗仂�舒亟亳 仗�亳�亳仆亳�亠 仆舒于亠亟亠仆亳 仗仂亟仂仍�"
+msgstr "D-BUS �亠�于亠�仂� 仆舒 Purple 仆亠 �亠 亳亰于���于舒 仗仂�舒亟亳 仗�亳�亳仆亳�亠 仆舒于亠亟亠仆亳 仗仂亟仂仍�"
 
 #: ../libpurple/desktopitem.c:287 ../libpurple/desktopitem.c:878
 msgid "No name"
@@ -2462,38 +2444,31 @@
 
 #: ../libpurple/gconf/purple.schemas.in.h:3
 msgid "The command used to handle \"gg\" URLs, if enabled."
-msgstr ""
-"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��gg�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
+msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��gg�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
 
 #: ../libpurple/gconf/purple.schemas.in.h:4
 msgid "The command used to handle \"icq\" URLs, if enabled."
-msgstr ""
-"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��icq�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
+msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��icq�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
 
 #: ../libpurple/gconf/purple.schemas.in.h:5
 msgid "The command used to handle \"irc\" URLs, if enabled."
-msgstr ""
-"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��irc�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
+msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��irc�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
 
 #: ../libpurple/gconf/purple.schemas.in.h:6
 msgid "The command used to handle \"msnim\" URLs, if enabled."
-msgstr ""
-"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��msnim�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
+msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��msnim�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
 
 #: ../libpurple/gconf/purple.schemas.in.h:7
 msgid "The command used to handle \"sip\" URLs, if enabled."
-msgstr ""
-"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��sip�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
+msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��sip�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
 
 #: ../libpurple/gconf/purple.schemas.in.h:8
 msgid "The command used to handle \"xmpp\" URLs, if enabled."
-msgstr ""
-"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��xmpp�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
+msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��xmpp�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
 
 #: ../libpurple/gconf/purple.schemas.in.h:9
 msgid "The command used to handle \"ymsgr\" URLs, if enabled."
-msgstr ""
-"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��ymsgr�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
+msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��ymsgr�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂."
 
 #: ../libpurple/gconf/purple.schemas.in.h:10
 msgid "The handler for \"aim\" URLs"
@@ -2675,8 +2650,7 @@
 
 #: ../libpurple/log.c:1426 ../libpurple/log.c:1559
 msgid "<font color=\"red\"><b>Unable to find log path!</b></font>"
-msgstr ""
-"<font color=\"red\"><b>�亠 仄仂亢舒仄 亟舒 �舒 仆舒�亟舒仄 仗舒�亠从舒�舒 仆舒 仍仂亞仂�!</b></font>"
+msgstr "<font color=\"red\"><b>�亠 仄仂亢舒仄 亟舒 �舒 仆舒�亟舒仄 仗舒�亠从舒�舒 仆舒 仍仂亞仂�!</b></font>"
 
 #: ../libpurple/log.c:1438 ../libpurple/log.c:1568
 #, c-format
@@ -2754,8 +2728,7 @@
 #: ../libpurple/plugins/autoaccept.c:80
 #, c-format
 msgid "Autoaccepted file transfer of \"%s\" from \"%s\" completed."
-msgstr ""
-"�于�仂仄舒��从亳 仗�亳�舒�亠仆亳仂� 仗�亠仆仂� 仆舒 亟舒�仂�亠从亳 仆舒 \"%s\" 仂亟 \"%s\" 亠 亰舒于��亠仆."
+msgstr "�于�仂仄舒��从亳 仗�亳�舒�亠仆亳仂� 仗�亠仆仂� 仆舒 亟舒�仂�亠从亳 仆舒 \"%s\" 仂亟 \"%s\" 亠 亰舒于��亠仆."
 
 #: ../libpurple/plugins/autoaccept.c:82
 msgid "Autoaccept complete"
@@ -3090,8 +3063,7 @@
 
 #: ../libpurple/plugins/log_reader.c:1643
 msgid "Message could not be sent because the maximum length was exceeded."
-msgstr ""
-"�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 亠 仆舒亟仄亳仆舒�舒 仄舒从�亳仄舒仍仆舒�舒 亟仂仍亢亳仆舒."
+msgstr "�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 亠 仆舒亟仄亳仆舒�舒 仄舒从�亳仄舒仍仆舒�舒 亟仂仍亢亳仆舒."
 
 #: ../libpurple/plugins/log_reader.c:1648
 msgid "Message could not be sent."
@@ -3241,8 +3213,7 @@
 
 #: ../libpurple/plugins/offlinemsg.c:25 ../libpurple/plugins/offlinemsg.c:26
 msgid "Save messages sent to an offline user as pounce."
-msgstr ""
-"�舒��于舒� 亞亳 仗仂�舒从亳�亠 亳�仗�舒�亠仆亳 亟仂 仂�仍舒�仆 从仂�亳�仆亳�亳�亠 从舒从仂 亟亠���于仂 亰舒 仗�亳�舒�亠仍."
+msgstr "�舒��于舒� 亞亳 仗仂�舒从亳�亠 亳�仗�舒�亠仆亳 亟仂 仂�仍舒�仆 从仂�亳�仆亳�亳�亠 从舒从仂 亟亠���于仂 亰舒 仗�亳�舒�亠仍."
 
 #: ../libpurple/plugins/offlinemsg.c:95
 msgid ""
@@ -3267,8 +3238,7 @@
 
 #: ../libpurple/plugins/offlinemsg.c:161
 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
-msgstr ""
-"�仂亢亠�亠 亟舒 亞仂 ��亠亟�于舒�亠/弍�亳�亠�亠 亟亠���于仂�仂 仂亟 亟亳�舒仍仂亞仂� ���亠���于舒 亰舒 仗�亳�舒�亠仍亳��"
+msgstr "�仂亢亠�亠 亟舒 亞仂 ��亠亟�于舒�亠/弍�亳�亠�亠 亟亠���于仂�仂 仂亟 亟亳�舒仍仂亞仂� ���亠���于舒 亰舒 仗�亳�舒�亠仍亳��"
 
 #: ../libpurple/plugins/offlinemsg.c:165
 #: ../libpurple/protocols/msn/dialog.c:133
@@ -3540,10 +3510,8 @@
 msgstr "�亠 仄仂亢舒仄 亟舒 �仍��舒仄 亰舒 亟仂舒�舒�从亳 于��从亳\n"
 
 #: ../libpurple/protocols/bonjour/bonjour.c:137
-msgid ""
-"Unable to establish connection with the local mDNS server.  Is it running?"
-msgstr ""
-"�亠 仄仂亢舒仄 亟舒 于仂�仗仂��舒于舒仄 于��从舒 �仂 仍仂从舒仍仆亳仂� mDNS �亠�于亠�. �舒仍亳 �亠 亳亰于���于舒?"
+msgid "Unable to establish connection with the local mDNS server.  Is it running?"
+msgstr "�亠 仄仂亢舒仄 亟舒 于仂�仗仂��舒于舒仄 于��从舒 �仂 仍仂从舒仍仆亳仂� mDNS �亠�于亠�. �舒仍亳 �亠 亳亰于���于舒?"
 
 #. Creating the options for the protocol
 #: ../libpurple/protocols/bonjour/bonjour.c:351
@@ -3671,8 +3639,7 @@
 
 #: ../libpurple/protocols/gg/gg.c:270
 msgid "Your buddylist is empty, nothing was written to the file."
-msgstr ""
-"�舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳 亠 仗�舒亰仆舒, 仗舒 仆亳��仂 仆亠 �亠 亰舒仗亳�舒 于仂 亟舒�仂�亠从舒�舒."
+msgstr "�舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳 亠 仗�舒亰仆舒, 仗舒 仆亳��仂 仆亠 �亠 亰舒仗亳�舒 于仂 亟舒�仂�亠从舒�舒."
 
 #: ../libpurple/protocols/gg/gg.c:276 ../libpurple/protocols/gg/gg.c:278
 msgid "Couldn't open file"
@@ -4632,8 +4599,7 @@
 
 #: ../libpurple/protocols/irc/parse.c:150
 msgid "umode &lt;+|-&gt;&lt;A-Za-z&gt;:  Set or unset a user mode."
-msgstr ""
-"umode &lt;+|-&gt;&lt;A-Za-z&gt;:  �仂��舒于亳 亞仂 亳仍亳 ��亞仆亳 亞仂 从仂�亳�仆亳�从亳仂� �亠亢亳仄."
+msgstr "umode &lt;+|-&gt;&lt;A-Za-z&gt;:  �仂��舒于亳 亞仂 亳仍亳 ��亞仆亳 亞仂 从仂�亳�仆亳�从亳仂� �亠亢亳仄."
 
 #: ../libpurple/protocols/irc/parse.c:151
 msgid "version [nick]: send CTCP VERSION request to a user"
@@ -4661,8 +4627,7 @@
 
 #: ../libpurple/protocols/irc/parse.c:155
 msgid "whowas &lt;nick&gt;: Get information on a user that has logged off."
-msgstr ""
-"whowas &lt;nick&gt;: �仂弍亳��亠 亳仆�仂�仄舒�亳亳 亰舒 从仂�亳�仆亳从 从仂� ��仂 �亠 仂亟�舒于亳仍."
+msgstr "whowas &lt;nick&gt;: �仂弍亳��亠 亳仆�仂�仄舒�亳亳 亰舒 从仂�亳�仆亳从 从仂� ��仂 �亠 仂亟�舒于亳仍."
 
 #: ../libpurple/protocols/irc/parse.c:465
 #, c-format
@@ -4693,14 +4658,12 @@
 
 #: ../libpurple/protocols/jabber/adhoccommands.c:139
 #: ../libpurple/protocols/jabber/adhoccommands.c:140
-#, fuzzy
 msgid "Ad-Hoc Command Failed"
-msgstr "�仂仄舒仆亟舒�舒 亠 亳�从仍��亠仆舒"
+msgstr "�亟-�仂从 从仂仄舒仆亟舒�舒 仆亠 ��仗亠舒"
 
 #: ../libpurple/protocols/jabber/adhoccommands.c:173
-#, fuzzy
 msgid "execute"
-msgstr "�亠 亠 仂�亠从�于舒仆仂"
+msgstr "亳亰于��亳"
 
 #: ../libpurple/protocols/jabber/auth.c:53
 msgid "Server requires TLS/SSL for login.  No TLS/SSL support found."
@@ -4708,8 +4671,7 @@
 
 #: ../libpurple/protocols/jabber/auth.c:116
 msgid "Server requires plaintext authentication over an unencrypted stream"
-msgstr ""
-"弌亠�于亠�仂� 弍舒�舒 仗�仂于亠�从舒 仆舒 舒于�亠仆�亳�仆仂�� �仂 �亳�� �亠从�� 仗�亠从� 仆亠亠仆从�亳仗�亳�舒仆 �亠从"
+msgstr "弌亠�于亠�仂� 弍舒�舒 仗�仂于亠�从舒 仆舒 舒于�亠仆�亳�仆仂�� �仂 �亳�� �亠从�� 仗�亠从� 仆亠亠仆从�亳仗�亳�舒仆 �亠从"
 
 #: ../libpurple/protocols/jabber/auth.c:319
 #: ../libpurple/protocols/jabber/auth.c:508
@@ -4883,13 +4845,12 @@
 #: ../libpurple/protocols/jabber/buddy.c:815
 #: ../libpurple/protocols/jabber/buddy.c:975
 msgid "Last Activity"
-msgstr ""
+msgstr "�仂�仍亠亟仆舒 舒从�亳于仆仂��"
 
 #: ../libpurple/protocols/jabber/buddy.c:817
 #: ../libpurple/protocols/jabber/buddy.c:977
-#, fuzzy
 msgid "Service Discovery Info"
-msgstr "�仂��舒于亳 亳仆�仂�仄舒�亳亳 亰舒 亟亳�亠从�仂�亳�仄仂�"
+msgstr "�仆�仂�仄舒�亳亳 亰舒 仂�从�亳于舒�亠 仆舒 �亠�于亳�亳"
 
 #: ../libpurple/protocols/jabber/buddy.c:819
 #: ../libpurple/protocols/jabber/buddy.c:979
@@ -4898,21 +4859,18 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:821
 #: ../libpurple/protocols/jabber/buddy.c:981
-#, fuzzy
 msgid "Extended Stanza Addressing"
-msgstr "��仂�亳�亠仆舒 舒亟�亠�舒"
+msgstr "��仂�亳�亠仆舒 stanza 舒亟�亠�舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:823
 #: ../libpurple/protocols/jabber/buddy.c:983
-#, fuzzy
 msgid "Multi-User Chat"
-msgstr "�仍亳�舒� �舒亰亞仂于仂�"
+msgstr "��仍�亳-从仂�亳�仆亳�从亳 �舒亰亞仂于仂�"
 
 #: ../libpurple/protocols/jabber/buddy.c:825
 #: ../libpurple/protocols/jabber/buddy.c:985
-#, fuzzy
 msgid "Multi-User Chat Extended Presence Information"
-msgstr "�仂�亳�仆亳从仂� 仆亠仄舒 亳仆�仂�仄舒�亳亳 亰舒 亟亳�亠从�仂�亳�仄仂�."
+msgstr "�仆�仂�仄舒�亳亳 亰舒 仗�仂亟仂仍亠亢仆仂 仗�亳����于仂 亰舒 仄�仍�亳-从仂�亳�仆亳�从亳 �舒亰亞仂于仂�"
 
 #: ../libpurple/protocols/jabber/buddy.c:827
 #: ../libpurple/protocols/jabber/buddy.c:987
@@ -4921,9 +4879,8 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:829
 #: ../libpurple/protocols/jabber/buddy.c:989
-#, fuzzy
 msgid "Ad-Hoc Commands"
-msgstr "�仂仄舒仆亟舒"
+msgstr "�亟-�仂从 从仂仄舒仆亟亳"
 
 #: ../libpurple/protocols/jabber/buddy.c:831
 #: ../libpurple/protocols/jabber/buddy.c:991
@@ -4942,45 +4899,38 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:837
 #: ../libpurple/protocols/jabber/buddy.c:997
-#, fuzzy
 msgid "XHTML-IM"
-msgstr "HTML"
+msgstr "XHTML-IM"
 
 #: ../libpurple/protocols/jabber/buddy.c:839
 #: ../libpurple/protocols/jabber/buddy.c:999
-#, fuzzy
 msgid "In-Band Registration"
 msgstr "��亠�从舒 于仂 �亠亞亳���舒�亳�舒�舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:841
 #: ../libpurple/protocols/jabber/buddy.c:1001
-#, fuzzy
 msgid "User Location"
-msgstr "�仂从舒�亳�舒"
+msgstr "�仂从舒�亳�舒 仆舒 从仂�亳�仆亳从仂�"
 
 #: ../libpurple/protocols/jabber/buddy.c:843
 #: ../libpurple/protocols/jabber/buddy.c:1003
-#, fuzzy
 msgid "User Avatar"
-msgstr "��亠弍舒��于舒�亠 仆舒 从仂�亳�仆亳�亳"
+msgstr "�于舒�舒� 仆舒 从仂�亳�仆亳从仂�"
 
 #: ../libpurple/protocols/jabber/buddy.c:845
 #: ../libpurple/protocols/jabber/buddy.c:1005
-#, fuzzy
 msgid "Chat State Notifications"
-msgstr "�亰于亠���于舒�亠 亰舒 �仂��仂�弍舒�舒 仆舒 仗�亳�舒�亠仍仂�"
+msgstr "�亰于亠���于舒�亠 亰舒 �仂��仂�弍舒�舒 仆舒 �舒亰亞仂于仂�仂�"
 
 #: ../libpurple/protocols/jabber/buddy.c:847
 #: ../libpurple/protocols/jabber/buddy.c:1007
-#, fuzzy
 msgid "Software Version"
-msgstr "�亠仗仂亟亟�亢舒仆舒 于亠�亰亳�舒"
+msgstr "�亠�亰亳�舒 仆舒 �仂��于亠�仂�"
 
 #: ../libpurple/protocols/jabber/buddy.c:849
 #: ../libpurple/protocols/jabber/buddy.c:1009
-#, fuzzy
 msgid "Stream Initiation"
-msgstr "��亳亠仆�舒�亳�舒"
+msgstr "�仆亳�亳�舒�亠 仆舒 ���亳仄仂�"
 
 #: ../libpurple/protocols/jabber/buddy.c:851
 #: ../libpurple/protocols/jabber/buddy.c:1011
@@ -4990,21 +4940,18 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:853
 #: ../libpurple/protocols/jabber/buddy.c:1013
-#, fuzzy
 msgid "User Mood"
-msgstr "�仂�亳�仆亳�从亳 �亠亢亳仄亳"
+msgstr "�舒�仗仂仍仂亢亠仆亳亠 仆舒 从仂�亳�仆亳从仂�"
 
 #: ../libpurple/protocols/jabber/buddy.c:855
 #: ../libpurple/protocols/jabber/buddy.c:1015
-#, fuzzy
 msgid "User Activity"
-msgstr "�亳仄亳� 仆舒 从仂�亳�仆亳�亳"
+msgstr "�从�亳于仆仂�� 仆舒 从仂�亳�仆亳从仂�"
 
 #: ../libpurple/protocols/jabber/buddy.c:857
 #: ../libpurple/protocols/jabber/buddy.c:1017
-#, fuzzy
 msgid "Entity Capabilities"
-msgstr "�仂亢仆仂��亳"
+msgstr ""
 
 #: ../libpurple/protocols/jabber/buddy.c:859
 #: ../libpurple/protocols/jabber/buddy.c:1019
@@ -5013,106 +4960,93 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:861
 #: ../libpurple/protocols/jabber/buddy.c:1021
-#, fuzzy
 msgid "User Tune"
-msgstr "�仂�亳�仆亳�从仂 亳仄亠"
+msgstr ""
 
 #: ../libpurple/protocols/jabber/buddy.c:863
 #: ../libpurple/protocols/jabber/buddy.c:1023
-#, fuzzy
 msgid "Roster Item Exchange"
-msgstr "�仆��舒仆� 仗仂�舒从舒 �仂 �舒亰仄亠仆舒 仆舒 从仍��"
+msgstr ""
 
 #: ../libpurple/protocols/jabber/buddy.c:865
 #: ../libpurple/protocols/jabber/buddy.c:1025
-#, fuzzy
 msgid "Reachability Address"
-msgstr "�亟�亠�舒 亰舒 亠-仗仂��舒"
+msgstr ""
 
 #: ../libpurple/protocols/jabber/buddy.c:867
 #: ../libpurple/protocols/jabber/buddy.c:1027
-#, fuzzy
 msgid "User Profile"
-msgstr "��仂�亳仍"
+msgstr "�仂�亳�仆亳�从亳 仗�仂�亳仍"
 
 #: ../libpurple/protocols/jabber/buddy.c:869
 #: ../libpurple/protocols/jabber/buddy.c:1029
-#, fuzzy
 msgid "Jingle"
-msgstr "��亳从仍��亳 �亠"
+msgstr "Jingle"
 
 #: ../libpurple/protocols/jabber/buddy.c:871
 #: ../libpurple/protocols/jabber/buddy.c:1031
 msgid "Jingle Audio"
-msgstr ""
+msgstr "Jingle 舒�亟亳仂"
 
 #: ../libpurple/protocols/jabber/buddy.c:873
 #: ../libpurple/protocols/jabber/buddy.c:1033
-#, fuzzy
 msgid "User Nickname"
-msgstr "�仂�亳�仆亳�从仂 亳仄亠"
+msgstr "�仂�亳�仆亳�从亳 仗�亠从舒�"
 
 #: ../libpurple/protocols/jabber/buddy.c:875
 #: ../libpurple/protocols/jabber/buddy.c:1035
 msgid "Jingle ICE UDP"
-msgstr ""
+msgstr "Jingle ICE UDP"
 
 #: ../libpurple/protocols/jabber/buddy.c:877
 #: ../libpurple/protocols/jabber/buddy.c:1037
 msgid "Jingle ICE TCP"
-msgstr ""
+msgstr "Jingle ICE TCP"
 
 #: ../libpurple/protocols/jabber/buddy.c:879
 #: ../libpurple/protocols/jabber/buddy.c:1039
 msgid "Jingle Raw UDP"
-msgstr ""
+msgstr "Jingle Raw UDP"
 
 #: ../libpurple/protocols/jabber/buddy.c:881
 #: ../libpurple/protocols/jabber/buddy.c:1041
-#, fuzzy
 msgid "Jingle Video"
-msgstr "�亳亟亠仂 于仂 亢亳于仂"
+msgstr "Jingle 于亳亟亠仂"
 
 #: ../libpurple/protocols/jabber/buddy.c:883
 #: ../libpurple/protocols/jabber/buddy.c:1043
 msgid "Jingle DTMF"
-msgstr ""
+msgstr "Jingle DTMF"
 
 #: ../libpurple/protocols/jabber/buddy.c:885
 #: ../libpurple/protocols/jabber/buddy.c:1045
-#, fuzzy
 msgid "Message Receipts"
-msgstr "��亳仄亠仆舒 亠 仗仂�舒从舒"
+msgstr "��亳仄舒�亳 仆舒 仗仂�舒从舒�舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:887
 #: ../libpurple/protocols/jabber/buddy.c:1047
-#, fuzzy
 msgid "Public Key Publishing"
-msgstr "�舒于亠仆 仂�仗亠�舒�仂从 仂亟 从仍��仂�"
+msgstr "�弍�舒于�于舒�亠 仆舒 �舒于仆亳仂� 从仍��"
 
 #: ../libpurple/protocols/jabber/buddy.c:889
 #: ../libpurple/protocols/jabber/buddy.c:1049
-#, fuzzy
 msgid "User Chatting"
-msgstr "�仗�亳亳 亰舒 从仂�亳�仆亳从仂�"
+msgstr "�仂�亳�仆亳从仂� �舒亰亞仂于舒�舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:891
 #: ../libpurple/protocols/jabber/buddy.c:1051
-#, fuzzy
 msgid "User Browsing"
-msgstr "�仂�亳�仆亳�从亳 �亠亢亳仄亳"
+msgstr "�仂�亳�仆亳从仂� ����舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:893
 #: ../libpurple/protocols/jabber/buddy.c:1053
-#, fuzzy
 msgid "User Gaming"
-msgstr "�仂�亳�仆亳�从仂 亳仄亠"
+msgstr "�仂�亳�仆亳从仂� 亳亞�舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:895
 #: ../libpurple/protocols/jabber/buddy.c:1055
-#, fuzzy
 msgid "User Viewing"
-msgstr "�亳仄亳� 仆舒 从仂�亳�仆亳�亳"
+msgstr "�仂�亳�仆亳从仂� 亞仍亠亟舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:897
 #: ../libpurple/protocols/jabber/buddy.c:1057
@@ -5125,9 +5059,8 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:899
 #: ../libpurple/protocols/jabber/buddy.c:1059
-#, fuzzy
 msgid "Stanza Encryption"
-msgstr "Trillian 亠仆从�亳仗�亳�舒"
+msgstr "Stanza 亠仆从�亳仗�亳�舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:901
 #: ../libpurple/protocols/jabber/buddy.c:1061
@@ -5238,14 +5171,12 @@
 msgstr "��从舒亢亳"
 
 #: ../libpurple/protocols/jabber/buddy.c:1985
-#, fuzzy
 msgid "Log In"
-msgstr "�舒�舒于亠仆"
+msgstr "�舒�舒于舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:1989
-#, fuzzy
 msgid "Log Out"
-msgstr "�仂亞亳�舒� �舒亰亞仂于仂�亳"
+msgstr "�亟�舒于舒"
 
 #: ../libpurple/protocols/jabber/buddy.c:2035
 #: ../libpurple/protocols/jabber/jabber.c:1553
@@ -5448,7 +5379,7 @@
 
 #: ../libpurple/protocols/jabber/jabber.c:145
 msgid "You require encryption, but it is not available on this server."
-msgstr ""
+msgstr "�舒�舒�亠 亠仆从�亳仗�亳�舒, 仆仂 仆亠 亠 亟仂��舒仗仆舒 仆舒 仂于仂� �亠�于亠�."
 
 #: ../libpurple/protocols/jabber/jabber.c:259
 #: ../libpurple/protocols/jabber/jabber.c:312
@@ -5492,9 +5423,9 @@
 msgstr "�亠亞亳���亳�舒�亠�仂 仆舒 %s@%s 亠 ��仗亠�仆仂"
 
 #: ../libpurple/protocols/jabber/jabber.c:662
-#, fuzzy, c-format
+#, c-format
 msgid "Registration to %s successful"
-msgstr "�亠亞亳���亳�舒�亠�仂 仆舒 %s@%s 亠 ��仗亠�仆仂"
+msgstr "�亠亞亳���舒�亳�舒�舒 仆舒 %s 亠 ��仗亠�仆舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:664
 #: ../libpurple/protocols/jabber/jabber.c:665
@@ -5507,21 +5438,19 @@
 msgstr "�亠亞亳���亳�舒�亠�仂 仆亠 ��仗亠舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:692
-#, fuzzy, c-format
+#, c-format
 msgid "Registration from %s successfully removed"
-msgstr "�亠亞亳���亳�舒�亠�仂 仆舒 %s@%s 亠 ��仗亠�仆仂"
+msgstr "�亠亞亳���舒�亳�舒�舒 仂亟 %s 亠 ��仗亠�仆仂 仂����舒仆亠�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:694
 #: ../libpurple/protocols/jabber/jabber.c:695
-#, fuzzy
 msgid "Unregistration Successful"
-msgstr "�亠亞亳���亳�舒�亠�仂 亠 ��仗亠�仆仂"
+msgstr "�亠�亠亞亳���亳�舒�亠�仂 亠 ��仗亠�仆仂"
 
 #: ../libpurple/protocols/jabber/jabber.c:703
 #: ../libpurple/protocols/jabber/jabber.c:704
-#, fuzzy
 msgid "Unregistration Failed"
-msgstr "�亠亞亳���亳�舒�亠�仂 仆亠 ��仗亠舒"
+msgstr "�亠�亠亞亳���舒�亳�舒�舒 仆亠 ��仗亠舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:864
 #: ../libpurple/protocols/jabber/jabber.c:865
@@ -5553,17 +5482,12 @@
 msgstr "�舒��仄"
 
 #: ../libpurple/protocols/jabber/jabber.c:987
-#, fuzzy
 msgid "Unregister"
-msgstr "�亠亞亳���亳�舒�"
+msgstr "�亠�亠亞亳���亳�舒�"
 
 #: ../libpurple/protocols/jabber/jabber.c:994
-#, fuzzy
-msgid ""
-"Please fill out the information below to change your account registration."
-msgstr ""
-"�亠 仄仂仍舒仄, 仗仂仗仂仍仆亠�亠 亞亳 亳仆�仂�仄舒�亳亳�亠 仗仂亟仂仍� 亰舒 亟舒 �舒 �亠亞亳���亳�舒�亠 �舒�舒�舒 仆仂于舒 "
-"�仄亠�从舒."
+msgid "Please fill out the information below to change your account registration."
+msgstr "�亠 仄仂仍舒仄, 仗仂仗仂仍仆亠�亠 亞亳 亳仆�仂�仄舒�亳亳�亠 仗仂亟仂仍� 亰舒 亟舒 �舒 �仄亠仆亳�亠 �亠亞亳���舒�亳�舒�舒 亰舒 �舒�舒�舒 �仄亠�从舒."
 
 #: ../libpurple/protocols/jabber/jabber.c:997
 msgid "Please fill out the information below to register your new account."
@@ -5582,40 +5506,36 @@
 msgstr "�亠亞亳���亳�舒�"
 
 #: ../libpurple/protocols/jabber/jabber.c:1012
-#, fuzzy, c-format
+#, c-format
 msgid "Change Account Registration at %s"
-msgstr "��仂仄亠仆亳 从仂�亳�仆亳�从仂 亳仆�仂 亰舒 %s"
+msgstr "弌仄亠仆亠�亠 �舒 �亠亞亳���舒�亳�舒�舒 亰舒 �仄亠�从舒�舒 仆舒 %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:1013
-#, fuzzy, c-format
+#, c-format
 msgid "Register New Account at %s"
-msgstr "�亠亞亳���亳�舒� 仆仂于舒 XMPP �仄亠�从舒"
+msgstr "�亠亞亳���亳�舒��亠 仆仂于舒 �仄亠�从舒 仆舒 %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:1016
-#, fuzzy
 msgid "Change Registration"
-msgstr "弌仄亠仆亳 亞仂 ��舒���仂� 于仂"
+msgstr "弌仄亠仆亠�亠 �亠亞亳���舒�亳�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1120
 #: ../libpurple/protocols/jabber/jabber.c:1121
-#, fuzzy
 msgid "Error unregistering account"
-msgstr "��亠�从舒 仗�亳 仄亠仆�于舒�亠 仆舒 亳仆�仂�仄舒�亳亳 亰舒 �仄亠�从舒�舒"
+msgstr "��亠�从舒 仗�亳 亟亠�亠亞亳���舒�亳�舒 仆舒 �仄亠�从舒�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1126
 #: ../libpurple/protocols/jabber/jabber.c:1127
-#, fuzzy
 msgid "Account successfully unregistered"
-msgstr "丕�仗亠�仆仂 从�亠亳�舒于�亠 Qun"
+msgstr "弌仄亠�从舒�舒 亠 ��仗亠�仆仂 亟亠�亠亞亳���亳�舒仆舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1284
 msgid "Initializing Stream"
 msgstr "�仂 亳仆亳�亳�舒仍亳亰亳�舒仄 �亳��亠仄仂�"
 
 #: ../libpurple/protocols/jabber/jabber.c:1289
-#, fuzzy
 msgid "Initializing SSL/TLS"
-msgstr "�仂 亳仆亳�亳�舒仍亳亰亳�舒仄 �亳��亠仄仂�"
+msgstr "�仆亳�亳�舒仄 SSL/TLS"
 
 #: ../libpurple/protocols/jabber/jabber.c:1293
 #: ../libpurple/protocols/msn/session.c:351
@@ -5685,27 +5605,24 @@
 #: ../libpurple/protocols/jabber/jabber.c:1580
 #: ../libpurple/protocols/jabber/jabber.c:1603
 #: ../libpurple/protocols/jabber/jabber.c:1626
-#, fuzzy
 msgid "Mood Text"
-msgstr "��于仆舒 亞��仗舒"
+msgstr "丐亠从�� 亰舒 �舒�仗仂仍仂亢亠仆亳亠"
 
 #: ../libpurple/protocols/jabber/jabber.c:1535
 #: ../libpurple/protocols/jabber/jabber.c:1558
 #: ../libpurple/protocols/jabber/jabber.c:1581
 #: ../libpurple/protocols/jabber/jabber.c:1604
 #: ../libpurple/protocols/jabber/jabber.c:1627
-#, fuzzy
 msgid "Tune Artist"
-msgstr "���亳��亳"
+msgstr "���亳�� 亰舒 仗亠�仆舒�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1536
 #: ../libpurple/protocols/jabber/jabber.c:1559
 #: ../libpurple/protocols/jabber/jabber.c:1582
 #: ../libpurple/protocols/jabber/jabber.c:1605
 #: ../libpurple/protocols/jabber/jabber.c:1628
-#, fuzzy
 msgid "Tune Title"
-msgstr "�舒�仍仂于"
+msgstr "�舒�仍仂于 仆舒 仗亠�仆舒�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1537
 #: ../libpurple/protocols/jabber/jabber.c:1560
@@ -5713,7 +5630,7 @@
 #: ../libpurple/protocols/jabber/jabber.c:1606
 #: ../libpurple/protocols/jabber/jabber.c:1629
 msgid "Tune Album"
-msgstr ""
+msgstr "�仍弍�仄 亰舒 仗亠�仆舒�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1538
 #: ../libpurple/protocols/jabber/jabber.c:1561
@@ -5721,16 +5638,15 @@
 #: ../libpurple/protocols/jabber/jabber.c:1607
 #: ../libpurple/protocols/jabber/jabber.c:1630
 msgid "Tune Genre"
-msgstr ""
+msgstr "�舒仆� 亰舒 仗亠�仆舒�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1539
 #: ../libpurple/protocols/jabber/jabber.c:1562
 #: ../libpurple/protocols/jabber/jabber.c:1585
 #: ../libpurple/protocols/jabber/jabber.c:1608
 #: ../libpurple/protocols/jabber/jabber.c:1631
-#, fuzzy
 msgid "Tune Comment"
-msgstr "�仂仄亠仆�舒� 亰舒 仗�亳�舒�亠仍"
+msgstr "�仂仄亠仆�舒� 亰舒 仗亠�仆舒�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1540
 #: ../libpurple/protocols/jabber/jabber.c:1563
@@ -5746,7 +5662,7 @@
 #: ../libpurple/protocols/jabber/jabber.c:1610
 #: ../libpurple/protocols/jabber/jabber.c:1633
 msgid "Tune Time"
-msgstr ""
+msgstr "��亠仄亠 亰舒 仗亠�仆舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1542
 #: ../libpurple/protocols/jabber/jabber.c:1565
@@ -5754,7 +5670,7 @@
 #: ../libpurple/protocols/jabber/jabber.c:1611
 #: ../libpurple/protocols/jabber/jabber.c:1634
 msgid "Tune Year"
-msgstr ""
+msgstr "�仂亟亳仆舒 亰舒 仗亠�仆舒�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1543
 #: ../libpurple/protocols/jabber/jabber.c:1566
@@ -5762,16 +5678,15 @@
 #: ../libpurple/protocols/jabber/jabber.c:1612
 #: ../libpurple/protocols/jabber/jabber.c:1635
 msgid "Tune URL"
-msgstr ""
+msgstr "URL 亰舒 仗亠�仆舒�舒"
 
 #: ../libpurple/protocols/jabber/jabber.c:1545
 #: ../libpurple/protocols/jabber/jabber.c:1568
 #: ../libpurple/protocols/jabber/jabber.c:1591
 #: ../libpurple/protocols/jabber/jabber.c:1614
 #: ../libpurple/protocols/jabber/jabber.c:1637
-#, fuzzy
 msgid "Allow Buzz"
-msgstr "�仂亰于仂仍亳"
+msgstr "�仂亰于仂仍亳 buzz"
 
 #: ../libpurple/protocols/jabber/jabber.c:1665
 msgid "Password Changed"
@@ -6049,9 +5964,9 @@
 msgstr "�亠 ��仗亠舒于 亟舒 亞仂 亳���仍舒仄 从仂�亳�仆亳从仂� %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:2185
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to ping user %s"
-msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 弍舒仆亳�舒仄 从仂�亳�仆亳从仂� %s"
+msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 仗亳仆亞仆舒仄 从仂�亳�仆亳从仂� %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:2207
 #: ../libpurple/protocols/jabber/jabber.c:2217
@@ -6065,9 +5980,9 @@
 msgstr ""
 
 #: ../libpurple/protocols/jabber/jabber.c:2239
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to buzz, because the user %s does not support it."
-msgstr "�亠 仄仂亢亠 亟舒 亳�仗�舒�亳�亠 亟舒�仂�亠从舒 亟o %s, 从仂�亳�仆亳从仂� 仆亠 仗仂亟亟�亢�于舒 仗�亠仆仂�"
+msgstr ""
 
 #: ../libpurple/protocols/jabber/jabber.c:2253
 msgid "config:  Configure a chat room."
@@ -6122,15 +6037,14 @@
 msgstr "kick &lt;从仂�亳�仆亳从&gt; [�仂弍舒]:  ����仍亳 从仂�亳�仆亳从 仂亟 �仂弍舒�舒."
 
 #: ../libpurple/protocols/jabber/jabber.c:2318
-msgid ""
-"msg &lt;user&gt; &lt;message&gt;:  Send a private message to another user."
+msgid "msg &lt;user&gt; &lt;message&gt;:  Send a private message to another user."
 msgstr ""
 "msg &lt;从仂�亳�仆亳从&gt; &lt;仗仂�舒从舒&gt;:  ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 亟��亞 "
 "从仂�亳�仆亳从."
 
 #: ../libpurple/protocols/jabber/jabber.c:2324
 msgid "ping &lt;jid&gt;:\tPing a user/component/server."
-msgstr ""
+msgstr "ping &lt;jid&gt;:\t�亳仆亞仆亳 从仂�亳�仆亳从/从仂仄仗仂仆亠仆�舒/�亠�于亠�."
 
 #: ../libpurple/protocols/jabber/jabber.c:2329
 #: ../libpurple/protocols/yahoo/yahoo.c:4145
@@ -6159,7 +6073,7 @@
 
 #: ../libpurple/protocols/jabber/libxmpp.c:210
 msgid "Require SSL/TLS"
-msgstr ""
+msgstr "�舒�a SSL/TLS"
 
 #: ../libpurple/protocols/jabber/libxmpp.c:214
 msgid "Force old (port 5223) SSL"
@@ -6216,9 +6130,9 @@
 
 #: ../libpurple/protocols/jabber/message.c:307
 #: ../libpurple/protocols/yahoo/yahoo.c:4120
-#, fuzzy, c-format
+#, c-format
 msgid "%s has buzzed you!"
-msgstr "%s �亠 仆舒�舒于亳."
+msgstr "%s �亳 亳�仗�舒�亳 buzz!"
 
 #: ../libpurple/protocols/jabber/message.c:407
 #, c-format
@@ -6293,8 +6207,7 @@
 #: ../libpurple/protocols/jabber/si.c:857
 #, c-format
 msgid "Please select which resource of %s you would like to send a file to"
-msgstr ""
-"�亠 仄仂仍舒仄 亳亰弍亠�亠�亠 仆舒 从仂� �亠���� 仂亟 %s �舒从舒�亠 亟舒 仄� �舒 亳�仗�舒�亳�亠 亟舒�仂�亠从舒�舒"
+msgstr "�亠 仄仂仍舒仄 亳亰弍亠�亠�亠 仆舒 从仂� �亠���� 仂亟 %s �舒从舒�亠 亟舒 仄� �舒 亳�仗�舒�亳�亠 亟舒�仂�亠从舒�舒"
 
 #: ../libpurple/protocols/jabber/si.c:873
 msgid "Select a Resource"
@@ -6302,34 +6215,29 @@
 
 #: ../libpurple/protocols/jabber/usermood.c:179
 #: ../libpurple/protocols/jabber/usermood.c:180
-#, fuzzy
 msgid "Edit User Mood"
-msgstr "�仂�亳�仆亳�从亳 �亠亢亳仄亳"
+msgstr "丕�亠亟亳 �舒�仗仂仍仂 亢亠仆亳亠"
 
 #: ../libpurple/protocols/jabber/usermood.c:181
 msgid "Please select your mood from the list."
-msgstr ""
+msgstr "�亠 仄仂仍舒仄 亳亰弍亠�亠�亠 亞仂 �舒�仗仂仍仂亢亠仆亳亠�仂 仂亟 仍亳��舒�舒."
 
 #: ../libpurple/protocols/jabber/usermood.c:183
 #: ../libpurple/protocols/jabber/usernick.c:78
-#, fuzzy
 msgid "Set"
-msgstr "_�仂��舒于亳"
+msgstr "�仂��舒于亳"
 
 #: ../libpurple/protocols/jabber/usermood.c:191
-#, fuzzy
 msgid "Set Mood..."
-msgstr "��仗�舒�亳 ��..."
+msgstr "�仂��舒于亳 �舒�仗仂仍仂亢亠仆亳亠..."
 
 #: ../libpurple/protocols/jabber/usernick.c:76
-#, fuzzy
 msgid "Set User Nickname"
-msgstr "�仂��舒于亳 仍亳仄亳� 仆舒 从仂�亳�仆亳�亳"
+msgstr "�仂��舒于亳 从仂�亳�仆亳�从亳 仗�亠从舒�"
 
 #: ../libpurple/protocols/jabber/usernick.c:76
-#, fuzzy
 msgid "Please specify a new nickname for you."
-msgstr "�亠 仄仂仍舒仄 于仆亠�亠�亠 仆仂于仂 亳仄亠 亰舒 %s"
+msgstr "�亠 仄仂仍舒仄 仂亟�亠亟亠�亠 仆仂于 仗�亠从舒�."
 
 #: ../libpurple/protocols/jabber/usernick.c:77
 msgid ""
@@ -6338,19 +6246,16 @@
 msgstr ""
 
 #: ../libpurple/protocols/jabber/usernick.c:99
-#, fuzzy
 msgid "Set Nickname..."
-msgstr "��亠从舒�"
+msgstr "�仂��舒于亳 仗�亠从舒�..."
 
 #: ../libpurple/protocols/jabber/xdata.c:378
-#, fuzzy
 msgid "Actions"
-msgstr "�亠���于仂"
+msgstr "�亠���于舒"
 
 #: ../libpurple/protocols/jabber/xdata.c:380
-#, fuzzy
 msgid "Select an action"
-msgstr "�亰弍亠�亠�亠 亟舒�仂�亠从舒"
+msgstr "�亰弍亠�亠�亠 亟亠���于仂"
 
 #: ../libpurple/protocols/msn/dialog.c:110
 #, c-format
@@ -6660,12 +6565,12 @@
 
 #: ../libpurple/protocols/msn/msn.c:130
 msgid "Nudge"
-msgstr ""
+msgstr "Nudge"
 
 #: ../libpurple/protocols/msn/msn.c:131
-#, fuzzy, c-format
+#, c-format
 msgid "%s has nudged you!"
-msgstr "%s �亠 仆舒�舒于亳."
+msgstr "%s �亳 亳�仗�舒�亳 nudge!"
 
 #: ../libpurple/protocols/msn/msn.c:132
 #, c-format
@@ -7066,9 +6971,8 @@
 msgstr "�仂�亳��亳 亞仂 HTTP 仄亠�仂亟仂�"
 
 #: ../libpurple/protocols/msn/msn.c:2199
-#, fuzzy
 msgid "HTTP Method Server"
-msgstr "IPC �亠�� �亠�于亠�"
+msgstr "HTTP 仄亠�仂亟 亰舒 �亠�于亠�"
 
 #: ../libpurple/protocols/msn/msn.c:2204
 msgid "Show custom smileys"
@@ -7231,8 +7135,7 @@
 msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仆舒�舒于舒仄: %s"
 
 #: ../libpurple/protocols/msn/session.c:325
-msgid ""
-"Your MSN buddy list is temporarily unavailable. Please wait and try again."
+msgid "Your MSN buddy list is temporarily unavailable. Please wait and try again."
 msgstr ""
 "�舒�舒�舒 仍亳��舒 仆舒 仗�亳�舒�亠仍亳 仂亟 MSN 亠 仄仂仄亠仆�舒仍仆仂 仆亠亟仂��舒仗仆舒. �亠 仄仂仍舒仄 仗仂�亠从舒��亠 "
 "亳 仗�仂弍舒��亠 仗舒从."
@@ -7284,8 +7187,7 @@
 
 #: ../libpurple/protocols/msn/switchboard.c:416
 msgid "Message could not be sent because a connection error occurred:"
-msgstr ""
-"�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 弍亳亟亠 亳�仗�舒�亠仆舒 弍亳亟亠��亳 �亠 仗仂�舒于亳 亞�亠�从舒 �仂 于��从舒�舒:"
+msgstr "�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 弍亳亟亠 亳�仗�舒�亠仆舒 弍亳亟亠��亳 �亠 仗仂�舒于亳 亞�亠�从舒 �仂 于��从舒�舒:"
 
 #: ../libpurple/protocols/msn/switchboard.c:420
 msgid "Message could not be sent because we are sending too quickly:"
@@ -7301,8 +7203,7 @@
 "仄亳仆��亳."
 
 #: ../libpurple/protocols/msn/switchboard.c:431
-msgid ""
-"Message could not be sent because an error with the switchboard occurred:"
+msgid "Message could not be sent because an error with the switchboard occurred:"
 msgstr ""
 "�仂�舒从舒�舒 仆亠 仄仂亢亠�亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 �亠 �仍��亳 亞�亠�从舒 �仂 从仂仆��仂仍仆舒�舒 "
 "�舒弍仍舒:"
@@ -7331,9 +7232,8 @@
 msgstr "�仄亠�仂 亰舒 亠从�舒仆仂� 亠 仆亠于舒仍亳亟仆仂."
 
 #: ../libpurple/protocols/myspace/myspace.c:111
-#, fuzzy
 msgid "Missing Cipher"
-msgstr "丿亳��舒"
+msgstr "�亠亟仂��舒��于舒 cipher"
 
 #: ../libpurple/protocols/myspace/myspace.c:112
 msgid "The RC4 cipher could not be found"
@@ -7356,22 +7256,19 @@
 #: ../libpurple/protocols/myspace/myspace.c:292
 #: ../libpurple/protocols/myspace/myspace.c:1801
 msgid "MySpaceIM Error"
-msgstr ""
+msgstr "��亠�从舒 �仂 MySpaceIM"
 
 #: ../libpurple/protocols/myspace/myspace.c:349
-#, fuzzy
 msgid "Reading challenge"
-msgstr "��亠�从舒 于仂 �亳�舒�亠�仂"
+msgstr ""
 
 #: ../libpurple/protocols/myspace/myspace.c:355
-#, fuzzy
 msgid "Unexpected challenge length from server"
-msgstr "�亠于舒仍亳亟亠仆 仗�亠亟亳亰于亳从 仂亟 �亠�于亠�仂�"
+msgstr "�亠于舒仍亳亟亠仆 亟仂仍亢亳仆舒 仆舒 仗�亠亟亳亰于亳从 仂亟 �亠�于亠�仂�"
 
 #: ../libpurple/protocols/myspace/myspace.c:359
-#, fuzzy
 msgid "Logging in"
-msgstr "�仂亞亳�舒�亠"
+msgstr "弌亠 仆舒�舒于�于舒仄"
 
 #: ../libpurple/protocols/myspace/myspace.c:1286
 #, c-format
@@ -7380,29 +7277,28 @@
 
 #. Can't write _()'d strings in array initializers. Workaround.
 #: ../libpurple/protocols/myspace/myspace.c:1328
-#, fuzzy
 msgid "New mail messages"
-msgstr "��仗�舒�亳 仗仂�舒从舒"
+msgstr "�仂于舒 仗仂��舒"
 
 #: ../libpurple/protocols/myspace/myspace.c:1329
 msgid "New blog comments"
-msgstr ""
+msgstr "�仂于亳 从仂仄亠仆�舒�亳 仆舒 弍仍仂亞"
 
 #: ../libpurple/protocols/myspace/myspace.c:1330
 msgid "New profile comments"
-msgstr ""
+msgstr "�仂于亳 从仂仄亠仆�舒�亳 仆舒 仗�仂�亳仍仂�"
 
 #: ../libpurple/protocols/myspace/myspace.c:1331
 msgid "New friend requests!"
-msgstr ""
+msgstr "�仂于亳 弍舒�舒�舒 亰舒 仗�亳�舒�亠仍亳!"
 
 #: ../libpurple/protocols/myspace/myspace.c:1332
 msgid "New picture comments"
-msgstr ""
+msgstr "�仂于亳 从仂仄亠仆�舒�亳 仆舒 �仍亳从舒"
 
 #: ../libpurple/protocols/myspace/myspace.c:1360
 msgid "MySpace"
-msgstr ""
+msgstr "MySpace"
 
 #. The session is now set up, ready to be connected. This emits the
 #. * signedOn signal, so clients can now do anything with msimprpl, and
@@ -7414,90 +7310,81 @@
 
 #: ../libpurple/protocols/myspace/myspace.c:1554
 #: ../libpurple/protocols/myspace/myspace.c:1556
-#, fuzzy
 msgid "No username set"
-msgstr "�亠仄舒 亳仄亠"
+msgstr "�亠 亠 仗仂��舒于亠仆仂 从仂�亳�仆亳�从仂 亳仄亠"
 
 #: ../libpurple/protocols/myspace/myspace.c:1555
 msgid ""
 "Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile."
 "username and choose a username and try to login again."
 msgstr ""
+"�亠 仄仂仍舒仄 仂亟亠�亠 仆舒 http://editprofile.myspace.com/index.cfm?fuseaction=profile."
+"username 亳 仂亟弍亠�亠�亠 从仂�亳�仆亳�从仂 亳仄亠 亳 仗�仂弍舒��亠 亟舒 �亠 仆舒�舒于亳�亠."
 
 #: ../libpurple/protocols/myspace/myspace.c:1782
-#, fuzzy, c-format
+#, c-format
 msgid "Protocol error, code %d: %s"
-msgstr "��仂�亠�仂� 于�舒�亳 从仂亟 仆舒 亞�亠�从舒 %d"
+msgstr "��亠�从舒 于仂 仗�仂�仂从仂仍仂�, 从仂亟 %d: %s"
 
 #: ../libpurple/protocols/myspace/myspace.c:1972
 #: ../libpurple/protocols/myspace/myspace.c:2006
-#, fuzzy
 msgid "Failed to add buddy"
-msgstr "�亠 仄仂亢舒仄 亟舒 仗�亳从仍��舒仄 仗�亳�舒�亠仍 于仂 �舒亰亞仂于仂�仂�"
+msgstr "�亠 ��仗亠舒于 亟舒 亞仂 亟仂亟舒亟舒仄 仗�亳�舒�亠仍仂�"
 
 #: ../libpurple/protocols/myspace/myspace.c:1972
-#, fuzzy
 msgid "'addbuddy' command failed."
-msgstr "��亳�舒� �舒 仍亳��舒�舒 �仂 仗�亳�舒�亠仍亳 仂亟 亟舒�仂�亠从舒..."
+msgstr "从仂仄舒仆亟舒�舒 'addbuddy' 仆亠 ��仗亠舒."
 
 #: ../libpurple/protocols/myspace/myspace.c:2006
 #: ../libpurple/protocols/myspace/myspace.c:2247
-#, fuzzy
 msgid "persist command failed"
-msgstr "�仂仆��仂仍仆舒�舒 �舒弍仍舒 仆亠 ��仗亠舒"
+msgstr "从仂仄舒仆亟舒�舒 persist 仆亠 ��仗亠舒"
 
 #: ../libpurple/protocols/myspace/myspace.c:2115
 #, c-format
 msgid "No such user: %s"
-msgstr ""
+msgstr "�亠仄舒 �舒从仂于 从仂�亳�仆亳从: %s"
 
 #: ../libpurple/protocols/myspace/myspace.c:2116
-#, fuzzy
 msgid "User lookup"
-msgstr "�仂�亳�仆亳�从亳 �仂弍亳"
+msgstr "��仂于亠�从舒 仆舒 从仂�亳�仆亳从仂�"
 
 #: ../libpurple/protocols/myspace/myspace.c:2228
 #: ../libpurple/protocols/myspace/myspace.c:2247
 #: ../libpurple/protocols/myspace/myspace.c:2269
-#, fuzzy
 msgid "Failed to remove buddy"
-msgstr "�亠 仄仂亢舒仄 亟舒 仗�亳从仍��舒仄 仗�亳�舒�亠仍 于仂 �舒亰亞仂于仂�仂�"
+msgstr "�亠 ��仗亠舒于 亟舒 亞仂 仂����舒仆舒仄 仗�亳�舒�亠仍仂�"
 
 #: ../libpurple/protocols/myspace/myspace.c:2228
 msgid "'delbuddy' command failed"
 msgstr ""
 
 #: ../libpurple/protocols/myspace/myspace.c:2269
-#, fuzzy
 msgid "blocklist command failed"
-msgstr "�仂仆��仂仍仆舒�舒 �舒弍仍舒 仆亠 ��仗亠舒"
+msgstr "从仂仄舒仆亟舒�舒 blocklist 仆亠 ��仗亠舒"
 
 #: ../libpurple/protocols/myspace/myspace.c:2315
-#, fuzzy
 msgid "Invalid input condition"
-msgstr "��亳于���于舒�亠 仆舒 仗仂于�亰�于舒�亠�仂"
+msgstr "�亠于舒仍亳亟亠仆 于仍亠亰亠仆 ��仍仂于"
 
 #. TODO: g_realloc like msn, yahoo, irc, jabber?
 #: ../libpurple/protocols/myspace/myspace.c:2333
 #: ../libpurple/protocols/myspace/myspace.c:2364
-#, fuzzy
 msgid "Read buffer full"
-msgstr "�亠亟仂� 亠 仗仂仍仆"
+msgstr "�舒�亠�仂� 亠 仗仂仍仆"
 
 #: ../libpurple/protocols/myspace/myspace.c:2402
-#, fuzzy
 msgid "Unparseable message"
-msgstr "�亠 仄仂亢舒仄 亟舒 �舒 舒仆舒仍亳亰亳�舒仄 仗仂�舒从舒�舒"
+msgstr "�仂�舒从舒 ��仂 仆亠 仄仂亢亠 亟舒 �亠 仗舒��亳�舒"
 
 #: ../libpurple/protocols/myspace/myspace.c:2471
-#, fuzzy, c-format
+#, c-format
 msgid "Couldn't connect to host: %s (%d)"
-msgstr "�亠 仄仂亢亠 亟舒 �亠 于�亰亠 �仂 �亠�于亠�仂�"
+msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仗仂于�亰舒仄 �仂 �仂��仂�: %s (%d)"
 
 #: ../libpurple/protocols/myspace/myspace.c:2642
-#, fuzzy
 msgid "IM Friends"
-msgstr "_��仂亰仂��亳 亰舒 仗仂�舒从亳"
+msgstr "IM 仗�亳�舒�亠仍亳"
 
 #: ../libpurple/protocols/myspace/myspace.c:2741
 #, c-format
@@ -7507,30 +7394,26 @@
 msgstr ""
 
 #: ../libpurple/protocols/myspace/myspace.c:2742
-#, fuzzy
 msgid "Add contacts from server"
-msgstr "�亠于舒仍亳亟亠仆 仂亟亞仂于仂� 仂亟 �亠�于亠�仂�."
+msgstr "�仂亟舒� 从仂仆�舒从�亳 仂亟 �亠�于亠�仂�"
 
 #: ../libpurple/protocols/myspace/myspace.c:2794
 #: ../libpurple/protocols/myspace/myspace.c:2859
 msgid "Add friends from MySpace.com"
-msgstr ""
+msgstr "�仂亟舒� 仗�亳�舒�亠仍亳 仂亟 MySpace.com"
 
 #: ../libpurple/protocols/myspace/myspace.c:2795
-#, fuzzy
 msgid "Importing friends failed"
-msgstr "于�亳��于舒�亠�仂 仆舒 亟仂亟舒�仂从仂� 仆亠 ��仗亠舒"
+msgstr "丕于仂亰仂� 仆舒 仗�亳�舒�亠仍亳 仆亠 ��仗亠舒"
 
 #. TODO: find out how
 #: ../libpurple/protocols/myspace/myspace.c:2851
-#, fuzzy
 msgid "Find people..."
 msgstr "�舒�亟亳 仗�亳�舒�亠仍亳..."
 
 #: ../libpurple/protocols/myspace/myspace.c:2854
-#, fuzzy
 msgid "Change IM name..."
-msgstr "��仂仄亠仆亳 �舒 仍仂亰亳仆从舒�舒..."
+msgstr "��仂仄亠仆亳 亞仂 IM 亳仄亠�仂..."
 
 #: ../libpurple/protocols/myspace/myspace.c:3156
 msgid "myim URL handler"
@@ -7553,17 +7436,16 @@
 msgstr ""
 
 #: ../libpurple/protocols/myspace/myspace.c:3289
-#, fuzzy
 msgid "Send emoticons"
-msgstr "�仗�亳亳 亰舒 亰于�从"
+msgstr "��仗�舒�亳 亠仄仂�亳亳"
 
 #: ../libpurple/protocols/myspace/myspace.c:3294
 msgid "Screen resolution (dots per inch)"
-msgstr ""
+msgstr "�亠亰仂仍��亳�舒 仆舒 亠从�舒仆仂� (�仂�从亳 仗仂 亳仆�)"
 
 #: ../libpurple/protocols/myspace/myspace.c:3297
 msgid "Base font size (points)"
-msgstr ""
+msgstr "��仆仂于仆舒 亞仂仍亠仄亳仆舒 仆舒 �仂仆� (points)"
 
 #: ../libpurple/protocols/myspace/user.c:95
 #: ../libpurple/protocols/zephyr/zephyr.c:786
@@ -7578,36 +7460,33 @@
 msgstr "��仂�亳仍"
 
 #: ../libpurple/protocols/myspace/user.c:124
-#, fuzzy
 msgid "Headline"
-msgstr "_��亠从舒�:"
+msgstr "�舒�仍仂于"
 
 #: ../libpurple/protocols/myspace/user.c:129
-#, fuzzy
 msgid "Song"
-msgstr "�于��亳"
+msgstr "�亠�仆舒"
 
 #: ../libpurple/protocols/myspace/user.c:134
 msgid "Total Friends"
-msgstr ""
+msgstr "�从�仗仆仂 仗�亳�舒�亠仍亳"
 
 #: ../libpurple/protocols/myspace/user.c:145
 #: ../libpurple/protocols/myspace/user.c:148
 #: ../libpurple/protocols/myspace/user.c:151
-#, fuzzy
 msgid "Client Version"
-msgstr "�舒�于仂�亳 �舒亰亞仂于仂�"
+msgstr "�亠�亰亳�舒 仆舒 从仍亳亠仆�仂�"
 
 #. TODO: icons for each zap
 #: ../libpurple/protocols/myspace/zap.c:44
 #: ../libpurple/protocols/myspace/zap.c:177
 msgid "Zap"
-msgstr ""
+msgstr "Zap"
 
 #: ../libpurple/protocols/myspace/zap.c:44
-#, fuzzy, c-format
+#, c-format
 msgid "%s has zapped you!"
-msgstr "%s �亠 仆舒�舒于亳."
+msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:44
 #, c-format
@@ -7619,24 +7498,23 @@
 msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:45
-#, fuzzy, c-format
+#, c-format
 msgid "%s has whacked you!"
-msgstr "�仂�亳�仆亳从仂� �亠 弍仍仂从亳�舒仍"
+msgstr "%s �亠 ��亠�仆舒!"
 
 #: ../libpurple/protocols/myspace/zap.c:45
 #, c-format
 msgid "Whacking %s..."
-msgstr ""
+msgstr "�仂 ��亠�从舒仄 %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:46
-#, fuzzy
 msgid "Torch"
-msgstr "�舒�仍仂于"
+msgstr "个舒从亠仍"
 
 #: ../libpurple/protocols/myspace/zap.c:46
-#, fuzzy, c-format
+#, c-format
 msgid "%s has torched you!"
-msgstr "�仂�亳�仆亳从仂� �亠 弍仍仂从亳�舒仍"
+msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:46
 #, c-format
@@ -7648,9 +7526,9 @@
 msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:47
-#, fuzzy, c-format
+#, c-format
 msgid "%s has smooched you!"
-msgstr "%s �亠 仆舒�舒于亳."
+msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:47
 #, c-format
@@ -7659,27 +7537,26 @@
 
 #: ../libpurple/protocols/myspace/zap.c:48
 msgid "Hug"
-msgstr ""
+msgstr "���从舒"
 
 #: ../libpurple/protocols/myspace/zap.c:48
-#, fuzzy, c-format
+#, c-format
 msgid "%s has hugged you!"
-msgstr "%s �亠 仆舒�舒于亳."
+msgstr "%s �亠 亞��仆舒!"
 
 #: ../libpurple/protocols/myspace/zap.c:48
 #, c-format
 msgid "Hugging %s..."
-msgstr ""
+msgstr "�仂/�舒 亞��从舒仄 %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:49
-#, fuzzy
 msgid "Slap"
-msgstr "弌仂仆仍亳于"
+msgstr "丿舒仄舒�"
 
 #: ../libpurple/protocols/myspace/zap.c:49
-#, fuzzy, c-format
+#, c-format
 msgid "%s has slapped you!"
-msgstr "%s �亠 仆舒�舒于亳."
+msgstr "%s �亳 �亟�亳 �舒仄舒�!"
 
 #: ../libpurple/protocols/myspace/zap.c:49
 #, c-format
@@ -7687,28 +7564,27 @@
 msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:50
-#, fuzzy
 msgid "Goose"
-msgstr "弌亳 亰舒仄亳仆舒"
+msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:50
-#, fuzzy, c-format
+#, c-format
 msgid "%s has goosed you!"
-msgstr "%s �亳 亰舒仄亳仆舒."
+msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:50
-#, fuzzy, c-format
+#, c-format
 msgid "Goosing %s..."
-msgstr "�仂 弍舒�舒仄 %s"
+msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:51
 msgid "High-five"
 msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:51
-#, fuzzy, c-format
+#, c-format
 msgid "%s has high-fived you!"
-msgstr "%s �亠 仆舒�舒于亳."
+msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:51
 #, c-format
@@ -7720,9 +7596,9 @@
 msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:52
-#, fuzzy, c-format
+#, c-format
 msgid "%s has punk'd you!"
-msgstr "%s �亠 仆舒�舒于亳."
+msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:52
 #, c-format
@@ -7734,9 +7610,9 @@
 msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:53
-#, fuzzy, c-format
+#, c-format
 msgid "%s has raspberried you!"
-msgstr "%s �亠 仆舒�舒于亳."
+msgstr ""
 
 #: ../libpurple/protocols/myspace/zap.c:53
 #, c-format
@@ -7878,14 +7754,12 @@
 #: ../libpurple/protocols/novell/novell.c:247
 #, c-format
 msgid "Unable to send message. Could not get details for user (%s)."
-msgstr ""
-"�亠 仄仂亢舒仄 亟舒 亳�仗�舒�舒仄 仗仂�舒从舒. �亠 仄仂亢舒仄 亟舒 亟仂弍亳�舒仄 亟亠�舒仍亳 亰舒 从仂�亳�仆亳从仂� (%s)."
+msgstr "�亠 仄仂亢舒仄 亟舒 亳�仗�舒�舒仄 仗仂�舒从舒. �亠 仄仂亢舒仄 亟舒 亟仂弍亳�舒仄 亟亠�舒仍亳 亰舒 从仂�亳�仆亳从仂� (%s)."
 
 #: ../libpurple/protocols/novell/novell.c:396
 #, c-format
 msgid "Unable to add %s to your buddy list (%s)."
-msgstr ""
-"�亠 仄仂亢舒仄 亟舒 亞仂 亟仂亟舒亟舒仄 仗�亳�舒�亠仍仂� %s 仆舒舒 �舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳 (%s)."
+msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 亟仂亟舒亟舒仄 仗�亳�舒�亠仍仂� %s 仆舒舒 �舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳 (%s)."
 
 #. TODO: Improve this! message to who or for what conference?
 #: ../libpurple/protocols/novell/novell.c:422
@@ -7909,8 +7783,7 @@
 #: ../libpurple/protocols/novell/novell.c:537
 #, c-format
 msgid "Unable to send message. Could not create the conference (%s)."
-msgstr ""
-"�亠 仄仂亢舒仄 亟舒 亳�仗�舒�舒仄 仗仂�舒从舒. �亠 仄仂亢舒仄 亟舒 �舒 从�亠亳�舒仄 从仂仆�亠�亠仆�亳�舒�舒 (%s)."
+msgstr "�亠 仄仂亢舒仄 亟舒 亳�仗�舒�舒仄 仗仂�舒从舒. �亠 仄仂亢舒仄 亟舒 �舒 从�亠亳�舒仄 从仂仆�亠�亠仆�亳�舒�舒 (%s)."
 
 #: ../libpurple/protocols/novell/novell.c:584
 #, c-format
@@ -8053,10 +7926,8 @@
 
 #: ../libpurple/protocols/novell/novell.c:2069
 #, c-format
-msgid ""
-"%s appears to be offline and did not receive the message that you just sent."
-msgstr ""
-"%s 亳亰亞仍亠亟舒 亟亠从舒 亠 亳�从仍��亠仆(a) 亳 仆亠 �舒 仗�亳仄亳 仗仂�舒从舒�舒 从仂�舒 ��仂 �舒 亳�仗�舒�亳于�亠."
+msgid "%s appears to be offline and did not receive the message that you just sent."
+msgstr "%s 亳亰亞仍亠亟舒 亟亠从舒 亠 亳�从仍��亠仆(a) 亳 仆亠 �舒 仗�亳仄亳 仗仂�舒从舒�舒 从仂�舒 ��仂 �舒 亳�仗�舒�亳于�亠."
 
 #. TODO: Would be nice to prompt if not set!
 #. *  purple_request_fields(gc, _("Server Address"),...);
@@ -8536,8 +8407,7 @@
 #: ../libpurple/protocols/oscar/oscar.c:1371
 #, c-format
 msgid "The client version you are using is too old. Please upgrade at %s"
-msgstr ""
-"�亠�亰亳�舒�舒 仆舒 从仍亳亠仆�仂� 从仂� 亞仂 从仂�亳��亳�亠 亠 仗�亠��舒�舒. �亠 仄仂仍舒仄, 仆舒亟亞�舒亟亠�亠 仆舒 %s"
+msgstr "�亠�亰亳�舒�舒 仆舒 从仍亳亠仆�仂� 从仂� 亞仂 从仂�亳��亳�亠 亠 仗�亠��舒�舒. �亠 仄仂仍舒仄, 仆舒亟亞�舒亟亠�亠 仆舒 %s"
 
 #: ../libpurple/protocols/oscar/oscar.c:1410
 msgid "Could Not Connect"
@@ -8604,8 +8474,7 @@
 
 #: ../libpurple/protocols/oscar/oscar.c:2202
 msgid "Please authorize me so I can add you to my buddy list."
-msgstr ""
-"丐亠 仄仂仍舒仄 舒于�仂�亳亰亳�舒� 仄亠 亰舒 亟舒 仄仂亢舒仄 亟舒 �亠 亟仂亟舒亟舒仄 于仂 仍亳��舒�舒 �仂 仗�亳�舒�亠仍亳."
+msgstr "丐亠 仄仂仍舒仄 舒于�仂�亳亰亳�舒� 仄亠 亰舒 亟舒 仄仂亢舒仄 亟舒 �亠 亟仂亟舒亟舒仄 于仂 仍亳��舒�舒 �仂 仗�亳�舒�亠仍亳."
 
 #: ../libpurple/protocols/oscar/oscar.c:2230
 msgid "Authorization Request Message:"
@@ -8724,27 +8593,19 @@
 
 #: ../libpurple/protocols/oscar/oscar.c:2614
 #, c-format
-msgid ""
-"You missed %hu message from %s because the rate limit has been exceeded."
-msgid_plural ""
-"You missed %hu messages from %s because the rate limit has been exceeded."
-msgstr[0] ""
-"��仂仗���亳于�亠 %hu 仗仂�舒从舒 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�."
-msgstr[1] ""
-"��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�."
-msgstr[2] ""
-"��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�."
+msgid "You missed %hu message from %s because the rate limit has been exceeded."
+msgid_plural "You missed %hu messages from %s because the rate limit has been exceeded."
+msgstr[0] "��仂仗���亳于�亠 %hu 仗仂�舒从舒 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�."
+msgstr[1] "��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�."
+msgstr[2] "��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�."
 
 #: ../libpurple/protocols/oscar/oscar.c:2623
 #, c-format
 msgid "You missed %hu message from %s because he/she was too evil."
 msgid_plural "You missed %hu messages from %s because he/she was too evil."
-msgstr[0] ""
-"��仂仗���亳于�亠 %hu 仗仂�舒从舒 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒."
-msgstr[1] ""
-"��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒."
-msgstr[2] ""
-"��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒."
+msgstr[0] "��仂仗���亳于�亠 %hu 仗仂�舒从舒 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒."
+msgstr[1] "��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒."
+msgstr[2] "��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒."
 
 #: ../libpurple/protocols/oscar/oscar.c:2632
 #, c-format
@@ -8964,8 +8825,7 @@
 msgstr "�仆�仂�仄舒�亳亳 亰舒 �仄亠�从舒�舒"
 
 #: ../libpurple/protocols/oscar/oscar.c:4218
-msgid ""
-"Your IM Image was not sent. You must be Direct Connected to send IM Images."
+msgid "Your IM Image was not sent. You must be Direct Connected to send IM Images."
 msgstr ""
 "�舒�舒�舒 亳仆��舒仆� 仗仂�舒从舒 仆亠 弍亠�亠 亳�仗�舒�亠仆舒. �仂�舒 亟舒 弍亳亟亠�亠 亟亳�亠从�仆仂 仗仂于�亰舒仆亳 亰舒 "
 "亟舒 亳�仗�舒�亳�亠 �仍亳从亳 于仂 亳仆��舒仆� 仗仂�舒从亳."
@@ -10055,8 +9915,7 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:1645
 #, c-format
-msgid ""
-"A Sametime administrator has issued the following announcement on server %s"
+msgid "A Sametime administrator has issued the following announcement on server %s"
 msgstr "�亟仄亳仆亳���舒�仂� 仆舒 Sametime �舒 亳亰亟舒亟亠 �仍亠亟仆舒于舒 仆舒�舒于舒 仆舒 �亠�于亠�仂� %s"
 
 #: ../libpurple/protocols/sametime/sametime.c:1650
@@ -10387,8 +10246,7 @@
 #: ../libpurple/protocols/sametime/sametime.c:5564
 #, c-format
 msgid "The identifier '%s' did not match any users in your Sametime community."
-msgstr ""
-"�亰仆舒从舒�舒 ��%s�� 仆亠 �亠 �仂于仗舒亟仆舒 �仂 仆亳亠亟亠仆 从仂�亳�仆亳从 于仂 �舒�舒�舒 Sametime 亰舒亠亟仆亳�舒."
+msgstr "�亰仆舒从舒�舒 ��%s�� 仆亠 �亠 �仂于仗舒亟仆舒 �仂 仆亳亠亟亠仆 从仂�亳�仆亳从 于仂 �舒�舒�舒 Sametime 亰舒亠亟仆亳�舒."
 
 #: ../libpurple/protocols/sametime/sametime.c:5568
 msgid "No Matches"
@@ -11129,8 +10987,7 @@
 #: ../libpurple/protocols/silc/chat.c:1045
 #: ../libpurple/protocols/silc10/chat.c:1102
 #, c-format
-msgid ""
-"You have to join the %s channel before you are able to join the private group"
+msgid "You have to join the %s channel before you are able to join the private group"
 msgstr ""
 "�仂�舒 亟舒 �亠 仗�亳从仍��亳�亠 从仂仆 从舒仆舒仍仂� %s 仗�亠亟 亟舒 仄仂亢亠�亠 亟舒 �亠 仗�亳从仍��亳�亠 于仂 "
 "仗�亳于舒�仆舒�舒 亞��仗舒"
@@ -11549,8 +11406,7 @@
 #: ../libpurple/protocols/silc/pk.c:103 ../libpurple/protocols/silc10/pk.c:109
 #, c-format
 msgid "Received %s's public key. Would you like to accept this public key?"
-msgstr ""
-"�仂 仗�亳仄亳于 �舒于仆亳仂� 从仍�� 仆舒 %s. �舒仍亳 �舒从舒�亠 亟舒 亞仂 仗�亳�舒�亳�亠 仂于仂� �舒于亠仆 从仍��?"
+msgstr "�仂 仗�亳仄亳于 �舒于仆亳仂� 从仍�� 仆舒 %s. �舒仍亳 �舒从舒�亠 亟舒 亞仂 仗�亳�舒�亳�亠 仂于仂� �舒于亠仆 从仍��?"
 
 #: ../libpurple/protocols/silc/pk.c:107 ../libpurple/protocols/silc10/pk.c:113
 #, c-format
@@ -11596,8 +11452,7 @@
 
 #: ../libpurple/protocols/silc/silc.c:238
 #: ../libpurple/protocols/silc10/ops.c:1714
-msgid ""
-"Resuming detached session failed. Press Reconnect to create new connection."
+msgid "Resuming detached session failed. Press Reconnect to create new connection."
 msgstr ""
 "��仂亟仂仍亢�于舒�亠�仂 仆舒 仂亟亟亠仍亠仆舒�舒 �亠�亳�舒 仆亠 ��仗亠舒. ��亳�亳�仆亠�亠 仆舒 ���仂于�亰亳 �亠 "
 "仗仂于�仂�仆仂�� 亰舒 亟舒 从�亠亳�舒�亠 仆仂于舒 于��从舒."
@@ -11880,8 +11735,7 @@
 #: ../libpurple/protocols/silc/silc.c:1666
 #: ../libpurple/protocols/silc10/silc.c:1595
 msgid "join &lt;channel&gt; [&lt;password&gt;]:  Join a chat on this network"
-msgstr ""
-"join &lt;从舒仆舒仍&gt; [&lt;仍仂亰亳仆从舒&gt;]:  ��亳从仍��亳 �亠 从仂仆 �舒亰亞仂于仂� 仆舒 仄�亠亢舒�舒"
+msgstr "join &lt;从舒仆舒仍&gt; [&lt;仍仂亰亳仆从舒&gt;]:  ��亳从仍��亳 �亠 从仂仆 �舒亰亞仂于仂� 仆舒 仄�亠亢舒�舒"
 
 #: ../libpurple/protocols/silc/silc.c:1670
 #: ../libpurple/protocols/silc10/silc.c:1599
@@ -11897,14 +11751,12 @@
 #: ../libpurple/protocols/silc10/silc.c:1607
 #: ../libpurple/protocols/zephyr/zephyr.c:2685
 msgid "msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user"
-msgstr ""
-"msg &lt;仗�亠从舒�&gt; &lt;仗仂�舒从舒&gt;:  ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 从仂�亳�仆亳从"
+msgstr "msg &lt;仗�亠从舒�&gt; &lt;仗仂�舒从舒&gt;:  ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 从仂�亳�仆亳从"
 
 #: ../libpurple/protocols/silc/silc.c:1682
 #: ../libpurple/protocols/silc10/silc.c:1611
 msgid "query &lt;nick&gt; [&lt;message&gt;]:  Send a private message to a user"
-msgstr ""
-"query &lt;仗�亠从舒�&gt; [&lt;仗仂�舒从舒&gt;]:  ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 从仂�亳�仆亳从"
+msgstr "query &lt;仗�亠从舒�&gt; [&lt;仗仂�舒从舒&gt;]:  ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 从仂�亳�仆亳从"
 
 #: ../libpurple/protocols/silc/silc.c:1686
 #: ../libpurple/protocols/silc10/silc.c:1615
@@ -12250,8 +12102,7 @@
 #: ../libpurple/protocols/silc10/ops.c:1934
 #, c-format
 msgid "Failure: Remote does not trust/support your public key"
-msgstr ""
-"�亠��仗亠�: �亟亟舒仍亠�亠仆亳仂� �仂�� 仆亠 亞仂 仗仂亟亟�亢�于舒/仆亠仄舒 亟仂于亠�弍舒 于仂 �舒�亳仂� �舒于亠仆 从仍��"
+msgstr "�亠��仗亠�: �亟亟舒仍亠�亠仆亳仂� �仂�� 仆亠 亞仂 仗仂亟亟�亢�于舒/仆亠仄舒 亟仂于亠�弍舒 于仂 �舒�亳仂� �舒于亠仆 从仍��"
 
 #: ../libpurple/protocols/silc10/ops.c:1937
 #, c-format
@@ -12321,9 +12172,8 @@
 msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仗仂于�亰舒仄"
 
 #: ../libpurple/protocols/simple/simple.c:1059
-#, fuzzy
 msgid "Unknown server response."
-msgstr "�亠仗仂亰仆舒�舒 仗�亳�亳仆舒."
+msgstr "�亠仗仂亰仆舒� 仂亟亞仂于仂� 仂亟 �亠�于亠�仂�."
 
 #: ../libpurple/protocols/simple/simple.c:1563
 #: ../libpurple/protocols/simple/simple.c:1605
@@ -12342,8 +12192,7 @@
 
 #: ../libpurple/protocols/simple/simple.c:1694
 msgid "SIP screen names may not contain whitespaces or @ symbols"
-msgstr ""
-"SIP 亳仄亳�舒�舒 仆舒 从仂�亳�仆亳�亳 仆亠 �仄亠舒� 亟舒 �仂亟�亢舒� 仗�舒亰仆亳 仄亠��舒 亳仍亳 �亳仄弍仂仍仂� @"
+msgstr "SIP 亳仄亳�舒�舒 仆舒 从仂�亳�仆亳�亳 仆亠 �仄亠舒� 亟舒 �仂亟�亢舒� 仗�舒亰仆亳 仄亠��舒 亳仍亳 �亳仄弍仂仍仂� @"
 
 #. *< type
 #. *< ui_requirement
@@ -12686,8 +12535,7 @@
 
 #: ../libpurple/protocols/yahoo/yahoo.c:2129
 msgid "Your account is locked, please log in to the Yahoo! website."
-msgstr ""
-"�舒�舒�舒 �仄亠�从舒 亠 亰舒从仍��亠仆舒. �亠 仄仂仍舒仄, 仆舒�舒于亠�亠 �亠 仆舒 ���舒仆亳�舒�舒 仆舒 Yahoo!."
+msgstr "�舒�舒�舒 �仄亠�从舒 亠 亰舒从仍��亠仆舒. �亠 仄仂仍舒仄, 仆舒�舒于亠�亠 �亠 仆舒 ���舒仆亳�舒�舒 仆舒 Yahoo!."
 
 #: ../libpurple/protocols/yahoo/yahoo.c:2132
 #, c-format
@@ -12817,9 +12665,8 @@
 msgstr "�仂� ID. 亟舒 亞仂 舒从�亳于亳�舒仄?"
 
 #: ../libpurple/protocols/yahoo/yahoo.c:3506
-#, fuzzy
 msgid "Join whom in chat?"
-msgstr "�仂亞仂 亟舒 仗�亳从仍��舒仄 于仂 �舒亰亞仂于仂�仂�?"
+msgstr "�舒 从仂� 亟舒 仄� �亠 仗�亳从仍��舒仄 于仂 �舒亰亞仂于仂�仂�?"
 
 #: ../libpurple/protocols/yahoo/yahoo.c:3518
 msgid "Activate ID..."
@@ -13003,8 +12850,7 @@
 msgid ""
 "Sorry, this profile seems to be in a language or format that is not "
 "supported at this time."
-msgstr ""
-"�亰于亳仆亠�亠 仆仂 仂于仂� 仗�仂�亳仍 亳亰亞仍亠亟舒 亠 仆舒 �舒亰亳从 从仂� 仆亠 亠 仗仂亟亟�亢舒仆 仄仂仄亠仆�舒仍仆仂."
+msgstr "�亰于亳仆亠�亠 仆仂 仂于仂� 仗�仂�亳仍 亳亰亞仍亠亟舒 亠 仆舒 �舒亰亳从 从仂� 仆亠 亠 仗仂亟亟�亢舒仆 仄仂仄亠仆�舒仍仆仂."
 
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1221
 msgid ""
@@ -13032,8 +12878,7 @@
 #: ../libpurple/protocols/yahoo/yahoochat.c:217
 #, c-format
 msgid "%s declined your conference invitation to room \"%s\" because \"%s\"."
-msgstr ""
-"%s �舒 仂亟弍亳 �舒�舒�舒 仗仂从舒仆舒 亰舒 从仂仆�亠�亠仆�亳�舒 于仂 �仂弍舒�舒 \"%s\" 仗仂�舒亟亳 \"%s\"."
+msgstr "%s �舒 仂亟弍亳 �舒�舒�舒 仗仂从舒仆舒 亰舒 从仂仆�亠�亠仆�亳�舒 于仂 �仂弍舒�舒 \"%s\" 仗仂�舒亟亳 \"%s\"."
 
 #: ../libpurple/protocols/yahoo/yahoochat.c:219
 msgid "Invitation Rejected"
@@ -13176,13 +13021,11 @@
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2705
 msgid "inst &lt;instance&gt;: Set the instance to be used on this class"
-msgstr ""
-"inst &lt;instance&gt;: �仂��舒于亳 �舒 亳仆��舒仆�舒�舒 亟舒 弍亳亟亠 从仂�亳��亠仆舒 仆舒 仂于舒舒 从仍舒�舒"
+msgstr "inst &lt;instance&gt;: �仂��舒于亳 �舒 亳仆��舒仆�舒�舒 亟舒 弍亳亟亠 从仂�亳��亠仆舒 仆舒 仂于舒舒 从仍舒�舒"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2710
 msgid "topic &lt;instance&gt;: Set the instance to be used on this class"
-msgstr ""
-"topic &lt;instance&gt;: �仂��舒于亳 �舒 亳仆��舒仆�舒�舒 亟舒 弍亳亟亠 从仂�亳��亠仆舒 仆舒 仂于舒舒 从仍舒�舒"
+msgstr "topic &lt;instance&gt;: �仂��舒于亳 �舒 亳仆��舒仆�舒�舒 亟舒 弍亳亟亠 从仂�亳��亠仆舒 仆舒 仂于舒舒 从仍舒�舒"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2716
 msgid "sub &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Join a new chat"
@@ -13191,10 +13034,8 @@
 "�舒亰亞仂于仂�"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2721
-msgid ""
-"zi &lt;instance&gt;: Send a message to &lt;message,<i>instance</i>,*&gt;"
-msgstr ""
-"zi &lt;instance&gt;: ��仗�舒�亳 仗仂�舒从舒 亟仂 &lt;message,<i>instance</i>,*&gt;"
+msgid "zi &lt;instance&gt;: Send a message to &lt;message,<i>instance</i>,*&gt;"
+msgstr "zi &lt;instance&gt;: ��仗�舒�亳 仗仂�舒从舒 亟仂 &lt;message,<i>instance</i>,*&gt;"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2727
 msgid ""
@@ -13377,9 +13218,8 @@
 msgstr "��亳�舒�亳 �舒 仗仂从舒仆舒�舒 亰舒 �舒亰亞仂于仂�?"
 
 #: ../libpurple/sslconn.c:164
-#, fuzzy
 msgid "SSL Connection Failed"
-msgstr "�仂于�亰�于舒�亠�仂 仆亠 ��仗亠舒"
+msgstr "SSL 于��从舒�舒 仆亠 ��仗亠舒"
 
 #: ../libpurple/sslconn.c:166
 msgid "SSL Handshake Failed"
@@ -13390,9 +13230,8 @@
 msgstr ""
 
 #: ../libpurple/sslconn.c:171
-#, fuzzy
 msgid "Unknown SSL error"
-msgstr "�亠仗仂亰仆舒�舒 亞�亠�从舒"
+msgstr "�亠仗仂亰仆舒�舒 SSL 亞�亠�从舒"
 
 #: ../libpurple/status.c:153
 msgid "Unset"
@@ -13682,9 +13521,8 @@
 msgstr "�仂_亰亳仆从舒:"
 
 #: ../pidgin/gtkaccount.c:1195
-#, fuzzy
 msgid "Unable to save new account"
-msgstr "�亠 仄仂亢舒仄 亟舒 从�亠亳�舒仄 于��从舒"
+msgstr "�亠 仄仂亢舒仄 亟舒 �舒 亰舒��于舒仄 仆仂于舒�舒 �仄亠�从舒"
 
 #: ../pidgin/gtkaccount.c:1196
 msgid "An account already exists with the specified criteria."
@@ -13775,9 +13613,8 @@
 msgstr "�仂�舒从舒"
 
 #: ../pidgin/gtkblist.c:1148
-#, fuzzy
 msgid "_Send File"
-msgstr "��仗�舒�亳 亟舒�仂�亠从舒"
+msgstr "_��仗�舒�亳 亟舒�仂�亠从舒"
 
 #: ../pidgin/gtkblist.c:1155
 msgid "Add Buddy _Pounce"
@@ -13839,10 +13676,8 @@
 
 #: ../pidgin/gtkblist.c:2057 ../pidgin/gtkconv.c:4840
 #: ../pidgin/gtkpounce.c:430
-msgid ""
-"You are not currently signed on with an account that can add that buddy."
-msgstr ""
-"�亠 ��亠 仄仂仄亠仆�舒仍仆仂 仆舒�舒于亠仆亳 �仂 �仄亠�从舒 从仂�舒 仄仂亢亠 亟舒 亞仂 亟仂亟舒亟亠 �仂� 仗�亳�舒�亠仍."
+msgid "You are not currently signed on with an account that can add that buddy."
+msgstr "�亠 ��亠 仄仂仄亠仆�舒仍仆仂 仆舒�舒于亠仆亳 �仂 �仄亠�从舒 从仂�舒 仄仂亢亠 亟舒 亞仂 亟仂亟舒亟亠 �仂� 仗�亳�舒�亠仍."
 
 #. Buddies menu
 #: ../pidgin/gtkblist.c:2869
@@ -13866,34 +13701,28 @@
 msgstr "/��亳�舒�亠仍亳/��亠亞仍亠亟舒� _仍仂亞..."
 
 #: ../pidgin/gtkblist.c:2875
-#, fuzzy
 msgid "/Buddies/Show"
-msgstr "/_��亳�舒�亠仍亳"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳"
 
 #: ../pidgin/gtkblist.c:2876
-#, fuzzy
 msgid "/Buddies/Show/_Offline Buddies"
-msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 亳�从仍��亠仆亳 仗�亳�舒�亠仍亳"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_��从仍��亠仆亳 仗�亳�舒�亠仍亳"
 
 #: ../pidgin/gtkblist.c:2877
-#, fuzzy
 msgid "/Buddies/Show/_Empty Groups"
-msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_��舒亰仆亳 亞��仗亳"
 
 #: ../pidgin/gtkblist.c:2878
-#, fuzzy
 msgid "/Buddies/Show/Buddy _Details"
-msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 亟亠�舒仍亳 亰舒 _仗�亳�舒�亠仍"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_�亠�舒仍亳 亰舒 _仗�亳�舒�亠仍"
 
 #: ../pidgin/gtkblist.c:2879
-#, fuzzy
 msgid "/Buddies/Show/Idle _Times"
-msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 于�亠仄亠 仆舒 _仆亠舒从�亳于仆仂��"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_��亠仄亠 仆舒 _仆亠舒从�亳于仆仂��"
 
 #: ../pidgin/gtkblist.c:2880
-#, fuzzy
 msgid "/Buddies/Show/_Protocol Icons"
-msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_�从仂仆亳 亰舒 仗�仂�仂从仂仍亳�亠"
 
 #: ../pidgin/gtkblist.c:2881
 msgid "/Buddies/_Sort Buddies"
@@ -13934,9 +13763,8 @@
 msgstr "/�仍舒�从亳/�亠���于舒 亰舒 _仗�亳�舒�亠仍"
 
 #: ../pidgin/gtkblist.c:2896
-#, fuzzy
 msgid "/Tools/_Certificates"
-msgstr "/�仍舒�从亳/��_亠�亠�亠仆�亳"
+msgstr "/�仍舒�从亳/_弌亠��亳�亳从舒�亳"
 
 #: ../pidgin/gtkblist.c:2897
 msgid "/Tools/Plu_gins"
@@ -14115,7 +13943,7 @@
 
 #. Translators: Please maintain the use of -> and <- to refer to menu heirarchy
 #: ../pidgin/gtkblist.c:4334
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "<span weight='bold' size='larger'>Welcome to %s!</span>\n"
 "\n"
@@ -14134,29 +13962,24 @@
 #. * after the treeview or faceprint gets mad. -Robot101
 #.
 #: ../pidgin/gtkblist.c:4597
-#, fuzzy
 msgid "/Buddies/Show/Offline Buddies"
-msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 亳�从仍��亠仆亳 仗�亳�舒�亠仍亳"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/��从仍��亠仆亳 仗�亳�舒�亠仍亳"
 
 #: ../pidgin/gtkblist.c:4600
-#, fuzzy
 msgid "/Buddies/Show/Empty Groups"
-msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/��舒亰仆亳 亞��仗亳"
 
 #: ../pidgin/gtkblist.c:4606
-#, fuzzy
 msgid "/Buddies/Show/Buddy Details"
-msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 亟亠�舒仍亳 亰舒 仗�亳�舒�亠仍亳"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/�亠�舒仍亳 亰舒 仗�亳�舒�亠仍亳"
 
 #: ../pidgin/gtkblist.c:4609
-#, fuzzy
 msgid "/Buddies/Show/Idle Times"
-msgstr "/��亳�舒�亠仍亳/��亠仄亠 仆舒 仆亠舒从�亳于仆仂��"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/��亠仄亠 仆舒 仆亠舒从�亳于仆仂��"
 
 #: ../pidgin/gtkblist.c:4612
-#, fuzzy
 msgid "/Buddies/Show/Protocol Icons"
-msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳"
+msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/�从仂仆亳 亰舒 仗�仂�仂从仂仍亳�亠"
 
 #: ../pidgin/gtkblist.c:5507
 msgid ""
@@ -14234,9 +14057,8 @@
 
 #. Widget creation function
 #: ../pidgin/gtkcertmgr.c:530
-#, fuzzy
 msgid "SSL Servers"
-msgstr "弌亠�于亠�"
+msgstr "SSL �亠�于亠�亳"
 
 #: ../pidgin/gtkconn.c:180
 #, c-format
@@ -14260,10 +14082,8 @@
 msgstr "�于仂� 仗�亳�舒�亠仍 仆亠 亠 仆舒 亳��亳仂� 仗�仂�仂从仂仍 从舒从仂 于仂 仂于仂� �舒亰亞仂于仂�."
 
 #: ../pidgin/gtkconv.c:774
-msgid ""
-"You are not currently signed on with an account that can invite that buddy."
-msgstr ""
-"�亠 ��亠 仄仂仄亠仆�舒仍仆仂 仆舒�舒于亠仆亳 �仂 �仄亠�从舒 从仂�舒 仄仂亢亠 亟舒 亞仂 仗仂从舒仆亳 仂于仂� 仗�亳�舒�亠仍."
+msgid "You are not currently signed on with an account that can invite that buddy."
+msgstr "�亠 ��亠 仄仂仄亠仆�舒仍仆仂 仆舒�舒于亠仆亳 �仂 �仄亠�从舒 从仂�舒 仄仂亢亠 亟舒 亞仂 仗仂从舒仆亳 仂于仂� 仗�亳�舒�亠仍."
 
 #: ../pidgin/gtkconv.c:827
 msgid "Invite Buddy Into Chat Room"
@@ -14837,9 +14657,8 @@
 msgstr "Spanish"
 
 #: ../pidgin/gtkdialogs.c:161
-#, fuzzy
 msgid "Estonian"
-msgstr "Bosnian"
+msgstr "Estonian"
 
 #: ../pidgin/gtkdialogs.c:162 ../pidgin/gtkdialogs.c:163
 msgid "Euskera(Basque)"
@@ -14926,9 +14745,8 @@
 msgstr "Kurdish"
 
 #: ../pidgin/gtkdialogs.c:185
-#, fuzzy
 msgid "Lao"
-msgstr "�舒于"
+msgstr "Lao"
 
 #: ../pidgin/gtkdialogs.c:186 ../pidgin/gtkdialogs.c:252
 #: ../pidgin/gtkdialogs.c:253
@@ -15055,7 +14873,7 @@
 msgstr "�舒 %s"
 
 #: ../pidgin/gtkdialogs.c:400
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s is a graphical modular messaging client based on libpurple which is "
 "capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, "
@@ -15069,7 +14887,7 @@
 msgstr ""
 "%s 亠 亞�舒�亳�从亳 仄仂亟�仍舒�亠仆 从仍亳亠仆� 亰舒 亳�仗�舒�舒�亠 仆舒 仗仂�舒从亳 弍舒亰亳�舒仆 仆舒 libpurple  "
 "从仂� ��仂 亠 �仗仂�仂弍亠仆 亟舒 �亠 于�亰�于舒 仆舒 AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, "
-"SIP/SIMPLE, Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, Gadu-Gadu, 亳 "
+"SIP/SIMPLE, Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, MySpaceIM, Gadu-Gadu, 亳 "
 "QQ 仂亟亠亟仆舒�. �舒仗亳�舒仆 亠 �仂 从仂�亳��亠�亠 仆舒 GTK+. <BR><BR>弌仄亠亠�亠 亟舒 �舒 仄亠仆�于舒�亠 亳 "
 "�亠亟亳���亳弍�亳�舒�亠 仗�仂亞�舒仄舒�舒 �仗仂�亠亟 ��仍仂于亳�亠 于仂 GPL (于亠�亰亳�舒 2 亳仍亳 仗仂仆仂于舒).  "
 "�仂仗亳�舒 仂亟 GPL 亟仂舒�舒 于仂 亟舒�仂�亠从舒�舒 'COPYING' 从仂�舒 ��仂 �亠 亟亳���亳弍�亳�舒 亰舒亠亟仆仂 "
@@ -15134,8 +14952,7 @@
 msgid ""
 "Please enter the screen name or alias of the person whose log you would like "
 "to view."
-msgstr ""
-"�仆亠�亠�亠 亞仂 亳仄亠�仂 亳仍亳 舒仍亳�舒�仂� 仆舒 仗�亳�舒�亠仍仂� �亳� 仍仂亞 �舒从舒�亠 亟舒 亞仂 仗�亠亞仍亠亟舒�亠."
+msgstr "�仆亠�亠�亠 亞仂 亳仄亠�仂 亳仍亳 舒仍亳�舒�仂� 仆舒 仗�亳�舒�亠仍仂� �亳� 仍仂亞 �舒从舒�亠 亟舒 亞仂 仗�亠亞仍亠亟舒�亠."
 
 #: ../pidgin/gtkdialogs.c:1020
 msgid "Alias Contact"
@@ -15224,8 +15041,7 @@
 
 #: ../pidgin/gtkdialogs.c:1247
 #, c-format
-msgid ""
-"You are about to remove %s from your buddy list.  Do you want to continue?"
+msgid "You are about to remove %s from your buddy list.  Do you want to continue?"
 msgstr ""
 "丿�仂��从� �亠 仂弍亳亟仂于�亠 亟舒 亞仂/�舒 仂����舒仆亠�亠 %s 仂亟 �舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳.  "
 "�舒仍亳 �舒从舒�亠 亟舒 仗�仂亟仂仍亢亠�亠?"
@@ -15276,7 +15092,6 @@
 msgstr "�舒仄仂仍�亳 亰于��亳"
 
 #: ../pidgin/gtkdocklet.c:535
-#, fuzzy
 msgid "Blink on new message"
 msgstr "丐�亠仗从舒� 仆舒 仆仂于舒 仗仂�舒从舒"
 
@@ -15520,9 +15335,8 @@
 msgstr "_个仂仆�"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1054
-#, fuzzy
 msgid "Group Items"
-msgstr "�亟. 仆舒 亞��仗舒�舒"
+msgstr "���仗亳�舒� 仗�亠亟仄亠�亳"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1054
 msgid "Ungroup Items"
@@ -15553,34 +15367,28 @@
 msgstr ""
 
 #: ../pidgin/gtkimhtmltoolbar.c:1096
-#, fuzzy
 msgid "Font Face"
-msgstr "_�亰亞仍亠亟 仆舒 �仂仆�"
+msgstr "�亰亞仍亠亟 仆舒 �仂仆�"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1097
-#, fuzzy
 msgid "Background Color"
-msgstr "�仂�_舒 仆舒 仗仂亰舒亟亳仆舒"
+msgstr "�仂�舒 仆舒 仗仂亰舒亟亳仆舒"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1098
-#, fuzzy
 msgid "Foreground Color"
-msgstr "�仂�舒 仆舒 _�仂仆�"
+msgstr "�仂�舒 仆舒 �仂仆�"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1100
-#, fuzzy
 msgid "Reset Formatting"
-msgstr "_���亳��亳 �仂�仄舒�亳�舒�亠"
+msgstr "�亠�亠�亳�舒� �仂�仄舒�亳�舒�亠"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1103
-#, fuzzy
 msgid "Insert IM Image"
 msgstr "�仆亠�亳 �仍亳从舒"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1104
-#, fuzzy
 msgid "Insert Smiley"
-msgstr "�仆亠�亳 �仍亳从舒"
+msgstr "�仆亠�亳 �仄舒�仍亳"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1179
 msgid "<b>_Bold</b>"
@@ -15595,9 +15403,8 @@
 msgstr "<u>_�仂亟于仍亠�亠仆仂</u>"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1182
-#, fuzzy
 msgid "<span strikethrough='true'>Strikethrough</span>"
-msgstr "<span size='larger'>_�仂亞仂仍亠仄仂</span>"
+msgstr "<span size='larger'>��亠�从��舒仆仂</span>"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1183
 msgid "<span size='larger'>_Larger</span>"
@@ -15700,8 +15507,7 @@
 "仗�亠�亠�亠仆�舒�舒 亠 仂于仂亰仄仂亢亠仆舒."
 
 #: ../pidgin/gtklog.c:557
-msgid ""
-"Chats will only be logged if the \"Log all chats\" preference is enabled."
+msgid "Chats will only be logged if the \"Log all chats\" preference is enabled."
 msgstr ""
 "�舒亰亞仂于仂�亳�亠 �亠 弍亳亟舒� 仍仂亞亳�舒仆亳 �舒仄仂 舒从仂 亠 亳亰弍�舒仆仂 \"�仂亞亳�舒� 亞亳 �亳�亠 �舒亰亞仂于仂�亳"
 "\"."
@@ -15739,7 +15545,7 @@
 msgstr "%s %s. ��仂弍舒��亠 `%s -h' 亰舒 仗仂于亠�亠 亳仆�仂�仄舒�亳亳.\n"
 
 #: ../pidgin/gtkmain.c:388
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s %s\n"
 "Usage: %s [OPTION]...\n"
@@ -15754,7 +15560,7 @@
 "  -v, --version       display the current version and exit\n"
 msgstr ""
 "%s %s\n"
-"丕仗仂��亠弍舒: %s [OPTION]...\n"
+"丕仗仂��亠弍舒: %s [��丶���]...\n"
 "\n"
 "  -c, --config=DIR    use DIR for config files\n"
 "  -d, --debug         print debugging messages to stdout\n"
@@ -15766,7 +15572,7 @@
 "  -v, --version       display the current version and exit\n"
 
 #: ../pidgin/gtkmain.c:512
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s has segfaulted and attempted to dump a core file.\n"
 "This is a bug in the software and has happened through\n"
@@ -15792,7 +15598,7 @@
 "\n"
 "�从仂 仄仂亢亠�亠 亟舒 �舒 �亠仗�仂亟��亳�舒�亠 亞�亠�从舒�舒, �亠 仄仂仍舒仄, 亳亰于亠��亠�亠\n"
 "亞亳 �舒亰于亳于舒�亳�亠 �仂 仗�亳�舒于�于舒�亠 仆舒 弍�弍舒�从舒 仆舒:\n"
-"%snewticket/\n"
+"%ssimpleticket/\n"
 "\n"
 "��亳亞��亠�亠 �亠 亟亠从舒 �仂�仆仂 仆舒于亠亟亳于�亠 ��仂 仗�舒于亠于�亠 于仂 �仂舒 于�亠仄亠\n"
 "亳 亳�仗�舒�亠�亠 �舒 ��舒亞舒�舒 仂亟 亟舒�仂�亠从舒�舒 �仂 �舒亟�仂�仂(core).  �从仂 仆亠 亰仆舒亠�亠\n"
@@ -15827,12 +15633,12 @@
 msgstr[2] "%s 亳仄舒 %d 仆仂于亳 仗仂�舒从亳."
 
 #: ../pidgin/gtknotify.c:564
-#, fuzzy, c-format
+#, c-format
 msgid "<b>You have %d new e-mail.</b>"
 msgid_plural "<b>You have %d new e-mails.</b>"
-msgstr[0] "<b>�仄舒�亠 %d 仆仂于舒 亠-仗仂��舒.</b>"
-msgstr[1] "<b>�仄舒�亠 %d 仆仂于亳 亠-仗仂��亳.</b>"
-msgstr[2] "<b>�仄舒�亠 %d 仆仂于亳 亠-仗仂��亳.</b>"
+msgstr[0] "<b>�仄舒�亠 %d 仆仂于舒 仗仂�舒从舒.</b>"
+msgstr[1] "<b>�仄舒�亠 %d 仆仂于亳 仗仂�舒从亳.</b>"
+msgstr[2] "<b>�仄舒�亠 %d 仆仂于亳 仗仂�舒从亳.</b>"
 
 #: ../pidgin/gtknotify.c:989
 #, c-format
@@ -15850,8 +15656,7 @@
 msgstr "��亠�从舒 仗�亳 仍舒仆�亳�舒�亠 仆舒 \"%s\": %s"
 
 #: ../pidgin/gtknotify.c:1145
-msgid ""
-"The 'Manual' browser command has been chosen, but no command has been set."
+msgid "The 'Manual' browser command has been chosen, but no command has been set."
 msgstr "�亰弍�舒仆舒 亠 �舒�仆舒�舒 从仂仄舒仆亟舒 仆舒 仗�亠仍亳���于舒�仂�, 仆仂 仆亠 亠 仗仂��舒于亠仆舒 从仂仄舒仆亟舒."
 
 #: ../pidgin/gtkplugin.c:265
@@ -16460,8 +16265,7 @@
 
 #: ../pidgin/gtkprivacy.c:559
 msgid "Please enter the name of the user you wish to be able to contact you."
-msgstr ""
-"�仆亠�亠�亠 亞仂 亳仄亠�仂 仆舒 从仂�亳�仆亳从仂� �仂 从仂亞仂 仗仂�舒从�于舒�亠 亟舒 仄仂亢亠�亠 亟舒 从仂仆�舒从�亳�舒�亠."
+msgstr "�仆亠�亠�亠 亞仂 亳仄亠�仂 仆舒 从仂�亳�仆亳从仂� �仂 从仂亞仂 仗仂�舒从�于舒�亠 亟舒 仄仂亢亠�亠 亟舒 从仂仆�舒从�亳�舒�亠."
 
 #: ../pidgin/gtkprivacy.c:562 ../pidgin/gtkprivacy.c:578
 msgid "_Permit"
@@ -16540,8 +16344,7 @@
 
 #: ../pidgin/gtksavedstatuses.c:337
 msgid "Are you sure you want to delete the selected saved statuses?"
-msgstr ""
-"�舒仍亳 ��亠 �亳亞��仆亳 亟亠从舒 �舒从舒�亠 亟舒 亞亳 亳亰弍�亳�亠�亠 亳亰弍�舒仆亳�亠 亰舒��于舒仆亳 ��舒���亳?"
+msgstr "�舒仍亳 ��亠 �亳亞��仆亳 亟亠从舒 �舒从舒�亠 亟舒 亞亳 亳亰弍�亳�亠�亠 亳亰弍�舒仆亳�亠 亰舒��于舒仆亳 ��舒���亳?"
 
 #. Use button
 #: ../pidgin/gtksavedstatuses.c:620 ../pidgin/gtksavedstatuses.c:1266
@@ -16686,8 +16489,7 @@
 #: ../pidgin/gtkutils.c:2641
 #, c-format
 msgid "The file '%s' is too large for %s.  Please try a smaller image.\n"
-msgstr ""
-"�舒�仂�亠从舒�舒 ��%s�� 亠 仗�亠亞仂仍亠仄舒 亰舒 %s.  �亠 仄仂仍舒仄, 仗�仂弍舒��亠 �仂 仗仂仄舒仍舒 �仍亳从舒.\n"
+msgstr "�舒�仂�亠从舒�舒 ��%s�� 亠 仗�亠亞仂仍亠仄舒 亰舒 %s.  �亠 仄仂仍舒仄, 仗�仂弍舒��亠 �仂 仗仂仄舒仍舒 �仍亳从舒.\n"
 
 #: ../pidgin/gtkutils.c:2643
 msgid "Icon Error"
@@ -16704,8 +16506,7 @@
 
 #: ../pidgin/gtkutils.c:2793
 #, c-format
-msgid ""
-"Failed to load image '%s': reason not known, probably a corrupt image file"
+msgid "Failed to load image '%s': reason not known, probably a corrupt image file"
 msgstr ""
 "�亠 ��仗亠舒于 亟舒 �舒 于�亳�舒仄 �仍亳从舒�舒 ��%s��: 仗�亳�亳仆亳�亠 仆亠 �亠 仗仂亰仆舒�亳, 仆舒�于亠�仂�舒�仆仂 "
 "�仍亳从舒�舒 亠 仂��亠�亠仆舒"
@@ -16870,8 +16671,7 @@
 #. *< version
 #. *< summary
 #: ../pidgin/plugins/contact_priority.c:190
-msgid ""
-"Allows for controlling the values associated with different buddy states."
+msgid "Allows for controlling the values associated with different buddy states."
 msgstr ""
 "�于仂亰仄仂亢�于舒 从仂仆��仂仍舒 仆舒 于�亠亟仆仂��亳�亠 舒�仂�亳�舒仆亳 �仂 �舒亰仍亳�仆亳 �仂��仂�弍亳 仆舒 "
 "仗�亳�舒�亠仍亳�亠."
@@ -16953,8 +16753,7 @@
 
 #: ../pidgin/plugins/extplacement.c:117
 msgid "Separate IM and Chat windows when placing by number"
-msgstr ""
-"�亟亟亠仍仆亳 仗�仂亰仂��亳 亰舒 IM 亳 仗�仂亰仂��亳 亰舒 �舒亰亞仂于仂�亳 从仂亞舒 �亠 仗仂��舒于�于舒舒� 仗仂 弍�仂�"
+msgstr "�亟亟亠仍仆亳 仗�仂亰仂��亳 亰舒 IM 亳 仗�仂亰仂��亳 亰舒 �舒亰亞仂于仂�亳 从仂亞舒 �亠 仗仂��舒于�于舒舒� 仗仂 弍�仂�"
 
 #. *< type
 #. *< ui_requirement
@@ -17707,8 +17506,7 @@
 #. *  description
 #: ../pidgin/plugins/timestamp.c:207
 msgid "Display iChat-style timestamps every N minutes."
-msgstr ""
-"�仂亟舒于舒 于�亠仄亠仆�从亳 仂亰仆舒从亳 于仂 ��亳仍仂� 仆舒 iChat 于仂 �舒亰亞仂于仂�亳�亠 仆舒 �亠从仂亳 N 仄亳仆��亳."
+msgstr "�仂亟舒于舒 于�亠仄亠仆�从亳 仂亰仆舒从亳 于仂 ��亳仍仂� 仆舒 iChat 于仂 �舒亰亞仂于仂�亳�亠 仆舒 �亠从仂亳 N 仄亳仆��亳."
 
 #: ../pidgin/plugins/timestamp_format.c:23
 msgid "Timestamp Format Options"
@@ -17879,8 +17677,7 @@
 msgstr "�仗�亳亳 仆舒仄亠仆亠�亳 亰舒 Pidgin 亰舒 Windows."
 
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:374
-msgid ""
-"Provides options specific to Pidgin for Windows , such as buddy list docking."
+msgid "Provides options specific to Pidgin for Windows , such as buddy list docking."
 msgstr ""
 "�于仂亰仄仂亢�于舒 仂仗�亳亳 仆舒仄亠仆亠�亳 亰舒 Pidgin 亰舒 Windows, 从舒从仂 ��仂 �亠 仗�亳从舒��于舒�亠 仆舒 "
 "仍亳��舒�舒 �仂 仗�亳�舒�亠仍亳 亳 ��亠仗从舒�亠 仆舒 �舒亰亞仂于仂�亳�亠."
@@ -17932,130 +17729,3 @@
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr "�于仂� 仗�亳从仍��仂从 亠 从仂�亳�亠仆 亰舒 亟亠弍舒亞亳�舒�亠 仆舒 XMPP �亠�于亠�亳 亳仍亳 从仍亳亠仆�亳."
 
-#, fuzzy
-#~ msgid "Offline buddies"
-#~ msgstr "�仂从舒亢亳 亳�从仍��亠仆亳 仗�亳�舒�亠仍亳"
-
-#, fuzzy
-#~ msgid "Sort"
-#~ msgstr "�仂��舒"
-
-#, fuzzy
-#~ msgid "By Status"
-#~ msgstr "�仂 ��舒���"
-
-#, fuzzy
-#~ msgid "By Log Size"
-#~ msgstr "�仂 亞仂仍亠仄亳仆舒 仆舒 仍仂亞"
-
-#, fuzzy
-#~ msgid "Unable to connect to contact server"
-#~ msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仗仂于�亰舒仄 �仂 �亠�于亠�仂�."
-
-#, fuzzy
-#~ msgid "Unable to retrieve MSN Address Book"
-#~ msgstr "�亟弍亠�亠�亠 舒亟�亠�舒� 亰舒 弍亠仍亠�从亳"
-
-#, fuzzy
-#~ msgid "Current media"
-#~ msgstr "丐亠从仂于亠仆 亰仆舒从"
-
-#, fuzzy
-#~ msgid "Windows Live Messenger Protocol Plugin"
-#~ msgstr "�仂亟舒�仂从 亰舒 Novell GroupWise Messenger"
-
-#, fuzzy
-#~ msgid "Windows Live ID authentication Failed"
-#~ msgstr "�亠��仗亠�: �于�仂�亳亰亳�舒�亠�仂 仆亠 ��仗亠舒"
-
-#~ msgid "%s just sent you a Nudge!"
-#~ msgstr "%s ��仂��从� �亳 亳�仗�舒�亳 Nudge!"
-
-#, fuzzy
-#~ msgid "Unknown error (%d)"
-#~ msgstr "�亠仗仂亰仆舒�舒 亞�亠�从舒"
-
-#, fuzzy
-#~ msgid "Unable to connect to OIM server"
-#~ msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仗仂于�亰舒仄 �仂 �亠�于亠�仂�."
-
-#, fuzzy
-#~ msgid "%s (%s) changed status from %s to %s"
-#~ msgstr "%s 亞仂 �仄亠仆亳 ��舒���仂� 仂亟 %s 于仂 %s"
-
-#, fuzzy
-#~ msgid "%s (%s) is now %s"
-#~ msgstr "%s �亠亞舒 亠 %s"
-
-#, fuzzy
-#~ msgid "%s (%s) is no longer %s"
-#~ msgstr "%s 仆亠 亠 于亠�亠 %s"
-
-#, fuzzy
-#~ msgid "_Merge"
-#~ msgstr "_�仂�舒从舒:"
-
-#, fuzzy
-#~ msgid "_Send File..."
-#~ msgstr "_��仗�舒�亳 亟舒�仂�亠从舒"
-
-#, fuzzy
-#~ msgid "Add Buddy _Pounce..."
-#~ msgstr "�仂亟舒� 亟亠���于仂 亰舒 仗�亳�舒�亠仍..."
-
-#, fuzzy
-#~ msgid "Hide when offline"
-#~ msgstr "�亠 亠 亟仂亰于仂仍亠仆 亟仂亟亠从舒 ��亠 亳�从仍��亠仆亳"
-
-#, fuzzy
-#~ msgid "Show when offline"
-#~ msgstr "�亠 亠 亟仂亰于仂仍亠仆 亟仂亟亠从舒 ��亠 亳�从仍��亠仆亳"
-
-#, fuzzy
-#~ msgid "Add _Buddy..."
-#~ msgstr "�仂亟舒� 仗�亳�舒�亠仍"
-
-#, fuzzy
-#~ msgid "Add C_hat..."
-#~ msgstr "�仂亟舒� �舒亰亞仂于仂�"
-
-#, fuzzy
-#~ msgid "Persistent"
-#~ msgstr "Persian"
-
-#, fuzzy
-#~ msgid "/Accounts/Manage"
-#~ msgstr "/弌仄亠�从亳"
-
-#, fuzzy
-#~ msgid "A_ccount:"
-#~ msgstr "弌仄亠�从舒:"
-
-#, fuzzy
-#~ msgid "S_end To"
-#~ msgstr "��仗�舒�亳 仆舒"
-
-#, fuzzy
-#~ msgid "_Smile!"
-#~ msgstr "弌仄舒�仍亳!"
-
-#~ msgid "You have just sent a Nudge!"
-#~ msgstr "弌舒仄仂 ��仂 亳�仗�舒�亳于�亠 Nudge!"
-
-#~ msgid "Would like to add him?"
-#~ msgstr "�舒仍亳 �舒从舒�亠 亟舒 亞仂 亟仂亟舒亟亠�亠?"
-
-#~ msgid "%s just sent you a Buzz!"
-#~ msgstr "%s ��仂��从� �亳 亳�仗�舒�亳 Buzz!"
-
-#~ msgid "You have just sent a Buzz!"
-#~ msgstr "弌舒仄仂 ��仂 亳�仗�舒�亳于�亠 Buzz!"
-
-#~ msgid "/Options/Show Buddy _Icon"
-#~ msgstr "/�仗�亳亳/�仂从舒亢亳 亳从仂仆舒 仆舒 _仗�亳�舒�亠仍"
-
-#~ msgid "/Options/Show Buddy Icon"
-#~ msgstr "/�仗�亳亳/�仂从舒亢亳 亳从仂仆舒 仆舒 仗�亳�舒�亠仍"
-
-#~ msgid "Norwegian"
-#~ msgstr "Norwegian"