changeset 21143:7be910c7cff7

merge of '20236f54c97e87512b7eb716559a4bd86b73f833' and '756265e6ef8651abedbdc0a1aad9d50cc32e140f'
author John Bailey <rekkanoryo@rekkanoryo.org>
date Mon, 05 Nov 2007 00:35:07 +0000
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"