merge of '755d7efe6da376f6fbeb9f6d3e08f2d7201aabc7'

Wed, 16 Sep 2009 15:36:24 +0000

author
John Bailey <rekkanoryo@rekkanoryo.org>
date
Wed, 16 Sep 2009 15:36:24 +0000
changeset 28549
c97a80bb45a3
parent 28261
755d7efe6da3 (current diff)
parent 28548
0848cfc68369 (diff)
child 28550
7921ad861bba
child 29514
7b39d4c94f2e

merge of '755d7efe6da376f6fbeb9f6d3e08f2d7201aabc7'
and '0848cfc68369ad686459fb7420f1e4613029b294'

ChangeLog.API file | annotate | diff | comparison | revisions
libpurple/account.c file | annotate | diff | comparison | revisions
libpurple/account.h file | annotate | diff | comparison | revisions
pidgin/pixmaps/status/11/invisible.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/22/audio-call.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/22/scalable/audio-call.svg file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/22/scalable/voice-call.svg file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/22/voice-call.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/32/audio-call.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/32/scalable/audio-call.svg file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/32/scalable/voice-call.svg file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/32/voice-call.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/48/audio-call.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/48/scalable/audio-call.svg file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/48/scalable/voice-call.svg file | annotate | diff | comparison | revisions
pidgin/pixmaps/toolbar/48/voice-call.png file | annotate | diff | comparison | revisions
--- a/COPYRIGHT	Wed Sep 16 15:35:45 2009 +0000
+++ b/COPYRIGHT	Wed Sep 16 15:36:24 2009 +0000
@@ -88,6 +88,7 @@
 Matěj Cepl
 Cerulean Studios, LLC
 Jonathan Champ
+Matthew Chapman
 Christophe Chapuis
 Patrick Cheung
 Ka-Hing Cheung
@@ -306,6 +307,7 @@
 Arkadiusz Miskiewicz
 David Mohr
 Andrew Molloy
+Tomasz Mon
 Michael Monreal
 Laurent Montaron
 Marco Monteiro
--- a/ChangeLog	Wed Sep 16 15:35:45 2009 +0000
+++ b/ChangeLog	Wed Sep 16 15:36:24 2009 +0000
@@ -1,6 +1,71 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.6.0 (??/??/2009):
+version 2.6.3 (??/??/20??):
+	XMPP:
+	* Fix a crash when attempting to validate an invalid JID.
+
+	General:
+	* New 'plugins' sub-command to 'debug' command (i.e. '/debug plugins')
+	  to announce the list of loaded plugins (in both Finch and Pidgin).
+
+version 2.6.2 (09/05/2009):
+	libpurple:
+	* Fix --disable-avahi to actually disable it in configure, as opposed
+	  to just making the warning non-fatal.
+	* Fix using GNOME proxy settings properly.  (Erik van Pienbroek)
+
+	IRC:
+	* Fix parsing of invalid TOPIC messages.  (CVE-2009-2703)
+
+	MSN:
+	* Sending custom smileys in chats is now supported.
+	* Ink messages are now saved when using the HTML logger.
+	* Fix a crash when receiving some handwritten messages.
+	* Fix a crash when receiving certain SLP invite messages.
+	* Chats with multiple people should no longer spontaneously
+	  disconnect.
+
+	XMPP:
+	* Prompt the user before cancelling a presence subscription.
+	* Escape status messages that have HTML entities in the Get Info dialog.
+	* Fix connecting to XMPP domains with no SRV records from Pidgin on
+	  Windows.
+	* Fix typing notifications with Pidgin 2.5.9 or earlier.
+	* Fix connecting using BOSH and legacy authentication (XEP-0078).
+	* Adding buddies of the form "romeo@montague.net/Resource" are handled
+	  properly.  In addition, it is no longer possible to add buddies of
+	  the form "room@conference.example.net/User", where
+	  room@conference.example.net is a MUC.
+	* Don't crash when receiving "smileyfied" XHTML-IM from clients that don't
+	  support bits of binary (ie. when getting an empty <data/> in return)
+	* Fix bug where SSL/TLS was not required even though the
+	  "require SSL/TLS" preference checked when connecting to servers
+	  that use the older iq-based authentication.  (CVE-2009-3026)
+
+	Yahoo!/Yahoo! JAPAN:
+	* Accounts now have "Use account proxy for SSL connections" option.  This
+	  option force-overrides the account specific proxy settings for SSL
+	  connections only and instead uses the global proxy configuration.
+
+	Finch:
+	* Properly detect libpanel on OpenBSD.  (Brad Smith)
+	* Remove IO watches in gnt_quit.  (Tomasz Mon)
+
+	Pidgin:
+	* Fix the auto-personize functionality in the Buddy List.
+	* Set the window icon for the media window to an icon corresponding to
+	  the type of call (headphone or webcam).
+	* Customized sound files are no longer reset whenever opening the
+	  Preferences dialog.
+	* The buddy list should now immediately refresh upon changing the icon
+	  theme.
+
+version 2.6.1 (08/18/2009):
+	* Fix a crash when some users send you a link in a Yahoo IM
+	* Fix compilation with GTK+ < 2.6.0
+	* Fix compilation on Windows
+
+version 2.6.0 (08/18/2009):
 	libpurple:
 	* Theme support in libpurple thanks to Justin Rodriguez's summer of code
 	  project, with some minor additions and cleanups from Paul Aurich.
@@ -13,10 +78,32 @@
 	* Various memory cleanups when unloading libpurple. (Nick Hebner and
 	  Stefan Becker)
 	* Report idle time 'From last message sent' should work properly.
+	* Better handling of corrupt certificates in the TLS Peers cache.
+	* More efficient buddy list and conversation search functions.
+	  (Jan Kaluza and Aman Gupta)
+	* Install scalable versions of the main Pidgin icon, the protocol icons,
+	  the dialog icons, and the Buddy List emblems.
+	* Build properly on Hurd.  (Marc Dequènes)
+	* Various memory leaks fixed as reported by Josh Mueller.
+	* Properly handle an IRC buddy appearing in multiple groups.
+	* Escape HTML entities in usernames when written with the HTML logger.
+	* Do not display MySpace status changes as incoming IMs.  (Mark Doliner and
+	  Justin Williams)
+
+	DNS:
 	* DNS servers are re-read when DNS queries fail in case the system has
 	  moved to a new network and the old servers are not accessible.
 	* DNS SRV records with equal priority are sorted with respect to their
 	  weight as specified in RFC 2782.  (Vijay Raghunathan)
+	* Don't do IPv6 address lookups if the computer does not have an IPv6
+	  address configured.
+	* Fix a leak when the UI provides its own DNS resolving UI op.
+	  (Aman Gupta)
+	* Don't fork a DNS resolver process to resolve IP addresses.  (Aman Gupta)
+	* Internationalized Domain Names are supported when libpurple is compiled
+	  against the GNU IDN library.
+
+	Environment Variables:
 	* GnuTLS logging (disabled by default) can be controlled through the
 	  PURPLE_GNUTLS_DEBUG environment variable, which is an integer between
 	  0 and 9 (higher is more verbose). Higher values may reveal sensitive
@@ -31,24 +118,6 @@
 	  useful when running libpurple inside of Valgrind or similar programs.
 	  Currently, it keeps plugins in memory, allowing Valgrind to perform
 	  symbol resolution of leak traces at shutdown.
-	* Don't do IPv6 address lookups if the computer does not have an IPv6
-	  address configured.
-	* Fix a leak when the UI provides its own DNS resolving UI op.
-	  (Aman Gupta)
-	* Don't fork a DNS resolver process to resolve IP addresses.  (Aman Gupta)
-	* Better handling of corrupt certificates in the TLS Peers cache.
-	* More efficient buddy list and conversation search functions.
-	  (Jan Kaluza and Aman Gupta)
-	* Internationalized Domain Names are supported when libpurple is compiled
-	  against the GNU IDN library.
-	* Install scalable versions of the main Pidgin icon, the protocol icons,
-	  the dialog icons, and the Buddy List emblems.
-	* Build properly on Hurd.  (Marc Dequènes)
-	* Various memory leaks fixed as reported by Josh Mueller.
-	* Properly handle an IRC buddy appearing in multiple groups.
-	* Escape HTML entities in usernames when written with the HTML logger.
-	* Do not display MySpace status changes as incoming IMs.  (Mark Doliner and
-	  Justin Williams)
 
 	AIM and ICQ:
 	* Preliminary support for a new authentication scheme called
@@ -67,6 +136,17 @@
 	* Support connection progress steps in Gadu-Gadu.  (Krzysztof "kkszysiu"
 	  Klinikowski)
 
+	MSN:
+	* Add support for receiving handwritten (ink) messages on MSN.  (Chris
+	  Stafford, Gal Topper, and Elliott Sales de Andrade)
+	* Add support for receiving audio clips on MSN.  (Chris Stafford, Gal
+	  Topper, and Elliott Sales de Andrade)
+	* Show the invite message for buddies that requested authorization
+	  from you on MSN.
+	* Support sending an invite message to buddies when requesting authorization
+	  from them on MSN.
+	* Timeout switchboard connections aggressively (60 seconds).
+
 	XMPP:
 	* Voice & Video support with Jingle (XEP-0166, 0167, 0176, & 0177), voice
 	  support with GTalk and voice and video support with the GMail web
@@ -136,15 +216,6 @@
 	* Ability to set personal details for an account and for buddies in the
 	  buddylist.
 
-	MSN:
-	* Add support for receiving handwritten (ink) messages on MSN.
-	* Add support for receiving audio clips on MSN.
-	* Show the invite message for buddies that requested authorization
-	  from you on MSN.
-	* Support sending an invite message to buddies when requesting authorization
-	  from them on MSN.
-	* Timeout switchboard connections aggressively
-
 	Pidgin:
 	* Added -f command line option to tell Pidgin to ignore NetworkManager
 	  and assume it has a valid network connection.
@@ -192,6 +263,8 @@
 	* The hardware cursor is updated correctly. This will be useful
 	  especially for users of braille terminals, screen readers etc.
 	* Added a TinyURL plugin, which aids copying longer URLs.
+	* Fixed UTF-8 compatibility problems which could cause exits or other
+	  unrequested behaviour.
 
 	Pidgin GTK+ Theme Control Plugin:
 	* Removed mouse cursor color preferences.
@@ -200,6 +273,13 @@
 	* Preferences have been reorganized into three tabs for Colors, Fonts, and
 	  Miscellaneous categories.
 
+version 2.5.9 (08/18/2009):
+	* Fix a crash via a specially crafted MSN message (CVE-2009-2694,
+	  thanks to Core Security Technologies for discovering this and
+	  notifying us privately before announcing it).
+	* Fix a crash in Bonjour, MSN, and XMPP when trying to transfer files with
+	  NULL names.
+
 version 2.5.8 (06/27/2009):
 	ICQ:
 	* Fix misparsing a web message as an SMS message. (Yuriy Kaminskiy)
--- a/ChangeLog.API	Wed Sep 16 15:35:45 2009 +0000
+++ b/ChangeLog.API	Wed Sep 16 15:36:24 2009 +0000
@@ -1,6 +1,18 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.6.0 (??/??/2009):
+version 2.6.2 (09/05/2009):
+	Perl:
+		Added:
+		* Purple::XMLNode::get_next(), which returns the next neighbor tag of
+		  the current node.
+		Changed:
+		* Purple::XMLNode::get_child() will return the first child node if
+		  passed "" or undef as the name of the node.
+
+version 2.6.1 (08/18/2009):
+	No changes
+
+version 2.6.0 (08/18/2009):
 	libpurple:
 		Added:
 		* PurpleMedia and PurpleMediaManager API
@@ -154,6 +166,9 @@
 		* GntProgressBar and functions (Saleem Abdulrasool)
 
 	perl:
+		Added:
+		* Purple::XMLNode::get_name()
+
 		Changed:
 		* Made a bunch of functions act more perl-like. Call the new()
 		  functions as Class->new(...) instead of Class::new(...):
@@ -167,6 +182,14 @@
 			* Purple::Request::Field::list_new
 			* Purple::Request::Field::string_new
 			* Purple::Request::Field::group_new
+		* Make the XMLNode API more perl-like. Don't pass len
+		  parameters and call them like:
+			* $xmlnode->copy()
+			* $xmlnode->to_str()
+			* $xmlnode->to_formatted_str()
+			* Purple::XMLNode::from_str(...)
+version 2.5.9 (08/18/2009):
+	No changes
 
 version 2.5.8 (06/27/2009):
 	No changes
--- a/ChangeLog.win32	Wed Sep 16 15:35:45 2009 +0000
+++ b/ChangeLog.win32	Wed Sep 16 15:36:24 2009 +0000
@@ -1,6 +1,15 @@
-version 2.6.0 (??/??/2009):
+version 2.6.2 (09/05/2009):
+	* No changes
+
+version 2.6.1 (08/18/2009):
+	* No changes
+
+version 2.6.0 (08/18/2009):
 	* Added XMPP URI support.
 
+version 2.5.9 (08/18/2009):
+	* No changes and no win32 packages built.
+
 version 2.5.8 (06/27/2009):
 	* No changes
 
--- a/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -100,13 +100,13 @@
 	|| (cd $(srcdir) && mtn --root=. automate get_base_revision_id) 2>/dev/null >$@ \
 	|| rm -f $@
 package_revision.h: package_revision_raw.txt
-	if [ -f $< ]; then \
-	  sed 's/^\(.\+\)$$/#define REVISION "\1"/' $< > $@; \
+	if test -f $<; then \
+	  echo "#define REVISION \"`cat $<`\"" > $@; \
 	fi
-	if [ ! -f $@ -a -f $(srcdir)/$@ ]; then \
+	if test ! -f $@ -a -f $(srcdir)/$@; then \
 	  cp $(srcdir)/$@ $@; \
 	fi
-	[ -f $@ ] || echo "#define REVISION \"unknown\"" > $@
+	test -f $@ || echo "#define REVISION \"unknown\"" > $@
 
 # This is a magic directive copy-and-pasted, then modified, from the
 # automake 1.9 manual, section 13.4, "Checking the distribution".
--- a/NEWS	Wed Sep 16 15:35:45 2009 +0000
+++ b/NEWS	Wed Sep 16 15:36:24 2009 +0000
@@ -2,6 +2,68 @@
 
 Our development blog is available at: http://planet.pidgin.im
 
+2.6.2 (09/05/2009):
+	Mark: Woo boy it's been a busy two weeks.  There was a lot of new code
+	in 2.6.0, and with new code comes new bugs.  The cadre of relentless
+	developers responsible for Pidgin have been hard at work, and I believe
+	they have fixed all the major bugs that cropped up.  My thanks to all
+	those names listed as Current Developers in Pidgin's 'About' window.
+
+	Elliott: Well now, just as Mark said, there was a lot of new stuff that
+	probably came up with tons of bugs.  So I can't say I wrote anything
+	super-awesome, but I definitely fixed quite a few of those itty-bitty
+	why-didn't-this-work-this-way sort of bugs.
+
+2.6.1 (08/18/2009):
+	Mark: There were a lot of changes in 2.6.0, and so a few major bugs
+	crept in.  This is a very minor release to fix those bugs.  Sorry for
+	the inconvenience!
+
+2.6.0 (08/18/2009):
+	John:  Wow, four straight releases that I'm the first to NEWS on.  This
+	is getting kinda scary!  I'm beginning to wonder who else actually does
+	anything around here!  (Just kidding, of course.)  LOTS of new features
+	and a crapton of bugfixes this release.  There should pretty much be
+	something for everybody.  A great example of this is the ton of Yahoo
+	changes that have happened thanks to our SoC student from 2008, Sulabh
+	Mahajan.  Among his massive improvements are the ability to add MSN
+	buddies by adding them as "msn/user@domain.tld" and peer-to-peer file
+	transfers.  Of course, history shows we can't please everyine, so I'm
+	sure I'll see a complaint or five thousand in trac.  Enjoy, though!
+
+	Marcus: This is my first news! It's been quite a few microreleases this
+	time, but now we're finally at 2.6.0. I suppose the most anticipated
+	new feature in this release is the voice and video support, thanks to
+	Mike's heroic work. I've managed to slip in a few features too, like
+	in-band bytestream file transfers as a fallback on XMPP and idle time
+	reporting on XMPP. Enjoy!
+
+	Paul: This is my first news, too!  This release has definitely been a
+	long time coming; hopefully it won't disappoint since we've closed over
+	200 tickets.  Among other things, Tobias Markmann's GSoC project from
+	last year was merged, which means we now support BOSH (XMPP connections
+	over HTTP), and Andrei Mozzhuhin contributed an XMPP Service Discovery
+	Browser.  Also, thanks to Bernmeister for poking (at least) several
+	hundred old tickets!
+
+	Mike: Ditto. This is my first news as well. I have a feeling this is
+	getting repetitive at this point, but voice and video support is
+	finally here! Thanks to the rest of the Pidgin team, Farsight 2, and
+	GStreamer developers for making this possible! (I finally finished my
+	Summer of Code project :D)
+
+	Elliott: Hey, this is my firs... Wait, no it isn't.  Now I feel left
+	out.  So have you heard about this voice and video thing?
+	Unfortunately, not quite ready for all protocols, but it's getting
+	there.  MSN gained support for receiving voice clips at least, and
+	finally we have Ink receiving capabilities too.  Thanks to the guys
+	who wrote the original patch.  And finally, MSN no longer has over a
+	100 tickets open!
+
+2.5.9 (08/18/2009):
+	John:  This release is just a crash fix release to address a security
+	issue reported to us by CORE and a couple crashes Elliott found.
+
 2.5.8 (06/27/2009):
 	John:  This release is another somewhat rushed bugfix release to fix
 	a number of bugs that have come up since we released Pidgin 2.5.7.
@@ -51,10 +113,10 @@
 	a few patches, and we've dealt with what feels like a TON of tickets
 	about two very common issues.  Feels like time for a release to me.
 
-	Etan: My first NEWS in quite a while and I don't have much to say. I
+	Etan: My first NEWS in quite a while and I don't have much to say.  I
 	haven't been too active lately and I'm hoping that won't be the case
-	going forward. I managed to get in a few perl fixes and some UI
-	language tweaks this release. My plan is to work on some of the
+	going forward.  I managed to get in a few perl fixes and some UI
+	language tweaks this release.  My plan is to work on some of the
 	issues pointed out by mpt (during his expert review of pidgin a little
 	while back) in the near future.
 
@@ -92,14 +154,14 @@
 	messaging pleasure.
 
 	Sadrul: Despite our best efforts, this release got delayed by a
-	couple of weeks. But here it is! It is mostly a bug fix release, with
+	couple of weeks.  But here it is! It is mostly a bug fix release, with
 	a couple of important fixes, e.g. fix for the Yahoo! disconnect
-	problem. Also, welcome our newest Crazy Patch Writer, Marcus Lundblad,
+	problem.  Also, welcome our newest Crazy Patch Writer, Marcus Lundblad,
 	who, among various other fixes, has implemented custom smileys for the
-	XMPP protocol, included in this release. Enjoy!
+	XMPP protocol, included in this release.  Enjoy!
 
 	Stu: I guess this is the time of year for server migrations, and
-	I've just about had enough of them. Fortunately Pidgin is still fun,
+	I've just about had enough of them.  Fortunately Pidgin is still fun,
 	and this release should be superb.
 
 	John: Although our services were down for quite some time, we didn't
@@ -109,8 +171,8 @@
 	happy!
 
 	Elliott: This release took a while, but that was due to an unfortunate
-	server snafu. I didn't have much to do with it, but hopefully the new
-	servers will help us out a bit. Anyway, mostly bug-fixes this time.
+	server snafu.  I didn't have much to do with it, but hopefully the new
+	servers will help us out a bit.  Anyway, mostly bug-fixes this time.
 	Nothing spectacular, unless you happen to suffer from one of those bugs.
 	Oh, and don't forget, the "Has you" tooltip is back!
 
@@ -123,9 +185,9 @@
 	coming months.
 
 	Elliott: I'm just commenting so Kevin wouldn't be the only one in NEWS
-	and no-one else seems to want to. Anyway, there's a couple MSN login
-	fixes, so try it out. The contact list problems might still be around,
-	but you can probably find a workaround in trac. And there's a tooltip
+	and no-one else seems to want to.  Anyway, there's a couple MSN login
+	fixes, so try it out.  The contact list problems might still be around,
+	but you can probably find a workaround in trac.  And there's a tooltip
 	fix for our AIM friends, not that I had anything to do with it (except
 	closing many many duplicate tickets).
 
@@ -135,16 +197,16 @@
 	it to the world!  There are myriad bugfixes, including some important
 	ones so you should be sure to update.
 
-	Hylke: Finally MSNP15 support. To celebrate this I refreshed a lot of
+	Hylke: Finally MSNP15 support.  To celebrate this I refreshed a lot of
 	the smilies used in the protocol and added the long awaited indispensable
-	bunny icon. I think this is one of those releases that will make a lot
+	bunny icon.  I think this is one of those releases that will make a lot
 	of users happy, especially MSN users.
 
-	Elliott: Oh look, my first NEWS! Well anyway, with that new MSNP15
+	Elliott: Oh look, my first NEWS!  Well anyway, with that new MSNP15
 	support, this release is set up to be a huge success and a total flop
-	all at the same time. Here's hoping it's the "huge success" one for you.
+	all at the same time.  Here's hoping it's the "huge success" one for you.
 	Those icon changes that Hylke made, while minor, really make things look
-	a little cleaner, I think. Oh yea, did I mention that MSNP15 stuff?
+	a little cleaner, I think.  Oh yea, did I mention that MSNP15 stuff?
 
 	Mark: Speaking of MSNP15, we'd like to welcome Elliott Sales de Andrade
 	as a full fledged developer!  He took the last few strides mushing the
@@ -152,7 +214,7 @@
 	doing other great stuff.
 
 	Ka-Hing: "Reject"ing a certificate after your account is signed off is
-	not recommended. Deleting the file after you start sending it is also
+	not recommended.  Deleting the file after you start sending it is also
 	discouraged.
 
 2.4.3 (07/01/2008):
@@ -162,12 +224,12 @@
 2.4.2 (5/17/2008):
 	Sadrul: We added some usability changes in this release, including the
 	typing notification, buddyicon and input area size in the conversation
-	windows, escape to close conversation windows etc. These changes should
+	windows, escape to close conversation windows etc.  These changes should
 	make pidgin more usable and more fun for Everyone! *wink*
 
 	Stu: I fixed some memory leaks, but nothing like as many as Daniel did.
 	MSN buddy list synchronization should be significantly less painful now,
-	and opening MSN inboxes might work better too. SILC passphrase changes
+	and opening MSN inboxes might work better too.  SILC passphrase changes
 	and support for passphrase-less keys has been improved also.
 
 2.4.1 (3/31/2008):
@@ -184,27 +246,27 @@
 	John: While this release took what seems like forever to get out the
 	door, I think it's well worth the wait, especially for Yahoo! users.
 	This release serves up some fixes for long standing bugs and adds
-	file transfer for transfers with newer Yahoo! clients (finally!). As
+	file transfer for transfers with newer Yahoo! clients (finally!).  As
 	is standard with code I committed, where it works great thank the
-	patch writer, and where it's broken, feel free to yell at me. Enjoy!
-
-	Sadrul: Finch is more colourful and blinky in this release! There's
+	patch writer, and where it's broken, feel free to yell at me.  Enjoy!
+
+	Sadrul: Finch is more colourful and blinky in this release!  There's
 	now a log viewer, which is very useful, and also the ability to
-	block/unblock buddies. It's now also possible to find chat rooms on
-	many services, e.g. XMPP, IRC, Yahoo! etc. Happy Leap Day!
+	block/unblock buddies.  It's now also possible to find chat rooms on
+	many services, e.g. XMPP, IRC, Yahoo! etc.  Happy Leap Day!
 
 	Ka-Hing: I think all I've done for this release is committing some
 	patches written by other people.
 
-	Stu: Finally, 2.4.0 lands. I didn't do all that much except complain
-	about things I didn't like or just revert Sean's changes. I'm quite
+	Stu: Finally, 2.4.0 lands.  I didn't do all that much except complain
+	about things I didn't like or just revert Sean's changes.  I'm quite
 	pleased with how well it's turned out in the end.
 	Happy Birthday Fred, you must be nearly 10 now ;-)
 
 2.3.1 (12/7/2007):
 	Stu: I'm sorry for the MSN problems and the plugin crashes in 2.3.0.
-	Hopefully this will redeem us. This fixes a number of bugs. I'm a
-	bit late but I'd like to welcome John to the team. Enjoy!
+	Hopefully this will redeem us.  This fixes a number of bugs.  I'm a
+	bit late but I'd like to welcome John to the team.  Enjoy!
 
 	Luke: I've done absolutely nothing in the last 2 weeks, except watch
 	others commit bug and, more, leak fixes.  People should be noticing
@@ -246,23 +308,23 @@
 	last release looking at the tickets that have been submitted
 	and many of them have been closed.
 
-	Stu: I haven't NEWS'd in a while. I haven't actually done much for
-	too long also, maybe I'll find some time soon. This release is
+	Stu: I haven't NEWS'd in a while.  I haven't actually done much for
+	too long also, maybe I'll find some time soon.  This release is
 	basically what 2.2.0 should have been - it actually compiles this
 	time.
 
 2.2.0 (9/13/2007):
 	Sean: 2.2.0 contains the results of several major Google Summer
-	of Code branches bringing some new, extraordinary features. We
+	of Code branches bringing some new, extraordinary features.  We
 	have a new protocol, MySpaceIM, a bunch of new features for an
 	existing protocol, XMPP, and nifty new certificate management
 	to make sure your IM server is who it says it is.
 
 	Ka-Hing: A number of you noticed crashes when dragging windows
-	around when certain options are enabled. Well, that was my fault,
-	and Sadrul fixed it. So Props to him and poos to me. I haven't
+	around when certain options are enabled.  Well, that was my fault,
+	and Sadrul fixed it.  So Props to him and poos to me.  I haven't
 	done much for this release, but the next one should contain
-	something that I helped work on. Hint: students are cheap slave
+	something that I helped work on.  Hint: students are cheap slave
 	coders!
 
 	Kevin: I haven't really been coding much in Pidgin, and this
@@ -272,9 +334,9 @@
 
 2.1.1 (8/20/2007):
 	Sean: Continuing our schedule of frequent releases, Pidgin 2.1.1
-	is out. In it, we've addressed a lot of UI issues from our
+	is out.  In it, we've addressed a lot of UI issues from our
 	experimental new changes introduced in 2.1.0, and gave a lot of 
-	attention to Yahoo! and Bonjour. Thanks to everyone who 
+	attention to Yahoo! and Bonjour.  Thanks to everyone who 
 	contributed.
 
 	Luke: We have reworked some parts of the conversation windows in
@@ -285,14 +347,14 @@
 	various issues, testing fixes, and getting patches in.
 
 	Tim: Sean finally got me to fix some of the buddy list bugs with
-	Yahoo! when in version 15 mode. So now we have some Yahoo! to
-	MSN support, which is kind of nice. Looks like some others have
+	Yahoo! when in version 15 mode.  So now we have some Yahoo! to
+	MSN support, which is kind of nice.  Looks like some others have
 	been contributing to Yahoo! while I've been AWOL, so many thanks
 	to them.
 
 2.1.0 (7/28/2007):
 	Sean: This release took a bit longer than 3 weeks, but boy is it 
-	worth it! We're beginning to experiment with new UI concepts and
+	worth it!  We're beginning to experiment with new UI concepts and
 	this release features a largely re-designed conversation window.
 	We've closed 150 tickets for this release; much thanks go to all
 	the developers, translators, and testers who made this possible.
@@ -300,28 +362,28 @@
 	Ka-Hing: Sean said no one else NEWS'ed, so I figure I should.
 
 2.0.2 (6/14/2007):
-	Sean: Another big maintenance release. Again, about 100 tickets were
-	resolved in this release, and they keep coming in. Lots of bug fixes,
+	Sean: Another big maintenance release.  Again, about 100 tickets were
+	resolved in this release, and they keep coming in.  Lots of bug fixes,
 	some minor icon adjustements, hopefully we addressed some ICQ
 	internationalization issues, and support for Bonjour on Windows!
 	Our next release will be 2.1.0, and will come with some great new
 	features.
 
 	Stu: I think we're gradually getting the hang of this 3 week thing
-	again. This release includes yet more bug fixes. I'd also like to
+	again.  This release includes yet more bug fixes.  I'd also like to
 	specifically thank Pekka Riikonen for the patch to enable using SILC
 	Toolkit 1.1 with Pidgin/libpurple that is included in this release.
 
 2.0.1 (5/24/2007):
-	Sean: 2.0.1! Three weeks later, as scheduled! It is so nice to have
-	regular, frequent, releases again! This is a bugfix release; We have
+	Sean: 2.0.1!  Three weeks later, as scheduled!  It is so nice to have
+	regular, frequent, releases again!  This is a bugfix release; We have
 	fixed over 100 issues reported to us at http://developer.pidgin.im.
 	Thanks to everyone for their great work, and look for the next release
 	in another three weeks!
 
-	Stu: Lots'o'fixes in this. I don't know how you users find so many
-	things for us to fix. 24 hours in a day (sadly). 24 is divisible by the
-	sum of its digits and by their product. It is the smallest composite
+	Stu: Lots'o'fixes in this.  I don't know how you users find so many
+	things for us to fix.  24 hours in a day (sadly).  24 is divisible by the
+	sum of its digits and by their product.  It is the smallest composite
 	number, the product of whose divisors is a cube.
 
 	Luke: I requested that we have a bug fix release, and so we have!
@@ -343,18 +405,18 @@
 	definition of 'cool' to get it.
 
 	Etan: Perl plugins now have access to almost all of the savedstatus
-	API functions. I also removed a couple of the preferences from the
+	API functions.  I also removed a couple of the preferences from the
 	Pidgin GTK+ Theme Control plugin which should help many of the people
-	for whom the configuration dialog size was a problem. The removed
+	for whom the configuration dialog size was a problem.  The removed
 	preferences no longer had the effects they were added to have anyway.
 
 2.0.0 (5/3/2007):
 	Sean: 2.0.0! It's real exciting to finally release Pidgin 2.0.0! I'm
-	really proud of all the work we've all done. I'm pumped. And, while
+	really proud of all the work we've all done.  I'm pumped.  And, while
 	I could go on about all the amazing thing that have been added since
 	1.5.0, what I'm really excited about is getting back to a regular,
 	rapid, release cycle of active, open development, unhindered by legal
-	quandries. Huge thanks to everyone involved.
+	quandries.  Huge thanks to everyone involved.
 
 	Luke: We have finally managed to get 2.0.0 out the door, after nearly
 	but not quite 2 years of effort and fustration.  No one regrets more
@@ -371,24 +433,24 @@
 	attempt to avoid knee-jerk reactions.
 
 	Evan: One small step for bird, one giant leap for birdkind... except
-	this is hardly one small step. A lot more has changed from Gaim 1.5.0
+	this is hardly one small step.  A lot more has changed from Gaim 1.5.0
 	than just the name. Pidgin has a *very* attractive new look, a whole
 	new member of the family (Finch, formerly gaim-console) has been born,
 	and libpurple has come into its own as a solid, full-featured library
-	powering the greatest IM clients around. Bugs were fixed and
+	powering the greatest IM clients around.  Bugs were fixed and
 	features were added by the hundreds (thousands?) since the last
 	major release, all while improving performance and resisting feature
-	creep. As Luke said, a ton of thought and effort has gone into
+	creep.  As Luke said, a ton of thought and effort has gone into
 	Pidgin 2.0.0; I'm proud to have played a part.
 
-	Stu: We did it! finally, we have 2.0.0. It's been a long time coming,
-	but there's a great deal of goodness here. When I say a long time, I'm
+	Stu: We did it! finally, we have 2.0.0.  It's been a long time coming,
+	but there's a great deal of goodness here.  When I say a long time, I'm
 	not kidding - it's been 972 days since we branched off "oldstatus"
-	(aka 1.x). The early Greeks were uncertain as to whether 2 was a
+	(aka 1.x).  The early Greeks were uncertain as to whether 2 was a
 	number at all (or if we'd ever make this release) - it has a beginning
 	and an end but no middle (much like our unfortunately quiet development
-	period). 2 is the first prime number and the only even prime. 2 is also
-	the first deficient number (oh well). There are only 10 types of people
+	period).  2 is the first prime number and the only even prime. 2 is also
+	the first deficient number (oh well).  There are only 10 types of people
 	in the world - those who like our new names and those who do not.
 	Enjoy!
 
@@ -398,7 +460,7 @@
 	where they are today.  Congratulations everyone!
 
 	Sadrul: My first NEWS, and on what an occasion! Pidgin 2.0.0 is finally
-	released!! And it's *really* very good!!! Give your soul a break ...
+	released!!  And it's *really* very good!!!  Give your soul a break ...
 	Use Pidgin!
 
 	Daniel: There has been a fair amount of weeping and gnashing of teeth
--- a/PLUGIN_HOWTO	Wed Sep 16 15:35:45 2009 +0000
+++ b/PLUGIN_HOWTO	Wed Sep 16 15:36:24 2009 +0000
@@ -1,6 +1,6 @@
 For information on writing a plugin for Purple, Pidgin or Finch, go
-http://developer.pidgin.im and click on API.  From there, see the HOWTOs in the
-"Related Pages" section.
+http://developer.pidgin.im and click on API.  From there, see the
+HOWTOs in the "Related Pages" section.
 
 You can also generate this documentation locally by installing
 doxygen and graphviz dot, then running "make docs" in the
--- a/autogen.sh	Wed Sep 16 15:35:45 2009 +0000
+++ b/autogen.sh	Wed Sep 16 15:36:24 2009 +0000
@@ -129,6 +129,7 @@
 check "$libtoolize";		LIBTOOLIZE=${BIN};
 check "glib-gettextize";	GLIB_GETTEXTIZE=${BIN};
 check "intltoolize";		INTLTOOLIZE=${BIN};
+check "sed";				SED=${BIN};
 check "aclocal";		ACLOCAL=${BIN};
 check "autoheader";		AUTOHEADER=${BIN};
 check "automake";		AUTOMAKE=${BIN};
@@ -140,6 +141,9 @@
 run_or_die ${LIBTOOLIZE} ${LIBTOOLIZE_FLAGS:-"-c -f --automake"}
 run_or_die ${GLIB_GETTEXTIZE} ${GLIB_GETTEXTIZE_FLAGS:-"--force --copy"}
 run_or_die ${INTLTOOLIZE} ${INTLTOOLIZE_FLAGS:-"-c -f --automake"}
+# This call to sed is needed to work around an annoying bug in intltool 0.40.6
+# See http://developer.pidgin.im/ticket/9520 for details
+run_or_die ${SED} "s:'\^\$\$lang\$\$':\^\$\$lang\$\$:g" -i po/Makefile.in.in
 run_or_die ${ACLOCAL} ${ACLOCAL_FLAGS:-"-I m4macros"}
 run_or_die ${AUTOHEADER} ${AUTOHEADER_FLAGS}
 run_or_die ${AUTOMAKE} ${AUTOMAKE_FLAGS:-"-a -c --gnu"}
--- a/configure.ac	Wed Sep 16 15:35:45 2009 +0000
+++ b/configure.ac	Wed Sep 16 15:36:24 2009 +0000
@@ -46,7 +46,7 @@
 m4_define([purple_lt_current], [6])
 m4_define([purple_major_version], [2])
 m4_define([purple_minor_version], [6])
-m4_define([purple_micro_version], [0])
+m4_define([purple_micro_version], [3])
 m4_define([purple_version_suffix], [devel])
 m4_define([purple_version],
           [purple_major_version.purple_minor_version.purple_micro_version])
@@ -55,7 +55,7 @@
 m4_define([gnt_lt_current], [6])
 m4_define([gnt_major_version], [2])
 m4_define([gnt_minor_version], [6])
-m4_define([gnt_micro_version], [0])
+m4_define([gnt_micro_version], [3])
 m4_define([gnt_version_suffix], [devel])
 m4_define([gnt_version],
           [gnt_major_version.gnt_minor_version.gnt_micro_version])
@@ -312,11 +312,11 @@
 dnl #######################################################################
 dnl # Check for GLib 2.0 (required)
 dnl #######################################################################
-PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.0.0 gobject-2.0 gmodule-2.0 gthread-2.0], , [
+PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.4.0 gobject-2.0 gmodule-2.0 gthread-2.0], , [
 	AC_MSG_RESULT(no)
 	AC_MSG_ERROR([
 
-You must have the GLib 2.0 development headers installed to build.
+You must have GLib 2.4.0 or newer development headers installed to build.
 
 If you have these installed already you may need to install pkg-config so
 I can find them.
@@ -399,12 +399,13 @@
 fi
 
 if test "x$enable_gtkui" = "xyes" ; then
-	PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.0.0], , [
+	PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.4.0], , [
 		AC_MSG_RESULT(no)
 		AC_MSG_ERROR([
 
-You must have the GTK+ 2.0 development headers installed to compile Pidgin.
-If you want to build only Finch then specify --disable-gtkui when running configure.
+You must have GTK+ 2.4.0 or newer development headers installed to compile
+Pidgin.  If you want to build only Finch then specify --disable-gtkui when
+running configure.
 ])])
 
 	AC_SUBST(GTK_CFLAGS)
@@ -631,7 +632,8 @@
 		[ac_ncurses_includes="$withval"], [ac_ncurses_includes=""])
 if test "x$enable_consoleui" = "xyes"; then
 	AC_CHECK_LIB(ncursesw, initscr, [GNT_LIBS="-lncursesw"], [enable_consoleui=no])
-	AC_CHECK_LIB(panelw, update_panels, [GNT_LIBS="$GNT_LIBS -lpanelw"], [enable_consoleui=no])
+	AC_CHECK_LIB(panelw, update_panels, [GNT_LIBS="$GNT_LIBS -lpanelw"],
+	    [enable_consoleui=no], [$GNT_LIBS])
 
 	if test "x$enable_consoleui" = "xyes"; then
 		dnl # Some distros put the headers in ncursesw/, some don't
@@ -674,7 +676,8 @@
 		# ncursesw was not found. Look for plain old ncurses
 		enable_consoleui=yes
 		AC_CHECK_LIB(ncurses, initscr, [GNT_LIBS="-lncurses"], [enable_consoleui=no])
-		AC_CHECK_LIB(panel, update_panels, [GNT_LIBS="$GNT_LIBS -lpanel"], [enable_consoleui=no])
+		AC_CHECK_LIB(panel, update_panels, [GNT_LIBS="$GNT_LIBS -lpanel"],
+		    [enable_consoleui=no], [$GNT_LIBS])
 		AC_DEFINE(NO_WIDECHAR, 1, [Define to 1 if you don't have wide-character support.])
 		if test x"$ac_ncurses_includes" != "x"; then
 			GNT_CFLAGS="-I$ac_ncurses_includes"
@@ -792,13 +795,13 @@
 dnl #######################################################################
 AC_ARG_ENABLE(vv,
 	[AC_HELP_STRING([--disable-vv], [compile without voice and video support])],
-	[enable_vv="$enableval" force_vv=$enableval], [enable_vv="yes" force_vv=no])
+	enable_vv="$enableval", enable_vv="yes")
 if test "x$enable_vv" != "xno"; then
 	if test "x$enable_gstreamer" != "xno" -a "x$enable_gstinterfaces" != "xno" -a "x$enable_farsight" != "xno"; then
 		AC_DEFINE(USE_VV, 1, [Use voice and video])
 	else
 		enable_vv="no"
-		if test "x$force_vv" = "xyes"; then
+		if test "x$force_deps" = "xyes"; then
 			AC_MSG_ERROR([
 Dependencies for voice/video were not met.
 Install the necessary gstreamer and farsight packages first.
@@ -807,6 +810,7 @@
 		fi
 	fi
 fi
+AM_CONDITIONAL(USE_VV, test "x$enable_gstreamer" != "xno" -a "x$enable_gstinterfaces" != "xno" -a "x$enable_farsight" != "xno")
 
 AC_ARG_ENABLE(idn,
 	[AC_HELP_STRING([--disable-idn], [compile without IDN support])],
@@ -856,36 +860,39 @@
 	[AC_HELP_STRING([--disable-avahi],
 		[compile without avahi (required for Bonjour support)])],
 	enable_avahi="$enableval", enable_avahi="yes")
-AC_ARG_WITH(avahi-client-includes, [AC_HELP_STRING([--with-avahi-client-includes=DIR], [compile the Bonjour plugin against the Avahi Client includes in DIR])], [ac_avahi_client_includes="$withval"], [ac_avahi_client_includes="no"])
-AC_ARG_WITH(avahi-client-libs, [AC_HELP_STRING([--with-avahi-client-libs=DIR], [compile the Bonjour plugin against the Avahi Client libs in DIR])], [ac_avahi_client_libs="$withval"], [ac_avahi_client_libs="no"])
-AVAHI_CFLAGS=""
-AVAHI_LIBS=""
+
+if test "x$enable_avahi" = "xyes"; then
+	AC_ARG_WITH(avahi-client-includes, [AC_HELP_STRING([--with-avahi-client-includes=DIR], [compile the Bonjour plugin against the Avahi Client includes in DIR])], [ac_avahi_client_includes="$withval"], [ac_avahi_client_includes="no"])
+	AC_ARG_WITH(avahi-client-libs, [AC_HELP_STRING([--with-avahi-client-libs=DIR], [compile the Bonjour plugin against the Avahi Client libs in DIR])], [ac_avahi_client_libs="$withval"], [ac_avahi_client_libs="no"])
+	AVAHI_CFLAGS=""
+	AVAHI_LIBS=""
 
-dnl Attempt to autodetect Avahi
-PKG_CHECK_MODULES(AVAHI, [avahi-client avahi-glib], [
-	avahiincludes="yes"
-	avahilibs="yes"
-], [
-	avahiincludes="no"
-	avahilibs="no"
-])
+	dnl Attempt to autodetect Avahi
+	PKG_CHECK_MODULES(AVAHI, [avahi-client avahi-glib], [
+		avahiincludes="yes"
+		avahilibs="yes"
+	], [
+		avahiincludes="no"
+		avahilibs="no"
+	])
 
-dnl Override AVAHI_CFLAGS if the user specified an include dir
-if test "$ac_avahi_client_includes" != "no"; then
-	AVAHI_CFLAGS="-I$ac_avahi_client_includes"
+	dnl Override AVAHI_CFLAGS if the user specified an include dir
+	if test "$ac_avahi_client_includes" != "no"; then
+		AVAHI_CFLAGS="-I$ac_avahi_client_includes"
+	fi
+	CPPFLAGS_save="$CPPFLAGS"
+	CPPFLAGS="$CPPFLAGS $AVAHI_CFLAGS"
+	AC_CHECK_HEADER(avahi-client/client.h, [avahiincludes=yes], [avahiincludes=no])
+	CPPFLAGS="$CPPFLAGS $AVAHI_CFLAGS $GLIB_CFLAGS"
+	AC_CHECK_HEADER(avahi-glib/glib-malloc.h, [avahiincludes=yes], [avahiincludes=no])
+	CPPFLAGS="$CPPFLAGS_save"
+
+	dnl Override AVAHI_LIBS if the user specified a libs dir
+	if test "$ac_avahi_client_libs" != "no"; then
+		AVAHI_LIBS="-L$ac_avahi_client_libs -lavahi-common -lavahi-client -lavahi-glib "
+	fi
+	AC_CHECK_LIB(avahi-client, avahi_client_new, [avahilibs=yes], [avahilibs=no], $AVAHI_LIBS)
 fi
-CPPFLAGS_save="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $AVAHI_CFLAGS"
-AC_CHECK_HEADER(avahi-client/client.h, [avahiincludes=yes], [avahiincludes=no])
-CPPFLAGS="$CPPFLAGS $AVAHI_CFLAGS $GLIB_CFLAGS"
-AC_CHECK_HEADER(avahi-glib/glib-malloc.h, [avahiincludes=yes], [avahiincludes=no])
-CPPFLAGS="$CPPFLAGS_save"
-
-dnl Override AVAHI_LIBS if the user specified a libs dir
-if test "$ac_avahi_client_libs" != "no"; then
-	AVAHI_LIBS="-L$ac_avahi_client_libs -lavahi-common -lavahi-client -lavahi-glib "
-fi
-AC_CHECK_LIB(avahi-client, avahi_client_new, [avahilibs=yes], [avahilibs=no], $AVAHI_LIBS)
 
 if test "x$enable_avahi" = "xyes" -a "x$force_deps" = "xyes" -a \( "x$avahiincludes" = "xno" -o "x$avahilibs" = "xno" \); then
 	AC_MSG_ERROR([
--- a/finch/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/finch/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -78,7 +78,6 @@
 
 AM_CPPFLAGS = \
 	-DSTANDALONE \
-	-DBR_PTHREADS=0 \
 	-DDATADIR=\"$(datadir)\" \
 	-DLIBDIR=\"$(libdir)/finch/\" \
 	-DLOCALEDIR=\"$(datadir)/locale\" \
--- a/finch/gntconv.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/finch/gntconv.c	Wed Sep 16 15:36:24 2009 +0000
@@ -29,6 +29,7 @@
 #include <internal.h>
 
 #include <cmds.h>
+#include <core.h>
 #include <idle.h>
 #include <prefs.h>
 #include <util.h>
@@ -1181,22 +1182,43 @@
                  const char *cmd, char **args, char **error, void *data)
 {
 	char *tmp, *markup;
-	PurpleCmdStatus status;
 
 	if (!g_ascii_strcasecmp(args[0], "version")) {
-		tmp = g_strdup_printf("me is using Finch v%s.", DISPLAY_VERSION);
-		markup = g_markup_escape_text(tmp, -1);
-
-		status = purple_cmd_do_command(conv, tmp, markup, error);
+		tmp = g_strdup_printf("Using Finch v%s with libpurple v%s.",
+				DISPLAY_VERSION, purple_core_get_version());
+	} else if (!g_ascii_strcasecmp(args[0], "plugins")) {
+		/* Show all the loaded plugins, including the protocol plugins and plugin loaders.
+		 * This is intentional, since third party prpls are often sources of bugs, and some
+		 * plugin loaders (e.g. mono) can also be buggy.
+		 */
+		GString *str = g_string_new("Loaded Plugins: ");
+		const GList *plugins = purple_plugins_get_loaded();
+		if (plugins) {
+			for (; plugins; plugins = plugins->next) {
+				str = g_string_append(str, purple_plugin_get_name(plugins->data));
+				if (plugins->next)
+					str = g_string_append(str, ", ");
+			}
+		} else {
+			str = g_string_append(str, "(none)");
+		}
 
-		g_free(tmp);
-		g_free(markup);
-		return status;
+		tmp = g_string_free(str, FALSE);
 	} else {
-		purple_conversation_write(conv, NULL, _("Supported debug options are:  version"),
+		purple_conversation_write(conv, NULL, _("Supported debug options are: plugins version"),
 		                        PURPLE_MESSAGE_NO_LOG|PURPLE_MESSAGE_ERROR, time(NULL));
-		return PURPLE_CMD_STATUS_OK;
+		return PURPLE_CMD_RET_OK;
 	}
+
+	markup = g_markup_escape_text(tmp, -1);
+	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)
+		purple_conv_im_send(PURPLE_CONV_IM(conv), markup);
+	else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT)
+		purple_conv_chat_send(PURPLE_CONV_CHAT(conv), markup);
+
+	g_free(tmp);
+	g_free(markup);
+	return PURPLE_CMD_RET_OK;
 }
 
 /* Xerox */
@@ -1207,7 +1229,7 @@
 	FinchConv *ggconv = FINCH_GET_DATA(conv);
 	gnt_text_view_clear(GNT_TEXT_VIEW(ggconv->tv));
 	purple_conversation_clear_message_history(conv);
-	return PURPLE_CMD_STATUS_OK;
+	return PURPLE_CMD_RET_OK;
 }
 
 /* Xerox */
@@ -1247,7 +1269,7 @@
 	purple_conversation_write(conv, NULL, s->str, PURPLE_MESSAGE_NO_LOG, time(NULL));
 	g_string_free(s, TRUE);
 
-	return PURPLE_CMD_STATUS_OK;
+	return PURPLE_CMD_RET_OK;
 }
 
 static PurpleCmdRet
@@ -1255,7 +1277,7 @@
 {
 	void (*callback)(void) = data;
 	callback();
-	return PURPLE_CMD_STATUS_OK;
+	return PURPLE_CMD_RET_OK;
 }
 
 #if GLIB_CHECK_VERSION(2,6,0)
@@ -1278,26 +1300,26 @@
 	else {
 		if (error)
 			*error = g_strdup_printf(_("%s is not a valid message class. See '/help msgcolor' for valid message classes."), args[0]);
-		return PURPLE_CMD_STATUS_FAILED;
+		return PURPLE_CMD_RET_FAILED;
 	}
 
 	fg = gnt_colors_get_color(args[1]);
 	if (fg == -EINVAL) {
 		if (error)
 			*error = g_strdup_printf(_("%s is not a valid color. See '/help msgcolor' for valid colors."), args[1]);
-		return PURPLE_CMD_STATUS_FAILED;
+		return PURPLE_CMD_RET_FAILED;
 	}
 
 	bg = gnt_colors_get_color(args[2]);
 	if (bg == -EINVAL) {
 		if (error)
 			*error = g_strdup_printf(_("%s is not a valid color. See '/help msgcolor' for valid colors."), args[2]);
-		return PURPLE_CMD_STATUS_FAILED;
+		return PURPLE_CMD_RET_FAILED;
 	}
 
 	init_pair(*msgclass, fg, bg);
 
-	return PURPLE_CMD_STATUS_OK;
+	return PURPLE_CMD_RET_OK;
 }
 #endif
 
@@ -1307,7 +1329,7 @@
 	FinchConv *fc = FINCH_GET_DATA(conv);
 	FinchConvChat *ch;
 	if (!fc)
-		return PURPLE_CMD_STATUS_FAILED;
+		return PURPLE_CMD_RET_FAILED;
 
 	ch = fc->u.chat;
 	gnt_widget_set_visible(ch->userlist,
@@ -1315,7 +1337,7 @@
 	gnt_box_readjust(GNT_BOX(fc->window));
 	gnt_box_give_focus_to_child(GNT_BOX(fc->window), fc->entry);
 	purple_prefs_set_bool(PREF_USERLIST, !(GNT_WIDGET_IS_FLAG_SET(ch->userlist, GNT_WIDGET_INVISIBLE)));
-	return PURPLE_CMD_STATUS_OK;
+	return PURPLE_CMD_RET_OK;
 }
 
 void finch_conversation_init()
--- a/finch/gntmedia.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/finch/gntmedia.c	Wed Sep 16 15:36:24 2009 +0000
@@ -156,7 +156,7 @@
 {
 	media->priv = FINCH_MEDIA_GET_PRIVATE(media);
 
-	media->priv->calling = gnt_label_new(_("Calling ... "));
+	media->priv->calling = gnt_label_new(_("Calling..."));
 	media->priv->hangup = gnt_button_new(_("Hangup"));
 	media->priv->accept = gnt_button_new(_("Accept"));
 	media->priv->reject = gnt_button_new(_("Reject"));
--- a/finch/libgnt/configure.ac	Wed Sep 16 15:35:45 2009 +0000
+++ b/finch/libgnt/configure.ac	Wed Sep 16 15:36:24 2009 +0000
@@ -24,11 +24,11 @@
 # Make sure to update ../../configure.ac with libgnt version changes.
 #
 
-m4_define([gnt_lt_current], [5])
+m4_define([gnt_lt_current], [6])
 m4_define([gnt_major_version], [2])
-m4_define([gnt_minor_version], [5])
-m4_define([gnt_micro_version], [0])
-m4_define([gnt_version_suffix], [])
+m4_define([gnt_minor_version], [6])
+m4_define([gnt_micro_version], [2])
+m4_define([gnt_version_suffix], [devel])
 m4_define([gnt_version],
           [gnt_major_version.gnt_minor_version.gnt_micro_version])
 m4_define([gnt_display_version], gnt_version[]m4_ifdef([gnt_version_suffix],[gnt_version_suffix]))
--- a/finch/libgnt/gntkeys.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/finch/libgnt/gntkeys.c	Wed Sep 16 15:36:24 2009 +0000
@@ -166,7 +166,7 @@
 				strstr(term, "xterm") == term ||
 				strstr(term, "vt100") == term)
 			*(text + 1) = 'O';
-	} else if (*(unsigned char*)text == 195) {
+	} else if (g_utf8_get_char(text) == 195) {
 		if (*(text + 2) == 0 && strstr(term, "xterm") == term) {
 			*(text) = 27;
 			*(text + 1) -= 64;  /* Say wha? */
--- a/finch/libgnt/gntmain.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/finch/libgnt/gntmain.c	Wed Sep 16 15:36:24 2009 +0000
@@ -69,7 +69,8 @@
  */
 
 static GIOChannel *channel = NULL;
-static int channel_read_callback;
+static guint channel_read_callback = 0;
+static guint channel_error_callback = 0;
 
 static gboolean ascii_only;
 static gboolean mouse_enabled;
@@ -314,11 +315,11 @@
 	channel_read_callback = result = g_io_add_watch_full(channel,  G_PRIORITY_HIGH,
 					(G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI),
 					io_invoke, NULL, NULL);
-	
-	g_io_add_watch_full(channel,  G_PRIORITY_HIGH,
+
+	channel_error_callback = g_io_add_watch_full(channel,  G_PRIORITY_HIGH,
 					(G_IO_NVAL),
 					io_invoke_error, GINT_TO_POINTER(result), NULL);
-	
+
 	g_io_channel_unref(channel);  /* Apparently this caused crashes for some people.
 	                                 But irssi does this, so I am going to assume the
 	                                 crashes were caused by some other stuff. */
@@ -583,6 +584,13 @@
 
 void gnt_quit()
 {
+	/* Prevent io_invoke() from being called after wm is destroyed */
+	g_source_remove(channel_error_callback);
+	g_source_remove(channel_read_callback);
+
+	channel_error_callback = 0;
+	channel_read_callback = 0;
+
 	g_object_unref(G_OBJECT(wm));
 	wm = NULL;
 
--- a/finch/plugins/gnttinyurl.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/finch/plugins/gnttinyurl.c	Wed Sep 16 15:36:24 2009 +0000
@@ -354,7 +354,7 @@
   frame = purple_plugin_pref_frame_new();
 
   pref = purple_plugin_pref_new_with_name(PREF_LENGTH);
-  purple_plugin_pref_set_label(pref, _("Only create TinyURL for urls"
+  purple_plugin_pref_set_label(pref, _("Only create TinyURL for URLs"
 				     " of this length or greater"));
   purple_plugin_pref_frame_add(frame, pref);
   pref = purple_plugin_pref_new_with_name(PREF_URL);
@@ -390,7 +390,7 @@
 	N_("TinyURL"),
 	DISPLAY_VERSION,
 	N_("TinyURL plugin"),
-	N_("When receiving a message with URL(s), TinyURL for easier copying"),
+	N_("When receiving a message with URL(s), use TinyURL for easier copying"),
 	"Richard Nelson <wabz@whatsbeef.net>",
 	PURPLE_WEBSITE,
 	plugin_load,
--- a/finch/plugins/grouping.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/finch/plugins/grouping.c	Wed Sep 16 15:36:24 2009 +0000
@@ -15,7 +15,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 
 #define PURPLE_PLUGIN
--- a/libpurple/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -299,7 +299,6 @@
 	-lm
 
 AM_CPPFLAGS = \
-	-DBR_PTHREADS=0 \
 	-DDATADIR=\"$(datadir)\" \
 	-DLIBDIR=\"$(libdir)/purple-$(PURPLE_MAJOR_VERSION)/\" \
 	-DLOCALEDIR=\"$(datadir)/locale\" \
--- a/libpurple/account.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/account.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1206,11 +1206,14 @@
 purple_account_disconnect(PurpleAccount *account)
 {
 	PurpleConnection *gc;
+	const char *username;
 
 	g_return_if_fail(account != NULL);
 	g_return_if_fail(!purple_account_is_disconnected(account));
 
-	purple_debug_info("account", "Disconnecting account %p\n", account);
+	username = purple_account_get_username(account);
+	purple_debug_info("account", "Disconnecting account %s (%p)\n",
+	                  username ? username : "(null)", account);
 
 	account->disconnecting = TRUE;
 
@@ -2287,9 +2290,13 @@
 purple_account_add_buddy(PurpleAccount *account, PurpleBuddy *buddy)
 {
 	PurplePluginProtocolInfo *prpl_info = NULL;
-	PurpleConnection *gc = purple_account_get_connection(account);
+	PurpleConnection *gc;
 	PurplePlugin *prpl = NULL;
 
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(buddy != NULL);
+
+	gc = purple_account_get_connection(account);
 	if (gc != NULL)
 	        prpl = purple_connection_get_prpl(gc);
 
--- a/libpurple/blist.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/blist.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1118,7 +1118,7 @@
 	old_alias = buddy->alias;
 
 	if ((new_alias != NULL) && (*new_alias != '\0'))
-		buddy->alias = g_strdup(alias);
+		buddy->alias = new_alias;
 	else {
 		buddy->alias = NULL;
 		g_free(new_alias); /* could be "\0" */
--- a/libpurple/blist.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/blist.h	Wed Sep 16 15:36:24 2009 +0000
@@ -223,7 +223,7 @@
 	 * be set to a fallback function that saves data to blist.xml like in
 	 * previous libpurple versions.
 	 *
-	 * @attrib node    The node which has been modified.
+	 * @param node    The node which has been modified.
 	 *
 	 * @since 2.6.0.
 	 */
@@ -238,7 +238,7 @@
 	 * be set to a fallback function that saves data to blist.xml like in
 	 * previous libpurple versions.
 	 *
-	 * @attrib node  The node which has been modified.
+	 * @param node  The node which has been modified.
 	 * @since 2.6.0.
 	 */
 	void (*remove_node)(PurpleBlistNode *node);
@@ -252,7 +252,7 @@
 	 * be set to a fallback function that saves data to blist.xml like in
 	 * previous libpurple versions.
 	 *
-	 * @attrib account  The account whose data to save. If NULL, save all data
+	 * @param account  The account whose data to save. If NULL, save all data
 	 *                  for all accounts.
 	 * @since 2.6.0.
 	 */
--- a/libpurple/certificate.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/certificate.c	Wed Sep 16 15:36:24 2009 +0000
@@ -43,6 +43,91 @@
 /** List of registered Pools */
 static GList *cert_pools = NULL;
 
+/*
+ * TODO: Merge this with PurpleCertificateVerificationStatus for 3.0.0 */
+typedef enum {
+	PURPLE_CERTIFICATE_UNKNOWN_ERROR = -1,
+
+	/* Not an error */
+	PURPLE_CERTIFICATE_NO_PROBLEMS = 0,
+
+	/* Non-fatal */
+	PURPLE_CERTIFICATE_NON_FATALS_MASK = 0x0000FFFF,
+
+	/* The certificate is self-signed. */
+	PURPLE_CERTIFICATE_SELF_SIGNED = 0x01,
+
+	/* The CA is not in libpurple's pool of certificates. */
+	PURPLE_CERTIFICATE_CA_UNKNOWN = 0x02,
+
+	/* The current time is before the certificate's specified
+	 * activation time.
+	 */
+	PURPLE_CERTIFICATE_NOT_ACTIVATED = 0x04,
+
+	/* The current time is after the certificate's specified expiration time */
+	PURPLE_CERTIFICATE_EXPIRED = 0x08,
+
+	/* The certificate's subject name doesn't match the expected */
+	PURPLE_CERTIFICATE_NAME_MISMATCH = 0x10,
+
+	/* No CA pool was found. This shouldn't happen... */
+	PURPLE_CERTIFICATE_NO_CA_POOL = 0x20,
+
+	/* Fatal */
+	PURPLE_CERTIFICATE_FATALS_MASK = 0xFFFF0000,
+
+	/* The signature chain could not be validated. Due to limitations in the
+	 * the current API, this also indicates one of the CA certificates in the
+	 * chain is expired (or not yet activated). FIXME 3.0.0 */
+	PURPLE_CERTIFICATE_INVALID_CHAIN = 0x10000,
+
+	/* The signature has been revoked. */
+	PURPLE_CERTIFICATE_REVOKED = 0x20000,
+
+	PURPLE_CERTIFICATE_LAST = 0x40000,
+} PurpleCertificateInvalidityFlags;
+
+static const gchar *
+invalidity_reason_to_string(PurpleCertificateInvalidityFlags flag)
+{
+	switch (flag) {
+		case PURPLE_CERTIFICATE_SELF_SIGNED:
+			return _("The certificate is self-signed and cannot be "
+			         "automatically checked.");
+			break;
+		case PURPLE_CERTIFICATE_CA_UNKNOWN:
+			return _("The root certificate this one claims to be issued by is "
+			         "unknown.");
+			break;
+		case PURPLE_CERTIFICATE_NOT_ACTIVATED:
+			return _("The certificate is not valid yet.");
+			break;
+		case PURPLE_CERTIFICATE_EXPIRED:
+			return _("The certificate has expired and should not be "
+			         "considered valid.");
+			break;
+		case PURPLE_CERTIFICATE_NAME_MISMATCH:
+			/* Translators: "domain" refers to a DNS domain (e.g. talk.google.com) */
+			return _("The certificate presented is not issued to this domain.");
+			break;
+		case PURPLE_CERTIFICATE_NO_CA_POOL:
+			return _("You have no database of root certificates, so "
+			         "this certificate cannot be validated.");
+			break;
+		case PURPLE_CERTIFICATE_INVALID_CHAIN:
+			return _("The certificate chain presented is invalid.");
+			break;
+		case PURPLE_CERTIFICATE_REVOKED:
+			return _("The certificate has been revoked.");
+			break;
+		case PURPLE_CERTIFICATE_UNKNOWN_ERROR:
+		default:
+			return _("An unknown certificate error occurred.");
+			break;
+	}
+}
+
 void
 purple_certificate_verify (PurpleCertificateVerifier *verifier,
 			   const gchar *subject_name, GList *cert_chain,
@@ -1265,10 +1350,104 @@
 }
 
 static void
-x509_tls_cached_unknown_peer(PurpleCertificateVerificationRequest *vrq);
+x509_tls_cached_unknown_peer(PurpleCertificateVerificationRequest *vrq,
+                             PurpleCertificateInvalidityFlags flags);
 
 static void
-x509_tls_cached_cert_in_cache(PurpleCertificateVerificationRequest *vrq)
+x509_tls_cached_complete(PurpleCertificateVerificationRequest *vrq,
+                         PurpleCertificateInvalidityFlags flags)
+{
+	PurpleCertificatePool *tls_peers;
+	PurpleCertificate *peer_crt = vrq->cert_chain->data;
+
+	if (flags & PURPLE_CERTIFICATE_FATALS_MASK) {
+		/* TODO: Also print any other warnings? */
+		const gchar *error;
+		gchar *tmp, *secondary;
+
+		if (flags & PURPLE_CERTIFICATE_INVALID_CHAIN)
+			error = invalidity_reason_to_string(PURPLE_CERTIFICATE_INVALID_CHAIN);
+		else if (flags & PURPLE_CERTIFICATE_REVOKED)
+			error = invalidity_reason_to_string(PURPLE_CERTIFICATE_REVOKED);
+		else
+			error = invalidity_reason_to_string(PURPLE_CERTIFICATE_UNKNOWN_ERROR);
+
+		tmp = g_strdup_printf(_("The certificate for %s could not be validated."),
+					vrq->subject_name);
+		secondary = g_strconcat(tmp, " ", error, NULL);
+		g_free(tmp);
+
+		purple_notify_error(NULL, /* TODO: Probably wrong. */
+					_("SSL Certificate Error"),
+					_("Unable to validate certificate"),
+					secondary);
+		g_free(secondary);
+
+		purple_certificate_verify_complete(vrq, PURPLE_CERTIFICATE_INVALID);
+		return;
+	} else if (flags & PURPLE_CERTIFICATE_NON_FATALS_MASK) {
+		/* Non-fatal error. Prompt the user. */
+		gchar *tmp;
+		GString *errors;
+		guint32 i = 1;
+
+		tmp = g_strdup_printf(_("The certificate for %s could not be validated."),
+					vrq->subject_name);
+		errors = g_string_new(tmp);
+		g_free(tmp);
+
+		errors = g_string_append_c(errors, '\n');
+
+		/* Special case a name mismatch because we want to display the two names... */
+		if (flags & PURPLE_CERTIFICATE_NAME_MISMATCH) {
+			gchar *sn = purple_certificate_get_subject_name(peer_crt);
+
+			g_string_append_printf(errors, _("The certificate claims to be "
+						"from \"%s\" instead. This could mean that you are "
+						"not connecting to the service you believe you are."),
+						sn);
+			g_free(sn);
+
+			flags &= ~PURPLE_CERTIFICATE_NAME_MISMATCH;
+		}
+
+		while (i != PURPLE_CERTIFICATE_LAST) {
+			if (flags & i) {
+				errors = g_string_append_c(errors, '\n');
+				g_string_append(errors, invalidity_reason_to_string(i));
+			}
+
+			i <<= 1;
+		}
+
+		x509_tls_cached_user_auth(vrq, errors->str);
+		g_string_free(errors, TRUE);
+		return;
+	}
+
+	/* If we reach this point, the certificate is good. */
+
+	/* Look up the local cache and store it there for future use */
+	tls_peers = purple_certificate_find_pool(x509_tls_cached.scheme_name,
+						 "tls_peers");
+	if (tls_peers) {
+		if (!purple_certificate_pool_contains(tls_peers, vrq->subject_name) &&
+		        !purple_certificate_pool_store(tls_peers,vrq->subject_name,
+		                                       peer_crt)) {
+			purple_debug_error("certificate/x509/tls_cached",
+			                   "FAILED to cache peer certificate\n");
+		}
+	} else {
+		purple_debug_error("certificate/x509/tls_cached",
+		                   "Unable to locate tls_peers certificate cache.\n");
+	}
+
+	purple_certificate_verify_complete(vrq, PURPLE_CERTIFICATE_VALID);
+}
+
+static void
+x509_tls_cached_cert_in_cache(PurpleCertificateVerificationRequest *vrq,
+                              PurpleCertificateInvalidityFlags flags)
 {
 	/* TODO: Looking this up by name over and over is expensive.
 	   Fix, please! */
@@ -1291,7 +1470,7 @@
 				   "Lookup failed on cached certificate!\n"
 				   "Falling back to full verification.\n");
 		/* vrq now becomes the problem of unknown_peer */
-		x509_tls_cached_unknown_peer(vrq);
+		x509_tls_cached_unknown_peer(vrq, flags);
 		return;
 	}
 
@@ -1302,14 +1481,12 @@
 	if (!memcmp(peer_fpr->data, cached_fpr->data, peer_fpr->len)) {
 		purple_debug_info("certificate/x509/tls_cached",
 				  "Peer cert matched cached\n");
-		/* vrq is now finished */
-		purple_certificate_verify_complete(vrq,
-						   PURPLE_CERTIFICATE_VALID);
+		x509_tls_cached_complete(vrq, flags);
 	} else {
 		purple_debug_error("certificate/x509/tls_cached",
 				  "Peer cert did NOT match cached\n");
 		/* vrq now becomes the problem of the user */
-		x509_tls_cached_unknown_peer(vrq);
+		x509_tls_cached_unknown_peer(vrq, flags);
 	}
 
 	purple_certificate_destroy(cached_crt);
@@ -1324,9 +1501,8 @@
  */
 static void
 x509_tls_cached_check_subject_name(PurpleCertificateVerificationRequest *vrq,
-                                   gboolean had_ca_pool)
+                                   PurpleCertificateInvalidityFlags flags)
 {
-	PurpleCertificatePool *tls_peers;
 	PurpleCertificate *peer_crt;
 	GList *chain = vrq->cert_chain;
 
@@ -1337,77 +1513,14 @@
 						     vrq->subject_name) ) {
 		gchar *sn = purple_certificate_get_subject_name(peer_crt);
 
+		flags |= PURPLE_CERTIFICATE_NAME_MISMATCH;
 		purple_debug_error("certificate/x509/tls_cached",
 				  "Name mismatch: Certificate given for %s "
 				  "has a name of %s\n",
 				  vrq->subject_name, sn);
-
-		if (had_ca_pool) {
-			/* Prompt the user to authenticate the certificate */
-			/* TODO: Provide the user with more guidance about why he is
-			   being prompted */
-			/* vrq will be completed by user_auth */
-			gchar *msg;
-			msg = g_strdup_printf(_("The certificate presented by \"%s\" "
-						"claims to be from \"%s\" instead.  "
-						"This could mean that you are not "
-						"connecting to the service you "
-						"believe you are."),
-					      vrq->subject_name, sn);
-
-			x509_tls_cached_user_auth(vrq, msg);
-			g_free(msg);
-		} else {
-			/* Had no CA pool, so couldn't verify the chain *and*
-			 * the subject name isn't valid.
-			 * I think this is bad enough to warrant a fatal error. It's
-			 * not likely anyway...
-			 */
-			purple_notify_error(NULL, /* TODO: Probably wrong. */
-						_("SSL Certificate Error"),
-						_("Invalid certificate chain"),
-						_("You have no database of root certificates, so "
-						"this certificate cannot be validated."));
-		}
-
-		g_free(sn);
-		return;
-	} /* if (name mismatch) */
-
-	if (!had_ca_pool) {
-		/* The subject name is correct, but we weren't able to verify the
-		 * chain because there was no pool of root CAs found. Prompt the user
-		 * to validate it.
-		 */
-
-		/* vrq will be completed by user_auth */
-		x509_tls_cached_user_auth(vrq,_("You have no database of root "
-						"certificates, so this "
-						"certificate cannot be "
-						"validated."));
-		return;
 	}
 
-	/* If we reach this point, the certificate is good. */
-	/* Look up the local cache and store it there for future use */
-	tls_peers = purple_certificate_find_pool(x509_tls_cached.scheme_name,
-						 "tls_peers");
-
-	if (tls_peers) {
-		if (!purple_certificate_pool_store(tls_peers,vrq->subject_name,
-						   peer_crt) ) {
-			purple_debug_error("certificate/x509/tls_cached",
-					   "FAILED to cache peer certificate\n");
-		}
-	} else {
-		purple_debug_error("certificate/x509/tls_cached",
-				   "Unable to locate tls_peers certificate "
-				   "cache.\n");
-	}
-
-	/* Whew! Done! */
-	purple_certificate_verify_complete(vrq, PURPLE_CERTIFICATE_VALID);
-
+	x509_tls_cached_complete(vrq, flags);
 }
 
 /* For when we've never communicated with this party before */
@@ -1415,7 +1528,8 @@
    least  reprioritize them.
  */
 static void
-x509_tls_cached_unknown_peer(PurpleCertificateVerificationRequest *vrq)
+x509_tls_cached_unknown_peer(PurpleCertificateVerificationRequest *vrq,
+                             PurpleCertificateInvalidityFlags flags)
 {
 	PurpleCertificatePool *ca;
 	PurpleCertificate *peer_crt;
@@ -1430,22 +1544,13 @@
 	/* TODO: Figure out a way to check for a bad signature, as opposed to
 	   "not self-signed" */
 	if ( purple_certificate_signed_by(peer_crt, peer_crt) ) {
-		gchar *msg;
+		flags |= PURPLE_CERTIFICATE_SELF_SIGNED;
 
 		purple_debug_info("certificate/x509/tls_cached",
 				  "Certificate for %s is self-signed.\n",
 				  vrq->subject_name);
 
-		/* Prompt the user to authenticate the certificate */
-		/* vrq will be completed by user_auth */
-		msg = g_strdup_printf(_("The certificate presented by \"%s\" "
-					"is self-signed. It cannot be "
-					"automatically checked."),
-				      vrq->subject_name);
-
-		x509_tls_cached_user_auth(vrq,msg);
-
-		g_free(msg);
+		x509_tls_cached_check_subject_name(vrq, flags);
 		return;
 	} /* if (self signed) */
 
@@ -1491,32 +1596,11 @@
 		 * If we get here, either the cert matched the stuff right above
 		 * or it didn't, in which case we give up and complain to the user.
 		 */
-		if (chain_validated) {
-			x509_tls_cached_check_subject_name(vrq, TRUE);
-		} else {
+		if (!chain_validated)
 			/* TODO: Tell the user where the chain broke? */
-			/* TODO: This error will hopelessly confuse any
-			   non-elite user. */
-			gchar *secondary;
-
-			secondary = g_strdup_printf(_("The certificate chain presented"
-						      " for %s is not valid."),
-						    vrq->subject_name);
+			flags |= PURPLE_CERTIFICATE_INVALID_CHAIN;
 
-			/* TODO: Make this error either block the ensuing SSL
-			   connection error until the user dismisses this one, or
-			   stifle it. */
-			purple_notify_error(NULL, /* TODO: Probably wrong. */
-					    _("SSL Certificate Error"),
-					    _("Invalid certificate chain"),
-					    secondary );
-			g_free(secondary);
-
-			/* Okay, we're done here */
-			purple_certificate_verify_complete(vrq,
-							   PURPLE_CERTIFICATE_INVALID);
-		}
-
+		x509_tls_cached_check_subject_name(vrq, flags);
 		return;
 	} /* if (signature chain not good) */
 
@@ -1527,7 +1611,9 @@
 				   "No X.509 Certificate Authority pool "
 				   "could be found!\n");
 
-		x509_tls_cached_check_subject_name(vrq, FALSE);
+		flags |= PURPLE_CERTIFICATE_NO_CA_POOL;
+
+		x509_tls_cached_check_subject_name(vrq, flags);
 		return;
 	}
 
@@ -1540,15 +1626,15 @@
 			  ca_id);
 	ca_crt = purple_certificate_pool_retrieve(ca, ca_id);
 	if ( NULL == ca_crt ) {
+		flags |= PURPLE_CERTIFICATE_CA_UNKNOWN;
+
 		purple_debug_warning("certificate/x509/tls_cached",
 				  "Certificate Authority with DN='%s' not "
 				  "found. I'll prompt the user, I guess.\n",
 				  ca_id);
 		g_free(ca_id);
-		/* vrq will be completed by user_auth */
-		x509_tls_cached_user_auth(vrq,_("The root certificate this "
-						"one claims to be issued by "
-						"is unknown to Pidgin."));
+
+		x509_tls_cached_check_subject_name(vrq, flags);
 		return;
 	}
 
@@ -1579,36 +1665,15 @@
 		/* TODO: Also mention the CA involved. While I could do this
 		   now, a full DN is a little much with which to assault the
 		   user's poor, leaky eyes. */
-		/* TODO: This error message makes my eyes cross, and I wrote it */
-		gchar * secondary =
-			g_strdup_printf(_("The certificate chain presented by "
-					  "%s does not have a valid digital "
-					  "signature from the Certificate "
-					  "Authority from which it claims to "
-					  "have a signature."),
-					vrq->subject_name);
-
-		purple_notify_error(NULL, /* TODO: Probably wrong */
-				    _("SSL Certificate Error"),
-				    _("Invalid certificate authority"
-				      " signature"),
-				    secondary);
-		g_free(secondary);
-
-		/* Signal "bad cert" */
-		purple_certificate_verify_complete(vrq,
-						   PURPLE_CERTIFICATE_INVALID);
-
-		purple_certificate_destroy(ca_crt);
-		g_byte_array_free(ca_fpr, TRUE);
-		g_byte_array_free(last_fpr, TRUE);
-		return;
-	} /* if (CA signature not good) */
+		flags |= PURPLE_CERTIFICATE_INVALID_CHAIN;
+	}
 
 	g_byte_array_free(ca_fpr, TRUE);
 	g_byte_array_free(last_fpr, TRUE);
 
-	x509_tls_cached_check_subject_name(vrq, TRUE);
+	purple_certificate_destroy(ca_crt);
+
+	x509_tls_cached_check_subject_name(vrq, flags);
 }
 
 static void
@@ -1617,6 +1682,7 @@
 	const gchar *tls_peers_name = "tls_peers"; /* Name of local cache */
 	PurpleCertificatePool *tls_peers;
 	time_t now, activation, expiration;
+	PurpleCertificateInvalidityFlags flags = PURPLE_CERTIFICATE_NO_PROBLEMS;
 	gboolean ret;
 
 	g_return_if_fail(vrq);
@@ -1632,37 +1698,21 @@
 	now = time(NULL);
 	ret = purple_certificate_get_times(vrq->cert_chain->data, &activation,
 	                                   &expiration);
-	if (!ret || now > expiration || now < activation) {
-		gchar *secondary;
-
-		if (!ret)
-			purple_debug_error("certificate/x509/tls_cached",
-					"Failed to get validity times for certificate %s\n",
-					vrq->subject_name);
-		else if (now > expiration)
-			purple_debug_error("certificate/x509/tls_cached",
-					"Certificate %s expired at %s\n",
-					vrq->subject_name, ctime(&expiration));
-		else
-			purple_debug_error("certificate/x509/tls_cached",
-					"Certificate %s is not yet valid, will be at %s\n",
-					vrq->subject_name, ctime(&activation));
-
-		/* FIXME 2.6.1 */
-		secondary = g_strdup_printf(_("The certificate chain presented"
-					" for %s is not valid."),
-					vrq->subject_name);
-
-		purple_notify_error(NULL, /* TODO: Probably wrong. */
-					_("SSL Certificate Error"),
-					_("Invalid certificate chain"),
-					secondary );
-		g_free(secondary);
-
-		/* Okay, we're done here */
-		purple_certificate_verify_complete(vrq,
-						    PURPLE_CERTIFICATE_INVALID);
-		return;
+	if (!ret) {
+		flags |= PURPLE_CERTIFICATE_EXPIRED | PURPLE_CERTIFICATE_NOT_ACTIVATED;
+		purple_debug_error("certificate/x509/tls_cached",
+				"Failed to get validity times for certificate %s\n",
+				vrq->subject_name);
+	} else if (now > expiration) {
+		flags |= PURPLE_CERTIFICATE_EXPIRED;
+		purple_debug_error("certificate/x509/tls_cached",
+				"Certificate %s expired at %s\n",
+				vrq->subject_name, ctime(&expiration));
+	} else if (now < activation) {
+		flags |= PURPLE_CERTIFICATE_NOT_ACTIVATED;
+		purple_debug_error("certificate/x509/tls_cached",
+				"Certificate %s is not yet valid, will be at %s\n",
+				vrq->subject_name, ctime(&activation));
 	}
 
 	tls_peers = purple_certificate_find_pool(x509_tls_cached.scheme_name,tls_peers_name);
@@ -1672,9 +1722,8 @@
 				   "Couldn't find local peers cache %s\n",
 				   tls_peers_name);
 
-
 		/* vrq now becomes the problem of unknown_peer */
-		x509_tls_cached_unknown_peer(vrq);
+		x509_tls_cached_unknown_peer(vrq, flags);
 		return;
 	}
 
@@ -1685,12 +1734,12 @@
 		purple_debug_info("certificate/x509/tls_cached",
 				  "...Found cached cert\n");
 		/* vrq is now the responsibility of cert_in_cache */
-		x509_tls_cached_cert_in_cache(vrq);
+		x509_tls_cached_cert_in_cache(vrq, flags);
 	} else {
 		purple_debug_warning("certificate/x509/tls_cached",
 				  "...Not in cache\n");
 		/* vrq now becomes the problem of unknown_peer */
-		x509_tls_cached_unknown_peer(vrq);
+		x509_tls_cached_unknown_peer(vrq, flags);
 	}
 }
 
--- a/libpurple/conversation.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/conversation.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1308,7 +1308,7 @@
  * @param user     The user to invite to the chat.
  * @param message  The message to send with the invitation.
  * @param confirm  Prompt before sending the invitation. The user is always
- *                 prompted if either #user or #message is @c NULL.
+ *                 prompted if either \a user or \a message is @c NULL.
  *
  * @since 2.6.0
  */
--- a/libpurple/core.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/core.c	Wed Sep 16 15:36:24 2009 +0000
@@ -497,7 +497,7 @@
 			{
 				char *link;
 #if GLIB_CHECK_VERSION(2,4,0)
-				GError *err = NULL;
+				err = NULL;
 
 				if ((link = g_file_read_link(name, &err)) == NULL)
 				{
--- a/libpurple/core.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/core.h	Wed Sep 16 15:36:24 2009 +0000
@@ -24,6 +24,16 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
+
+/*! @mainpage Pidgin/Finch/libpurple API Documentation
+ *
+ * <a href="group__core.html">libpurple</a> is intended to be the core of an IM
+ * program.  <a href="group__pidgin.html">Pidgin</a> is a GTK+ frontend
+ * to libpurple, and <a href="group__finch.html">Finch</a> is an ncurses
+ * frontend built using <a href="group__gnt.html">libgnt</a>
+ * (GLib Ncurses Toolkit).
+ */
+
 #ifndef _PURPLE_CORE_H_
 #define _PURPLE_CORE_H_
 
--- a/libpurple/dbus-analyze-functions.py	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/dbus-analyze-functions.py	Wed Sep 16 15:36:24 2009 +0000
@@ -181,15 +181,20 @@
 
    
     def processoutput(self, type, name):
+        const = False
+        unsigned = False
         # the "void" type is simple ...
         if type == ["void"]:
             return self.outputvoid(type, name)
 
-        const = False
         if type[0] == "const":
             type = type[1:]
             const = True
 
+        if type[0] == "unsigned":
+            type = type[1:]
+            unsigned = True
+
         # a string
         if type == ["char", pointer] or type == ["gchar", pointer]:
             return self.outputstring(type, name, const)
@@ -197,7 +202,7 @@
         # simple types (ints, booleans, enums, ...)
         if (len(type) == 1) and \
                ((type[0] in simpletypes) or (type[0].startswith("Purple"))):
-            return self.outputsimple(type, name)
+            return self.outputsimple(type, name, unsigned)
 
         # pointers ...
         if (len(type) == 2) and (type[1] == pointer):
@@ -303,10 +308,13 @@
 #        self.returncode.append("NULLIFY(%s);" % name)
         self.returncode.append("return %s;" % name);
 
-    def outputsimple(self, type, name):
+    def outputsimple(self, type, name, us):
         self.functiontype = type[0]
         self.decls.append("%s %s = 0;" % (type[0], name))
-        self.outputparams.append(("G_TYPE_INT", name))
+        if us:
+            self.outputparams.append(("G_TYPE_UINT", name))
+        else:
+            self.outputparams.append(("G_TYPE_INT", name))
         self.returncode.append("return %s;" % name);
 
     # we could add "const" to the return type but this would probably
@@ -455,11 +463,16 @@
         if not const:
             self.ccodeout.append("\tg_free(%s);" % name)
 
-    def outputsimple(self, type, name):
-        self.cdecls.append("\tdbus_int32_t %s;" % name)
+    def outputsimple(self, type, name, us):
+        if us:
+            self.cdecls.append("\tdbus_uint32_t %s;" % name)
+            self.cparamsout.append(("UINT32", name))
+            self.addouttype("u", name)
+        else:
+            self.cdecls.append("\tdbus_int32_t %s;" % name)
+            self.cparamsout.append(("INT32", name))
+            self.addouttype("i", name)
         self.ccode.append("\t%s = %s;" % (name, self.call))
-        self.cparamsout.append(("INT32", name))
-        self.addouttype("i", name)
 
     def outputpurplestructure(self, type, name):
         self.cdecls.append("\tdbus_int32_t %s;" % name)
--- a/libpurple/dnssrv.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/dnssrv.c	Wed Sep 16 15:36:24 2009 +0000
@@ -465,9 +465,16 @@
 {
 	PurpleSrvResponse *srvres = NULL;
 	PurpleSrvQueryData *query_data = data;
-	if(query_data->error_message != NULL)
+	if(query_data->error_message != NULL) {
 		purple_debug_error("dnssrv", query_data->error_message);
-	else {
+		if (query_data->type == DNS_TYPE_SRV) {
+			if (query_data->cb.srv)
+				query_data->cb.srv(srvres, 0, query_data->extradata);
+		} else if (query_data->type == DNS_TYPE_TXT) {
+			if (query_data->cb.txt)
+				query_data->cb.txt(NULL, query_data->extradata);
+		}
+	} else {
 		if (query_data->type == DNS_TYPE_SRV) {
 			PurpleSrvResponse *srvres_tmp = NULL;
 			GList *lst = query_data->results;
--- a/libpurple/dnssrv.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/dnssrv.h	Wed Sep 16 15:36:24 2009 +0000
@@ -98,11 +98,11 @@
 /**
  * Get the value of the current TXT record.
  *
- * @param resp  The TXT response record
+ * @param response  The TXT response record
  * @returns The value of the current TXT record.
  * @since 2.6.0
  */
-const gchar *purple_txt_response_get_content(PurpleTxtResponse *resp);
+const gchar *purple_txt_response_get_content(PurpleTxtResponse *response);
 
 /**
  * Destroy a TXT DNS response object.
@@ -110,7 +110,7 @@
  * @param response The PurpleTxtResponse to destroy.
  * @since 2.6.0
  */
-void purple_txt_response_destroy(PurpleTxtResponse *resp);
+void purple_txt_response_destroy(PurpleTxtResponse *response);
 
 #ifdef __cplusplus
 }
--- a/libpurple/example/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/example/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -12,7 +12,6 @@
 
 AM_CPPFLAGS = \
 	-DSTANDALONE \
-	-DBR_PTHREADS=0 \
 	-DDATADIR=\"$(datadir)\" \
 	-DLIBDIR=\"$(libdir)/purple-$(PURPLE_MAJOR_VERSION)/\" \
 	-DLOCALEDIR=\"$(datadir)/locale\" \
--- a/libpurple/ft.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/ft.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1313,7 +1313,7 @@
 
 	if (purple_xfer_get_filename(xfer) != NULL)
 	{
-		msg = g_strdup_printf(_("You canceled the transfer of %s"),
+		msg = g_strdup_printf(_("You cancelled the transfer of %s"),
 							  purple_xfer_get_filename(xfer));
 	}
 	else
@@ -1376,12 +1376,12 @@
 
 	if (purple_xfer_get_filename(xfer) != NULL)
 	{
-		msg = g_strdup_printf(_("%s canceled the transfer of %s"),
+		msg = g_strdup_printf(_("%s cancelled the transfer of %s"),
 				buddy ? purple_buddy_get_alias(buddy) : xfer->who, purple_xfer_get_filename(xfer));
 	}
 	else
 	{
-		msg = g_strdup_printf(_("%s canceled the file transfer"),
+		msg = g_strdup_printf(_("%s cancelled the file transfer"),
 				buddy ? purple_buddy_get_alias(buddy) : xfer->who);
 	}
 	purple_xfer_conversation_write(xfer, msg, TRUE);
--- a/libpurple/idle.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/idle.h	Wed Sep 16 15:36:24 2009 +0000
@@ -26,6 +26,8 @@
 #ifndef _PURPLE_IDLE_H_
 #define _PURPLE_IDLE_H_
 
+#include <time.h>
+
 /**
  * Idle UI operations.
  */
--- a/libpurple/media-gst.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/media-gst.h	Wed Sep 16 15:36:24 2009 +0000
@@ -21,7 +21,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #ifndef _PURPLE_MEDIA_GST_H_
@@ -42,7 +42,7 @@
 #define PURPLE_IS_MEDIA_ELEMENT_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_ELEMENT_INFO))
 #define PURPLE_MEDIA_ELEMENT_INFO_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_ELEMENT_INFO, PurpleMediaElementInfo))
 
-/** @copydoc _PurpleMediaElementInfo */
+/** An opaque structure representing an audio/video source/sink. */
 typedef struct _PurpleMediaElementInfo PurpleMediaElementInfo;
 typedef struct _PurpleMediaElementInfoClass PurpleMediaElementInfoClass;
 typedef GstElement *(*PurpleMediaElementCreateCallback)(PurpleMedia *media,
@@ -138,6 +138,9 @@
  *
  * @param manager The media manager to use to obtain the source/sink.
  * @param type The type of source/sink to get.
+ * @param media The media call this element is requested for.
+ * @param session_id The id of the session this element is requested for or NULL.
+ * @param participant The remote user this element is requested for or NULL.
  *
  * @since 2.6.0
  */
--- a/libpurple/media.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/media.c	Wed Sep 16 15:36:24 2009 +0000
@@ -21,7 +21,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #include <string.h>
@@ -2046,13 +2046,32 @@
 				FsError error_no;
 				gst_structure_get_enum(msg->structure, "error-no",
 						FS_TYPE_ERROR, (gint*)&error_no);
-				/*
-				 * Unknown CName is only a problem for the
-				 * multicast transmitter which isn't used.
-				 */
-				if (error_no != FS_ERROR_UNKNOWN_CNAME)
-					purple_debug_error("media", "farsight-error: %i: %s\n", error_no,
-						  	gst_structure_get_string(msg->structure, "error-msg"));
+				switch (error_no) {
+					case FS_ERROR_NO_CODECS:
+						purple_media_error(media, _("No codecs found. Install some GStreamer codecs found in GStreamer plugins packages."));
+						purple_media_end(media, NULL, NULL);
+						break;
+					case FS_ERROR_NO_CODECS_LEFT:
+						purple_media_error(media, _("No codecs left. Your codec preferences in fs-codecs.conf are too strict."));
+						purple_media_end(media, NULL, NULL);
+						break;
+					case FS_ERROR_UNKNOWN_CNAME:
+					/*
+					 * Unknown CName is only a problem for the
+					 * multicast transmitter which isn't used.
+					 * It is also deprecated.
+					 */
+						break;
+					default:
+						purple_debug_error("media", "farsight-error: %i: %s\n", error_no,
+							  	gst_structure_get_string(msg->structure, "error-msg"));
+						break;
+				}
+
+				if (FS_ERROR_IS_FATAL(error_no)) {
+					purple_media_error(media, _("A non-recoverable Farsight2 error has occurred."));
+					purple_media_end(media, NULL, NULL);
+				}
 			} else if (gst_structure_has_name(msg->structure,
 					"farsight-new-local-candidate")) {
 				FsStream *stream = g_value_get_object(gst_structure_get_value(msg->structure, "stream"));
@@ -2129,6 +2148,35 @@
 			}
 			break;
 		}
+		case GST_MESSAGE_ERROR: {
+			GstElement *element = GST_ELEMENT(GST_MESSAGE_SRC(msg));
+			GstElement *lastElement = NULL;
+			while (!GST_IS_PIPELINE(element)) {
+				if (element == media->priv->confbin) {
+					purple_media_error(media, _("Conference error"));
+					purple_media_end(media, NULL, NULL);
+					break;
+				}
+				lastElement = element;
+				element = GST_ELEMENT_PARENT(element);
+			}
+			if (GST_IS_PIPELINE(element)) {
+				GList *sessions = g_hash_table_get_values(media->priv->sessions);
+				for (; sessions; sessions = g_list_delete_link(sessions, sessions)) {
+					PurpleMediaSession *session = sessions->data;
+
+					if (session->src == lastElement) {
+						if (session->type & PURPLE_MEDIA_AUDIO)
+							purple_media_error(media, _("Error with your microphone"));
+						else
+							purple_media_error(media, _("Error with your webcam"));
+						purple_media_end(media, NULL, NULL);
+						break;
+					}
+				}
+				g_list_free(sessions);
+			}
+		}
 		default:
 			break;
 	}
@@ -2230,6 +2278,18 @@
 					purple_media_to_fs_stream_direction(
 					stream->session->type), NULL);
 			stream->accepted = TRUE;
+
+			if (stream->remote_candidates != NULL) {
+				GError *err = NULL;
+				fs_stream_set_remote_candidates(stream->stream,
+						stream->remote_candidates, &err);
+
+				if (err) {
+					purple_debug_error("media", "Error adding remote"
+							" candidates: %s\n", err->message);
+					g_error_free(err);
+				}
+			}
 		}
 	} else if (local == TRUE && (type == PURPLE_MEDIA_INFO_MUTE ||
 			type == PURPLE_MEDIA_INFO_UNMUTE)) {
@@ -2541,7 +2601,7 @@
 				media->priv->conference, media_type, &err);
 
 		if (err != NULL) {
-			purple_media_error(media, "Error creating session: %s\n", err->message);
+			purple_media_error(media, _("Error creating session: %s"), err->message);
 			g_error_free(err);
 			g_free(session);
 			return FALSE;
@@ -2730,10 +2790,13 @@
 					num_params, params, &err);
 		}
 
-		if (err) {
-			purple_debug_error("media", "Error creating stream: %s\n",
-					   err->message);
-			g_error_free(err);
+		if (fsstream == NULL) {
+			purple_debug_error("media",
+					"Error creating stream: %s\n",
+					err && err->message ?
+					err->message : "NULL");
+			if (err)
+				g_error_free(err);
 			g_object_unref(participant);
 			g_hash_table_remove(media->priv->participants, who);
 			purple_media_remove_session(media, session);
@@ -2852,13 +2915,15 @@
 	stream->remote_candidates = g_list_concat(stream->remote_candidates,
 			purple_media_candidate_list_to_fs(remote_candidates));
 
-	fs_stream_set_remote_candidates(stream->stream,
-			stream->remote_candidates, &err);
-
-	if (err) {
-		purple_debug_error("media", "Error adding remote"
-				" candidates: %s\n", err->message);
-		g_error_free(err);
+	if (stream->accepted == TRUE) {
+		fs_stream_set_remote_candidates(stream->stream,
+				stream->remote_candidates, &err);
+
+		if (err) {
+			purple_debug_error("media", "Error adding remote"
+					" candidates: %s\n", err->message);
+			g_error_free(err);
+		}
 	}
 #endif
 }
--- a/libpurple/media.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/media.h	Wed Sep 16 15:36:24 2009 +0000
@@ -21,7 +21,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #ifndef _PURPLE_MEDIA_H_
@@ -59,11 +59,11 @@
 #define PURPLE_MEDIA_TYPE_STATE      (purple_media_state_changed_get_type())
 #define PURPLE_MEDIA_TYPE_INFO_TYPE	(purple_media_info_type_get_type())
 
-/** @copydoc _PurpleMedia */
+/** An opaque structure representing a media call. */
 typedef struct _PurpleMedia PurpleMedia;
-/** @copydoc _PurpleMediaCandidate */
+/** An opaque structure representing a network candidate (IP Address and port pair). */
 typedef struct _PurpleMediaCandidate PurpleMediaCandidate;
-/** @copydoc _PurpleMediaCodec */
+/** An opaque structure representing an audio or video codec. */
 typedef struct _PurpleMediaCodec PurpleMediaCodec;
 
 /** Media caps */
@@ -559,6 +559,7 @@
  * @param media The media object to find the session in.
  * @param sess_id The session id of the session find the stream in.
  * @param participant The name of the remote user to set the candidates from.
+ * @param codecs The list of remote codecs to set.
  *
  * @return @c TRUE The codecs were set successfully, or @c FALSE otherwise.
  *
--- a/libpurple/mediamanager.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/mediamanager.c	Wed Sep 16 15:36:24 2009 +0000
@@ -21,7 +21,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #include "internal.h"
--- a/libpurple/mediamanager.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/mediamanager.h	Wed Sep 16 15:36:24 2009 +0000
@@ -21,7 +21,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #ifndef _PURPLE_MEDIA_MANAGER_H_
@@ -30,9 +30,9 @@
 #include <glib.h>
 #include <glib-object.h>
 
-/** @copydoc _PurpleMediaManager */
+/** An opaque structure representing a group of (usually all) media calls. */
 typedef struct _PurpleMediaManager PurpleMediaManager;
-/** @copydoc _PurpleMediaManagerClass */
+/** The GObject class structure of the PurpleMediaManager object. */
 typedef struct _PurpleMediaManagerClass PurpleMediaManagerClass;
 
 #include "account.h"
@@ -81,6 +81,7 @@
  * @param account The account to create the session on.
  * @param conference_type The conference type to feed into Farsight2.
  * @param remote_user The remote user to initiate the session with.
+ * @param initiator TRUE if the local user is the initiator of this media call, FALSE otherwise.
  *
  * @return A newly created media session.
  *
--- a/libpurple/plugins/joinpart.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/plugins/joinpart.c	Wed Sep 16 15:36:24 2009 +0000
@@ -229,16 +229,17 @@
 
 	frame = purple_plugin_pref_frame_new();
 
-	ppref = purple_plugin_pref_new_with_label(_("Join/Part Hiding Configuration"));
+	ppref = purple_plugin_pref_new_with_label(_("Hide Joins/Parts"));
 	purple_plugin_pref_frame_add(frame, ppref);
 
 	ppref = purple_plugin_pref_new_with_name_and_label(THRESHOLD_PREF,
-	                                                 _("Minimum Room Size"));
+	                                                 /* Translators: Followed by an input request a number of people */
+	                                                 _("For rooms with more than this many people"));
 	purple_plugin_pref_set_bounds(ppref, 0, 1000);
 	purple_plugin_pref_frame_add(frame, ppref);
 
 	ppref = purple_plugin_pref_new_with_name_and_label(DELAY_PREF,
-	                                                 _("User Inactivity Timeout (in minutes)"));
+	                                                 _("If user has not spoken in this many minutes"));
 	purple_plugin_pref_set_bounds(ppref, 0, 8 * 60); /* 8 Hours */
 	purple_plugin_pref_frame_add(frame, ppref);
 
--- a/libpurple/plugins/perl/common/XMLNode.xs	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/plugins/perl/common/XMLNode.xs	Wed Sep 16 15:36:24 2009 +0000
@@ -4,21 +4,24 @@
 PROTOTYPES: ENABLE
 
 Purple::XMLNode
-xmlnode_copy(class, src)
+xmlnode_copy(src)
 	Purple::XMLNode src
-    C_ARGS:
-	src
 
 void
 xmlnode_free(node)
 	Purple::XMLNode node
 
 Purple::XMLNode
-xmlnode_from_str(class, str, size)
-	const char *str
-	gssize size
-    C_ARGS:
-	str, size
+xmlnode_from_str(const char *str, gssize length(str))
+    PROTOTYPE: $
+
+const char *
+xmlnode_get_name(node)
+	Purple::XMLNode node
+	CODE:
+	RETVAL = node->name;
+	OUTPUT:
+	RETVAL
 
 const char *
 xmlnode_get_attrib(node, attr)
@@ -29,6 +32,18 @@
 xmlnode_get_child(parent, name)
 	Purple::XMLNode parent
 	const char *name
+PREINIT:
+	xmlnode *tmp;
+CODE:
+	if (!name || *name == '\0') {
+		tmp = parent->child;
+		while (tmp && tmp->type != XMLNODE_TYPE_TAG)
+			tmp = tmp->next;
+		RETVAL = tmp;
+	} else
+		RETVAL = xmlnode_get_child(parent, name);
+OUTPUT:
+	RETVAL
 
 Purple::XMLNode
 xmlnode_get_child_with_namespace(parent, name, xmlns)
@@ -41,6 +56,19 @@
 	Purple::XMLNode node
 
 Purple::XMLNode
+xmlnode_get_next(node)
+	Purple::XMLNode node
+PREINIT:
+	xmlnode *tmp;
+CODE:
+	tmp = node->next;
+	while (tmp && tmp->type != XMLNODE_TYPE_TAG)
+		tmp = tmp->next;
+	RETVAL = tmp;
+OUTPUT:
+	RETVAL
+
+Purple::XMLNode
 xmlnode_get_next_twin(node)
 	Purple::XMLNode node
 
@@ -78,11 +106,17 @@
 	const char *value
 
 gchar_own *
-xmlnode_to_formatted_str(node, len)
+xmlnode_to_formatted_str(node)
 	Purple::XMLNode node
-	int *len
+    CODE:
+	RETVAL = xmlnode_to_formatted_str(node, NULL);
+    OUTPUT:
+	RETVAL
 
 gchar_own *
-xmlnode_to_str(node, len)
+xmlnode_to_str(node)
 	Purple::XMLNode node
-	int *len
+    CODE:
+	RETVAL = xmlnode_to_str(node, NULL);
+    OUTPUT:
+	RETVAL
--- a/libpurple/protocols/bonjour/bonjour_ft.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/bonjour/bonjour_ft.c	Wed Sep 16 15:36:24 2009 +0000
@@ -17,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 #include "internal.h"
 #include "util.h"
@@ -450,9 +450,11 @@
 
 				/* TODO: Make sure that it is advertising a bytestreams transfer */
 
-				bonjour_xfer_receive(pc, id, sid, name, filesize, filename, XEP_BYTESTREAMS);
+				if (filename) {
+					bonjour_xfer_receive(pc, id, sid, name, filesize, filename, XEP_BYTESTREAMS);
 
-				parsed_receive = TRUE;
+					parsed_receive = TRUE;
+				}
 			}
 
 			if (!parsed_receive) {
--- a/libpurple/protocols/bonjour/bonjour_ft.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/bonjour/bonjour_ft.h	Wed Sep 16 15:36:24 2009 +0000
@@ -17,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 #ifndef _BONJOUR_FT_H_
 #define _BONJOUR_FT_H_
--- a/libpurple/protocols/irc/msgs.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/irc/msgs.c	Wed Sep 16 15:36:24 2009 +0000
@@ -445,9 +445,13 @@
 	PurpleConversation *convo;
 
 	if (!strcmp(name, "topic")) {
+		if (!args[0] || !args[1])
+			return;
 		chan = args[0];
 		topic = irc_mirc2txt (args[1]);
 	} else {
+		if (!args[0] || !args[1] || !args[2])
+			return;
 		chan = args[1];
 		topic = irc_mirc2txt (args[2]);
 	}
--- a/libpurple/protocols/irc/parse.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/irc/parse.c	Wed Sep 16 15:36:24 2009 +0000
@@ -361,7 +361,12 @@
 	char fg[3] = "\0\0", bg[3] = "\0\0";
 	int fgnum, bgnum;
 	int font = 0, bold = 0, underline = 0, italic = 0;
-	GString *decoded = g_string_sized_new(strlen(string));
+	GString *decoded;
+
+	if (string == NULL)
+		return NULL;
+
+	decoded = g_string_sized_new(strlen(string));
 
 	cur = string;
 	do {
@@ -461,9 +466,14 @@
 
 char *irc_mirc2txt (const char *string)
 {
-	char *result = g_strdup (string);
+	char *result;
 	int i, j;
 
+	if (string == NULL)
+		return NULL;
+
+	result = g_strdup (string);
+
 	for (i = 0, j = 0; result[i]; i++) {
 		switch (result[i]) {
 		case '\002':
--- a/libpurple/protocols/jabber/adhoccommands.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/adhoccommands.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/adhoccommands.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/adhoccommands.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/auth.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/auth.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -573,6 +575,7 @@
                                xmlnode *packet, gpointer data)
 {
 	if (type == JABBER_IQ_RESULT) {
+		jabber_stream_set_state(js, JABBER_STREAM_POST_AUTH);
 		jabber_disco_items_server(js);
 	} else {
 		PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
@@ -1070,7 +1073,12 @@
 	}
 #endif
 
-	jabber_stream_set_state(js, JABBER_STREAM_REINITIALIZING);
+	/*
+	 * The stream will be reinitialized later in jabber_recv_cb_ssl() or
+	 * jabber_bosh_connection_send.
+	 */
+	js->reinit = TRUE;
+	jabber_stream_set_state(js, JABBER_STREAM_POST_AUTH);
 }
 
 void jabber_auth_handle_failure(JabberStream *js, xmlnode *packet)
--- a/libpurple/protocols/jabber/auth.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/auth.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/bosh.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/bosh.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2008, Tobias Markmann <tmarkmann@googlemail.com>
+ * 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
@@ -68,7 +70,6 @@
 
 	gboolean pipelining;
 	gboolean ssl;
-	gboolean needs_restart;
 
 	enum {
 		BOSH_CONN_OFFLINE,
@@ -195,7 +196,6 @@
 	conn->path = g_strdup_printf("/%s", path);
 	g_free(path);
 	conn->pipelining = TRUE;
-	conn->needs_restart = FALSE;
 
 	if ((user && user[0] != '\0') || (passwd && passwd[0] != '\0')) {
 		purple_debug_info("jabber", "Ignoring unexpected username and password "
@@ -375,10 +375,10 @@
 	                conn->sid,
 	                conn->js->user->domain);
 
-	if (conn->needs_restart) {
+	if (conn->js->reinit) {
 		packet = g_string_append(packet, " xmpp:restart='true'/>");
 		/* TODO: Do we need to wait for a response? */
-		conn->needs_restart = FALSE;
+		conn->js->reinit = FALSE;
 	} else {
 		gsize read_amt;
 		if (type == PACKET_TERMINATE)
@@ -404,12 +404,6 @@
 	jabber_bosh_connection_send(conn, PACKET_TERMINATE, NULL);
 }
 
-static void jabber_bosh_connection_stream_restart(PurpleBOSHConnection *conn)
-{
-	conn->needs_restart = TRUE;
-	jabber_bosh_connection_send(conn, PACKET_NORMAL, NULL);
-}
-
 static gboolean jabber_bosh_connection_error_check(PurpleBOSHConnection *conn, xmlnode *node) {
 	const char *type;
 
@@ -488,35 +482,8 @@
 	}
 }
 
-static void auth_response_cb(PurpleBOSHConnection *conn, xmlnode *node) {
-	xmlnode *child;
-
-	g_return_if_fail(node != NULL);
-	if (jabber_bosh_connection_error_check(conn, node))
-		return;
-
-	child = node->child;
-	while(child != NULL && child->type != XMLNODE_TYPE_TAG) {
-		child = child->next;
-	}
-
-	/* We're only expecting one XML node here, so only process the first one */
-	if (child != NULL && child->type == XMLNODE_TYPE_TAG) {
-		JabberStream *js = conn->js;
-		if (!strcmp(child->name, "success")) {
-			jabber_bosh_connection_stream_restart(conn);
-			jabber_process_packet(js, &child);
-			conn->receive_cb = jabber_bosh_connection_received;
-		} else {
-			js->state = JABBER_STREAM_AUTHENTICATING;
-			jabber_process_packet(js, &child);
-		}
-	} else {
-		purple_debug_warning("jabber", "Received unexepcted empty BOSH packet.\n");
-	}
-}
-
 static void boot_response_cb(PurpleBOSHConnection *conn, xmlnode *node) {
+	JabberStream *js = conn->js;
 	const char *sid, *version;
 	const char *inactivity, *requests;
 	xmlnode *packet;
@@ -534,7 +501,7 @@
 	if (sid) {
 		conn->sid = g_strdup(sid);
 	} else {
-		purple_connection_error_reason(conn->js->gc,
+		purple_connection_error_reason(js->gc,
 		        PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
 		        _("No session ID given"));
 		return;
@@ -551,7 +518,7 @@
 			minor = atoi(dot + 1);
 
 		if (major != 1 || minor < 6) {
-			purple_connection_error_reason(conn->js->gc,
+			purple_connection_error_reason(js->gc,
 			        PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
 			        _("Unsupported version of BOSH protocol"));
 			return;
@@ -581,11 +548,13 @@
 	if (requests)
 		conn->max_requests = atoi(requests);
 
+	jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING);
+
 	/* FIXME: Depending on receiving features might break with some hosts */
 	packet = xmlnode_get_child(node, "features");
 	conn->state = BOSH_CONN_ONLINE;
-	conn->receive_cb = auth_response_cb;
-	jabber_stream_features_parse(conn->js, packet);
+	conn->receive_cb = jabber_bosh_connection_received;
+	jabber_stream_features_parse(js, packet);
 }
 
 static void jabber_bosh_connection_boot(PurpleBOSHConnection *conn) {
@@ -661,8 +630,8 @@
 	conn->headers_done = FALSE;
 	conn->handled_len = conn->body_len = 0;
 
-	if (conn->bosh->needs_restart)
-		jabber_bosh_connection_stream_restart(conn->bosh);
+	if (conn->bosh->js->reinit)
+		jabber_bosh_connection_send(conn->bosh, PACKET_NORMAL, NULL);
 	else if (conn->bosh->state == BOSH_CONN_ONLINE) {
 		purple_debug_info("jabber", "BOSH session already exists. Trying to reuse it.\n");
 		if (conn->bosh->requests == 0 || conn->bosh->pending->bufused > 0) {
--- a/libpurple/protocols/jabber/bosh.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/bosh.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2008, Tobias Markmann <tmarkmann@googlemail.com>
+ * 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
--- a/libpurple/protocols/jabber/buddy.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -749,7 +751,9 @@
 		const char *status_name = jabber_buddy_state_get_name(jbr->state);
 
 		if (jbr->status) {
-			purdy = purple_strdup_withhtml(jbr->status);
+			tmp = purple_markup_escape_text(jbr->status, -1);
+			purdy = purple_strdup_withhtml(tmp);
+			g_free(tmp);
 
 			if (purple_strequal(status_name, purdy))
 				status_name = NULL;
@@ -908,12 +912,14 @@
 	             (binval = xmlnode_get_child(photo, "BINVAL"))) {
 		gsize size;
 		char *bintext = xmlnode_get_data(binval);
-		guchar *data = purple_base64_decode(bintext, &size);
-		g_free(bintext);
+		if (bintext) {
+			guchar *data = purple_base64_decode(bintext, &size);
+			g_free(bintext);
 
-		if (data) {
-			vcard_hash = jabber_calculate_data_sha1sum(data, size);
-			g_free(data);
+			if (data) {
+				vcard_hash = jabber_calculate_data_sha1sum(data, size);
+				g_free(data);
+			}
 		}
 	}
 
@@ -1675,21 +1681,42 @@
 	jabber_buddy_set_invisibility(js, purple_buddy_get_name(buddy), FALSE);
 }
 
-static void jabber_buddy_cancel_presence_notification(PurpleBlistNode *node,
-		gpointer data)
+static void cancel_presence_notification(gpointer data)
 {
 	PurpleBuddy *buddy;
 	PurpleConnection *gc;
 	JabberStream *js;
 
+	buddy = data;
+	gc = purple_account_get_connection(purple_buddy_get_account(buddy));
+	js = purple_connection_get_protocol_data(gc);
+
+	jabber_presence_subscription_set(js, purple_buddy_get_name(buddy), "unsubscribed");
+}
+
+static void
+jabber_buddy_cancel_presence_notification(PurpleBlistNode *node,
+                                          gpointer data)
+{
+	PurpleBuddy *buddy;
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	const gchar *name;
+	char *msg;
+
 	g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
 
 	buddy = (PurpleBuddy *) node;
-	gc = purple_account_get_connection(purple_buddy_get_account(buddy));
-	js = purple_connection_get_protocol_data(gc);
+	name = purple_buddy_get_name(buddy);
+	account = purple_buddy_get_account(buddy);
+	gc = purple_account_get_connection(account);
 
-	/* I wonder if we should prompt the user before doing this */
-	jabber_presence_subscription_set(js, purple_buddy_get_name(buddy), "unsubscribed");
+	msg = g_strdup_printf(_("%s will no longer be able to see your status "
+	                        "updates.  Do you want to continue?"), name);
+	purple_request_yes_no(gc, NULL, _("Cancel Presence Notification"),
+	                      msg, 0 /* Yes */, account, name, NULL, buddy,
+	                      cancel_presence_notification, NULL /* Do nothing */);
+	g_free(msg);
 }
 
 static void jabber_buddy_rerequest_auth(PurpleBlistNode *node, gpointer data)
--- a/libpurple/protocols/jabber/buddy.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/buddy.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/caps.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/caps.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
@@ -468,8 +470,10 @@
 		}
 
 		if (!hash || strcmp(hash, userdata->ver)) {
-			purple_debug_warning("jabber", "Could not validate caps info from %s\n",
-			                     xmlnode_get_attrib(packet, "from"));
+			purple_debug_warning("jabber", "Could not validate caps info from "
+			                     "%s. Expected %s, got %s\n",
+			                     xmlnode_get_attrib(packet, "from"),
+			                     userdata->ver, hash ? hash : "(null)");
 
 			userdata->cb(NULL, NULL, userdata->cb_data);
 			jabber_caps_client_info_destroy(info);
@@ -597,8 +601,8 @@
 	jabber_caps_cbplususerdata *userdata;
 
 	if (exts && hash) {
-		purple_debug_info("jabber", "Ignoring exts in new-style caps from %s\n",
-		                     who);
+		purple_debug_misc("jabber", "Ignoring exts in new-style caps from %s\n",
+		                  who);
 		g_strfreev(exts);
 		exts = NULL;
 	}
--- a/libpurple/protocols/jabber/caps.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/caps.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/chat.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/chat.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/chat.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/chat.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/data.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/data.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,4 +1,8 @@
 /*
+ * 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
@@ -11,7 +15,7 @@
  *
  * 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., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #include <stdlib.h>
@@ -52,31 +56,44 @@
 JabberData *
 jabber_data_create_from_xml(xmlnode *tag)
 {
-	JabberData *data = g_new0(JabberData, 1);
-	gsize size;
-	gpointer raw_data = NULL;
+	JabberData *data;
+	gchar *raw_data = NULL;
+	const gchar *cid, *type;
+
+	/* check if this is a "data" tag */
+	if (strcmp(tag->name, "data") != 0) {
+		purple_debug_error("jabber", "Invalid data element\n");
+		return NULL;
+	}
+
+	cid = xmlnode_get_attrib(tag, "cid");
+	type = xmlnode_get_attrib(tag, "type");
 
-	if (data == NULL) {
-		purple_debug_error("jabber", "Could not allocate data object\n");
+	if (!cid || !type) {
+		purple_debug_error("jabber", "cid or type missing\n");
+		return NULL;
+	}
+
+	raw_data = xmlnode_get_data(tag);
+
+	if (raw_data == NULL || *raw_data == '\0') {
+		purple_debug_error("jabber", "data element was empty");
+		g_free(raw_data);
+		return NULL;
+	}
+
+	data = g_new0(JabberData, 1);
+	data->data = purple_base64_decode(raw_data, &data->size);
+	g_free(raw_data);
+
+	if (data->data == NULL) {
+		purple_debug_error("jabber", "Malformed base64 data\n");
 		g_free(data);
 		return NULL;
 	}
 
-	/* check if this is a "data" tag */
-	if (strcmp(tag->name, "data") != 0) {
-		purple_debug_error("jabber", "Invalid data element");
-		g_free(data);
-		return NULL;
-	}
-
-	data->cid = g_strdup(xmlnode_get_attrib(tag, "cid"));
-	data->type = g_strdup(xmlnode_get_attrib(tag, "type"));
-
-	raw_data = xmlnode_get_data(tag);
-	data->data = purple_base64_decode(raw_data, &size);
-	data->size = size;
-
-	g_free(raw_data);
+	data->cid = g_strdup(cid);
+	data->type = g_strdup(type);
 
 	return data;
 }
--- a/libpurple/protocols/jabber/data.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/data.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1,4 +1,8 @@
 /*
+ * 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
@@ -11,7 +15,7 @@
  *
  * 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., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #ifndef PURPLE_JABBER_DATA_H
--- a/libpurple/protocols/jabber/disco.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/disco.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Service Discovery
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/disco.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/disco.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/google.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/google.c	Wed Sep 16 15:36:24 2009 +0000
@@ -91,20 +91,6 @@
 }
 
 static void
-google_session_send_terminate(GoogleSession *session)
-{
-	xmlnode *sess;
-	JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
-
-	xmlnode_set_attrib(iq->node, "to", session->remote_jid);
-	sess = google_session_create_xmlnode(session, "terminate");
-	xmlnode_insert_child(iq->node, sess);
-
-	jabber_iq_send(iq);
-	google_session_destroy(session);
-}
-
-static void
 google_session_send_candidates(PurpleMedia *media, gchar *session_id,
 		gchar *participant, GoogleSession *session)
 {
@@ -310,6 +296,9 @@
 		gchar *sid, gchar *name, gboolean local,
 		GoogleSession *session)
 {
+	if (sid != NULL || name != NULL)
+		return;
+
 	if (type == PURPLE_MEDIA_INFO_HANGUP) {
 		xmlnode *sess;
 		JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
@@ -328,6 +317,8 @@
 		xmlnode_insert_child(iq->node, sess);
 
 		jabber_iq_send(iq);
+	} else if (type == PURPLE_MEDIA_INFO_ACCEPT && local == TRUE) {
+		google_session_ready(session);
 	}
 }
 
@@ -398,6 +389,16 @@
 
 	purple_media_set_prpl_data(session->media, session);
 
+	g_signal_connect_swapped(G_OBJECT(session->media),
+			"candidates-prepared",
+			G_CALLBACK(google_session_ready), session);
+	g_signal_connect_swapped(G_OBJECT(session->media), "codecs-changed",
+			G_CALLBACK(google_session_ready), session);
+	g_signal_connect(G_OBJECT(session->media), "state-changed",
+			G_CALLBACK(google_session_state_changed_cb), session);
+	g_signal_connect(G_OBJECT(session->media), "stream-info",
+			G_CALLBACK(google_session_stream_info_cb), session);
+
 	params = jabber_google_session_get_params(js, &num_params);
 
 	if (purple_media_add_stream(session->media, "google-voice",
@@ -408,23 +409,11 @@
 			session->remote_jid, PURPLE_MEDIA_VIDEO,
 			TRUE, "nice", num_params, params) == FALSE)) {
 		purple_media_error(session->media, "Error adding stream.");
-		purple_media_stream_info(session->media,
-				PURPLE_MEDIA_INFO_HANGUP, NULL, NULL, TRUE);
-		google_session_destroy(session);
+		purple_media_end(session->media, NULL, NULL);
 		g_free(params);
 		return FALSE;
 	}
 
-	g_signal_connect_swapped(G_OBJECT(session->media),
-			"candidates-prepared",
-			G_CALLBACK(google_session_ready), session);
-	g_signal_connect_swapped(G_OBJECT(session->media), "codecs-changed",
-			G_CALLBACK(google_session_ready), session);
-	g_signal_connect(G_OBJECT(session->media), "state-changed",
-			G_CALLBACK(google_session_state_changed_cb), session);
-	g_signal_connect(G_OBJECT(session->media), "stream-info",
-			G_CALLBACK(google_session_stream_info_cb), session);
-
 	g_free(params);
 
 	return (session->media != NULL) ? TRUE : FALSE;
@@ -466,6 +455,16 @@
 
 	purple_media_set_prpl_data(session->media, session);
 
+	g_signal_connect_swapped(G_OBJECT(session->media),
+			"candidates-prepared",
+			G_CALLBACK(google_session_ready), session);
+	g_signal_connect_swapped(G_OBJECT(session->media), "codecs-changed",
+			G_CALLBACK(google_session_ready), session);
+	g_signal_connect(G_OBJECT(session->media), "state-changed",
+			G_CALLBACK(google_session_state_changed_cb), session);
+	g_signal_connect(G_OBJECT(session->media), "stream-info",
+			G_CALLBACK(google_session_stream_info_cb), session);
+
 	params = jabber_google_session_get_params(js, &num_params);
 
 	if (purple_media_add_stream(session->media, "google-voice",
@@ -477,8 +476,7 @@
 			FALSE, "nice", num_params, params) == FALSE)) {
 		purple_media_error(session->media, "Error adding stream.");
 		purple_media_stream_info(session->media,
-				PURPLE_MEDIA_INFO_HANGUP, NULL, NULL, TRUE);
-		google_session_send_terminate(session);
+				PURPLE_MEDIA_INFO_REJECT, NULL, NULL, TRUE);
 		g_free(params);
 		return FALSE;
 	}
@@ -535,18 +533,6 @@
 	purple_media_codec_list_free(codecs);
 	purple_media_codec_list_free(video_codecs);
 
-	g_signal_connect_swapped(G_OBJECT(session->media), "accepted",
-			G_CALLBACK(google_session_ready), session);
-	g_signal_connect_swapped(G_OBJECT(session->media),
-			"candidates-prepared",
-			G_CALLBACK(google_session_ready), session);
-	g_signal_connect_swapped(G_OBJECT(session->media), "codecs-changed",
-			G_CALLBACK(google_session_ready), session);
-	g_signal_connect(G_OBJECT(session->media), "state-changed",
-			G_CALLBACK(google_session_state_changed_cb), session);
-	g_signal_connect(G_OBJECT(session->media), "stream-info",
-			G_CALLBACK(google_session_stream_info_cb), session);
-
 	result = jabber_iq_new(js, JABBER_IQ_RESULT);
 	jabber_iq_set_id(result, iq_id);
 	xmlnode_set_attrib(result->node, "to", session->remote_jid);
@@ -778,8 +764,7 @@
 	session->js = js;
 	session->remote_jid = g_strdup(session->id.initiator);
 
-	if (!google_session_handle_initiate(js, session, session_node, iq_id))
-		google_session_destroy(session);
+	google_session_handle_initiate(js, session, session_node, iq_id);
 }
 #endif /* USE_VV */
 
@@ -1316,6 +1301,7 @@
 		purple_debug_error("jabber", "Google STUN lookup failed: %s\n",
 			error_message);
 		g_slist_free(hosts);
+		js->stun_query = NULL;
 		return;
 	}
 
@@ -1334,18 +1320,16 @@
 			port = ntohs(((struct sockaddr_in *) addr)->sin_port);
 		}
 
-		if (js) {
-			if (js->stun_ip) {
-				g_free(js->stun_ip);
-			}
-			js->stun_ip = g_strdup(dst);
-			purple_debug_info("jabber", "set Google STUN IP address: %s\n", dst);
-			js->stun_port = port;
-			purple_debug_info("jabber", "set Google STUN port: %d\n", port);
-			purple_debug_info("jabber", "set Google STUN port: %d\n", port);
-			/* unmark ongoing query */
-			js->stun_query = NULL;
-		}
+		if (js->stun_ip)
+			g_free(js->stun_ip);
+		js->stun_ip = g_strdup(dst);
+		js->stun_port = port;
+
+		purple_debug_info("jabber", "set Google STUN IP/port address: "
+		                  "%s:%d\n", dst, port);
+
+		/* unmark ongoing query */
+		js->stun_query = NULL;
 	}
 
 	while (hosts != NULL) {
--- a/libpurple/protocols/jabber/ibb.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/ibb.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,4 +1,8 @@
 /*
+ * 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
@@ -11,7 +15,7 @@
  *
  * 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., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #include "internal.h"
--- a/libpurple/protocols/jabber/ibb.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/ibb.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1,4 +1,8 @@
 /*
+ * 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
@@ -11,7 +15,7 @@
  *
  * 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., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #ifndef PURPLE_JABBER_IBB_H_
--- a/libpurple/protocols/jabber/iq.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/iq.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/iq.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/iq.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/jabber.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -1603,13 +1605,10 @@
 				jabber_auth_start_old(js);
 			}
 			break;
-		case JABBER_STREAM_REINITIALIZING:
+		case JABBER_STREAM_POST_AUTH:
 			purple_connection_update_progress(js->gc, _("Re-initializing Stream"),
 					(js->gsc ? 8 : 4), JABBER_CONNECT_STEPS);
 
-			/* The stream will be reinitialized later, in jabber_recv_cb_ssl() */
-			js->reinit = TRUE;
-
 			break;
 		case JABBER_STREAM_CONNECTED:
 			/* Send initial presence */
@@ -3302,7 +3301,7 @@
 	                  PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY |
 	                  PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber",
 	                  jabber_cmd_chat_role,
-	                  _("role &lt;moderator|participant|visitor|none&gt; [nick1] [nick2] ...: Get the users with an role or set users' role with the room."),
+	                  _("role &lt;moderator|participant|visitor|none&gt; [nick1] [nick2] ...: Get the users with a role or set users' role with the room."),
 	                  NULL);
 	jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id));
 
--- a/libpurple/protocols/jabber/jabber.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -85,7 +87,7 @@
 	JABBER_STREAM_INITIALIZING,
 	JABBER_STREAM_INITIALIZING_ENCRYPTION,
 	JABBER_STREAM_AUTHENTICATING,
-	JABBER_STREAM_REINITIALIZING,
+	JABBER_STREAM_POST_AUTH,
 	JABBER_STREAM_CONNECTED
 } JabberStreamState;
 
--- a/libpurple/protocols/jabber/jingle/content.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/content.c	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/content.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/content.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/iceudp.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/iceudp.c	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/iceudp.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/iceudp.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/jingle.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/jingle.c	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * purple - Jabber Protocol Plugin
  *
+ * 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
--- a/libpurple/protocols/jabber/jingle/jingle.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/jingle.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1,6 +1,10 @@
 /*
  * @file jingle.h
  *
+ * 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
--- a/libpurple/protocols/jabber/jingle/rawudp.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/rawudp.c	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/rawudp.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/rawudp.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/rtp.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/rtp.c	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
@@ -607,8 +611,11 @@
 		is_creator = !jingle_session_is_initiator(session);
 	g_free(creator);
 
-	purple_media_add_stream(media, name, remote_jid,
-			type, is_creator, transmitter, num_params, params);
+	if(!purple_media_add_stream(media, name, remote_jid,
+			type, is_creator, transmitter, num_params, params)) {
+		purple_media_end(media, NULL, NULL);
+		return FALSE;
+	}
 
 	g_free(name);
 	g_free(media_type);
--- a/libpurple/protocols/jabber/jingle/rtp.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/rtp.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/session.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/session.c	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/session.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/session.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/transport.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/transport.c	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jingle/transport.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/transport.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,6 +3,10 @@
  *
  * 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
--- a/libpurple/protocols/jabber/jutil.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jutil.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -151,10 +153,9 @@
 		if (!jabber_resourceprep(idn_buffer, sizeof(idn_buffer))) {
 			jabber_id_free(jid);
 			jid = NULL;
-			/* goto out; */
-		}
-
-		jid->resource = g_strdup(idn_buffer);
+			goto out;
+		} else
+			jid->resource = g_strdup(idn_buffer);
 	}
 
 out:
@@ -275,8 +276,8 @@
 #endif /* USE_IDN */
 }
 
-JabberID*
-jabber_id_new(const char *str)
+static JabberID*
+jabber_id_new_internal(const char *str, gboolean allow_terminating_slash)
 {
 	const char *at = NULL;
 	const char *slash = NULL;
@@ -321,7 +322,7 @@
 						/* JIDs cannot start with / */
 						return NULL;
 					}
-					if (c[1] == '\0') {
+					if (c[1] == '\0' && !allow_terminating_slash) {
 						/* JIDs cannot end with / */
 						return NULL;
 					}
@@ -384,14 +385,16 @@
 			jid->node = g_ascii_strdown(str, at - str);
 			if (slash) {
 				jid->domain = g_ascii_strdown(at + 1, slash - (at + 1));
-				jid->resource = g_strdup(slash + 1);
+				if (*(slash + 1))
+					jid->resource = g_strdup(slash + 1);
 			} else {
 				jid->domain = g_ascii_strdown(at + 1, -1);
 			}
 		} else {
 			if (slash) {
 				jid->domain = g_ascii_strdown(str, slash - str);
-				jid->resource = g_strdup(slash + 1);
+				if (*(slash + 1))
+					jid->resource = g_strdup(slash + 1);
 			} else {
 				jid->domain = g_ascii_strdown(str, -1);
 			}
@@ -419,14 +422,16 @@
 		node = g_utf8_casefold(str, at-str);
 		if(slash) {
 			domain = g_utf8_casefold(at+1, slash-(at+1));
-			jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC);
+			if (*(slash + 1))
+				jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC);
 		} else {
 			domain = g_utf8_casefold(at+1, -1);
 		}
 	} else {
 		if(slash) {
 			domain = g_utf8_casefold(str, slash-str);
-			jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC);
+			if (*(slash + 1))
+				jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC);
 		} else {
 			domain = g_utf8_casefold(str, -1);
 		}
@@ -483,21 +488,37 @@
 	return out;
 }
 
-char *jabber_get_bare_jid(const char *in)
+char *
+jabber_get_bare_jid(const char *in)
 {
 	JabberID *jid = jabber_id_new(in);
 	char *out;
 
-	if(!jid)
+	if (!jid)
 		return NULL;
-
-	out = g_strdup_printf("%s%s%s", jid->node ? jid->node : "",
-			jid->node ? "@" : "", jid->domain);
+	out = jabber_id_get_bare_jid(jid);
 	jabber_id_free(jid);
 
 	return out;
 }
 
+char *
+jabber_id_get_bare_jid(const JabberID *jid)
+{
+	g_return_val_if_fail(jid != NULL, NULL);
+
+	return g_strconcat(jid->node ? jid->node : "",
+	                   jid->node ? "@" : "",
+	                   jid->domain,
+	                   NULL);
+}
+
+JabberID *
+jabber_id_new(const char *str)
+{
+	return jabber_id_new_internal(str, FALSE);
+}
+
 const char *jabber_normalize(const PurpleAccount *account, const char *in)
 {
 	PurpleConnection *gc = account ? account->gc : NULL;
@@ -505,8 +526,7 @@
 	static char buf[3072]; /* maximum legal length of a jabber jid */
 	JabberID *jid;
 
-	jid = jabber_id_new(in);
-
+	jid = jabber_id_new_internal(in, TRUE);
 	if(!jid)
 		return NULL;
 
--- a/libpurple/protocols/jabber/jutil.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/jutil.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -35,6 +37,7 @@
 
 char *jabber_get_resource(const char *jid);
 char *jabber_get_bare_jid(const char *jid);
+char *jabber_id_get_bare_jid(const JabberID *jid);
 
 const char *jabber_normalize(const PurpleAccount *account, const char *in);
 
--- a/libpurple/protocols/jabber/message.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/message.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -87,8 +89,12 @@
 	}
 
 	if(!jm->xhtml && !jm->body) {
-		if (jbr)
-			jbr->chat_states = JABBER_CHAT_STATES_SUPPORTED;
+		if (jbr) {
+			if (jm->chat_state != JM_STATE_NONE)
+				jbr->chat_states = JABBER_CHAT_STATES_SUPPORTED;
+			else
+				jbr->chat_states = JABBER_CHAT_STATES_UNSUPPORTED;
+		}
 
 		if(JM_STATE_COMPOSING == jm->chat_state) {
 			serv_got_typing(jm->js->gc, from, 0, PURPLE_TYPING);
@@ -487,7 +493,7 @@
 	xmlnode *item_not_found = xmlnode_get_child(packet, "item-not-found");
 
 	/* did we get a data element as result? */
-	if (data_element) {
+	if (data_element && type == JABBER_IQ_RESULT) {
 		JabberData *data = jabber_data_create_from_xml(data_element);
 
 		if (data) {
@@ -1219,7 +1225,7 @@
 	jm->id = jabber_get_next_id(jm->js);
 
 	tmp = purple_utf8_strip_unprintables(msg);
-	purple_markup_html_to_xhtml(msg, &xhtml, &jm->body);
+	purple_markup_html_to_xhtml(tmp, &xhtml, &jm->body);
 	g_free(tmp);
 	tmp = jabber_message_smileyfy_xhtml(jm, xhtml);
 	if (tmp) {
--- a/libpurple/protocols/jabber/message.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/message.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/oob.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/oob.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -207,7 +209,10 @@
 	url = xmlnode_get_data(urlnode);
 
 	jox = g_new0(JabberOOBXfer, 1);
-	purple_url_parse(url, &jox->address, &jox->port, &jox->page, NULL, NULL);
+	if (!purple_url_parse(url, &jox->address, &jox->port, &jox->page, NULL, NULL)) {
+		g_free(url);
+		return;
+	}
 	g_free(url);
 	jox->js = js;
 	jox->headers = g_string_new("");
--- a/libpurple/protocols/jabber/oob.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/oob.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/parser.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/parser.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber XML parser stuff
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/parser.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/parser.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/pep.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/pep.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/pep.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/pep.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/ping.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/ping.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -16,7 +18,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/ping.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/ping.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -17,7 +19,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 #ifndef PURPLE_JABBER_PING_H_
 #define PURPLE_JABBER_PING_H_
--- a/libpurple/protocols/jabber/presence.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/presence.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -469,10 +471,17 @@
 		jbr->commands_fetched = TRUE;
 	}
 
+#if 0
+	/*
+	 * Versions of libpurple before 2.6.0 didn't advertise this capability, so
+	 * we can't yet use Entity Capabilities to determine whether or not the
+	 * other client supports Entity Capabilities.
+	 */
 	if (jabber_resource_has_capability(jbr, "http://jabber.org/protocol/chatstates"))
 		jbr->chat_states = JABBER_CHAT_STATES_SUPPORTED;
 	else
 		jbr->chat_states = JABBER_CHAT_STATES_UNSUPPORTED;
+#endif
 
 out:
 	g_free(userdata->from);
--- a/libpurple/protocols/jabber/presence.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/presence.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/roster.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/roster.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
@@ -24,6 +26,7 @@
 #include "util.h"
 
 #include "buddy.h"
+#include "chat.h"
 #include "google.h"
 #include "presence.h"
 #include "roster.h"
@@ -334,6 +337,7 @@
 {
 	JabberStream *js = gc->proto_data;
 	char *who;
+	JabberID *jid;
 	JabberBuddy *jb;
 	JabberBuddyResource *jbr;
 	const char *name;
@@ -343,13 +347,39 @@
 		return;
 
 	name = purple_buddy_get_name(buddy);
-	if(!(who = jabber_get_bare_jid(name)))
+	jid = jabber_id_new(name);
+	if (jid == NULL) {
+		/* TODO: Remove the buddy from the list? */
 		return;
+	}
 
-	jb = jabber_buddy_find(js, name, FALSE);
+	/* Adding a chat room or a chat buddy to the roster is *not* supported. */
+	if (jabber_chat_find(js, jid->node, jid->domain) != NULL) {
+		/*
+		 * This is the same thing Bonjour does. If it causes problems, move
+		 * it to an idle callback.
+		 */
+		purple_debug_warning("jabber", "Cowardly refusing to add a MUC user "
+		                     "to your buddy list and removing the buddy. "
+		                     "Buddies can only be added by real (non-MUC) "
+		                     "JID\n");
+		purple_blist_remove_buddy(buddy);
+		jabber_id_free(jid);
+		return;
+	}
 
-	purple_debug_info("jabber", "jabber_roster_add_buddy(): Adding %s\n",
-	                  name);
+	who = jabber_id_get_bare_jid(jid);
+	if (jid->resource != NULL) {
+		/*
+		 * If the buddy name added contains a resource, strip that off and
+		 * rename the buddy.
+		 */
+		purple_blist_rename_buddy(buddy, who);
+	}
+
+	jb = jabber_buddy_find(js, who, FALSE);
+
+	purple_debug_info("jabber", "jabber_roster_add_buddy(): Adding %s\n", who);
 
 	jabber_roster_update(js, who, NULL);
 
--- a/libpurple/protocols/jabber/roster.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/roster.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/si.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/si.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/si.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/si.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/useravatar.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/useravatar.c	Wed Sep 16 15:36:24 2009 +0000
@@ -17,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/useravatar.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/useravatar.h	Wed Sep 16 15:36:24 2009 +0000
@@ -17,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/usermood.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/usermood.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/usermood.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/usermood.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/usernick.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/usernick.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/usernick.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/usernick.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/usertune.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/usertune.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/usertune.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/usertune.h	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2007, Andreas Monitzer <andy@monitzer.com>
+ * 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
@@ -15,7 +17,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
 
--- a/libpurple/protocols/jabber/xdata.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/xdata.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1,7 +1,9 @@
 /*
  * purple - Jabber Protocol Plugin
  *
- * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/jabber/xdata.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/jabber/xdata.h	Wed Sep 16 15:36:24 2009 +0000
@@ -3,7 +3,9 @@
  *
  * purple
  *
- * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
+ * 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
--- a/libpurple/protocols/msn/Makefile.mingw	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/Makefile.mingw	Wed Sep 16 15:36:24 2009 +0000
@@ -41,7 +41,6 @@
 			command.c \
 			contact.c\
 			dialog.c \
-			directconn.c \
 			error.c \
 			group.c \
 			history.c \
--- a/libpurple/protocols/msn/cmdproc.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/cmdproc.h	Wed Sep 16 15:36:24 2009 +0000
@@ -71,6 +71,4 @@
 void msn_cmdproc_process_payload(MsnCmdProc *cmdproc,
 								 char *payload, int payload_len);
 
-void msn_cmdproc_disconnect(MsnCmdProc *cmdproc);
-
 #endif /* _MSN_CMDPROC_H_ */
--- a/libpurple/protocols/msn/contact.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/contact.c	Wed Sep 16 15:36:24 2009 +0000
@@ -21,7 +21,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 
 #include "msn.h"
--- a/libpurple/protocols/msn/contact.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/contact.h	Wed Sep 16 15:36:24 2009 +0000
@@ -20,7 +20,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 #ifndef _MSN_CONTACT_H_
 #define _MSN_CONTACT_H_
--- a/libpurple/protocols/msn/error.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/error.c	Wed Sep 16 15:36:24 2009 +0000
@@ -198,7 +198,7 @@
 			break;
 
 		case 800:
-			result = _("Friendly name changes too rapidly");
+			result = _("Friendly name is changing too rapidly");
 			break;
 
 		case 910:
--- a/libpurple/protocols/msn/msn.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/msn.c	Wed Sep 16 15:36:24 2009 +0000
@@ -89,6 +89,7 @@
 typedef struct
 {
 	char *smile;
+	PurpleSmiley *ps;
 	MsnObject *obj;
 } MsnEmoticon;
 
@@ -265,6 +266,7 @@
 	MsnSession *session;
 	MsnCmdProc *cmdproc;
 	MsnPage *page;
+	MsnMessage *msg;
 	MsnUser *user;
 	char *payload = NULL;
 	const char *mobile_number = NULL;
@@ -295,6 +297,9 @@
 	msn_transaction_set_payload(trans, payload, payload_len);
 	g_free(payload);
 
+	msg = msn_message_new_plain(entry);
+	msn_transaction_set_data(trans, msg);
+
 	msn_page_destroy(page);
 
 	msn_cmdproc_send_trans(cmdproc, trans);
@@ -1078,12 +1083,10 @@
 	strobj = msn_object_to_string(obj);
 
 	if (current)
-		g_string_append_printf(current, "\t%s\t%s",
-				emoticon->smile, strobj);
+		g_string_append_printf(current, "\t%s\t%s", emoticon->smile, strobj);
 	else {
 		current = g_string_new("");
-		g_string_printf(current,"%s\t%s",
-					emoticon->smile, strobj);
+		g_string_printf(current, "%s\t%s", emoticon->smile, strobj);
 	}
 
 	g_free(strobj);
@@ -1141,6 +1144,7 @@
 
 		emoticon = g_new0(MsnEmoticon, 1);
 		emoticon->smile = g_strdup(purple_smiley_get_shortcut(smiley));
+		emoticon->ps = smiley;
 		emoticon->obj = msn_object_new_from_image(img,
 				purple_imgstore_get_filename(img),
 				username, MSN_OBJECT_EMOTICON);
@@ -1163,7 +1167,7 @@
 
 	smileys = msn_msg_grab_emoticons(msg->body, username);
 	while (smileys) {
-		smile = (MsnEmoticon*)smileys->data;
+		smile = (MsnEmoticon *)smileys->data;
 		emoticons = msn_msg_emoticon_add(emoticons, smile);
 		msn_emoticon_destroy(smile);
 		smileys = g_slist_delete_link(smileys, smileys);
@@ -1714,13 +1718,19 @@
 {
 	PurpleAccount *account;
 	MsnSession *session;
+	const char *username;
 	MsnSwitchBoard *swboard;
 	MsnMessage *msg;
 	char *msgformat;
 	char *msgtext;
+	size_t msglen;
+	MsnEmoticon *smile;
+	GSList *smileys;
+	GString *emoticons = NULL;
 
 	account = purple_connection_get_account(gc);
 	session = gc->proto_data;
+	username = purple_account_get_username(account);
 	swboard = msn_session_find_swboard_with_id(session, id);
 
 	if (swboard == NULL)
@@ -1732,8 +1742,9 @@
 	swboard->flag |= MSN_SB_FLAG_IM;
 
 	msn_import_html(message, &msgformat, &msgtext);
-
-	if (strlen(msgtext) + strlen(msgformat) + strlen(VERSION) > 1564)
+	msglen = strlen(msgtext);
+
+	if ((msglen == 0) || (msglen + strlen(msgformat) + strlen(VERSION) > 1564))
 	{
 		g_free(msgformat);
 		g_free(msgtext);
@@ -1743,6 +1754,29 @@
 
 	msg = msn_message_new_plain(msgtext);
 	msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat);
+
+	smileys = msn_msg_grab_emoticons(msg->body, username);
+	while (smileys) {
+		smile = (MsnEmoticon *)smileys->data;
+		emoticons = msn_msg_emoticon_add(emoticons, smile);
+		if (purple_conv_custom_smiley_add(swboard->conv, smile->smile,
+		                                  "sha1", purple_smiley_get_checksum(smile->ps),
+		                                  FALSE)) {
+			gconstpointer data;
+			size_t len;
+			data = purple_smiley_get_data(smile->ps, &len);
+			purple_conv_custom_smiley_write(swboard->conv, smile->smile, data, len);
+			purple_conv_custom_smiley_close(swboard->conv, smile->smile);
+		}
+		msn_emoticon_destroy(smile);
+		smileys = g_slist_delete_link(smileys, smileys);
+	}
+
+	if (emoticons) {
+		msn_send_emoticons(swboard, emoticons);
+		g_string_free(emoticons, TRUE);
+	}
+
 	msn_switchboard_send_msg(swboard, msg, FALSE);
 	msn_message_destroy(msg);
 
--- a/libpurple/protocols/msn/msn.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/msn.h	Wed Sep 16 15:36:24 2009 +0000
@@ -127,7 +127,7 @@
 } MsnClientVerId;
 
 #define MSN_CLIENT_ID_VERSION      MSN_CLIENT_VER_7_0
-#define MSN_CLIENT_ID_CAPABILITIES (MSN_CLIENT_CAP_PACKET|MSN_CLIENT_CAP_INK_GIF|MSN_CLIENT_CAP_VOICEIM|MSN_CLIENT_CAP_WINKS)
+#define MSN_CLIENT_ID_CAPABILITIES (MSN_CLIENT_CAP_PACKET|MSN_CLIENT_CAP_INK_GIF|MSN_CLIENT_CAP_VOICEIM)
 
 #define MSN_CLIENT_ID \
 	((MSN_CLIENT_ID_VERSION    << 24) | \
--- a/libpurple/protocols/msn/notification.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/notification.c	Wed Sep 16 15:36:24 2009 +0000
@@ -599,6 +599,8 @@
 		/* Decrement the count for unknown results so that we'll continue login.
 		   Also, need to finish the login process here as well, because ADL OK
 		   will not be called. */
+		if (purple_debug_is_verbose())
+			purple_debug_info("msn", "ADL/FQY count is %d\n", session->adl_fqy);
 		if (--session->adl_fqy == 0)
 			msn_session_finish_login(session);
 		return;
@@ -680,6 +682,9 @@
 
 				/* ADL's are returned all-together */
 				session->adl_fqy++;
+				if (purple_debug_is_verbose())
+					purple_debug_info("msn", "Posting ADL, count is %d\n",
+					                  session->adl_fqy);
 
 				msn_notification_post_adl(session->notification->cmdproc,
 					payload, payload_len);
@@ -694,6 +699,9 @@
 		} else {
 			/* FQY's are returned one-at-a-time */
 			session->adl_fqy++;
+			if (purple_debug_is_verbose())
+				purple_debug_info("msn", "Adding FQY address, count is %d\n",
+				                  session->adl_fqy);
 
 			msn_add_contact_xml(session, fqy_node, user->passport,
 				0, user->networkid);
@@ -718,6 +726,9 @@
 
 		/* ADL's are returned all-together */
 		session->adl_fqy++;
+		if (purple_debug_is_verbose())
+			purple_debug_info("msn", "Posting ADL, count is %d\n",
+			                  session->adl_fqy);
 
 		msn_notification_post_adl(session->notification->cmdproc, payload, payload_len);
 
@@ -809,6 +820,9 @@
 
 	if (!strcmp(cmd->params[1], "OK")) {
 		/* ADL ack */
+		if (purple_debug_is_verbose())
+			purple_debug_info("msn", "ADL ACK, count is %d\n",
+			                  session->adl_fqy);
 		if (--session->adl_fqy == 0)
 			msn_session_finish_login(session);
 	} else {
@@ -1178,14 +1192,36 @@
 	id = xmlnode_get_attrib(msg, "id");
 
 	if (id && !strcmp(id, "407")) {
-		/* TODO: Use this to NAK the transaction, maybe print the text, too.
-		unsigned int trId;
-		id = xmlnode_get_attrib(payloadNode, "id");
-		trId = atol(id);
-		*/
-		purple_conv_present_error(who, gc->account,
-			_("Mobile message was not sent because it was too long."));
+		PurpleConversation *conv
+			= purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY,
+			                                        who, gc->account);
+		if (conv != NULL) {
+			purple_conversation_write(conv, NULL,
+			                          _("Mobile message was not sent because it was too long."),
+			                          PURPLE_MESSAGE_ERROR, time(NULL));
+
+			if ((id = xmlnode_get_attrib(payloadNode, "id")) != NULL) {
+				unsigned int trId = atol(id);
+				MsnTransaction *trans;
+				MsnMessage *msg;
 
+				trans = msn_history_find(cmdproc->history, trId);
+				msg = (MsnMessage *)trans->data;
+
+				if (msg) {
+					char *body_str = msn_message_to_string(msg);
+					char *body_enc = g_markup_escape_text(body_str, -1);
+
+					purple_conversation_write(conv, NULL, body_enc,
+					                          PURPLE_MESSAGE_RAW, time(NULL));
+
+					g_free(body_str);
+					g_free(body_enc);
+					msn_message_destroy(msg);
+					trans->data = NULL;
+				}
+			}
+		}
 	} else {
 		serv_got_im(gc, who, text, 0, time(NULL));
 	}
--- a/libpurple/protocols/msn/oim.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/oim.c	Wed Sep 16 15:36:24 2009 +0000
@@ -21,7 +21,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 #include "msn.h"
 #include "soap.h"
@@ -172,8 +172,18 @@
 
 	if (faultcode) {
 		gchar *faultcode_str = xmlnode_get_data(faultcode);
+		gboolean need_token_update = FALSE;
 
-		if (faultcode_str && g_str_equal(faultcode_str, "q0:BadContextToken")) {
+		if (faultcode_str) {
+			if (g_str_equal(faultcode_str, "q0:BadContextToken") ||
+				g_str_equal(faultcode_str, "AuthenticationFailed"))
+				need_token_update = TRUE;
+			else if (g_str_equal(faultcode_str, "q0:AuthenticationFailed") &&
+				xmlnode_get_child(fault, "detail/RequiredAuthPolicy") != NULL)
+				need_token_update = TRUE;
+		}
+
+		if (need_token_update) {
 			purple_debug_warning("msn", "OIM Request Error, Updating token now.\n");
 			msn_nexus_update_token(data->oim->session->nexus,
 				data->send ? MSN_AUTH_LIVE_SECURE : MSN_AUTH_MESSENGER_WEB,
@@ -181,16 +191,8 @@
 			g_free(faultcode_str);
 			return;
 
-		} else if (faultcode_str && g_str_equal(faultcode_str, "q0:AuthenticationFailed")) {
-			if (xmlnode_get_child(fault, "detail/RequiredAuthPolicy") != NULL) {
-				purple_debug_warning("msn", "OIM Request Error, Updating token now.\n");
-				msn_nexus_update_token(data->oim->session->nexus,
-					data->send ? MSN_AUTH_LIVE_SECURE : MSN_AUTH_MESSENGER_WEB,
-					(GSourceFunc)msn_oim_request_helper, data);
-				g_free(faultcode_str);
-				return;
-			}
 		}
+
 		g_free(faultcode_str);
 	}
 
--- a/libpurple/protocols/msn/oim.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/oim.h	Wed Sep 16 15:36:24 2009 +0000
@@ -20,7 +20,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 #ifndef _MSN_OIM_H_
 #define _MSN_OIM_H_
--- a/libpurple/protocols/msn/slp.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/slp.c	Wed Sep 16 15:36:24 2009 +0000
@@ -351,7 +351,7 @@
 
 			g_free(bin);
 
-			purple_xfer_set_filename(xfer, file_name);
+			purple_xfer_set_filename(xfer, file_name ? file_name : "");
 			g_free(file_name);
 			purple_xfer_set_size(xfer, file_size);
 			purple_xfer_set_init_fnc(xfer, msn_xfer_init);
@@ -403,9 +403,8 @@
 			if (conv) {
 				char *buf;
 				buf = g_strdup_printf(
-						_("%s has sent you a webcam "
-						"invite, which is not yet "
-						"supported."), from);
+						_("%s invited you to view his/her webcam, but "
+						"this is not yet supported."), from);
 				purple_conversation_write(conv, NULL, buf,
 						PURPLE_MESSAGE_SYSTEM |
 						PURPLE_MESSAGE_NOTIFY,
@@ -709,7 +708,15 @@
 
 		content = get_token(body, "\r\n\r\n", NULL);
 
-		got_invite(slpcall, branch, content_type, content);
+		if (branch && content_type && content)
+		{
+			got_invite(slpcall, branch, content_type, content);
+		}
+		else
+		{
+			msn_slpcall_destroy(slpcall);
+			slpcall = NULL;
+		}
 
 		g_free(branch);
 		g_free(content_type);
--- a/libpurple/protocols/msn/slpcall.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/slpcall.c	Wed Sep 16 15:36:24 2009 +0000
@@ -205,7 +205,7 @@
 		if (slpmsg->session_id == 64)
 		{
 			/* This is for handwritten messages (Ink) */
-			GError *error;
+			GError *error = NULL;
 			gsize bytes_read, bytes_written;
 
 			body_str = g_convert((const gchar *)body, body_len / 2,
@@ -232,7 +232,7 @@
 			g_free(body_str);
 
 			body_str = g_convert((const gchar *)body, body_len / 2,
-			                     "UTF-8", "UTF16-LE",
+			                     "UTF-8", "UTF-16LE",
 			                     &bytes_read, &bytes_written, &error);
 			if (!body_str)
 			{
--- a/libpurple/protocols/msn/slplink.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/slplink.c	Wed Sep 16 15:36:24 2009 +0000
@@ -441,6 +441,7 @@
 	slpmsg->info = "SLP ACK";
 
 	msn_slplink_send_slpmsg(slplink, slpmsg);
+	msn_slpmsg_destroy(slpmsg);
 }
 
 static void
@@ -504,11 +505,6 @@
 
 	data = msn_message_get_bin_data(msg, &len);
 
-	/*
-		OVERHEAD!
-		if (msg->msnslp_header.length < msg->msnslp_header.total_size)
-	 */
-
 	offset = msg->msnslp_header.offset;
 
 	if (offset == 0)
@@ -578,7 +574,7 @@
 		/* fseek(slpmsg->fp, offset, SEEK_SET); */
 		len = fwrite(data, 1, len, slpmsg->fp);
 	}
-	else if (slpmsg->size)
+	else if (slpmsg->size && slpmsg->buffer)
 	{
 		if (G_MAXSIZE - len < offset || (offset + len) > slpmsg->size)
 		{
--- a/libpurple/protocols/msn/soap.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/soap.c	Wed Sep 16 15:36:24 2009 +0000
@@ -20,7 +20,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 
 #include "internal.h"
--- a/libpurple/protocols/msn/soap.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/soap.h	Wed Sep 16 15:36:24 2009 +0000
@@ -20,7 +20,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 
 #ifndef _MSN_SOAP_H
--- a/libpurple/protocols/msn/switchboard.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msn/switchboard.c	Wed Sep 16 15:36:24 2009 +0000
@@ -248,9 +248,11 @@
 	{
 		purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), user, NULL,
 								PURPLE_CBFLAGS_NONE, TRUE);
+		msn_servconn_set_idle_timeout(swboard->servconn, 0);
 	}
 	else if (swboard->current_users > 1 || swboard->total_users > 1)
 	{
+		msn_servconn_set_idle_timeout(swboard->servconn, 0);
 		if (swboard->conv == NULL ||
 			purple_conversation_get_type(swboard->conv) != PURPLE_CONV_TYPE_CHAT)
 		{
@@ -920,7 +922,7 @@
 	}
 
 	imgid = purple_imgstore_add_with_id(image_data, image_len, NULL);
-	image_msg = g_strdup_printf("<IMG ID=%d/>", imgid);
+	image_msg = g_strdup_printf("<IMG ID='%d'/>", imgid);
 
 	if (swboard->current_users > 1 ||
 		((swboard->conv != NULL) &&
--- a/libpurple/protocols/msnp9/slp.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msnp9/slp.c	Wed Sep 16 15:36:24 2009 +0000
@@ -338,7 +338,7 @@
 		char *bin;
 		gsize bin_len;
 		guint32 file_size;
-		char *file_name;
+		gchar *file_name;
 		gunichar2 *uni_name;
 
 		account = slpcall->slplink->session->account;
@@ -368,7 +368,8 @@
 
 			g_free(bin);
 
-			purple_xfer_set_filename(xfer, file_name);
+			purple_xfer_set_filename(xfer, file_name ? file_name : "");
+			g_free(file_name);
 			purple_xfer_set_size(xfer, file_size);
 			purple_xfer_set_init_fnc(xfer, msn_xfer_init);
 			purple_xfer_set_request_denied_fnc(xfer, msn_xfer_cancel);
--- a/libpurple/protocols/msnp9/slplink.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/msnp9/slplink.c	Wed Sep 16 15:36:24 2009 +0000
@@ -477,6 +477,7 @@
 #endif
 
 	msn_slplink_send_slpmsg(slplink, slpmsg);
+	msn_slpmsg_destroy(slpmsg);
 }
 
 static void
@@ -603,7 +604,7 @@
 		/* fseek(slpmsg->fp, offset, SEEK_SET); */
 		len = fwrite(data, 1, len, slpmsg->fp);
 	}
-	else if (slpmsg->size)
+	else if (slpmsg->size && slpmsg->buffer)
 	{
 		if (G_MAXSIZE - len < offset || (offset + len) > slpmsg->size)
 		{
--- a/libpurple/protocols/oscar/clientlogin.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/oscar/clientlogin.c	Wed Sep 16 15:36:24 2009 +0000
@@ -62,50 +62,6 @@
 }
 
 /**
- * This is similar to purple_url_encode() except that it follows
- * RFC3986 a little more closely by not encoding - . _ and ~
- * It also uses capital letters as hex characters because capital
- * letters are required by AOL.  The RFC says that capital letters
- * are a SHOULD and that URLs that use capital letters are
- * equivalent to URLs that use small letters.
- *
- * TODO: Check if purple_url_encode() can be replaced with this
- *       version without breaking anything.
- */
-static const char *oscar_auth_url_encode(const char *str)
-{
-	const char *iter;
-	static char buf[BUF_LEN];
-	char utf_char[6];
-	guint i, j = 0;
-
-	g_return_val_if_fail(str != NULL, NULL);
-	g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
-
-	iter = str;
-	for (; *iter && j < (BUF_LEN - 1) ; iter = g_utf8_next_char(iter)) {
-		gunichar c = g_utf8_get_char(iter);
-		/* If the character is an ASCII character and is alphanumeric
-		 * no need to escape */
-		if ((c < 128 && isalnum(c)) || c =='-' || c == '.' || c == '_' || c == '~') {
-			buf[j++] = c;
-		} else {
-			int bytes = g_unichar_to_utf8(c, utf_char);
-			for (i = 0; i < bytes; i++) {
-				if (j > (BUF_LEN - 4))
-					break;
-				sprintf(buf + j, "%%%02X", utf_char[i] & 0xff);
-				j += 3;
-			}
-		}
-	}
-
-	buf[j] = '\0';
-
-	return buf;
-}
-
-/**
  * @return A null-terminated base64 encoded version of the HMAC
  *         calculated using the given key and data.
  */
@@ -134,8 +90,8 @@
 	char *encoded_url, *signature_base_string, *signature;
 	const char *encoded_parameters;
 
-	encoded_url = g_strdup(oscar_auth_url_encode(url));
-	encoded_parameters = oscar_auth_url_encode(parameters);
+	encoded_url = g_strdup(purple_url_encode(url));
+	encoded_parameters = purple_url_encode(parameters);
 	signature_base_string = g_strdup_printf("%s&%s&%s",
 			method, encoded_url, encoded_parameters);
 	g_free(encoded_url);
@@ -156,11 +112,15 @@
 	response_node = xmlnode_from_str(response, response_len);
 	if (response_node == NULL)
 	{
+		char *msg;
 		purple_debug_error("oscar", "startOSCARSession could not parse "
 				"response as XML: %s\n", response);
+		/* Note to translators: %s in this string is a URL */
+		msg = g_strdup_printf(_("Received unexpected response from %s"),
+				URL_START_OSCAR_SESSION);
 		purple_connection_error_reason(gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Received unexpected response from " URL_START_OSCAR_SESSION));
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
+		g_free(msg);
 		return FALSE;
 	}
 
@@ -175,11 +135,14 @@
 
 	/* Make sure we have a status code */
 	if (tmp_node == NULL || (tmp = xmlnode_get_data_unescaped(tmp_node)) == NULL) {
+		char *msg;
 		purple_debug_error("oscar", "startOSCARSession response was "
 				"missing statusCode: %s\n", response);
+		msg = g_strdup_printf(_("Received unexpected response from %s"),
+				URL_START_OSCAR_SESSION);
 		purple_connection_error_reason(gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Received unexpected response from " URL_START_OSCAR_SESSION));
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
+		g_free(msg);
 		xmlnode_free(response_node);
 		return FALSE;
 	}
@@ -197,10 +160,14 @@
 					  "frequently. Wait ten minutes and try again. If "
 					  "you continue to try, you will need to wait even "
 					  "longer."));
-		else
+		else {
+			char *msg;
+			msg = g_strdup_printf(_("Received unexpected response from %s"),
+					URL_START_OSCAR_SESSION);
 			purple_connection_error_reason(gc,
-					PURPLE_CONNECTION_ERROR_OTHER_ERROR,
-					_("Received unexpected response from " URL_START_OSCAR_SESSION));
+					PURPLE_CONNECTION_ERROR_OTHER_ERROR, msg);
+			g_free(msg);
+		}
 
 		g_free(tmp);
 		xmlnode_free(response_node);
@@ -212,11 +179,14 @@
 	if (data_node == NULL || host_node == NULL ||
 		port_node == NULL || cookie_node == NULL)
 	{
+		char *msg;
 		purple_debug_error("oscar", "startOSCARSession response was missing "
 				"something: %s\n", response);
+		msg = g_strdup_printf(_("Received unexpected response from %s"),
+				URL_START_OSCAR_SESSION);
 		purple_connection_error_reason(gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Received unexpected response from " URL_START_OSCAR_SESSION));
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
+		g_free(msg);
 		xmlnode_free(response_node);
 		return FALSE;
 	}
@@ -227,11 +197,14 @@
 	*cookie = xmlnode_get_data_unescaped(cookie_node);
 	if (*host == NULL || **host == '\0' || tmp == NULL || *tmp == '\0' || cookie == NULL || *cookie == '\0')
 	{
+		char *msg;
 		purple_debug_error("oscar", "startOSCARSession response was missing "
 				"something: %s\n", response);
+		msg = g_strdup_printf(_("Received unexpected response from %s"),
+				URL_START_OSCAR_SESSION);
 		purple_connection_error_reason(gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Received unexpected response from " URL_START_OSCAR_SESSION));
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
+		g_free(msg);
 		g_free(*host);
 		g_free(tmp);
 		g_free(*cookie);
@@ -261,8 +234,10 @@
 
 	if (error_message != NULL || len == 0) {
 		gchar *tmp;
-		tmp = g_strdup_printf(_("Error requesting " URL_START_OSCAR_SESSION
-				": %s"), error_message);
+		/* Note to translators: The first %s is a URL, the second is an
+		   error message. */
+		tmp = g_strdup_printf(_("Error requesting %s: %s"),
+				URL_START_OSCAR_SESSION, error_message);
 		purple_connection_error_reason(gc,
 				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
@@ -290,7 +265,7 @@
 			"&k=%s"
 			"&ts=%" PURPLE_TIME_T_MODIFIER
 			"&useTLS=0",
-			oscar_auth_url_encode(token), get_client_key(od), hosttime);
+			purple_url_encode(token), get_client_key(od), hosttime);
 	signature = generate_signature("GET", URL_START_OSCAR_SESSION,
 			query_string, session_key);
 	url = g_strdup_printf(URL_START_OSCAR_SESSION "?%s&sig_sha256=%s",
@@ -339,11 +314,14 @@
 	response_node = xmlnode_from_str(response, response_len);
 	if (response_node == NULL)
 	{
+		char *msg;
 		purple_debug_error("oscar", "clientLogin could not parse "
 				"response as XML: %s\n", response);
+		msg = g_strdup_printf(_("Received unexpected response from %s"),
+				URL_CLIENT_LOGIN);
 		purple_connection_error_reason(gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Received unexpected response from " URL_CLIENT_LOGIN));
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
+		g_free(msg);
 		return FALSE;
 	}
 
@@ -360,11 +338,14 @@
 
 	/* Make sure we have a status code */
 	if (tmp_node == NULL || (tmp = xmlnode_get_data_unescaped(tmp_node)) == NULL) {
+		char *msg;
 		purple_debug_error("oscar", "clientLogin response was "
 				"missing statusCode: %s\n", response);
+		msg = g_strdup_printf(_("Received unexpected response from %s"),
+				URL_CLIENT_LOGIN);
 		purple_connection_error_reason(gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Received unexpected response from " URL_CLIENT_LOGIN));
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
+		g_free(msg);
 		xmlnode_free(response_node);
 		return FALSE;
 	}
@@ -393,10 +374,14 @@
 			purple_connection_error_reason(gc,
 					PURPLE_CONNECTION_ERROR_OTHER_ERROR,
 					_("AOL does not allow your screen name to authenticate here"));
-		} else
+		} else {
+			char *msg;
+			msg = g_strdup_printf(_("Received unexpected response from %s"),
+					URL_CLIENT_LOGIN);
 			purple_connection_error_reason(gc,
-					PURPLE_CONNECTION_ERROR_OTHER_ERROR,
-					_("Received unexpected response from " URL_CLIENT_LOGIN));
+					PURPLE_CONNECTION_ERROR_OTHER_ERROR, msg);
+			g_free(msg);
+		}
 
 		xmlnode_free(response_node);
 		return FALSE;
@@ -407,11 +392,14 @@
 	if (data_node == NULL || secret_node == NULL ||
 		token_node == NULL || tokena_node == NULL)
 	{
+		char *msg;
 		purple_debug_error("oscar", "clientLogin response was missing "
 				"something: %s\n", response);
+		msg = g_strdup_printf(_("Received unexpected response from %s"),
+				URL_CLIENT_LOGIN);
 		purple_connection_error_reason(gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Received unexpected response from " URL_CLIENT_LOGIN));
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
+		g_free(msg);
 		xmlnode_free(response_node);
 		return FALSE;
 	}
@@ -422,11 +410,14 @@
 	tmp = xmlnode_get_data_unescaped(hosttime_node);
 	if (*token == NULL || **token == '\0' || *secret == NULL || **secret == '\0' || tmp == NULL || *tmp == '\0')
 	{
+		char *msg;
 		purple_debug_error("oscar", "clientLogin response was missing "
 				"something: %s\n", response);
+		msg = g_strdup_printf(_("Received unexpected response from %s"),
+				URL_CLIENT_LOGIN);
 		purple_connection_error_reason(gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Received unexpected response from " URL_CLIENT_LOGIN));
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
+		g_free(msg);
 		g_free(*token);
 		g_free(*secret);
 		g_free(tmp);
@@ -458,8 +449,8 @@
 
 	if (error_message != NULL || len == 0) {
 		gchar *tmp;
-		tmp = g_strdup_printf(_("Error requesting " URL_CLIENT_LOGIN
-				": %s"), error_message);
+		tmp = g_strdup_printf(_("Error requesting %s: %s"),
+				URL_CLIENT_LOGIN, error_message);
 		purple_connection_error_reason(gc,
 				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
@@ -518,8 +509,8 @@
 	body = g_string_new("");
 	g_string_append_printf(body, "devId=%s", get_client_key(od));
 	g_string_append_printf(body, "&f=xml");
-	g_string_append_printf(body, "&pwd=%s", oscar_auth_url_encode(password));
-	g_string_append_printf(body, "&s=%s", oscar_auth_url_encode(username));
+	g_string_append_printf(body, "&pwd=%s", purple_url_encode(password));
+	g_string_append_printf(body, "&s=%s", purple_url_encode(username));
 	g_free(password);
 
 	/* Construct an HTTP POST request */
--- a/libpurple/protocols/oscar/family_auth.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/oscar/family_auth.c	Wed Sep 16 15:36:24 2009 +0000
@@ -277,7 +277,7 @@
 	 * If set, old-fashioned buddy lists will not work. You will need
 	 * to use SSI.
 	 */
-	aim_tlvlist_add_8(&tlvlist, 0x004a, (allow_multiple_logins ? 0x01 : 0x02));
+	aim_tlvlist_add_8(&tlvlist, 0x004a, (allow_multiple_logins ? 0x01 : 0x03));
 
 	aim_tlvlist_write(&frame->data, &tlvlist);
 
--- a/libpurple/protocols/oscar/family_buddy.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/oscar/family_buddy.c	Wed Sep 16 15:36:24 2009 +0000
@@ -221,9 +221,6 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, &userinfo);
 
-	if (snac->subtype == SNAC_SUBTYPE_BUDDY_ONCOMING && userinfo.flags & AIM_FLAG_AWAY)
-		aim_locate_autofetch_away_message(od, userinfo.bn);
-
 	aim_info_free(&userinfo);
 
 	return ret;
--- a/libpurple/protocols/oscar/family_icbm.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/oscar/family_icbm.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1466,7 +1466,7 @@
 	/* Should this be ASCII -> UNICODE -> Custom */
 	static const guint16 charsetpri[] = {
 		AIM_CHARSET_ASCII, /* ASCII first */
-		AIM_CHARSET_CUSTOM, /* then ISO-8859-1 */
+		AIM_CHARSET_LATIN_1, /* then ISO-8859-1 */
 		AIM_CHARSET_UNICODE, /* UNICODE as last resort */
 	};
 	static const int charsetpricount = 3;
@@ -2714,7 +2714,7 @@
  * and Purple 0.60 and newer.
  *
  */
-int aim_im_sendmtn(OscarData *od, guint16 type1, const char *bn, guint16 type2)
+int aim_im_sendmtn(OscarData *od, guint16 channel, const char *bn, guint16 event)
 {
 	FlapConnection *conn;
 	ByteStream bs;
@@ -2730,19 +2730,14 @@
 
 	snacid = aim_cachesnac(od, SNAC_FAMILY_ICBM, 0x0014, 0x0000, NULL, 0);
 
-	/*
-	 * 8 days of light
-	 * Er, that is to say, 8 bytes of 0's
-	 */
-	byte_stream_put16(&bs, 0x0000);
-	byte_stream_put16(&bs, 0x0000);
-	byte_stream_put16(&bs, 0x0000);
-	byte_stream_put16(&bs, 0x0000);
+	/* ICBM cookie */
+	byte_stream_put32(&bs, 0x00000000);
+	byte_stream_put32(&bs, 0x00000000);
 
 	/*
-	 * Type 1 (should be 0x0001 for mtn)
+	 * Channel (should be 0x0001 for mtn)
 	 */
-	byte_stream_put16(&bs, type1);
+	byte_stream_put16(&bs, channel);
 
 	/*
 	 * Dest buddy name
@@ -2751,9 +2746,9 @@
 	byte_stream_putstr(&bs, bn);
 
 	/*
-	 * Type 2 (should be 0x0000, 0x0001, or 0x0002 for mtn)
+	 * Event (should be 0x0000, 0x0001, or 0x0002 for mtn)
 	 */
-	byte_stream_put16(&bs, type2);
+	byte_stream_put16(&bs, event);
 
 	flap_connection_send_snac(od, conn, SNAC_FAMILY_ICBM, 0x0014, 0x0000, snacid, &bs);
 
@@ -2775,16 +2770,16 @@
 	aim_rxcallback_t userfunc;
 	char *bn;
 	guint8 bnlen;
-	guint16 type1, type2;
-
-	byte_stream_advance(bs, 8); /* Unknown - All 0's */
-	type1 = byte_stream_get16(bs);
+	guint16 channel, event;
+
+	byte_stream_advance(bs, 8); /* ICBM cookie */
+	channel = byte_stream_get16(bs);
 	bnlen = byte_stream_get8(bs);
 	bn = byte_stream_getstr(bs, bnlen);
-	type2 = byte_stream_get16(bs);
+	event = byte_stream_get16(bs);
 
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
-		ret = userfunc(od, conn, frame, type1, bn, type2);
+		ret = userfunc(od, conn, frame, channel, bn, event);
 
 	g_free(bn);
 
--- a/libpurple/protocols/oscar/family_locate.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/oscar/family_locate.c	Wed Sep 16 15:36:24 2009 +0000
@@ -250,8 +250,6 @@
 aim_locate_adduserinfo(OscarData *od, aim_userinfo_t *userinfo)
 {
 	aim_userinfo_t *cur;
-	FlapConnection *conn;
-	aim_rxcallback_t userfunc;
 
 	cur = aim_locate_finduserinfo(od, userinfo->bn);
 
@@ -353,73 +351,6 @@
 		}
 		cur->away_len = 0;
 	}
-
-	/*
-	 * This callback can be used by a client if they want to know whenever
-	 * info for a buddy is updated.  For example, if a client shows away
-	 * messages in its buddy list, then it would need to know if a user's
-	 * away message changes.
-	 */
-	conn = flap_connection_findbygroup(od, SNAC_FAMILY_LOCATE);
-	if ((userfunc = aim_callhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_GOTINFOBLOCK)))
-		userfunc(od, conn, NULL, cur);
-}
-
-/**
- * Remove this buddy name from our queue.  If this info was requested
- * by our info request queue, then pop the next element off of the queue.
- *
- * @param od The aim session.
- * @param bn Buddy name of the info we just received.
- * @return True if the request was explicit (client requested the info),
- *         false if the request was implicit (libfaim request the info).
- */
-static int
-aim_locate_gotuserinfo(OscarData *od, FlapConnection *conn, const char *bn)
-{
-	struct userinfo_node *cur, *del;
-	int was_explicit = TRUE;
-
-	while ((od->locate.requested != NULL) && (oscar_util_name_compare(bn, od->locate.requested->bn) == 0)) {
-		del = od->locate.requested;
-		od->locate.requested = del->next;
-		was_explicit = FALSE;
-		g_free(del->bn);
-		g_free(del);
-	}
-
-	cur = od->locate.requested;
-	while ((cur != NULL) && (cur->next != NULL)) {
-		if (oscar_util_name_compare(bn, cur->next->bn) == 0) {
-			del = cur->next;
-			cur->next = del->next;
-			was_explicit = FALSE;
-			g_free(del->bn);
-			g_free(del);
-		} else
-			cur = cur->next;
-	}
-
-	return was_explicit;
-}
-
-void
-aim_locate_autofetch_away_message(OscarData *od, const char *bn)
-{
-	struct userinfo_node *cur;
-
-	/* Make sure we haven't already made an info request for this buddy */
-	for (cur = od->locate.requested; cur != NULL; cur = cur->next)
-		if (oscar_util_name_compare(bn, cur->bn) == 0)
-			return;
-
-	/* Add a new node to our request queue */
-	cur = (struct userinfo_node *)g_malloc(sizeof(struct userinfo_node));
-	cur->bn = g_strdup(bn);
-	cur->next = od->locate.requested;
-	od->locate.requested = cur;
-
-	aim_locate_getinfoshort(od, cur->bn, 0x00000002);
 }
 
 aim_userinfo_t *aim_locate_finduserinfo(OscarData *od, const char *bn) {
@@ -745,6 +676,13 @@
 			outinfo->sessionlen = byte_stream_get32(bs);
 			outinfo->present |= AIM_USERINFO_PRESENT_SESSIONLEN;
 
+		} else if (type == 0x0014) {
+			/*
+			 * My instance number.
+			 */
+			guint8 instance_number;
+			instance_number = byte_stream_get8(bs);
+
 		} else if (type == 0x0019) {
 			/*
 			 * OSCAR short capability information.  A shortened
@@ -866,10 +804,32 @@
 
 		} else if (type == 0x001f) {
 			/*
+			 * Upper bytes of user flags.  Can be any size
+			 *
 			 * Seen on a buddy using DeadAIM.  Data was 4 bytes:
 			 * 0x00 00 00 10
 			 */
 
+		} else if (type == 0x0023) {
+			/*
+			 * Last Buddy Feed update time, in seconds since the epoch.
+			 */
+
+		} else if (type == 0x0026) {
+			/*
+			 * Time that the profile was set, in seconds since the epoch.
+			 */
+
+		} else if (type == 0x0027) {
+			/*
+			 * Time that the away message was set, in seconds since the epoch.
+			 */
+
+		} else if (type == 0x002a) {
+			/*
+			 * Country code based on GeoIP data.
+			 */
+
 		} else {
 
 			/*
@@ -956,7 +916,6 @@
 	aim_snac_t *snac2;
 	guint16 reason;
 	char *bn;
-	int was_explicit;
 
 	if (!(snac2 = aim_remsnac(od, snac->id))) {
 		purple_debug_misc("oscar", "locate error: received response from unknown request!\n");
@@ -978,15 +937,9 @@
 
 	reason = byte_stream_get16(bs);
 
-	/*
-	 * Remove this buddy name from our queue.  If the client requested
-	 * this buddy's info explicitly, then notify them that we do not have
-	 * info for this buddy.
-	 */
-	was_explicit = aim_locate_gotuserinfo(od, conn, bn);
-	if (was_explicit == TRUE)
-		if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
-			ret = userfunc(od, conn, frame, reason, bn);
+	/* Notify the user that we do not have info for this buddy */
+	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
+		ret = userfunc(od, conn, frame, reason, bn);
 
 	if (snac2)
 		g_free(snac2->data);
@@ -1202,7 +1155,6 @@
 	aim_userinfo_t *userinfo, *userinfo2;
 	GSList *tlvlist;
 	aim_tlv_t *tlv = NULL;
-	int was_explicit;
 
 	userinfo = (aim_userinfo_t *)g_malloc(sizeof(aim_userinfo_t));
 	aim_info_extract(od, bs, userinfo);
@@ -1238,18 +1190,9 @@
 	aim_info_free(userinfo);
 	g_free(userinfo);
 
-	/*
-	 * Remove this buddy name from our queue.  If the client requested
-	 * this buddy's info explicitly, then notify them that we have info
-	 * for this buddy.
-	 */
-	if (userinfo2 != NULL)
-	{
-		was_explicit = aim_locate_gotuserinfo(od, conn, userinfo2->bn);
-		if (was_explicit == TRUE)
-			if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
-				ret = userfunc(od, conn, frame, userinfo2);
-	}
+	/* Show the info to the user */
+	if (userinfo2 != NULL && ((userfunc = aim_callhandler(od, snac->family, snac->subtype))))
+		ret = userfunc(od, conn, frame, userinfo2);
 
 	return ret;
 }
--- a/libpurple/protocols/oscar/oscar.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Wed Sep 16 15:36:24 2009 +0000
@@ -160,7 +160,6 @@
 static int purple_parse_misses     (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_parse_clientauto (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_parse_userinfo   (OscarData *, FlapConnection *, FlapFrame *, ...);
-static int purple_got_infoblock    (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_parse_motd       (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_chatnav_info     (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_conv_chat_join        (OscarData *, FlapConnection *, FlapFrame *, ...);
@@ -242,7 +241,7 @@
 	{
 		if ((unsigned char)utf8[i] > 0x7f) {
 			/* not ASCII! */
-			charset = AIM_CHARSET_CUSTOM;
+			charset = AIM_CHARSET_LATIN_1;
 			break;
 		}
 		i++;
@@ -429,7 +428,7 @@
 	if (charset == AIM_CHARSET_UNICODE) {
 		charsetstr1 = "UTF-16BE";
 		charsetstr2 = "UTF-8";
-	} else if (charset == AIM_CHARSET_CUSTOM) {
+	} else if (charset == AIM_CHARSET_LATIN_1) {
 		if ((sourcebn != NULL) && oscar_util_valid_name_icq(sourcebn))
 			charsetstr1 = purple_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING);
 		else
@@ -540,7 +539,7 @@
 	 */
 	*msg = g_convert(from, -1, charsetstr, "UTF-8", NULL, &msglen, &err);
 	if (*msg != NULL) {
-		*charset = AIM_CHARSET_CUSTOM;
+		*charset = AIM_CHARSET_LATIN_1;
 		*charsubset = 0x0000;
 		*msglen_int = msglen;
 		return;
@@ -812,37 +811,43 @@
 
 	od = purple_connection_get_protocol_data(gc);
 
-	if (userinfo == NULL)
-		userinfo = aim_locate_finduserinfo(od, purple_buddy_get_name(b));
-
-	if ((user_info == NULL) || ((b == NULL) && (userinfo == NULL)))
+	if (b == NULL && userinfo == NULL)
 		return;
 
 	if (b == NULL)
 		b = purple_find_buddy(purple_connection_get_account(gc), userinfo->bn);
+	else
+		userinfo = aim_locate_finduserinfo(od, purple_buddy_get_name(b));
 
 	if (b) {
 		presence = purple_buddy_get_presence(b);
 		status = purple_presence_get_active_status(presence);
-
-		message = g_strdup(purple_status_get_attr_string(status, "message"));
-		itmsurl = g_strdup(purple_status_get_attr_string(status, "itmsurl"));
-
-	} else {
-		/* This is an OSCAR contact for whom we don't have a PurpleBuddy but do have information. */
-		if ((userinfo->flags & AIM_FLAG_AWAY)) {
-			/* Away message? */
-			if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) {
-				tmp = oscar_encoding_extract(userinfo->away_encoding);
-				message = oscar_encoding_to_utf8(account, tmp, userinfo->away,
-												   userinfo->away_len);
-				g_free(tmp);
-			}
+	}
+
+	/* If we have both b and userinfo we favor userinfo, because if we're
+	   viewing someone's profile then we want the HTML away message, and
+	   the "message" attribute of the status contains only the plaintext
+	   message. */
+	if (userinfo) {
+		if ((userinfo->flags & AIM_FLAG_AWAY)
+				&& userinfo->away_len > 0
+				&& userinfo->away != NULL
+				&& userinfo->away_encoding != NULL)
+		{
+			/* Away message */
+			tmp = oscar_encoding_extract(userinfo->away_encoding);
+			message = oscar_encoding_to_utf8(account,
+					tmp, userinfo->away, userinfo->away_len);
+			g_free(tmp);
 		} else {
-			/* Available message? */
+			/*
+			 * Available message or non-HTML away message (because that's
+			 * all we have right now.
+			 */
 			if ((userinfo->status != NULL) && userinfo->status[0] != '\0') {
-				message = oscar_encoding_to_utf8(account, userinfo->status_encoding,
-											 userinfo->status, userinfo->status_len);
+				message = oscar_encoding_to_utf8(account,
+						userinfo->status_encoding, userinfo->status,
+						userinfo->status_len);
 			}
 #if defined (_WIN32) || defined (__APPLE__)
 			if (userinfo->itmsurl && (userinfo->itmsurl[0] != '\0'))
@@ -850,6 +855,9 @@
 												 userinfo->itmsurl, userinfo->itmsurl_len);
 #endif
 		}
+	} else {
+		message = g_strdup(purple_status_get_attr_string(status, "message"));
+		itmsurl = g_strdup(purple_status_get_attr_string(status, "itmsurl"));
 	}
 
 	is_away = ((status && !purple_status_is_available(status)) ||
@@ -916,7 +924,6 @@
 			g_free(message);
 			message = g_strdup(_("Offline"));
 		}
-
 	}
 
 	purple_notify_user_info_add_pair(user_info, _("Status"), message);
@@ -1478,7 +1485,6 @@
 	oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_RIGHTSINFO, purple_parse_locaterights, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_USERINFO, purple_parse_userinfo, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_ERROR, purple_parse_locerr, 0);
-	oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_GOTINFOBLOCK, purple_got_infoblock, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x0001, purple_parse_genericerr, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x000f, purple_selfinfo, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x001f, purple_memrequest, 0);
@@ -2139,6 +2145,23 @@
 	g_return_val_if_fail(info != NULL, 1);
 	g_return_val_if_fail(info->bn != NULL, 1);
 
+	/*
+	 * If this is an AIM buddy and their name has formatting, set their
+	 * server alias.
+	 */
+	if (!oscar_util_valid_name_icq(info->bn)) {
+		gboolean bn_has_formatting = FALSE;
+		char *c;
+		for (c = info->bn; *c != '\0'; c++) {
+			if (!islower(*c)) {
+				bn_has_formatting = TRUE;
+				break;
+			}
+		}
+		serv_got_alias(gc, info->bn,
+				bn_has_formatting ? info->bn : NULL);
+	}
+
 	if (info->present & AIM_USERINFO_PRESENT_FLAGS) {
 		if (info->flags & AIM_FLAG_AWAY)
 			buddy_is_away = TRUE;
@@ -2388,6 +2411,21 @@
 	if (purple_markup_find_tag("body", tmp, &start, &end, &attribs))
 	{
 		const char *ichattextcolor, *ichatballooncolor;
+		const char *start2, *end2;
+		GData *unused;
+
+		/*
+		 * Find the ending </body> so we can strip off the outer <html/>
+		 * and <body/>
+		 */
+		if (purple_markup_find_tag("/body", end + 1, &start2, &end2, &unused))
+		{
+			gchar *tmp2;
+			tmp2 = g_strndup(end + 1, (start2 - 1) - (end + 1) + 1);
+			g_free(tmp);
+			tmp = tmp2;
+			g_datalist_clear(&unused);
+		}
 
 		ichattextcolor = g_datalist_get_data(&attribs, "ichattextcolor");
 		if (ichattextcolor != NULL)
@@ -2769,7 +2807,7 @@
 				gchar *reason = NULL;
 
 				if (msg2[5] != NULL)
-					reason = purple_plugin_oscar_decode_im_part(account, bn, AIM_CHARSET_CUSTOM, 0x0000, msg2[5], strlen(msg2[5]));
+					reason = purple_plugin_oscar_decode_im_part(account, bn, AIM_CHARSET_LATIN_1, 0x0000, msg2[5], strlen(msg2[5]));
 
 				purple_debug_info("oscar",
 						   "Received an authorization request from UIN %u\n",
@@ -3198,16 +3236,16 @@
 static int purple_parse_mtn(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) {
 	PurpleConnection *gc = od->gc;
 	va_list ap;
-	guint16 type1, type2;
+	guint16 channel, event;
 	char *bn;
 
 	va_start(ap, fr);
-	type1 = (guint16) va_arg(ap, unsigned int);
+	channel = (guint16) va_arg(ap, unsigned int);
 	bn = va_arg(ap, char *);
-	type2 = (guint16) va_arg(ap, unsigned int);
+	event = (guint16) va_arg(ap, unsigned int);
 	va_end(ap);
 
-	switch (type2) {
+	switch (event) {
 		case 0x0000: { /* Text has been cleared */
 			serv_got_typing_stopped(gc, bn);
 		} break;
@@ -3220,12 +3258,14 @@
 			serv_got_typing(gc, bn, 0, PURPLE_TYPING);
 		} break;
 
+		case 0x000f: { /* Closed IM window */
+			serv_got_typing_stopped(gc, bn);
+		} break;
+
 		default: {
-			/*
-			 * It looks like iChat sometimes sends typing notification
-			 * with type1=0x0001 and type2=0x000f.  Not sure why.
-			 */
-			purple_debug_info("oscar", "Received unknown typing notification message from %s.  Type1 is 0x%04x and type2 is 0x%04hx.\n", bn, type1, type2);
+			purple_debug_info("oscar", "Received unknown typing "
+					"notification message from %s.  Channel is 0x%04x "
+					"and event is 0x%04hx.\n", bn, channel, event);
 		} break;
 	}
 
@@ -3287,7 +3327,7 @@
 	oscar_user_info_append_extra_info(gc, user_info, NULL, userinfo);
 
 	if ((userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) && !oscar_util_valid_name_sms(userinfo->bn)) {
-		/* An SMS contact is always online; its Online Since valid is not useful */
+		/* An SMS contact is always online; its Online Since value is not useful */
 		time_t t = userinfo->onlinesince;
 		oscar_user_info_add_pair(user_info, _("Online Since"), purple_date_format_full(localtime(&t)));
 	}
@@ -3330,55 +3370,6 @@
 	return 1;
 }
 
-static int purple_got_infoblock(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
-{
-	PurpleConnection *gc = od->gc;
-	PurpleAccount *account = purple_connection_get_account(gc);
-	PurpleBuddy *b;
-	PurplePresence *presence;
-	PurpleStatus *status;
-	gchar *message = NULL;
-
-	va_list ap;
-	aim_userinfo_t *userinfo;
-
-	va_start(ap, fr);
-	userinfo = va_arg(ap, aim_userinfo_t *);
-	va_end(ap);
-
-	b = purple_find_buddy(account, userinfo->bn);
-	if (b == NULL)
-		return 1;
-
-	if (!oscar_util_valid_name_icq(userinfo->bn))
-	{
-		if (strcmp(purple_buddy_get_name(b), userinfo->bn) != 0)
-			serv_got_alias(gc, purple_buddy_get_name(b), userinfo->bn);
-		else
-			serv_got_alias(gc, purple_buddy_get_name(b), NULL);
-	}
-
-	presence = purple_buddy_get_presence(b);
-	status = purple_presence_get_active_status(presence);
-
-	if (purple_status_is_online(status) && !purple_status_is_available(status) &&
-			userinfo->flags & AIM_FLAG_AWAY && userinfo->away_len > 0 &&
-			userinfo->away != NULL && userinfo->away_encoding != NULL)
-	{
-		gchar *charset = oscar_encoding_extract(userinfo->away_encoding);
-		message = oscar_encoding_to_utf8(account, charset,
-		                                 userinfo->away,
-		                                 userinfo->away_len);
-		g_free(charset);
-		purple_prpl_got_user_status(account, userinfo->bn,
-				purple_status_get_id(status),
-				"message", message, NULL);
-		g_free(message);
-	}
-
-	return 1;
-}
-
 static int purple_parse_motd(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
 {
 	char *msg;
@@ -4704,7 +4695,7 @@
 	if (charset == AIM_CHARSET_UNICODE) {
 		encoded = g_convert(str, -1, "UTF-16BE", "UTF-8", NULL, ret_len, NULL);
 		*encoding = "unicode-2-0";
-	} else if (charset == AIM_CHARSET_CUSTOM) {
+	} else if (charset == AIM_CHARSET_LATIN_1) {
 		encoded = g_convert(str, -1, "ISO-8859-1", "UTF-8", NULL, ret_len, NULL);
 		*encoding = "iso-8859-1";
 	} else {
@@ -5607,7 +5598,7 @@
 	buddy = purple_find_buddy(account, bn);
 
 	if (msg != NULL)
-		reason = purple_plugin_oscar_decode_im_part(account, bn, AIM_CHARSET_CUSTOM, 0x0000, msg, strlen(msg));
+		reason = purple_plugin_oscar_decode_im_part(account, bn, AIM_CHARSET_LATIN_1, 0x0000, msg, strlen(msg));
 
 	data = g_new(struct name_data, 1);
 	data->gc = gc;
@@ -5844,7 +5835,7 @@
 		charsetstr = "us-ascii";
 	else if (charset == AIM_CHARSET_UNICODE)
 		charsetstr = "unicode-2-0";
-	else if (charset == AIM_CHARSET_CUSTOM)
+	else if (charset == AIM_CHARSET_LATIN_1)
 		charsetstr = "iso-8859-1";
 	aim_chat_send_im(od, c->conn, 0, buf2, len, charsetstr, "en");
 	g_free(buf2);
@@ -6335,6 +6326,44 @@
 }
 
 static void
+oscar_close_directim(gpointer object, gpointer ignored)
+{
+	PurpleBlistNode *node;
+	PurpleBuddy *buddy;
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	PurpleConversation *conv;
+	OscarData *od;
+	PeerConnection *conn;
+	const char *name;
+
+	node = object;
+
+	g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
+
+	buddy = (PurpleBuddy*)node;
+	name = purple_buddy_get_name(buddy);
+	account = purple_buddy_get_account(buddy);
+	gc = purple_account_get_connection(account);
+	od = gc->proto_data;
+	conn = peer_connection_find_by_type(od, name, OSCAR_CAPABILITY_DIRECTIM);
+
+	if (conn != NULL)
+	{
+		if (!conn->ready)
+			aim_im_sendch2_cancel(conn);
+
+		peer_connection_destroy(conn, OSCAR_DISCONNECT_LOCAL_CLOSED, NULL);
+
+		/* OSCAR_DISCONNECT_LOCAL_CLOSED doesn't write anything to the convo
+		 * window. Let the user know that we canceled the Direct IM. */
+		conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, name);
+		purple_conversation_write(conv, NULL, _("You closed the connection."),
+		                          PURPLE_MESSAGE_SYSTEM, time(NULL));
+	}
+}
+
+static void
 oscar_get_aim_info_cb(PurpleBlistNode *node, gpointer ignore)
 {
 	PurpleBuddy *buddy;
@@ -6397,11 +6426,23 @@
 		oscar_util_name_compare(purple_account_get_username(account), bname) &&
 		PURPLE_BUDDY_IS_ONLINE(buddy))
 	{
+		PeerConnection *conn;
+		conn = peer_connection_find_by_type(od, bname, OSCAR_CAPABILITY_DIRECTIM);
+
 		if (userinfo->capabilities & OSCAR_CAPABILITY_DIRECTIM)
 		{
-			act = purple_menu_action_new(_("Direct IM"),
-			                           PURPLE_CALLBACK(oscar_ask_directim),
-			                           NULL, NULL);
+			if (conn)
+			{
+				act = purple_menu_action_new(_("End Direct IM Session"),
+				                          PURPLE_CALLBACK(oscar_close_directim),
+				                          NULL, NULL);
+			}
+			else
+			{
+				act = purple_menu_action_new(_("Direct IM"),
+				                          PURPLE_CALLBACK(oscar_ask_directim),
+				                          NULL, NULL);
+			}
 			menu = g_list_prepend(menu, act);
 		}
 #if 0
--- a/libpurple/protocols/oscar/oscar.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.h	Wed Sep 16 15:36:24 2009 +0000
@@ -533,7 +533,6 @@
 
 	struct {
 		struct aim_userinfo_s *userinfo;
-		struct userinfo_node *requested;
 	} locate;
 
 	/* Server-stored information (ssi) */
@@ -809,9 +808,9 @@
 #define AIM_IMFLAGS_OFFLINE				0x0800 /* send to offline user */
 #define AIM_IMFLAGS_TYPINGNOT			0x1000 /* typing notification */
 
-#define AIM_CHARSET_ASCII		0x0000
-#define AIM_CHARSET_UNICODE	0x0002 /* UTF-16BE */
-#define AIM_CHARSET_CUSTOM	0x0003
+#define AIM_CHARSET_ASCII   0x0000 /* ISO 646 */
+#define AIM_CHARSET_UNICODE 0x0002 /* ISO 10646 (UTF-16/UCS-2BE) */
+#define AIM_CHARSET_LATIN_1 0x0003 /* ISO 8859-1 */
 
 /*
  * Multipart message structures.
@@ -1007,7 +1006,7 @@
 /* 0x0008 */ int aim_im_warn(OscarData *od, FlapConnection *conn, const char *destbn, guint32 flags);
 /* 0x000b */ int aim_im_denytransfer(OscarData *od, const char *bn, const guchar *cookie, guint16 code);
 /* 0x0010 */ int aim_im_reqofflinemsgs(OscarData *od);
-/* 0x0014 */ int aim_im_sendmtn(OscarData *od, guint16 type1, const char *bn, guint16 type2);
+/* 0x0014 */ int aim_im_sendmtn(OscarData *od, guint16 channel, const char *bn, guint16 event);
 void aim_icbm_makecookie(guchar* cookie);
 gchar *oscar_encoding_extract(const char *encoding);
 gchar *oscar_encoding_to_utf8(PurpleAccount *account, const char *encoding, const char *text, int textlen);
@@ -1027,11 +1026,12 @@
 #define AIM_FLAG_ICQ             0x0040
 #define AIM_FLAG_WIRELESS        0x0080
 #define AIM_FLAG_UNKNOWN100      0x0100
-#define AIM_FLAG_UNKNOWN200      0x0200
+#define AIM_FLAG_IMFORWARDING    0x0200
 #define AIM_FLAG_ACTIVEBUDDY     0x0400
 #define AIM_FLAG_UNKNOWN800      0x0800
-#define AIM_FLAG_ABINTERNAL      0x1000
-#define AIM_FLAG_ALLUSERS        0x001f
+#define AIM_FLAG_ONEWAYWIRELESS  0x1000
+#define AIM_FLAG_NOKNOCKKNOCK    0x00040000
+#define AIM_FLAG_FORWARD_MOBILE  0x00080000
 
 #define AIM_USERINFO_PRESENT_FLAGS        0x00000001
 #define AIM_USERINFO_PRESENT_MEMBERSINCE  0x00000002
@@ -1133,7 +1133,6 @@
 /* 0x000f */ int aim_locate_setinterests(OscarData *od, const char *interest1, const char *interest2, const char *interest3, const char *interest4, const char *interest5, guint16 privacy);
 /* 0x0015 */ int aim_locate_getinfoshort(OscarData *od, const char *bn, guint32 flags);
 
-void aim_locate_autofetch_away_message(OscarData *od, const char *bn);
 guint32 aim_locate_getcaps(OscarData *od, ByteStream *bs, int len);
 guint32 aim_locate_getcaps_short(OscarData *od, ByteStream *bs, int len);
 void aim_info_free(aim_userinfo_t *);
--- a/libpurple/protocols/oscar/snactypes.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/oscar/snactypes.h	Wed Sep 16 15:36:24 2009 +0000
@@ -96,7 +96,6 @@
 #define SNAC_SUBTYPE_LOCATE_USERINFO 0x0006
 #define SNAC_SUBTYPE_LOCATE_WATCHERSUBREQ 0x0007
 #define SNAC_SUBTYPE_LOCATE_WATCHERNOT 0x0008
-#define SNAC_SUBTYPE_LOCATE_GOTINFOBLOCK 0xfffd
 #define SNAC_SUBTYPE_LOCATE_DEFAULT 0xffff
 
 /*
--- a/libpurple/protocols/qq/buddy_list.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/buddy_list.c	Wed Sep 16 15:36:24 2009 +0000
@@ -215,7 +215,7 @@
 		if (qd->client_version >= 2007)	bytes += 4;
 
 		if (bs.uid == 0 || (bytes - bytes_start) != entry_len) {
-			purple_debug_error("QQ", "uid=0 or entry complete len(%d) != %d",
+			purple_debug_error("QQ", "uid=0 or entry complete len(%d) != %d\n",
 					(bytes - bytes_start), entry_len);
 			continue;
 		}	/* check if it is a valid entry */
@@ -281,7 +281,7 @@
 	qd = (qq_data *) gc->proto_data;
 
 	if (data_len <= 2) {
-		purple_debug_error("QQ", "empty buddies list");
+		purple_debug_error("QQ", "empty buddies list\n");
 		return -1;
 	}
 	/* qq_show_packet("QQ get buddies list", data, data_len); */
@@ -352,7 +352,7 @@
 
 	if(bytes > data_len) {
 		purple_debug_error("QQ",
-				"qq_process_get_buddies: Dangerous error! maybe protocol changed, notify developers!");
+				"qq_process_get_buddies: Dangerous error! maybe protocol changed, notify developers!\n");
 	}
 
 	purple_debug_info("QQ", "Received %d buddies, nextposition=%u\n",
@@ -397,7 +397,7 @@
 		/* 05: skip unknow 0x00 */
 		bytes += 1;
 		if (uid == 0 || (type != 0x1 && type != 0x4)) {
-			purple_debug_info("QQ", "Buddy entry, uid=%u, type=%d", uid, type);
+			purple_debug_info("QQ", "Buddy entry, uid=%u, type=%d\n", uid, type);
 			continue;
 		}
 		if(0x1 == type) { /* a buddy */
@@ -407,7 +407,7 @@
 		} else { /* a group */
 			rmd = qq_room_data_find(gc, uid);
 			if(rmd == NULL) {
-				purple_debug_info("QQ", "Unknow room id %u", uid);
+				purple_debug_info("QQ", "Unknown room id %u\n", uid);
 				qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, uid);
 			} else {
 				rmd->my_role = QQ_ROOM_ROLE_YES;
@@ -418,7 +418,7 @@
 
 	if(bytes > data_len) {
 		purple_debug_error("QQ",
-				"qq_process_get_buddies_and_rooms: Dangerous error! maybe protocol changed, notify developers!");
+				"qq_process_get_buddies_and_rooms: Dangerous error! maybe protocol changed, notify developers!\n");
 	}
 
 	purple_debug_info("QQ", "Received %d buddies and %d groups, nextposition=%u\n", i, j, (guint) position);
--- a/libpurple/protocols/qq/buddy_opt.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/buddy_opt.c	Wed Sep 16 15:36:24 2009 +0000
@@ -805,7 +805,7 @@
 	dest_uid = segments[0];
 	reply = segments[1];
 	if (strtoul(dest_uid, NULL, 10) != qd->uid) {	/* should not happen */
-		purple_debug_error("QQ", "Add buddy reply is to [%s], not me!", dest_uid);
+		purple_debug_error("QQ", "Add buddy reply is to [%s], not me!\n", dest_uid);
 		g_strfreev(segments);
 		return;
 	}
@@ -822,7 +822,7 @@
 		}
 		qq_request_get_buddies_online(gc, 0, 0);
 
-		purple_debug_info("QQ", "Successed adding into %u's buddy list", uid);
+		purple_debug_info("QQ", "Successed adding into %u's buddy list\n", uid);
 		g_strfreev(segments);
 		return;
 	}
@@ -868,7 +868,7 @@
 	g_return_if_fail(dest_uid == uid);
 
 	if (reply == 0x99) {
-		purple_debug_info("QQ", "Successed adding buddy %u\n", uid);
+		purple_debug_info("QQ", "Successfully added buddy %u\n", uid);
 		qq_buddy_find_or_new(gc, uid);
 
 		qq_request_buddy_info(gc, uid, 0, 0);
@@ -882,7 +882,7 @@
 	}
 
 	if (reply != 0) {
-		purple_debug_info("QQ", "Failed adding buddy %u, Unknow reply 0x%02X\n",
+		purple_debug_info("QQ", "Failed adding buddy %u, Unknown reply 0x%02X\n",
 			uid, reply);
 	}
 
--- a/libpurple/protocols/qq/file_trans.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/file_trans.c	Wed Sep 16 15:36:24 2009 +0000
@@ -325,7 +325,7 @@
 	}
 
 	if (bytes != bytes_expected) {
-		purple_debug_error("QQ", "qq_send_file_ctl_packet: Expected to get %d bytes, but get %d",
+		purple_debug_error("QQ", "qq_send_file_ctl_packet: Expected to get %d bytes, but get %d\n",
 				bytes_expected, bytes);
 		return;
 	}
@@ -334,7 +334,7 @@
 		raw_data, bytes,
 		"sending packet[%s]:", qq_get_file_cmd_desc(packet_type));
 
-	encrypted = g_newa(guint8, bytes + 16);
+	encrypted = g_newa(guint8, bytes + 17);
 	encrypted_len = qq_encrypt(encrypted, raw_data, bytes, info->file_session_key);
 	/*debug: try to decrypt it */
 
@@ -342,7 +342,7 @@
 	guint8 *buf;
 	int buflen;
 	hex_dump = hex_dump_to_str(encrypted, encrypted_len);
-	purple_debug_info("QQ", "encrypted packet: \n%s", hex_dump);
+	purple_debug_info("QQ", "encrypted packet: \n%s\n", hex_dump);
 	g_free(hex_dump);
 	buf = g_newa(guint8, MAX_PACKET_SIZE);
 	buflen = encrypted_len;
@@ -352,7 +352,7 @@
 			purple_debug_info("QQ", "checksum ok\n");
 
 		hex_dump = hex_dump_to_str(buf, buflen);
-		purple_debug_info("QQ", "decrypted packet: \n%s", hex_dump);
+		purple_debug_info("QQ", "decrypted packet: \n%s\n", hex_dump);
 		g_free(hex_dump);
 	 } else {
 		purple_debug_info("QQ", "decrypt fail\n");
@@ -820,6 +820,6 @@
 			_qq_process_recv_file_data(gc, data + bytes, len - bytes);
 			break;
 		default:
-			purple_debug_info("QQ", "unknown packet tag");
+			purple_debug_info("QQ", "unknown packet tag\n");
 	}
 }
--- a/libpurple/protocols/qq/group_im.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/group_im.c	Wed Sep 16 15:36:24 2009 +0000
@@ -185,7 +185,7 @@
 	}
 
 	if (NULL == conv) {
-		purple_debug_info("QQ", "Conversion of %u is not open, missing from %d:/n%s/v",
+		purple_debug_info("QQ", "Conversion of %u is not open, missing from %d:/n%s/v\n",
 				room_id, uid_from, msg);
 		return;
 	}
--- a/libpurple/protocols/qq/group_internal.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/group_internal.c	Wed Sep 16 15:36:24 2009 +0000
@@ -188,7 +188,7 @@
 	g_return_if_fail (gc != NULL && gc->proto_data != NULL);
 	qd = (qq_data *) gc->proto_data;
 
-	purple_debug_info("QQ", "Find and remove room data, id %u", id);
+	purple_debug_info("QQ", "Find and remove room data, id %u\n", id);
 	rmd = qq_room_data_find(gc, id);
 	g_return_if_fail (rmd != NULL);
 
@@ -196,7 +196,7 @@
 	qd->groups = g_list_remove(qd->groups, rmd);
 	room_data_free(rmd);
 
-	purple_debug_info("QQ", "Find and remove chat, ext_id %u", ext_id);
+	purple_debug_info("QQ", "Find and remove chat, ext_id %u\n", ext_id);
 	num_str = g_strdup_printf("%u", ext_id);
 	chat = purple_blist_find_chat(purple_connection_get_account(gc), num_str);
 	g_free(num_str);
--- a/libpurple/protocols/qq/qq_base.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/qq_base.c	Wed Sep 16 15:36:24 2009 +0000
@@ -245,10 +245,10 @@
 
 	g_return_if_fail(qd->ld.token != NULL && qd->ld.token_len > 0);
 
-	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 16);
-	memset(raw_data, 0, MAX_PACKET_SIZE - 16);
+	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 17);
+	memset(raw_data, 0, MAX_PACKET_SIZE - 17);
 
-	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 16 bytes more */
+	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 17 bytes more */
 
 	bytes = 0;
 	/* now generate the encrypted data
@@ -609,7 +609,7 @@
 	raw_data = g_newa(guint8, 128);
 	memset(raw_data, 0, 128);
 
-	encrypted = g_newa(guint8, 128 + 16);	/* 16 bytes more */
+	encrypted = g_newa(guint8, 128 + 17);	/* 17 bytes more */
 
 	bytes = 0;
 	if (qd->redirect == NULL) {
@@ -682,10 +682,10 @@
 
 	g_return_if_fail(qd->ld.token != NULL && qd->ld.token_len > 0);
 
-	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 16);
-	memset(raw_data, 0, MAX_PACKET_SIZE - 16);
+	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 17);
+	memset(raw_data, 0, MAX_PACKET_SIZE - 17);
 
-	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 16 bytes more */
+	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 17 bytes more */
 
 	bytes = 0;
 	bytes += qq_put8(raw_data + bytes, qd->ld.token_len);
@@ -721,10 +721,10 @@
 
 	g_return_if_fail(qd->ld.token != NULL && qd->ld.token_len > 0);
 
-	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 16);
-	memset(raw_data, 0, MAX_PACKET_SIZE - 16);
+	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 17);
+	memset(raw_data, 0, MAX_PACKET_SIZE - 17);
 
-	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 16 bytes more */
+	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 17 bytes more */
 
 	bytes = 0;
 	bytes += qq_put8(raw_data + bytes, qd->ld.token_len);
@@ -765,10 +765,10 @@
 	g_return_if_fail(qd->ld.token != NULL && qd->ld.token_len > 0);
 	g_return_if_fail(code != NULL && code_len > 0);
 
-	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 16);
-	memset(raw_data, 0, MAX_PACKET_SIZE - 16);
+	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 17);
+	memset(raw_data, 0, MAX_PACKET_SIZE - 17);
 
-	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 16 bytes more */
+	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 17 bytes more */
 
 	bytes = 0;
 	bytes += qq_put8(raw_data + bytes, qd->ld.token_len);
@@ -998,10 +998,10 @@
 
 	g_return_if_fail(qd->ld.token_ex != NULL && qd->ld.token_ex_len > 0);
 
-	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 16);
-	memset(raw_data, 0, MAX_PACKET_SIZE - 16);
+	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 17);
+	memset(raw_data, 0, MAX_PACKET_SIZE - 17);
 
-	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 16 bytes more */
+	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 17 bytes more */
 
 	/* Encrypted password and put in encrypted */
 	bytes = 0;
@@ -1166,10 +1166,10 @@
 
 	g_return_if_fail(qd->ld.token != NULL && qd->ld.token_len > 0);
 
-	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 16);
-	memset(raw_data, 0, MAX_PACKET_SIZE - 16);
+	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 17);
+	memset(raw_data, 0, MAX_PACKET_SIZE - 17);
 
-	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 16 bytes more */
+	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 17 bytes more */
 
 	/* Encrypted password and put in encrypted */
 	bytes = 0;
@@ -1342,10 +1342,10 @@
 
 	g_return_if_fail(qd->ld.token != NULL && qd->ld.token_len > 0);
 
-	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 16);
-	memset(raw_data, 0, MAX_PACKET_SIZE - 16);
+	raw_data = g_newa(guint8, MAX_PACKET_SIZE - 17);
+	memset(raw_data, 0, MAX_PACKET_SIZE - 17);
 
-	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 16 bytes more */
+	encrypted = g_newa(guint8, MAX_PACKET_SIZE);	/* 17 bytes more */
 
 	/* Encrypted password and put in encrypted */
 	bytes = 0;
--- a/libpurple/protocols/qq/qq_crypt.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/qq_crypt.c	Wed Sep 16 15:36:24 2009 +0000
@@ -19,7 +19,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  *
  *
  * QQ encryption algorithm
@@ -171,7 +171,12 @@
 	}
 }
 
-/* length of crypted buffer must be plain_len + 16*/
+/* length of crypted buffer must be plain_len + 17*/
+/*
+ * The above comment used to say "plain_len + 16", but based on the
+ * behavior of the function that is wrong.  If you give this function
+ * a plain string with len%8 = 7 then the returned length is len+17
+ */
 gint qq_encrypt(guint8* crypted, const guint8* const plain, const gint plain_len, const guint8* const key)
 {
 	guint8 *crypted_ptr = crypted;		/* current position of dest */
--- a/libpurple/protocols/qq/qq_crypt.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/qq_crypt.h	Wed Sep 16 15:36:24 2009 +0000
@@ -19,7 +19,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 
 #ifndef _QQ_CRYPT_H_
--- a/libpurple/protocols/qq/qq_network.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/qq_network.c	Wed Sep 16 15:36:24 2009 +0000
@@ -968,7 +968,7 @@
 		qd->conn_data = purple_proxy_connect_udp(gc, account, server, port, connect_cb, gc);
 	}
 	if ( qd->conn_data == NULL ) {
-		purple_debug_error("QQ", "Couldn't create socket");
+		purple_debug_error("QQ", "Couldn't create socket\n");
 		return FALSE;
 	}
 #else
@@ -978,7 +978,7 @@
 	if(qd->use_tcp) {
 		qd->conn_data = purple_proxy_connect(gc, account, server, port, connect_cb, gc);
 		if ( qd->conn_data == NULL ) {
-			purple_debug_error("QQ", "Unable to connect.");
+			purple_debug_error("QQ", "Unable to connect.\n");
 			return FALSE;
 		}
 		return TRUE;
@@ -987,7 +987,7 @@
 	purple_debug_info("QQ", "UDP Connect to %s:%d\n", server, port);
 	qd->udp_query_data = purple_dnsquery_a(server, port, udp_host_resolved, gc);
 	if ( qd->udp_query_data == NULL ) {
-		purple_debug_error("QQ", "Could not resolve hostname");
+		purple_debug_error("QQ", "Could not resolve hostname\n");
 		return FALSE;
 	}
 #endif
@@ -1146,8 +1146,8 @@
 	qd = (qq_data *)gc->proto_data;
 	g_return_val_if_fail(data != NULL && data_len > 0, -1);
 
-	/* at most 16 bytes more */
-	encrypted = g_newa(guint8, data_len + 16);
+	/* at most 17 bytes more */
+	encrypted = g_newa(guint8, data_len + 17);
 	encrypted_len = qq_encrypt(encrypted, data, data_len, qd->session_key);
 	if (encrypted_len < 16) {
 		purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] 0x%04X %s\n",
@@ -1223,8 +1223,8 @@
 		purple_debug_info("QQ", "<== [SRV-%05d] %s(0x%04X), datalen %d\n",
 				seq, qq_get_cmd_desc(cmd), cmd, data_len);
 #endif
-	/* at most 16 bytes more */
-	encrypted = g_newa(guint8, data_len + 16);
+	/* at most 17 bytes more */
+	encrypted = g_newa(guint8, data_len + 17);
 	encrypted_len = qq_encrypt(encrypted, data, data_len, qd->session_key);
 	if (encrypted_len < 16) {
 		purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] 0x%04X %s\n",
@@ -1270,8 +1270,8 @@
 	seq = qd->send_seq;
 
 	/* Encrypt to encrypted with session_key */
-	/* at most 16 bytes more */
-	encrypted = g_newa(guint8, buf_len + 16);
+	/* at most 17 bytes more */
+	encrypted = g_newa(guint8, buf_len + 17);
 	encrypted_len = qq_encrypt(encrypted, buf, buf_len, qd->session_key);
 	if (encrypted_len < 16) {
 		purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] %s (0x%02X)\n",
--- a/libpurple/protocols/qq/qq_process.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/qq_process.c	Wed Sep 16 15:36:24 2009 +0000
@@ -426,7 +426,7 @@
 	if (qd->is_show_notice) {
 		qq_got_message(gc, content);
 	} else {
-		purple_debug_info("QQ", "QQ Server notice from %s:\n%s", from, msg_utf8);
+		purple_debug_info("QQ", "QQ Server notice from %s:\n%s\n", from, msg_utf8);
 	}
 	g_free(msg_utf8);
 	g_free(title);
--- a/libpurple/protocols/qq/send_file.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/qq/send_file.c	Wed Sep 16 15:36:24 2009 +0000
@@ -390,7 +390,7 @@
 	info->local_real_ip = 0x7f000001;
 	*/
 	info->local_real_ip = g_ntohl(inet_addr(purple_network_get_my_ip(-1)));
-	purple_debug_info("QQ", "local real ip is %x", info->local_real_ip);
+	purple_debug_info("QQ", "local real ip is %x\n", info->local_real_ip);
 
 	for (i = 0; i < 2; i++) {
 		sockfd = socket(PF_INET, SOCK_DGRAM, 0);
@@ -558,7 +558,7 @@
 	guint8 *raw_data;
 	gint packet_len, bytes;
 
-	purple_debug_info("_qq_send_packet_file_reject", "start");
+	purple_debug_info("_qq_send_packet_file_reject", "start\n");
 	qd = (qq_data *) gc->proto_data;
 
 	packet_len = 64;
@@ -730,7 +730,7 @@
 	*/
 	filename = g_path_get_basename(purple_xfer_get_local_filename(qd->xfer));
 	msg = g_strdup_printf
-		(_("%d canceled the transfer of %s"),
+		(_("%d cancelled the transfer of %s"),
 		 sender_uid, filename);
 
 	purple_notify_warning (gc, _("File Send"), msg, NULL);
--- a/libpurple/protocols/simple/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/simple/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -13,7 +13,7 @@
 
 libsimple_la_LDFLAGS = -module -avoid-version
 
-if STATIC_MSN
+if STATIC_SIMPLE
 
 st = -DPURPLE_STATIC_PRPL
 noinst_LTLIBRARIES   = libsimple.la
--- a/libpurple/protocols/yahoo/libyahoo.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/yahoo/libyahoo.c	Wed Sep 16 15:36:24 2009 +0000
@@ -278,7 +278,7 @@
 	NULL,                                             /**< dependencies   */
 	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */
 	"prpl-yahoo",                                     /**< id             */
-	"Yahoo!",	                                      /**< name           */
+	"Yahoo",	                                      /**< name           */
 	DISPLAY_VERSION,                                  /**< version        */
 	                                                  /**  summary        */
 	N_("Yahoo! Protocol Plugin"),
@@ -321,13 +321,15 @@
 	option = purple_account_option_string_new(_("Chat room locale"), "room_list_locale", YAHOO_ROOMLIST_LOCALE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
+	option = purple_account_option_string_new(_("Encoding"), "local_charset", "UTF-8");
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
+
 	option = purple_account_option_bool_new(_("Ignore conference and chatroom invitations"), "ignore_invites", FALSE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
-	option = purple_account_option_string_new(_("Encoding"), "local_charset", "UTF-8");
+	option = purple_account_option_bool_new(_("Use account proxy for SSL connections"), "proxy_ssl", FALSE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
-
 #if 0
 	option = purple_account_option_string_new(_("Chat room list URL"), "room_list", YAHOO_ROOMLIST_URL);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
--- a/libpurple/protocols/yahoo/libyahoojp.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/yahoo/libyahoojp.c	Wed Sep 16 15:36:24 2009 +0000
@@ -174,7 +174,7 @@
 	NULL,                                             /**< dependencies   */
 	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */
 	"prpl-yahoojp",                                     /**< id             */
-	"Yahoo! JAPAN",	                                      /**< name           */
+	"Yahoo JAPAN",	                                      /**< name           */
 	DISPLAY_VERSION,                                  /**< version        */
 	                                                  /**  summary        */
 	N_("Yahoo! JAPAN Protocol Plugin"),
@@ -217,13 +217,15 @@
 	option = purple_account_option_string_new(_("Chat room locale"), "room_list_locale", YAHOOJP_ROOMLIST_LOCALE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
+	option = purple_account_option_string_new(_("Encoding"), "local_charset", "UTF-8");
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
+
 	option = purple_account_option_bool_new(_("Ignore conference and chatroom invitations"), "ignore_invites", FALSE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
-	option = purple_account_option_string_new(_("Encoding"), "local_charset", "UTF-8");
+	option = purple_account_option_bool_new(_("Use account proxy for SSL connections"), "proxy_ssl", FALSE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
-
 #if 0
 	option = purple_account_option_string_new(_("Chat room list URL"), "room_list", YAHOO_ROOMLIST_URL);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
--- a/libpurple/protocols/yahoo/libymsg.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/yahoo/libymsg.c	Wed Sep 16 15:36:24 2009 +0000
@@ -220,7 +220,12 @@
 			if (f->status == YAHOO_STATUS_IDLE) {
 				/* Idle may have already been set in a more precise way in case 137 */
 				if (f->idle == 0)
-					f->idle = time(NULL);
+				{
+					if(pkt->service == YAHOO_SERVICE_STATUS_15)
+						f->idle = -1;
+					else
+						f->idle = time(NULL);
+				}
 			} else
 				f->idle = 0;
 
@@ -253,15 +258,20 @@
 			if (f->away == 2) {
 				/* Idle may have already been set in a more precise way in case 137 */
 				if (f->idle == 0)
-					f->idle = time(NULL);
+				{
+					if(pkt->service == YAHOO_SERVICE_STATUS_15)
+						f->idle = -1;
+					else
+						f->idle = time(NULL);
+				}
 			}
 
 			break;
-		case 138: /* either we're not idle, or we are but won't say how long */
+		case 138: /* when value is 1, either we're not idle, or we are but won't say how long */
 			if (!f)
 				break;
 
-			if (f->idle)
+			if( (strtol(pair->value, NULL, 10) == 1) && (f->idle) )
 				f->idle = -1;
 			break;
 		case 137: /* usually idle time in seconds, sometimes login time */
@@ -1839,11 +1849,12 @@
 			PurpleAccount *account = purple_connection_get_account(gc);
 			char *url = NULL;
 			gboolean yahoojp = yahoo_is_japan(account);
+			gboolean proxy_ssl = purple_account_get_bool(account, "proxy_ssl", FALSE);
 
 			url = g_strdup_printf(yahoojp ? YAHOOJP_LOGIN_URL : YAHOO_LOGIN_URL, token);
-			url_data = purple_util_fetch_url_request_len_with_account(account, url,
-					TRUE, YAHOO_CLIENT_USERAGENT, TRUE, NULL, FALSE, -1,
-					yahoo_auth16_stage2, auth_data);
+			url_data = purple_util_fetch_url_request_len_with_account(
+					proxy_ssl ? account : NULL, url, TRUE, YAHOO_CLIENT_USERAGENT,
+					TRUE, NULL, FALSE, -1, yahoo_auth16_stage2, auth_data);
 			g_free(url);
 			g_free(token);
 		}
@@ -1852,12 +1863,14 @@
 
 static void yahoo_auth16_stage1(PurpleConnection *gc, const char *seed)
 {
+	PurpleAccount *account = purple_connection_get_account(gc);
 	PurpleUtilFetchUrlData *url_data = NULL;
 	struct yahoo_auth_data *auth_data = NULL;
 	char *url = NULL;
 	char *encoded_username;
 	char *encoded_password;
-	gboolean yahoojp;
+	gboolean yahoojp = yahoo_is_japan(account);
+	gboolean proxy_ssl = purple_account_get_bool(account, "proxy_ssl", FALSE);
 
 	purple_debug_info("yahoo", "Authentication: In yahoo_auth16_stage1\n");
 
@@ -1866,7 +1879,6 @@
 		return;
 	}
 
-	yahoojp = yahoo_is_japan(purple_connection_get_account(gc));
 	auth_data = g_new0(struct yahoo_auth_data, 1);
 	auth_data->gc = gc;
 	auth_data->seed = g_strdup(seed);
@@ -1879,7 +1891,7 @@
 	g_free(encoded_username);
 
 	url_data = purple_util_fetch_url_request_len_with_account(
-			purple_connection_get_account(gc), url, TRUE,
+			proxy_ssl ? account : NULL, url, TRUE,
 			YAHOO_CLIENT_USERAGENT, TRUE, NULL, FALSE, -1,
 			yahoo_auth16_stage1_cb, auth_data);
 
@@ -2013,11 +2025,11 @@
 				break;
 			}
 		case 2:
-			purple_debug_info("yahoo", "Server reported that %s is already in the ignore list.",
+			purple_debug_info("yahoo", "Server reported that %s is already in the ignore list.\n",
 							  who);
 			break;
 		case 3:
-			purple_debug_info("yahoo", "Server reported that %s is not in the ignore list; could not delete",
+			purple_debug_info("yahoo", "Server reported that %s is not in the ignore list; could not delete\n",
 							  who);
 		case 0:
 		default:
@@ -2077,21 +2089,24 @@
 		if (!purple_account_get_remember_password(account))
 			purple_account_set_password(account, NULL);
 
-		msg = g_strdup(_("Incorrect password"));
+		msg = g_strdup(_("Invalid username or password"));
 		reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
 		break;
 	case 14:
-		msg = g_strdup(_("Your account is locked, please log in to the Yahoo! website."));
+		msg = g_strdup(_("Your account has been locked due to too many failed login attempts."
+					"  Please try logging into the Yahoo! website."));
 		reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
 		break;
 	case 52:
 		/* See #9660. As much as we know, reconnecting shouldn't hurt */
 		purple_debug_info("yahoo", "Got error 52, Set to autoreconnect\n");
-		msg = g_strdup_printf(_("Unknown error"));
+		msg = g_strdup_printf(_("Unknown error 52.  Reconnecting should fix this."));
 		reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 		break;
 	case 1013:
-		msg = g_strdup(_("Invalid username"));
+		msg = g_strdup(_("Error 1013: The username you have entered is invalid."
+					"  The most common cause of this error is entering your email"
+					" address instead of your Yahoo! ID."));
 		reason = PURPLE_CONNECTION_ERROR_INVALID_USERNAME;
 		break;
 	default:
@@ -4271,7 +4286,7 @@
 		}
 	}
 
-	msn = !g_strncasecmp(who, "msn/", 4);
+	msn = !g_ascii_strncasecmp(who, "msn/", 4);
 
 	if( strncmp(who, "+", 1) == 0 ) {
 		/* we have an sms to be sent */
@@ -4395,7 +4410,7 @@
 {
 	YahooData *yd = gc->proto_data;
 	struct yahoo_p2p_data *p2p_data;
-	gboolean msn = !g_strncasecmp(who, "msn/", 4);
+	gboolean msn = !g_ascii_strncasecmp(who, "msn/", 4);
 	struct yahoo_packet *pkt = NULL;
 
 	/* Don't do anything if sms is being typed */
@@ -4420,7 +4435,7 @@
 		else
 			yahoo_packet_hash(pkt, "ssssss", 49, "TYPING", 1, purple_connection_get_display_name(gc),
 	                  14, " ", 13, state == PURPLE_TYPING ? "1" : "0",
-	                  5, who+4, 1002, "1");
+	                  5, who, 1002, "1");
 		yahoo_packet_send_and_free(pkt, yd);
 	}
 
@@ -4495,8 +4510,12 @@
 
 	if (purple_presence_is_idle(presence))
 		yahoo_packet_hash_str(pkt, 47, "2");
-	else if (!purple_status_is_available(status))
-		yahoo_packet_hash_str(pkt, 47, "1");
+	else	{
+		if (!purple_status_is_available(status))
+			yahoo_packet_hash_str(pkt, 47, "1");
+		else
+			yahoo_packet_hash_str(pkt, 47, "0");
+	}
 
 	yahoo_packet_send_and_free(pkt, yd);
 
@@ -4517,6 +4536,7 @@
 	struct yahoo_packet *pkt = NULL;
 	char *msg = NULL, *msg2 = NULL;
 	PurpleStatus *status = NULL;
+	gboolean invisible = FALSE;
 
 	if (idle && yd->current_status != YAHOO_STATUS_CUSTOM)
 		yd->current_status = YAHOO_STATUS_IDLE;
@@ -4525,9 +4545,15 @@
 		yd->current_status = get_yahoo_status_from_purple_status(status);
 	}
 
+	invisible = !( purple_presence_is_available(purple_account_get_presence(purple_connection_get_account(gc))) );
+
 	pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_STATUS_UPDATE, YAHOO_STATUS_AVAILABLE, yd->session_id);
 
-	yahoo_packet_hash_int(pkt, 10, yd->current_status);
+	if (!idle && invisible)
+		yahoo_packet_hash_int(pkt, 10, YAHOO_STATUS_AVAILABLE);
+	else
+		yahoo_packet_hash_int(pkt, 10, yd->current_status);
+
 	if (yd->current_status == YAHOO_STATUS_CUSTOM) {
 		const char *tmp;
 		if (status == NULL)
@@ -4550,8 +4576,6 @@
 
 	if (idle)
 		yahoo_packet_hash_str(pkt, 47, "2");
-	else if (!purple_presence_is_available(purple_account_get_presence(purple_connection_get_account(gc))))
-		yahoo_packet_hash_str(pkt, 47, "1");
 
 	yahoo_packet_send_and_free(pkt, yd);
 
@@ -4668,7 +4692,7 @@
 		return;
 
 	f = yahoo_friend_find(gc, bname);
-	msn = !g_strncasecmp(bname, "msn/", 4);
+	msn = !g_ascii_strncasecmp(bname, "msn/", 4);
 
 	g = purple_buddy_get_group(buddy);
 	if (g)
@@ -4766,6 +4790,7 @@
 void yahoo_add_deny(PurpleConnection *gc, const char *who) {
 	YahooData *yd = (YahooData *)gc->proto_data;
 	struct yahoo_packet *pkt;
+	gboolean msn = FALSE;
 
 	if (!yd->logged_in)
 		return;
@@ -4773,15 +4798,21 @@
 	if (!who || who[0] == '\0')
 		return;
 
+	msn = !g_ascii_strncasecmp(who, "msn/", 4);
 	pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, yd->session_id);
-	yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc),
-	                  7, who, 13, "1");
+
+	if(msn)
+		yahoo_packet_hash(pkt, "ssss", 1, purple_connection_get_display_name(gc), 7, who+4, 241, "2", 13, "1");
+	else
+		yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "1");
+
 	yahoo_packet_send_and_free(pkt, yd);
 }
 
 void yahoo_rem_deny(PurpleConnection *gc, const char *who) {
 	YahooData *yd = (YahooData *)gc->proto_data;
 	struct yahoo_packet *pkt;
+	gboolean msn = FALSE;
 
 	if (!yd->logged_in)
 		return;
@@ -4789,8 +4820,14 @@
 	if (!who || who[0] == '\0')
 		return;
 
+	msn = !g_ascii_strncasecmp(who, "msn/", 4);
 	pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, yd->session_id);
-	yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "2");
+
+	if(msn)
+		yahoo_packet_hash(pkt, "ssss", 1, purple_connection_get_display_name(gc), 7, who+4, 241, "2", 13, "2");
+	else
+		yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "2");
+	
 	yahoo_packet_send_and_free(pkt, yd);
 }
 
--- a/libpurple/protocols/yahoo/libymsg.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/yahoo/libymsg.h	Wed Sep 16 15:36:24 2009 +0000
@@ -280,6 +280,27 @@
 void yahoo_init_colorht(void);
 void yahoo_dest_colorht(void);
 char *yahoo_codes_to_html(const char *x);
+
+/**
+ * This function takes a normal HTML message and converts it to the message
+ * format used by Yahoo, which uses a frankensteinish combination of ANSI
+ * escape codes and broken HTML.
+ *
+ * It results in slightly different output than would be sent by official
+ * Yahoo clients.  The two main differences are:
+ *
+ * 1. We always close all tags, whereas official Yahoo clients leave tags
+ *    dangling open at the end of each message (and the client treats them
+ *    as closed).
+ * 2. We always close inner tags first before closing outter tags.
+ *
+ * For example, if you want to send this message:
+ *   <b> bold <i> bolditalic </i></b><i> italic </i>
+ * Official Yahoo clients would send:
+ *   ESC[1m bold ESC[2m bolditalic ESC[x1m italic
+ * But we will send:
+ *   ESC[1m bold ESC[2m bolditalic ESC[x2mESC[x1mESC[2m italic ESC[x2m
+ */
 char *yahoo_html_to_codes(const char *src);
 
 gboolean
--- a/libpurple/protocols/yahoo/util.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/protocols/yahoo/util.c	Wed Sep 16 15:36:24 2009 +0000
@@ -513,7 +513,7 @@
 	int i, j;
 	gboolean no_more_gt_brackets = FALSE;
 	const char *match;
-	gchar *xmlstr1, *xmlstr2;
+	gchar *xmlstr1, *xmlstr2, *esc;
 
 	x_len = strlen(x);
 	html = xmlnode_new("html");
@@ -553,12 +553,15 @@
 #endif /* !USE_CSS_FORMATTING */
 
 				} else if ((match = g_hash_table_lookup(esc_codes_ht, code))) {
-					gboolean is_closing_tag;
-					gchar *tag_name;
-
-					tag_name = yahoo_markup_get_tag_name(match, &is_closing_tag);
-					yahoo_codes_to_html_add_tag(&cur, match, is_closing_tag, tag_name, FALSE);
-					g_free(tag_name);
+					/* Some tags are in the hash table only because we
+					 * want to ignore them */
+					if (match[0] != '\0') {
+						gboolean is_closing_tag;
+						gchar *tag_name;
+						tag_name = yahoo_markup_get_tag_name(match, &is_closing_tag);
+						yahoo_codes_to_html_add_tag(&cur, match, is_closing_tag, tag_name, FALSE);
+						g_free(tag_name);
+					}
 
 				} else {
 					purple_debug_error("yahoo",
@@ -608,7 +611,6 @@
 				if (match == NULL) {
 					/* Unknown tag.  The user probably typed a less-than sign */
 					g_string_append_c(cdata, x[i]);
-					no_more_gt_brackets = TRUE;
 					g_free(tag);
 					g_free(tag_name);
 					break;
@@ -657,7 +659,10 @@
 	xmlstr2 = g_strndup(xmlstr1 + 6, strlen(xmlstr1) - 13);
 	g_free(xmlstr1);
 
-	purple_debug_misc("yahoo", "yahoo_codes_to_html:  Returning string: '%s'.\n", xmlstr2);
+	esc = g_strescape(x, NULL);
+	purple_debug_misc("yahoo", "yahoo_codes_to_html(%s)=%s\n", esc, xmlstr2);
+	g_free(esc);
+
 	return xmlstr2;
 }
 
@@ -666,33 +671,16 @@
 #define POINT_SIZE(x) (_point_sizes [MIN ((x > 0 ? x : 1), MAX_FONT_SIZE) - 1])
 static const gint _point_sizes [] = { 8, 10, 12, 14, 20, 30, 40 };
 
-enum fatype
-{
-	FATYPE_SIZE,
-	FATYPE_COLOR,
-	FATYPE_FACE,
-	FATYPE_JUNK
-};
-
 typedef struct
 {
-	enum fatype type;
-	union {
-		int size;
-		char *color;
-		char *face;
-		char *junk;
-	} u;
-} fontattr;
-
-static void fontattr_free(fontattr *f)
-{
-	if (f->type == FATYPE_COLOR)
-		g_free(f->u.color);
-	else if (f->type == FATYPE_FACE)
-		g_free(f->u.face);
-	g_free(f);
-}
+	gboolean bold;
+	gboolean italic;
+	gboolean underline;
+	gboolean in_link;
+	int font_size;
+	char *font_face;
+	char *font_color;
+} CurrentMsgState;
 
 static void yahoo_htc_list_cleanup(GSList *l)
 {
@@ -702,338 +690,203 @@
 	}
 }
 
-static void _parse_font_tag(const char *src, GString *dest, int *i, int *j,
-				int len, GSList **colors, GSList **tags, GQueue *ftattr)
+static void parse_font_tag(GString *dest, const char *tag_name, const char *tag,
+				GSList **colors, GSList **tags)
 {
-	int m, n, vstart;
-	gboolean quote = FALSE, done = FALSE;
+	const char *start;
+	const char *end;
+	GData *attributes;
+	const char *attribute;
+	gboolean needendtag;
+	GString *tmp;
 
-	m = *j;
+	purple_markup_find_tag(tag_name, tag, &start, &end, &attributes);
+
+	needendtag = FALSE;
+	tmp = g_string_new(NULL);
 
-	while (1) {
-		m++;
+	attribute = g_datalist_get_data(&attributes, "color");
+	if (attribute != NULL) {
+		g_string_append(tmp, *colors ? (*colors)->data : "\033[#000000m");
+		g_string_append_printf(dest, "\033[%sm", attribute);
+		*colors = g_slist_prepend(*colors,
+				g_strdup_printf("\033[%sm", attribute));
+	} else {
+		/* We need to add a value to the colors stack even if we're not
+		 * setting a color because we ALWAYS pop exactly 1 element from
+		 * this stack for every </font> tag.  If we don't add anything
+		 * then we'll pop something that we shouldn't when we hit this
+		 * corresponding </font>. */
+		*colors = g_slist_prepend(*colors,
+				*colors ? g_strdup((*colors)->data) : g_strdup("\033[#000000m"));
+	}
 
-		if (m >= len) {
-			g_string_append(dest, &src[*i]);
-			*i = len;
-			break;
+	attribute = g_datalist_get_data(&attributes, "face");
+	if (attribute != NULL) {
+		needendtag = TRUE;
+		g_string_append(dest, "<font ");
+		g_string_append_printf(dest, "face=\"%s\" ", attribute);
+	}
+
+	attribute = g_datalist_get_data(&attributes, "size");
+	if (attribute != NULL) {
+		if (!needendtag) {
+			needendtag = TRUE;
+			g_string_append(dest, "<font ");
 		}
 
-		if (src[m] == '=') {
-			n = vstart = m;
-			while (1) {
-				n++;
-
-				if (n >= len) {
-					m = n;
-					break;
-				}
-
-				if (src[n] == '"') {
-					if (!quote) {
-						quote = TRUE;
-						vstart = n;
-						continue;
-					} else {
-						done = 1;
-					}
-				}
-
-				if (!quote && ((src[n] == ' ') || (src[n] == '>')))
-					done = TRUE;
-
-				if (done) {
-					if (!g_ascii_strncasecmp(&src[*j+1], "FACE", m - *j - 1)) {
-						fontattr *f;
-
-						f = g_new(fontattr, 1);
-						f->type = FATYPE_FACE;
-						f->u.face = g_strndup(&src[vstart+1], n-vstart-1);
-						if (!ftattr)
-							ftattr = g_queue_new();
-						g_queue_push_tail(ftattr, f);
-						m = n;
-						break;
-					} else if (!g_ascii_strncasecmp(&src[*j+1], "SIZE", m - *j - 1)) {
-						fontattr *f;
-
-						f = g_new(fontattr, 1);
-						f->type = FATYPE_SIZE;
-						f->u.size = POINT_SIZE(strtol(&src[vstart+1], NULL, 10));
-						if (!ftattr)
-							ftattr = g_queue_new();
-						g_queue_push_tail(ftattr, f);
-						m = n;
-						break;
-					} else if (!g_ascii_strncasecmp(&src[*j+1], "COLOR", m - *j - 1)) {
-						fontattr *f;
-
-						f = g_new(fontattr, 1);
-						f->type = FATYPE_COLOR;
-						f->u.color = g_strndup(&src[vstart+1], n-vstart-1);
-						if (!ftattr)
-							ftattr = g_queue_new();
-						g_queue_push_head(ftattr, f);
-						m = n;
-						break;
-					} else {
-						fontattr *f;
-
-						f = g_new(fontattr, 1);
-						f->type = FATYPE_JUNK;
-						f->u.junk = g_strndup(&src[*j+1], n-*j);
-						if (!ftattr)
-							ftattr = g_queue_new();
-						g_queue_push_tail(ftattr, f);
-						m = n;
-						break;
-					}
+		g_string_append_printf(dest, "size=\"%d\" ",
+				POINT_SIZE(strtol(attribute, NULL, 10)));
+	}
 
-				}
-			}
-		}
-
-		if (src[m] == ' ')
-			*j = m;
-
-		if (src[m] == '>') {
-			gboolean needendtag = FALSE;
-			fontattr *f;
-			GString *tmp = g_string_new(NULL);
-
-			if (!g_queue_is_empty(ftattr)) {
-				while ((f = g_queue_pop_tail(ftattr))) {
-					switch (f->type) {
-					case FATYPE_SIZE:
-						if (!needendtag) {
-							needendtag = TRUE;
-							g_string_append(dest, "<font ");
-						}
-
-						g_string_append_printf(dest, "size=\"%d\" ", f->u.size);
-						break;
-					case FATYPE_FACE:
-						if (!needendtag) {
-							needendtag = TRUE;
-							g_string_append(dest, "<font ");
-						}
-
-						g_string_append_printf(dest, "face=\"%s\" ", f->u.face);
-						break;
-					case FATYPE_JUNK:
-						if (!needendtag) {
-							needendtag = TRUE;
-							g_string_append(dest, "<font ");
-						}
+	if (needendtag) {
+		dest->str[dest->len-1] = '>';
+		*tags = g_slist_prepend(*tags, g_strdup("</font>"));
+		g_string_free(tmp, TRUE);
+	} else {
+		*tags = g_slist_prepend(*tags, tmp->str);
+		g_string_free(tmp, FALSE);
+	}
 
-						g_string_append(dest, f->u.junk);
-						break;
-
-					case FATYPE_COLOR:
-						if (needendtag) {
-							g_string_append(tmp, "</font>");
-							dest->str[dest->len-1] = '>';
-							needendtag = TRUE;
-						}
-
-						g_string_append(tmp, *colors ? (*colors)->data : "\033[#000000m");
-						g_string_append_printf(dest, "\033[%sm", f->u.color);
-						*colors = g_slist_prepend(*colors,
-								g_strdup_printf("\033[%sm", f->u.color));
-						break;
-					}
-					fontattr_free(f);
-				}
-
-				g_queue_free(ftattr);
-				ftattr = NULL;
-
-				if (needendtag) {
-					dest->str[dest->len-1] = '>';
-					*tags = g_slist_prepend(*tags, g_strdup("</font>"));
-					g_string_free(tmp, TRUE);
-				} else {
-					*tags = g_slist_prepend(*tags, tmp->str);
-					g_string_free(tmp, FALSE);
-				}
-			}
-
-			*i = *j = m;
-			break;
-		}
-	}
+	g_datalist_clear(&attributes);
 }
 
 char *yahoo_html_to_codes(const char *src)
 {
 	GSList *colors = NULL;
+
+	/**
+	 * A stack of char*s where each char* is the string that should be
+	 * appended to dest in order to close all the tags that were opened
+	 * by a <font> tag.
+	 */
 	GSList *tags = NULL;
+
 	size_t src_len;
 	int i, j;
 	GString *dest;
 	char *esc;
-	GQueue *ftattr = NULL;
-	gboolean no_more_specials = FALSE;
+	gboolean no_more_gt_brackets = FALSE;
+	gchar *tag, *tag_name;
+	gboolean is_closing_tag;
+	CurrentMsgState current_state;
+
+	memset(&current_state, 0, sizeof(current_state));
 
 	src_len = strlen(src);
 	dest = g_string_sized_new(src_len);
 
 	for (i = 0; i < src_len; i++) {
-
-		if (src[i] == '<' && !no_more_specials) {
+		if (src[i] == '<' && !no_more_gt_brackets) {
+			/* The start of an HTML tag  */
 			j = i;
 
-			while (1) {
-				j++;
-
-				if (j >= src_len) { /* no '>' */
-					g_string_append_c(dest, src[i]);
-					no_more_specials = TRUE;
-					break;
-				}
+			while (j++ < src_len) {
+				if (src[j] != '>') {
+					if (src[j] == '"') {
+						/* We're inside a quoted attribute value. Skip to the end */
+						j++;
+						while (j != src_len && src[j] != '"')
+							j++;
+					} else if (src[j] == '\'') {
+						/* We're inside a quoted attribute value. Skip to the end */
+						j++;
+						while (j != src_len && src[j] != '\'')
+							j++;
+					}
+					if (j != src_len)
+						/* Keep looking for the end of this tag */
+						continue;
 
-				if (src[j] == '<') {
-					/* FIXME: This doesn't convert outgoing entities.
-					 *        However, I suspect this case may never
-					 *        happen anymore because of the entities.
-					 */
-					g_string_append_len(dest, &src[i], j - i);
-					i = j - 1;
-					if (ftattr) {
-						fontattr *f;
-
-						while ((f = g_queue_pop_head(ftattr)))
-							fontattr_free(f);
-						g_queue_free(ftattr);
-						ftattr = NULL;
-					}
+					/* This < has no corresponding > */
+					g_string_append_c(dest, src[i]);
+					no_more_gt_brackets = TRUE;
 					break;
 				}
 
-				if (src[j] == ' ') {
-					if (!g_ascii_strncasecmp(&src[i+1], "BODY", j - i - 1)) {
-						char *t = strchr(&src[j], '>');
-						if (!t) {
-							g_string_append(dest, &src[i]);
-							i = src_len;
-							break;
-						} else {
-							i = t - src;
-							break;
+				tag = g_strndup(src + i, j - i + 1);
+				tag_name = yahoo_markup_get_tag_name(tag, &is_closing_tag);
+
+				if (g_str_equal(tag_name, "a")) {
+					const char *start;
+					const char *end;
+					GData *attributes;
+					const char *attribute;
+
+					/*
+					 * TODO: Ideally we would replace this:
+					 * <a href="http://pidgin.im/">Pidgin</a>
+					 * with this:
+					 * Pidgin (http://pidgin.im/)
+					 *
+					 * Currently we drop the text within the <a> tag and
+					 * just show the URL.  Doing it the fancy way is
+					 * complicated when dealing with HTML tags within the
+					 * <a> tag.
+					 */
+
+					/* Append the URL */
+					purple_markup_find_tag(tag_name, tag, &start, &end, &attributes);
+					attribute = g_datalist_get_data(&attributes, "href");
+					if (attribute != NULL) {
+						if (purple_str_has_prefix(attribute, "mailto:"))
+							attribute += 7;
+						g_string_append(dest, attribute);
+					}
+					g_datalist_clear(&attributes);
+
+					/* Skip past the closing </a> tag */
+					end = purple_strcasestr(src + j, "</a>");
+					if (end != NULL)
+						j = end - src + 3;
+
+				} else if (g_str_equal(tag_name, "font")) {
+					parse_font_tag(dest, tag_name, tag, &colors, &tags);
+				} else if (g_str_equal(tag_name, "b")) {
+					g_string_append(dest, "\033[1m");
+					current_state.bold = TRUE;
+				} else if (g_str_equal(tag_name, "/b")) {
+					if (current_state.bold) {
+						g_string_append(dest, "\033[x1m");
+						current_state.bold = FALSE;
+					}
+				} else if (g_str_equal(tag_name, "i")) {
+					current_state.italic = TRUE;
+					g_string_append(dest, "\033[2m");
+				} else if (g_str_equal(tag_name, "/i")) {
+					if (current_state.italic) {
+						g_string_append(dest, "\033[x2m");
+						current_state.italic = FALSE;
+					}
+				} else if (g_str_equal(tag_name, "u")) {
+					current_state.underline = TRUE;
+					g_string_append(dest, "\033[4m");
+				} else if (g_str_equal(tag_name, "/u")) {
+					if (current_state.underline) {
+						g_string_append(dest, "\033[x4m");
+						current_state.underline = FALSE;
+					}
+				} else if (g_str_equal(tag_name, "/a")) {
+					/* Do nothing */
+				} else if (g_str_equal(tag_name, "br")) {
+					g_string_append_c(dest, '\n');
+				} else if (g_str_equal(tag_name, "/font")) {
+					if (tags != NULL) {
+						char *etag = tags->data;
+						tags = g_slist_delete_link(tags, tags);
+						g_string_append(dest, etag);
+						if (colors != NULL) {
+							g_free(colors->data);
+							colors = g_slist_delete_link(colors, colors);
 						}
-					} else if (!g_ascii_strncasecmp(&src[i+1], "A HREF=\"", j - i - 1)) {
-						j += 7;
-						g_string_append(dest, "\033[lm");
-						if (purple_str_has_prefix(src + j, "mailto:"))
-							j += sizeof("mailto:") - 1;
-						while (1) {
-							g_string_append_c(dest, src[j]);
-							if (++j >= src_len) {
-								i = src_len;
-								break;
-							}
-							if (src[j] == '"') {
-								g_string_append(dest, "\033[xlm");
-								while (1) {
-									if (++j >= src_len) {
-										i = src_len;
-										break;
-									}
-									if (!g_ascii_strncasecmp(&src[j], "</A>", 4)) {
-										j += 3;
-										break;
-									}
-								}
-								i = j;
-								break;
-							}
-						}
-					} else if (!g_ascii_strncasecmp(&src[i+1], "SPAN", j - i - 1)) { /* drop span tags */
-						while (1) {
-							if (++j >= src_len) {
-								g_string_append(dest, &src[i]);
-								i = src_len;
-								break;
-							}
-							if (src[j] == '>') {
-								i = j;
-								break;
-							}
-						}
-					} else if (g_ascii_strncasecmp(&src[i+1], "FONT", j - i - 1)) { /* not interested! */
-						while (1) {
-							if (++j >= src_len) {
-								g_string_append(dest, &src[i]);
-								i = src_len;
-								break;
-							}
-							if (src[j] == '>') {
-								g_string_append_len(dest, &src[i], j - i + 1);
-								i = j;
-								break;
-							}
-						}
-					} else { /* yay we have a font tag */
-						_parse_font_tag(src, dest, &i, &j, src_len, &colors, &tags, ftattr);
+						g_free(etag);
 					}
-
-					break;
 				}
 
-				if (src[j] == '>') {
-					/* This has some problems like the FIXME for the
-					 * '<' case. and like that case, I suspect the case
-					 * that this has problems is won't happen anymore anyway.
-					 */
-					int sublen = j - i - 1;
-
-					if (sublen) {
-						if (!g_ascii_strncasecmp(&src[i+1], "B", sublen)) {
-							g_string_append(dest, "\033[1m");
-						} else if (!g_ascii_strncasecmp(&src[i+1], "/B", sublen)) {
-							g_string_append(dest, "\033[x1m");
-						} else if (!g_ascii_strncasecmp(&src[i+1], "I", sublen)) {
-							g_string_append(dest, "\033[2m");
-						} else if (!g_ascii_strncasecmp(&src[i+1], "/I", sublen)) {
-							g_string_append(dest, "\033[x2m");
-						} else if (!g_ascii_strncasecmp(&src[i+1], "U", sublen)) {
-							g_string_append(dest, "\033[4m");
-						} else if (!g_ascii_strncasecmp(&src[i+1], "/U", sublen)) {
-							g_string_append(dest, "\033[x4m");
-						} else if (!g_ascii_strncasecmp(&src[i+1], "/A", sublen)) {
-							g_string_append(dest, "\033[xlm");
-						} else if (!g_ascii_strncasecmp(&src[i+1], "BR", sublen)) {
-							g_string_append_c(dest, '\n');
-						} else if (!g_ascii_strncasecmp(&src[i+1], "/BODY", sublen)) {
-							/* mmm, </body> tags. *BURP* */
-						} else if (!g_ascii_strncasecmp(&src[i+1], "/SPAN", sublen)) {
-							/* </span> tags. dangerously close to </spam> */
-						} else if (!g_ascii_strncasecmp(&src[i+1], "/FONT", sublen) && tags != NULL) {
-							char *etag;
-
-							etag = tags->data;
-							tags = g_slist_delete_link(tags, tags);
-							if (etag) {
-								g_string_append(dest, etag);
-								if (!strcmp(etag, "</font>")) {
-									if (colors != NULL) {
-										g_free(colors->data);
-										colors = g_slist_delete_link(colors, colors);
-									}
-								}
-								g_free(etag);
-							}
-						} else {
-							g_string_append_len(dest, &src[i], j - i + 1);
-						}
-					} else {
-						g_string_append_len(dest, &src[i], j - i + 1);
-					}
-
-					i = j;
-					break;
-				}
-
+				i = j;
+				g_free(tag);
+				g_free(tag_name);
+				break;
 			}
 
 		} else {
@@ -1052,7 +905,7 @@
 	}
 
 	esc = g_strescape(dest->str, NULL);
-	purple_debug_misc("yahoo", "yahoo_html_to_codes:  Returning string: '%s'.\n", esc);
+	purple_debug_misc("yahoo", "yahoo_html_to_codes(%s)=%s\n", src, esc);
 	g_free(esc);
 
 	yahoo_htc_list_cleanup(colors);
--- a/libpurple/proxy.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/proxy.c	Wed Sep 16 15:36:24 2009 +0000
@@ -245,7 +245,7 @@
 		return &info;
 	}
 
-	if (purple_strequal(tmp, "manual\n")) {
+	if (!purple_strequal(tmp, "manual\n")) {
 		/* Unknown setting.  Fallback to using our global proxy settings. */
 		g_free(tmp);
 		return purple_global_proxy_get_info();
--- a/libpurple/server.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/server.c	Wed Sep 16 15:36:24 2009 +0000
@@ -592,13 +592,10 @@
 	 */
 	flags |= PURPLE_MESSAGE_RECV;
 
-	if (PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc))->set_permit_deny == NULL) {
-		/* protocol does not support privacy, handle it ourselves */
-		if (!purple_privacy_check(account, who)) {
-			purple_signal_emit(purple_conversations_get_handle(), "blocked-im-msg",
-					account, who, msg, flags, (unsigned int)mtime);
-			return;
-		}
+	if (!purple_privacy_check(account, who)) {
+		purple_signal_emit(purple_conversations_get_handle(), "blocked-im-msg",
+				account, who, msg, flags, (unsigned int)mtime);
+		return;
 	}
 
 	/*
--- a/libpurple/smiley.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/smiley.c	Wed Sep 16 15:36:24 2009 +0000
@@ -80,7 +80,7 @@
  * XML descriptor file layout                                                 *
  ******************************************************************************
  *
- * Althought we are creating the profile XML structure here, now we
+ * Although we are creating the profile XML structure here, now we
  * won't handle it.
  * So, we just add one profile named "default" that has no associated
  * account elements, and have only the smiley_set that will contain
@@ -163,14 +163,14 @@
 }
 
 static xmlnode *
-smileys_to_xmlnode()
+smileys_to_xmlnode(void)
 {
 	xmlnode *root_node, *profile_node, *smileyset_node;
 
 	root_node = xmlnode_new(XML_ROOT_TAG);
 	xmlnode_set_attrib(root_node, "version", "1.0");
 
-	/* See the top comment's above to understand why initial tag elements
+	/* See the top comments above to understand why initial tag elements
 	 * are not being considered by now. */
 	profile_node = xmlnode_new(XML_PROFILE_TAG);
 	if (profile_node) {
@@ -188,7 +188,7 @@
 }
 
 static void
-sync_smileys()
+sync_smileys(void)
 {
 	xmlnode *root_node;
 	char *data;
@@ -216,7 +216,7 @@
 }
 
 static void
-purple_smileys_save()
+purple_smileys_save(void)
 {
 	if (save_timer == 0)
 		save_timer = purple_timeout_add_seconds(5, save_smileys_cb, NULL);
@@ -248,7 +248,7 @@
 }
 
 static void
-purple_smileys_load()
+purple_smileys_load(void)
 {
 	xmlnode *root_node, *profile_node;
 	xmlnode *smileyset_node = NULL;
@@ -262,7 +262,7 @@
 	if (root_node == NULL)
 		return;
 
-	/* See the top comment's above to understand why initial tag elements
+	/* See the top comments above to understand why initial tag elements
 	 * are not being considered by now. */
 	profile_node = xmlnode_get_child(root_node, XML_PROFILE_TAG);
 	if (profile_node)
@@ -456,7 +456,7 @@
 }
 
 /*********************************************************************
- * Other Stuff                                                             *
+ * Other Stuff                                                       *
  *********************************************************************/
 
 static char *get_file_full_path(const char *filename)
@@ -876,7 +876,7 @@
 }
 
 void
-purple_smileys_init()
+purple_smileys_init(void)
 {
 	smiley_shortcut_index = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
 	smiley_checksum_index = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
@@ -887,7 +887,7 @@
 }
 
 void
-purple_smileys_uninit()
+purple_smileys_uninit(void)
 {
 	if (save_timer != 0) {
 		purple_timeout_remove(save_timer);
--- a/libpurple/smiley.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/smiley.h	Wed Sep 16 15:36:24 2009 +0000
@@ -95,7 +95,7 @@
 purple_smiley_new_from_file(const char *shortcut, const char *filepath);
 
 /**
- * Destroys the custom smiley and release the associated resources.
+ * Destroys the custom smiley and releases the associated resources.
  *
  * @param smiley    The custom smiley.
  */
@@ -183,7 +183,7 @@
  * If the custom smiley has data and the file exists in the cache, this
  * will return a full path to the cached file.
  *
- * In general, it is not appropriate to be poking in the file cached
+ * In general, it is not appropriate to be poking in the file cache
  * directly.  If you find yourself wanting to use this function, think
  * very long and hard about it, and then don't.
  *
@@ -192,7 +192,7 @@
  * @param smiley  The custom smiley.
  *
  * @return A full path to the file, or @c NULL under various conditions.
- *         The caller should use #g_free to free the returned string.
+ *         The caller should use g_free to free the returned string.
  */
 char *purple_smiley_get_full_path(PurpleSmiley *smiley);
 
--- a/libpurple/status.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/status.h	Wed Sep 16 15:36:24 2009 +0000
@@ -50,28 +50,38 @@
  * your accounts are saved so that the next time you start Purple,
  * your accounts will be set to their last known statuses.  There
  * is also a list of saved statuses that are written to the
- * status.xml file.  Also, each PurpleStatus has a "savable" boolean.
- * If "savable" is set to FALSE then the status is NEVER saved.
+ * status.xml file.  Also, each PurpleStatus has a "saveable" boolean.
+ * If "saveable" is set to FALSE then the status is NEVER saved.
  * All PurpleStatuses should be inside a PurplePresence.
  *
  *
- * A PurpleStatus is either "indepedent" or "exclusive."
- * Independent statuses can be active or inactive and it doesn't
+ * A PurpleStatus is either "independent" or "exclusive."
+ * Independent statuses can be active or inactive and they don't
  * affect anything else.  However, you can only have one exclusive
- * status per PurplePresence.  If you activate one exlusive status,
+ * status per PurplePresence.  If you activate one exclusive status,
  * then the previous exclusive status is automatically deactivated.
  *
  * A PurplePresence is like a collection of PurpleStatuses (plus some
  * other random info).  For any buddy, or for any one of your accounts,
- * or for any person you're chatting with, you may know various
+ * or for any person with which you're chatting, you may know various
  * amounts of information.  This information is all contained in
  * one PurplePresence.  If one of your buddies is away and idle,
  * then the presence contains the PurpleStatus for their awayness,
  * and it contains their current idle time.  PurplePresences are
- * never saved to disk.  The information they contain is only relevent
+ * never saved to disk.  The information they contain is only relevant
  * for the current PurpleSession.
  */
 
+/**
+ * PurpleStatusType's are created by each PRPL.  They outline the
+ * available statuses of the protocol.  AIM, for example, supports
+ * an available state with an optional available message, an away
+ * state with a mandatory message, and an invisible state (which is
+ * technically "independent" of the other two, but we'll get into
+ * that later).  PurpleStatusTypes are very permanent.  They are
+ * hardcoded in each PRPL and will not change often.  And because
+ * they are hardcoded, they do not need to be saved to any XML file.
+ */
 typedef struct _PurpleStatusType      PurpleStatusType;
 typedef struct _PurpleStatusAttr      PurpleStatusAttr;
 typedef struct _PurplePresence        PurplePresence;
@@ -80,7 +90,7 @@
 /**
  * A context for a presence.
  *
- * The context indicates what the presence applies to.
+ * The context indicates to what the presence applies.
  */
 typedef enum
 {
@@ -134,7 +144,7 @@
 #endif
 
 /**************************************************************************/
-/** @name PurpleStatusPrimitive API                                         */
+/** @name PurpleStatusPrimitive API                                       */
 /**************************************************************************/
 /*@{*/
 
@@ -172,7 +182,7 @@
 /*@}*/
 
 /**************************************************************************/
-/** @name PurpleStatusType API                                              */
+/** @name PurpleStatusType API                                            */
 /**************************************************************************/
 /*@{*/
 
--- a/libpurple/tests/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/tests/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -11,6 +11,7 @@
 	    tests.h \
 		test_cipher.c \
 		test_jabber_jutil.c \
+		test_qq.c \
 		test_yahoo_util.c \
 		test_util.c \
 		$(top_builddir)/libpurple/util.h
@@ -28,6 +29,7 @@
         @CHECK_LIBS@ \
 		$(GLIB_LIBS) \
 		$(top_builddir)/libpurple/protocols/jabber/libjabber.la \
+		$(top_builddir)/libpurple/protocols/qq/libqq.la \
 		$(top_builddir)/libpurple/protocols/yahoo/libymsg.la \
 		$(top_builddir)/libpurple/libpurple.la
 
--- a/libpurple/tests/check_libpurple.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/tests/check_libpurple.c	Wed Sep 16 15:36:24 2009 +0000
@@ -76,6 +76,7 @@
 
 	srunner_add_suite(sr, cipher_suite());
 	srunner_add_suite(sr, jabber_jutil_suite());
+	srunner_add_suite(sr, qq_suite());
 	srunner_add_suite(sr, yahoo_util_suite());
 	srunner_add_suite(sr, util_suite());
 
--- a/libpurple/tests/test_jabber_jutil.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/tests/test_jabber_jutil.c	Wed Sep 16 15:36:24 2009 +0000
@@ -132,6 +132,7 @@
 	assert_invalid_jid("mark.doliner@gmail\\stuff.org");
 	assert_invalid_jid("paul@[::1]124");
 	assert_invalid_jid("paul@2[::1]124/as");
+	assert_invalid_jid("paul@まつ.おおかみ/\x01");
 
 	/* Ensure that jabber_id_new is properly lowercasing node and domains */
 	assert_jid_parts("paul", "darkrain42.org", "PaUL@darkrain42.org");
@@ -153,6 +154,14 @@
 }
 END_TEST
 
+START_TEST(test_jabber_normalize)
+{
+	assert_string_equal("paul@darkrain42.org", jabber_normalize(NULL, "PaUL@DaRkRain42.org"));
+	assert_string_equal("paul@darkrain42.org", jabber_normalize(NULL, "PaUL@DaRkRain42.org/"));
+	assert_string_equal("paul@darkrain42.org", jabber_normalize(NULL, "PaUL@DaRkRain42.org/resource"));
+}
+END_TEST
+
 Suite *
 jabber_jutil_suite(void)
 {
@@ -172,6 +181,7 @@
 	tcase_add_test(tc, test_nodeprep_validate_illegal_chars);
 	tcase_add_test(tc, test_nodeprep_validate_too_long);
 	tcase_add_test(tc, test_jabber_id_new);
+	tcase_add_test(tc, test_jabber_normalize);
 	suite_add_tcase(s, tc);
 
 	return s;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_qq.c	Wed Sep 16 15:36:24 2009 +0000
@@ -0,0 +1,105 @@
+#include <string.h>
+
+#include "tests.h"
+#include "../protocols/qq/qq_crypt.h"
+
+START_TEST(test_qq_encrypt)
+{
+	const guint8 * const key = (guint8 *)"hamburger";
+	guint8 crypted[80];
+	gint ret;
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"a", 1, key);
+	assert_int_equal(16, ret);
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"aa", 2, key);
+	assert_int_equal(16, ret);
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"aaa", 3, key);
+	assert_int_equal(16, ret);
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"aaaa", 4, key);
+	assert_int_equal(16, ret);
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"aaaaa", 5, key);
+	assert_int_equal(16, ret);
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"aaaaaa", 6, key);
+	assert_int_equal(16, ret);
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"aaaaaaa", 7, key);
+	assert_int_equal(24, ret);
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"aaaaaaaa", 8, key);
+	assert_int_equal(24, ret);
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"aaaaaaaaa", 9, key);
+	assert_int_equal(24, ret);
+
+	ret = qq_encrypt(crypted, (const guint8 * const)"aaaaaaaaaa", 10, key);
+	assert_int_equal(24, ret);
+
+	ret = qq_encrypt(crypted,
+			(const guint8 * const)"aaaaaaaaaaa", 11, key);
+	assert_int_equal(24, ret);
+
+	ret = qq_encrypt(crypted,
+			(const guint8 * const)"aaaaaaaaaaaa", 12, key);
+	assert_int_equal(24, ret);
+
+	ret = qq_encrypt(crypted,
+			(const guint8 * const)"aaaaaaaaaaaaa", 13, key);
+	assert_int_equal(24, ret);
+
+	ret = qq_encrypt(crypted,
+			(const guint8 * const)"aaaaaaaaaaaaaa", 14, key);
+	assert_int_equal(24, ret);
+
+	ret = qq_encrypt(crypted,
+			(const guint8 * const)"aaaaaaaaaaaaaaa", 15, key);
+	assert_int_equal(32, ret);
+
+	ret = qq_encrypt(crypted,
+			(const guint8 * const)"aaaaaaaaaaaaaaaa", 16, key);
+	assert_int_equal(32, ret);
+
+	ret = qq_encrypt(crypted,
+			(const guint8 * const)"aaaaaaaaaaaaaaaaa", 17, key);
+	assert_int_equal(32, ret);
+
+	ret = qq_encrypt(crypted,
+			(const guint8 * const)"aaaaaaaaaaaaaaaaaa", 18, key);
+	assert_int_equal(32, ret);
+
+	ret = qq_encrypt(crypted,
+			(const guint8 * const)"aaaaaaaaaaaaaaaaaaa", 19, key);
+	assert_int_equal(32, ret);
+
+	/*
+	fprintf(stderr, "crypted=%s\n", crypted);
+	assert_string_equal_free("plain",
+			yahoo_codes_to_html("plain"));
+	*/
+}
+END_TEST
+
+START_TEST(test_qq_decrypt)
+{
+}
+END_TEST
+
+Suite *
+qq_suite(void)
+{
+	Suite *s;
+	TCase *tc;
+
+	s = suite_create("QQ");
+
+	tc = tcase_create("QQ Crypt Functions");
+	tcase_add_test(tc, test_qq_encrypt);
+	tcase_add_test(tc, test_qq_decrypt);
+	suite_add_tcase(s, tc);
+
+	return s;
+}
--- a/libpurple/tests/test_yahoo_util.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/tests/test_yahoo_util.c	Wed Sep 16 15:36:24 2009 +0000
@@ -25,6 +25,10 @@
 			yahoo_codes_to_html("plain <peanut"));
 	assert_string_equal_free("plain&gt; peanut",
 			yahoo_codes_to_html("plain> peanut"));
+	assert_string_equal_free("<font face='inva&gt;lid'>test</font>",
+			yahoo_codes_to_html("<font face='inva>lid'>test"));
+	assert_string_equal_free("&lt;font face=&apos;inva&gt;lid",
+			yahoo_codes_to_html("<font face='inva>lid"));
 
 	/* bold/italic/underline */
 	assert_string_equal_free("<b>bold</b>",
@@ -46,6 +50,10 @@
 	assert_string_equal_free("<b>bold <i>bolditalic <u>bolditalicunderline</u></i></b><i><u> italicunderline</u></i>",
 			yahoo_codes_to_html("\x1B[1mbold \x1B[2mbolditalic \x1B[4mbolditalicunderline\x1B[x1m italicunderline"));
 
+	/* link */
+	assert_string_equal_free("http://pidgin.im/",
+			yahoo_codes_to_html("\x1B[lmhttp://pidgin.im/\x1B[xlm"));
+
 #ifdef USE_CSS_FORMATTING
 	/* font color */
 	assert_string_equal_free("<span style='color: #0000FF'>blue</span>",
@@ -92,19 +100,105 @@
 			yahoo_codes_to_html("<font face='Georgia' size='32'>test"));
 	assert_string_equal_free("<font color='#FF0080'><font size='4' absz='15'>test</font></font>",
 			yahoo_codes_to_html("\x1B[35m<font size='15'>test"));
+	assert_string_equal_free(":&lt;",
+			yahoo_codes_to_html("<FADE #ff0000,#00ff00,#0000ff>:<</FADE>"));
 #endif /* !USE_CSS_FORMATTING */
 }
 END_TEST
 
+START_TEST(test_html_to_codes)
+{
+	assert_string_equal_free("plain",
+			yahoo_html_to_codes("plain"));
+	assert_string_equal_free("plain <peanut>",
+			yahoo_html_to_codes("plain &lt;peanut&gt;"));
+	assert_string_equal_free("plain <peanut",
+			yahoo_html_to_codes("plain &lt;peanut"));
+	assert_string_equal_free("plain> peanut",
+			yahoo_html_to_codes("plain&gt; peanut"));
+	assert_string_equal_free("plain >",
+			yahoo_html_to_codes("plain &gt;"));
+	assert_string_equal_free("plain > ",
+			yahoo_html_to_codes("plain &gt; "));
+	assert_string_equal_free("plain <",
+			yahoo_html_to_codes("plain &lt;"));
+	assert_string_equal_free("plain < ",
+			yahoo_html_to_codes("plain &lt; "));
+	assert_string_equal_free("plain &lt",
+			yahoo_html_to_codes("plain &lt"));
+	assert_string_equal_free("plain &",
+			yahoo_html_to_codes("plain &amp;"));
+
+	/* bold/italic/underline */
+	assert_string_equal_free("\x1B[1mbold\x1B[x1m",
+			yahoo_html_to_codes("<b>bold</b>"));
+	assert_string_equal_free("\x1B[2mitalic\x1B[x2m",
+			yahoo_html_to_codes("<i>italic</i>"));
+	assert_string_equal_free("\x1B[4munderline\x1B[x4m",
+			yahoo_html_to_codes("<u>underline</u>"));
+	assert_string_equal_free("no markup",
+			yahoo_html_to_codes("no</u> markup"));
+	assert_string_equal_free("\x1B[1mbold\x1B[x1m \x1B[2mitalic\x1B[x2m \x1B[4munderline\x1B[x4m",
+			yahoo_html_to_codes("<b>bold</b> <i>italic</i> <u>underline</u>"));
+	assert_string_equal_free("\x1B[1mbold \x1B[2mbolditalic\x1B[x2m\x1B[x1m\x1B[2m italic\x1B[x2m",
+			yahoo_html_to_codes("<b>bold <i>bolditalic</i></b><i> italic</i>"));
+	assert_string_equal_free("\x1B[1mbold \x1B[2mbolditalic\x1B[x2m\x1B[x1m\x1B[2m \x1B[4mitalicunderline\x1B[x4m\x1B[x2m",
+			yahoo_html_to_codes("<b>bold <i>bolditalic</i></b><i> <u>italicunderline</u></i>"));
+
+	/* link */
+	assert_string_equal_free("http://pidgin.im/",
+			yahoo_html_to_codes("<A HREF=\"http://pidgin.im/\">http://pidgin.im/</A>"));
+	assert_string_equal_free("mark@example.com",
+			yahoo_html_to_codes("<A HREF=\"mailto:mark@example.com\">mark@example.com</A>"));
+#if 0
+	assert_string_equal_free("Pidgin (http://pidgin.im/)",
+			yahoo_html_to_codes("<A HREF=\"http://pidgin.im/\">Pidgin</A>"));
+#endif
+
+	/* font nothing */
+	assert_string_equal_free("nothing",
+			yahoo_html_to_codes("<font>nothing</font>"));
+
+	/* font color */
+	assert_string_equal_free("\x1B[#E71414mred\x1B[#000000m",
+			yahoo_html_to_codes("<font color=\"#E71414\">red</font>"));
+	assert_string_equal_free("\x1B[#FF0000mred\x1B[#000000m \x1B[#0000FFmblue\x1B[#000000m black",
+			yahoo_html_to_codes("<font color=\"#FF0000\">red</font> <font color=\"#0000FF\">blue</font> black"));
+
+	/* font size */
+	assert_string_equal_free("<font size=\"10\">test</font>",
+			yahoo_html_to_codes("<font size=\"2\">test</font>"));
+	assert_string_equal_free("<font size=\"30\">test</font>",
+			yahoo_html_to_codes("<font size=\"6\">test</font>"));
+
+	/* combinations */
+	assert_string_equal_free("\x1B[#FF0000m<font size=\"8\">redsmall</font> rednormal\x1B[#000000m",
+			yahoo_html_to_codes("<font color=\"#FF0000\"><font size=\"1\">redsmall</font> rednormal</font>"));
+
+	assert_string_equal_free("\x1B[#FF0000m<font size=\"8\">redsmall</font> \x1B[#00FF00mgreennormal\x1B[#FF0000m rednormal\x1B[#000000m",
+			yahoo_html_to_codes("<font color=\"#FF0000\"><font size=\"1\">redsmall</font> <font color=\"#00FF00\">greennormal</font> rednormal</font>"));
+
+	assert_string_equal_free("\x1B[1mbold \x1B[#FF0000mred <font face=\"Comic Sans MS\" size=\"20\">larger \x1B[#000000mbacktoblack <font size=\"12\">normalsize</font>\x1B[#FF0000m</font>\x1B[#000000m\x1B[x1m",
+			yahoo_html_to_codes("<b>bold <font color=\"#FF0000\">red <font face=\"Comic Sans MS\" size=\"5\">larger <font color=\"#000000\">backtoblack <font size=\"3\">normalsize</font></font></font></font></b>"));
+}
+END_TEST
+
 Suite *
 yahoo_util_suite(void)
 {
-	Suite *s = suite_create("Yahoo Utility Functions");
+	Suite *s;
+	TCase *tc;
 
-	TCase *tc = tcase_create("Convert to Numeric");
+	s = suite_create("Yahoo Utility Functions");
+
+	tc = tcase_create("Convert IM from network format to HTML");
 	tcase_add_unchecked_fixture(tc, setup_codes_to_html, teardown_codes_to_html);
 	tcase_add_test(tc, test_codes_to_html);
 	suite_add_tcase(s, tc);
 
+	tc = tcase_create("Convert IM from HTML to network format");
+	tcase_add_test(tc, test_html_to_codes);
+	suite_add_tcase(s, tc);
+
 	return s;
 }
--- a/libpurple/tests/tests.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/tests/tests.h	Wed Sep 16 15:36:24 2009 +0000
@@ -10,13 +10,18 @@
 Suite * master_suite(void);
 Suite * cipher_suite(void);
 Suite * jabber_jutil_suite(void);
+Suite * qq_suite(void);
 Suite * yahoo_util_suite(void);
 Suite * util_suite(void);
 
 /* helper macros */
+#define assert_int_equal(expected, actual) { \
+	fail_if(expected != actual, "Expected '%d' but got '%d'", expected, actual); \
+}
+
 #define assert_string_equal(expected, actual) { \
 	const gchar *a = actual; \
-	fail_unless(strcmp(expected, a) == 0, "Expecting '%s' but got '%s'", expected, a); \
+	fail_unless(strcmp(expected, a) == 0, "Expected '%s' but got '%s'", expected, a); \
 }
 
 #define assert_string_equal_free(expected, actual) { \
--- a/libpurple/theme-loader.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/theme-loader.c	Wed Sep 16 15:36:24 2009 +0000
@@ -118,7 +118,7 @@
 
 	/* TYPE STRING (read only) */
 	pspec = g_param_spec_string("type", "Type",
-				    "The string represtenting the type of the theme",
+				    "The string representing the type of the theme",
 				    NULL,
 				    G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
 	g_object_class_install_property(obj_class, PROP_TYPE, pspec);
--- a/libpurple/theme-loader.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/theme-loader.h	Wed Sep 16 15:36:24 2009 +0000
@@ -71,11 +71,11 @@
 GType purple_theme_loader_get_type(void);
 
 /**
- * Returns the string represtenting the type of the theme loader
+ * Returns the string representing the type of the theme loader
  *
  * @param self The theme loader
  *
- * @returns The string represting this type
+ * @returns The string representing this type
  */
 const gchar *purple_theme_loader_get_type_string(PurpleThemeLoader *self);
 
--- a/libpurple/theme.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/theme.c	Wed Sep 16 15:36:24 2009 +0000
@@ -190,7 +190,7 @@
 
 	/* TYPE STRING (read only) */
 	pspec = g_param_spec_string("type", "Type",
-			"The string represtenting the type of the theme",
+			"The string representing the type of the theme",
 			NULL,
 			G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
 	g_object_class_install_property(obj_class, PROP_TYPE, pspec);
--- a/libpurple/theme.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/theme.h	Wed Sep 16 15:36:24 2009 +0000
@@ -73,7 +73,7 @@
  *
  * @param theme  The purple theme.
  *
- * @return The string representating the name of the theme.
+ * @return The string representing the name of the theme.
  */
 const gchar *purple_theme_get_name(PurpleTheme *theme);
 
@@ -124,7 +124,7 @@
  *
  * @param theme  The purple theme.
  *
- * @return The string represtenting the type.
+ * @return The string representing the type.
  */
 const gchar *purple_theme_get_type_string(PurpleTheme *theme);
 
@@ -133,7 +133,7 @@
  *
  * @param theme  The purple theme.
  *
- * @return The string represtenting the theme directory.
+ * @return The string representing the theme directory.
  */
 const gchar *purple_theme_get_dir(PurpleTheme *theme);
 
--- a/libpurple/util.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/util.c	Wed Sep 16 15:36:24 2009 +0000
@@ -3129,6 +3129,9 @@
 	const char *ret = NULL;
 	static char buf[BUF_LEN];
 
+	/* This should prevent a crash if purple_normalize gets called with NULL str, see #10115 */
+	g_return_val_if_fail(str != NULL, "");
+
 	if (account != NULL)
 	{
 		PurplePlugin *prpl = purple_find_prpl(purple_account_get_protocol_id(account));
@@ -3820,7 +3823,7 @@
 	/* Note: data is _not_ nul-terminated.  */
 	if (data_len > header_len) {
 		if (header[0] == '\n')
-			p = (g_strncasecmp(data, header + 1, header_len - 1) == 0) ? data : NULL;
+			p = (g_ascii_strncasecmp(data, header + 1, header_len - 1) == 0) ? data : NULL;
 		if (!p)
 			p = purple_strcasestr(data, header);
 		if (p)
@@ -3857,7 +3860,7 @@
 content_is_chunked(const char *data, size_t data_len)
 {
 	const char *p = find_header_content(data, data_len, "\nTransfer-Encoding: ", sizeof("\nTransfer-Encoding: ") - 1);
-	if (p && g_strncasecmp(p, "chunked", 7) == 0)
+	if (p && g_ascii_strncasecmp(p, "chunked", 7) == 0)
 		return TRUE;
 
 	return FALSE;
@@ -4375,14 +4378,14 @@
 		gunichar c = g_utf8_get_char(iter);
 		/* If the character is an ASCII character and is alphanumeric
 		 * no need to escape */
-		if (c < 128 && isalnum(c)) {
+		if (c < 128 && (isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~')) {
 			buf[j++] = c;
 		} else {
 			int bytes = g_unichar_to_utf8(c, utf_char);
 			for (i = 0; i < bytes; i++) {
 				if (j > (BUF_LEN - 4))
 					break;
-				sprintf(buf + j, "%%%02x", utf_char[i] & 0xff);
+				sprintf(buf + j, "%%%02X", utf_char[i] & 0xff);
 				j += 3;
 			}
 		}
@@ -4652,25 +4655,26 @@
 purple_utf8_strip_unprintables(const gchar *str)
 {
 	gchar *workstr, *iter;
+	const gchar *bad;
 
 	if (str == NULL)
 		/* Act like g_strdup */
 		return NULL;
 
-	g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
+	if (!g_utf8_validate(str, -1, &bad)) {
+		purple_debug_error("util", "purple_utf8_strip_unprintables(%s) failed; "
+		                           "first bad character was %02x (%c)\n",
+		                   str, *bad, *bad);
+		g_return_val_if_reached(NULL);
+	}
 
 	workstr = iter = g_new(gchar, strlen(str) + 1);
-	while (*str) {
-		gunichar c = g_utf8_get_char(str);
-		const gchar *next = g_utf8_next_char(str);
-		size_t len = next - str;
-
-		if (g_unichar_isprint(c)) {
-			memcpy(iter, str, len);
-			iter += len;
+	for ( ; *str; ++str) {
+		guchar c = *str;
+		if (c >= 0x20 || c == '\t' || c == '\n' || c == '\r') {
+			*iter = c;
+			++iter;
 		}
-
-		str = next;
 	}
 
 	/* nul-terminate the new string */
--- a/libpurple/util.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/libpurple/util.h	Wed Sep 16 15:36:24 2009 +0000
@@ -31,8 +31,14 @@
 
 #include <stdio.h>
 
+/**
+  * An opaque structure representing a URL request. Can be used to cancel
+  * the request.
+  */
 typedef struct _PurpleUtilFetchUrlData PurpleUtilFetchUrlData;
+/** @copydoc _PurpleMenuAction */
 typedef struct _PurpleMenuAction PurpleMenuAction;
+/** @copydoc _PurpleKeyValuePair */
 typedef struct _PurpleKeyValuePair PurpleKeyValuePair;
 
 #include "account.h"
@@ -107,7 +113,7 @@
  * @param album     The album of the song, can be @c NULL.
  * @param unused    Currently unused, must be @c NULL.
  *
- * @return   The formatted string. The caller must #g_free the returned string.
+ * @return   The formatted string. The caller must g_free the returned string.
  * @since 2.4.0
  */
 char * purple_util_format_song_info(const char *title, const char *artist,
@@ -1286,16 +1292,14 @@
 /**
  * Removes unprintable characters from a UTF-8 string. These characters
  * (in particular low-ASCII characters) are invalid in XML 1.0 and thus
- * are not allowed in XMPP and are rejected by libxml2 by default. This
- * function uses g_unichar_isprint to determine what characters should
- * be stripped. The returned string must be freed by the caller.
+ * are not allowed in XMPP and are rejected by libxml2 by default.
+ *
+ * The returned string must be freed by the caller.
  *
  * @param str A valid UTF-8 string.
  *
  * @return A newly allocated UTF-8 string without the unprintable characters.
  * @since 2.6.0
- *
- * @see g_unichar_isprint
  */
 gchar *purple_utf8_strip_unprintables(const gchar *str);
 
--- a/pidgin.spec.in	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin.spec.in	Wed Sep 16 15:36:24 2009 +0000
@@ -29,7 +29,7 @@
 
 # Generic build requirements
 BuildRequires: libtool, pkgconfig, intltool, gettext, libxml2-devel
-BuildRequires: gtk2-devel
+BuildRequires: gtk2-devel, libidn-devel
 
 %{!?_without_startupnotification:BuildRequires: startup-notification-devel}
 %{?_with_avahi:BuildRequires: avahi-glib-devel}
@@ -86,6 +86,8 @@
 
 Obsoletes: gaim
 Provides: gaim
+Obsoletes: pidgin-perl < %{version}
+Provides: pidgin-perl = %{version}-%{release}
 
 %package devel
 Summary:    Development headers, documentation, and libraries for Pidgin
@@ -104,6 +106,8 @@
 Obsoletes:  gaim-gadugadu
 Obsoletes:  pidgin-tcl < 2.0.0
 Obsoletes:  pidgin-silc < 2.0.0
+Obsoletes:  libpurple-perl < %{version}
+Provides:   libpurple-perl = %{version}-%{release}
 %{?_with_sasl:Requires:   cyrus-sasl-plain, cyrus-sasl-md5}
 
 %package -n libpurple-devel
@@ -226,6 +230,7 @@
                                     --mandir=%{_mandir} \
                                     --sysconfdir=%{_sysconfdir} \
                                     --disable-schemas-install \
+                                    %{!?_with_vv:--disable-vv} \
                                     %{!?_with_dbus:--disable-dbus} \
                                     %{!?_with_avahi:--disable-avahi} \
                                     %{!?_with_meanwhile:--disable-meanwhile} \
@@ -465,6 +470,11 @@
 %endif
 
 %changelog
+* Sat Sep 05 2009 Stu Tomlinson <stu@nosnilmot.com>
+- Disable Voice & Video unless --with vv is used
+- Add BuildRequires for libidn-devel
+- Add Provides/Obsoletes to ease transition from Red Hat / Fedora RPMs
+
 * Sat Jul 11 2009 Stu Tomlinson <stu@nosnilmot.com>
 - Update to reflect changes in perl module installation directories
 
--- a/pidgin/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -214,7 +214,6 @@
 endif
 
 AM_CPPFLAGS = \
-	-DBR_PTHREADS=0 \
 	-DDATADIR=\"$(datadir)\" \
 	-DLIBDIR=\"$(libdir)/pidgin/\" \
 	-DLOCALEDIR=\"$(datadir)/locale\" \
--- a/pidgin/gtkblist-theme.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkblist-theme.c	Wed Sep 16 15:36:24 2009 +0000
@@ -373,70 +373,94 @@
 	g_object_class_install_property(obj_class, PROP_BACKGROUND_COLOR, pspec);
 
 	pspec = g_param_spec_pointer("layout", _("Layout"),
-			_("The layout of icons, name, and status of the blist"),
+			_("The layout of icons, name, and status of the buddy list"),
 			G_PARAM_READWRITE);
 
 	g_object_class_install_property(obj_class, PROP_LAYOUT, pspec);
 
 	/* Group */
+	/* Note to translators: These two strings refer to the background color
+	   of a buddy list group when in its expanded state */
 	pspec = g_param_spec_boxed("expanded-color", _("Expanded Background Color"),
 			_("The background color of an expanded group"),
 			GDK_TYPE_COLOR, G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_EXPANDED_COLOR, pspec);
 
+	/* Note to translators: These two strings refer to the font and color
+	   of a buddy list group when in its expanded state */
 	pspec = g_param_spec_pointer("expanded-text", _("Expanded Text"),
 			_("The text information for when a group is expanded"),
 			G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_EXPANDED_TEXT, pspec);
 
+	/* Note to translators: These two strings refer to the background color
+	   of a buddy list group when in its collapsed state */
 	pspec = g_param_spec_boxed("collapsed-color", _("Collapsed Background Color"),
 			_("The background color of a collapsed group"),
 			GDK_TYPE_COLOR, G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_COLLAPSED_COLOR, pspec);
 
+	/* Note to translators: These two strings refer to the font and color
+	   of a buddy list group when in its collapsed state */
 	pspec = g_param_spec_pointer("collapsed-text", _("Collapsed Text"),
 			_("The text information for when a group is collapsed"),
 			G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_COLLAPSED_TEXT, pspec);
 
 	/* Buddy */
+	/* Note to translators: These two strings refer to the background color
+	   of a buddy list contact or chat room */
 	pspec = g_param_spec_boxed("contact-color", _("Contact/Chat Background Color"),
 			_("The background color of a contact or chat"),
 			GDK_TYPE_COLOR, G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_CONTACT_COLOR, pspec);
 
+	/* Note to translators: These two strings refer to the font and color
+	   of a buddy list contact when in its expanded state */
 	pspec = g_param_spec_pointer("contact", _("Contact Text"),
 			_("The text information for when a contact is expanded"),
 			G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_CONTACT, pspec);
 
-	pspec = g_param_spec_pointer("online", _("On-line Text"),
+	/* Note to translators: These two strings refer to the font and color
+	   of a buddy list buddy when it is online */
+	pspec = g_param_spec_pointer("online", _("Online Text"),
 			_("The text information for when a buddy is online"),
 			G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_ONLINE, pspec);
 
+	/* Note to translators: These two strings refer to the font and color
+	   of a buddy list buddy when it is away */
 	pspec = g_param_spec_pointer("away", _("Away Text"),
 			_("The text information for when a buddy is away"),
 			G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_AWAY, pspec);
 
-	pspec = g_param_spec_pointer("offline", _("Off-line Text"),
-			_("The text information for when a buddy is off-line"),
+	/* Note to translators: These two strings refer to the font and color
+	   of a buddy list buddy when it is offline */
+	pspec = g_param_spec_pointer("offline", _("Offline Text"),
+			_("The text information for when a buddy is offline"),
 			G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_OFFLINE, pspec);
 
+	/* Note to translators: These two strings refer to the font and color
+	   of a buddy list buddy when it is idle */
 	pspec = g_param_spec_pointer("idle", _("Idle Text"),
 			_("The text information for when a buddy is idle"),
 			G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_IDLE, pspec);
 
+	/* Note to translators: These two strings refer to the font and color
+	   of a buddy list buddy when they have sent you a new message */
 	pspec = g_param_spec_pointer("message", _("Message Text"),
 			_("The text information for when a buddy has an unread message"),
 			G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_MESSAGE, pspec);
 
+	/* Note to translators: These two strings refer to the font and color
+	   of a buddy list buddy when they have sent you a new message */
 	pspec = g_param_spec_pointer("message_nick_said", _("Message (Nick Said) Text"),
-			_("The text information for when a chat has an unread message that mentions your nick"),
+			_("The text information for when a chat has an unread message that mentions your nickname"),
 			G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_MESSAGE_NICK_SAID, pspec);
 
--- a/pidgin/gtkblist.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkblist.c	Wed Sep 16 15:36:24 2009 +0000
@@ -501,10 +501,12 @@
 
 		type = purple_blist_node_get_type(node);
 
-		if(type == PURPLE_BLIST_BUDDY_NODE)
+		if (type == PURPLE_BLIST_BUDDY_NODE) {
 			node = purple_blist_node_get_parent(node);
-
-		if(type == PURPLE_BLIST_CONTACT_NODE)
+			type = purple_blist_node_get_type(node);
+		}
+
+		if (type != PURPLE_BLIST_CONTACT_NODE)
 			continue;
 
 		for (b = purple_blist_node_get_first_child(node);
@@ -622,7 +624,14 @@
 				struct _pidgin_blist_node *gtknode =
 					(struct _pidgin_blist_node *)purple_blist_node_get_ui_data(node);
 
-				if (purple_contact_get_alias(contact) || gtknode->contact_expanded) {
+				/*
+				 * XXX Using purple_contact_get_alias here breaks because we
+				 * specifically want to check the contact alias only (i.e. not
+				 * the priority buddy, which purple_contact_get_alias does).
+				 * Adding yet another get_alias is evil, so figure this out
+				 * later :-P
+				 */
+				if (contact->alias || gtknode->contact_expanded) {
 					purple_blist_alias_contact(contact, arg2);
 					gtk_blist_auto_personize(purple_blist_node_get_parent(node), arg2);
 				} else {
@@ -4090,7 +4099,7 @@
 				else
 					g_snprintf(buf, sizeof(buf), "%%s ");
 
-				statustext = g_strdup_printf(buf, tmp);purple_presence_is_idle(presence)
+				statustext = g_strdup_printf(buf, tmp);
 
 				g_free(tmp);
 			}
@@ -4141,6 +4150,7 @@
 			name_color = "dim grey";
 		} else if (!purple_presence_is_online(presence)) {
 			namefont = pidgin_blist_theme_get_offline_text_info(theme);
+			name_color = "dim grey";
 			statusfont = pidgin_blist_theme_get_status_text_info(theme);
 		} else if (purple_presence_is_available(presence)) {
 			namefont = pidgin_blist_theme_get_online_text_info(theme);
@@ -4149,6 +4159,13 @@
 			namefont = pidgin_blist_theme_get_away_text_info(theme);
 			statusfont = pidgin_blist_theme_get_status_text_info(theme);
 		}
+	} else {
+		if (!selected
+				&& (purple_presence_is_idle(presence)
+							|| !purple_presence_is_online(presence)))
+		{
+			name_color = "dim grey";
+		}
 	}
 
 	name_color = theme_font_get_color_default(namefont, name_color);
@@ -6398,10 +6415,13 @@
 			ihrs = (t - idle_secs) / 3600;
 			imin = ((t - idle_secs) / 60) % 60;
 
-			if (!selected && theme != NULL && (pair = pidgin_blist_theme_get_idle_text_info(theme)) != NULL)
+			if (selected)
+				textcolor = NULL;
+			else if (theme != NULL && (pair = pidgin_blist_theme_get_idle_text_info(theme)) != NULL)
 				textcolor = pidgin_theme_font_get_color_describe(pair);
 			else
-				textcolor = NULL;
+				/* If no theme them default to making idle buddy names grey */
+				textcolor = "dim grey";
 
 			if (textcolor) {
 				idle = g_strdup_printf("<span color='%s' font_desc='%s'>%d:%02d</span>",
@@ -6493,7 +6513,7 @@
 			gchar *mark, *tmp;
 			const gchar *fg_color, *font;
 			GdkColor *color = NULL;
-			PidginBlistTheme *theme = pidgin_blist_get_theme();
+			PidginBlistTheme *theme;
 			PidginThemeFont *pair;
 			gboolean selected = (gtkblist->selected_node == cnode);
 
@@ -7130,7 +7150,7 @@
 	                          data->chat_data.rq_data.sg, data->group_combo,
 	                          TRUE, NULL);
 
-	data->autojoin = gtk_check_button_new_with_mnemonic(_("Auto_join when account becomes online."));
+	data->autojoin = gtk_check_button_new_with_mnemonic(_("Auto_join when account connects."));
 	data->persistent = gtk_check_button_new_with_mnemonic(_("_Remain in chat after window is closed."));
 	gtk_box_pack_start(GTK_BOX(vbox), data->autojoin, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(vbox), data->persistent, FALSE, FALSE, 0);
--- a/pidgin/gtkcertmgr.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkcertmgr.c	Wed Sep 16 15:36:24 2009 +0000
@@ -144,12 +144,12 @@
 tls_peers_mgmt_import_ok2_cb(gpointer data, const char *result)
 {
 	PurpleCertificate *crt = (PurpleCertificate *) data;
-	const char *id = result;
 
 	/* TODO: Perhaps prompt if you're overwriting a cert? */
 
 	/* Drop the certificate into the pool */
-	purple_certificate_pool_store(tpm_dat->tls_peers, id, crt);
+	if (result && *result)
+		purple_certificate_pool_store(tpm_dat->tls_peers, result, crt);
 
 	/* And this certificate is not needed any more */
 	purple_certificate_destroy(crt);
--- a/pidgin/gtkconv.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkconv.c	Wed Sep 16 15:36:24 2009 +0000
@@ -327,23 +327,43 @@
                  const char *cmd, char **args, char **error, void *data)
 {
 	char *tmp, *markup;
-	PurpleCmdStatus status;
 
 	if (!g_ascii_strcasecmp(args[0], "version")) {
-		tmp = g_strdup_printf("me is using Pidgin v%s with libpurple v%s.",
+		tmp = g_strdup_printf("Using Pidgin v%s with libpurple v%s.",
 				DISPLAY_VERSION, purple_core_get_version());
-		markup = g_markup_escape_text(tmp, -1);
-
-		status = purple_cmd_do_command(conv, tmp, markup, error);
-
-		g_free(tmp);
-		g_free(markup);
-		return status;
+	} else if (!g_ascii_strcasecmp(args[0], "plugins")) {
+		/* Show all the loaded plugins, including the protocol plugins and plugin loaders.
+		 * This is intentional, since third party prpls are often sources of bugs, and some
+		 * plugin loaders (e.g. mono) can also be buggy.
+		 */
+		GString *str = g_string_new("Loaded Plugins: ");
+		const GList *plugins = purple_plugins_get_loaded();
+		if (plugins) {
+			for (; plugins; plugins = plugins->next) {
+				str = g_string_append(str, purple_plugin_get_name(plugins->data));
+				if (plugins->next)
+					str = g_string_append(str, ", ");
+			}
+		} else {
+			str = g_string_append(str, "(none)");
+		}
+
+		tmp = g_string_free(str, FALSE);
 	} else {
-		purple_conversation_write(conv, NULL, _("Supported debug options are:  version"),
+		purple_conversation_write(conv, NULL, _("Supported debug options are: plugins version"),
 		                        PURPLE_MESSAGE_NO_LOG|PURPLE_MESSAGE_ERROR, time(NULL));
-		return PURPLE_CMD_STATUS_OK;
-	}
+		return PURPLE_CMD_RET_OK;
+	}
+
+	markup = g_markup_escape_text(tmp, -1);
+	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)
+		purple_conv_im_send(PURPLE_CONV_IM(conv), markup);
+	else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT)
+		purple_conv_chat_send(PURPLE_CONV_CHAT(conv), markup);
+
+	g_free(tmp);
+	g_free(markup);
+	return PURPLE_CMD_RET_OK;
 }
 
 static void clear_conversation_scrollback(PurpleConversation *conv)
@@ -363,7 +383,7 @@
                  const char *cmd, char **args, char **error, void *data)
 {
 	clear_conversation_scrollback(conv);
-	return PURPLE_CMD_STATUS_OK;
+	return PURPLE_CMD_RET_OK;
 }
 
 static PurpleCmdRet
@@ -371,7 +391,7 @@
                  const char *cmd, char **args, char **error, void *data)
 {
 	purple_conversation_foreach(clear_conversation_scrollback);
-	return PURPLE_CMD_STATUS_OK;
+	return PURPLE_CMD_RET_OK;
 }
 
 static PurpleCmdRet
@@ -410,7 +430,7 @@
 	purple_conversation_write(conv, NULL, s->str, PURPLE_MESSAGE_NO_LOG, time(NULL));
 	g_string_free(s, TRUE);
 
-	return PURPLE_CMD_STATUS_OK;
+	return PURPLE_CMD_RET_OK;
 }
 
 static void
@@ -959,6 +979,12 @@
 }
 
 static void
+menu_join_chat_cb(gpointer data, guint action, GtkWidget *widget)
+{
+	pidgin_blist_joinchat_show();
+}
+
+static void
 savelog_writefile_cb(void *user_data, const char *filename)
 {
 	PurpleConversation *conv = (PurpleConversation *)user_data;
@@ -3133,6 +3159,8 @@
 
 	{ N_("/Conversation/New Instant _Message..."), "<CTL>M", menu_new_conv_cb,
 			0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW },
+	{ N_("/Conversation/Join a _Chat..."), NULL, menu_join_chat_cb,
+			0, "<StockItem>", PIDGIN_STOCK_CHAT },
 
 	{ "/Conversation/sep0", NULL, NULL, 0, "<Separator>", NULL },
 
@@ -3859,7 +3887,7 @@
 	gtk_size_group_add_widget(sg, image);
 
 	/* Make our menu item */
-	text = g_strdup_printf("%s (%s)", name, purple_account_get_username(account));
+	text = g_strdup_printf("%s (%s)", name, purple_account_get_name_for_display(account));
 	menuitem = gtk_radio_menu_item_new_with_label(*group, text);
 	g_free(text);
 	*group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem));
@@ -7269,7 +7297,8 @@
 			pidgin_setup_gtkspell(GTK_TEXT_VIEW(gtkconv->entry));
 		else {
 			spell = gtkspell_get_from_text_view(GTK_TEXT_VIEW(gtkconv->entry));
-			gtkspell_detach(spell);
+			if (spell)
+				gtkspell_detach(spell);
 		}
 	}
 #endif
--- a/pidgin/gtkdialogs.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkdialogs.c	Wed Sep 16 15:36:24 2009 +0000
@@ -170,9 +170,7 @@
 	{N_("Esperanto"),           "eo", "Stéphane Fillod", "fillods@users.sourceforge.net"},
 	{N_("Spanish"),             "es", "Javier Fernández-Sanguino Peña", "jfs@debian.org"},
 	{N_("Estonian"),            "et", "Ivar Smolin", "okul@linux.ee"},
-	{N_("Euskera(Basque)"),     "eu", "Mikel Pascual Aldabaldetreku", "mikel.paskual@gmail.com"},
-	{N_("Euskera(Basque)"),     "eu", "Iñaki Larrañaga Murgoitio", "dooteo@zundan.com"},
-	{N_("Euskera(Basque)"),     "eu", "Hizkuntza Politikarako Sailburuordetza", "hizkpol@ej-gv.es"},
+	{N_("Basque"),              "eu", "Mikel Pascual Aldabaldetreku", "mikel.paskual@gmail.com"},
 	{N_("Persian"),             "fa", "Elnaz Sarbar", "elnaz@farsiweb.info"},
 	{N_("Persian"),             "fa", "Meelad Zakaria", "meelad@farsiweb.info"},
 	{N_("Persian"),             "fa", "Roozbeh Pournader ", "roozbeh@farsiweb.info"},
@@ -232,7 +230,7 @@
 	{N_("Turkish"),             "tr", "Serdar Soytetir", "tulliana@gmail.com"},
 	{N_("Urdu"),                "ur", "RKVS Raman", "rkvsraman@gmail.com"},
 	{N_("Vietnamese"),          "vi", N_("T.M.Thanh and the Gnome-Vi Team"), "gnomevi-list@lists.sf.net"},
-	{N_("Simplified Chinese"),  "zh_CN", "Aron Xu", "aronmalache@163.com"},
+	{N_("Simplified Chinese"),  "zh_CN", "Aron Xu", "happyaron.xu@gmail.com"},
 	{N_("Hong Kong Chinese"),   "zh_HK", "Abel Cheung", "abelindsay@gmail.com"},
 	{N_("Hong Kong Chinese"),   "zh_HK", "Ambrose C. Li", "acli@ada.dhs.org"},
 	{N_("Hong Kong Chinese"),   "zh_HK", "Paladin R. Liu", "paladin@ms1.hinet.net"},
@@ -257,6 +255,8 @@
 	{N_("Spanish"),             "es", "Nicolás Lichtmaier", NULL},
 	{N_("Spanish"),             "es", "Amaya Rodrigo", NULL},
 	{N_("Spanish"),             "es", "Alejandro G Villar", NULL},
+	{N_("Basque"),              "eu", "Iñaki Larrañaga Murgoitio", "dooteo@zundan.com"},
+	{N_("Basque"),              "eu", "Hizkuntza Politikarako Sailburuordetza", "hizkpol@ej-gv.es"},
 	{N_("Finnish"),             "fi", "Arto Alakulju", NULL},
 	{N_("Finnish"),             "fi", "Tero Kuusela", NULL},
 	{N_("French"),              "fr", "Sébastien François", NULL},
@@ -470,9 +470,15 @@
 	g_string_append_printf(str, _("<FONT SIZE=\"4\">FAQ:</FONT> <A HREF=\""
 				"http://developer.pidgin.im/wiki/FAQ\">"
 				"http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>"));
-	g_string_append_printf(str, _("<FONT SIZE=\"4\">Help via e-mail:</FONT>"
-				" <A HREF=\"mailto:support@pidgin.im\">support@pidgin.im</A>"
-				"<BR/><BR/>"));
+	g_string_append_printf(str,
+			_("<font size=\"4\">Help from other Pidgin users:</font> "
+			"<a href=\"mailto:support@pidgin.im\">support@pidgin.im</a><br/>"
+			"This is a <b>public</b> mailing list! "
+			"(<a href=\"http://pidgin.im/pipermail/support/\">archive</a>)<br/>"
+			"We can't help with 3rd party protocols or plugins!<br/>"
+			"This list's primary language is <b>English</b>.  You are "
+			"welcome to post in another language, but the responses may "
+			"be less helpful.<br/><br/>"));
 	g_string_append_printf(str, _("<FONT SIZE=\"4\">IRC Channel:</FONT> "
 				"#pidgin on irc.freenode.net<BR><BR>"));
 	g_string_append_printf(str, _("<FONT SIZE=\"4\">XMPP MUC:</FONT> "
--- a/pidgin/gtkimhtml.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkimhtml.h	Wed Sep 16 15:36:24 2009 +0000
@@ -188,8 +188,8 @@
 	GSList *anchors;
 	GtkIMHtmlSmileyFlags flags;
 	GtkIMHtml *imhtml;
-	gpointer data;       /** @Since 2.6.0 */
-	gsize datasize;      /** @Since 2.6.0 */
+	gpointer data;       /** @since 2.6.0 */
+	gsize datasize;      /** @since 2.6.0 */
 };
 
 struct _GtkIMHtmlScalable {
@@ -906,7 +906,7 @@
  *                      @c TRUE if the request for context menu was processed
  *                      successfully, @c FALSE otherwise.
  *
- * @return  @c TRUE if the protocol was successfully registered (or unregistered, when #activate is @c NULL)
+ * @return  @c TRUE if the protocol was successfully registered (or unregistered, when \a activate is @c NULL)
  *
  * @since 2.6.0
  */
--- a/pidgin/gtkimhtmltoolbar.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkimhtmltoolbar.c	Wed Sep 16 15:36:24 2009 +0000
@@ -133,22 +133,30 @@
 	destroy_toolbar_font(widget, NULL, toolbar);
 }
 
-static void apply_font(GtkWidget *widget, GtkFontSelection *fontsel)
+static void
+apply_font(GtkWidget *widget, GtkFontSelectionDialog *fontsel)
 {
 	/* this could be expanded to include font size, weight, etc.
 	   but for now only works with font face */
-	char *fontname;
-	char *space;
-	GtkIMHtmlToolbar *toolbar =  g_object_get_data(G_OBJECT(fontsel), "purple_toolbar");
+	gchar *fontname = gtk_font_selection_dialog_get_font_name(fontsel);
+	GtkIMHtmlToolbar *toolbar = g_object_get_data(G_OBJECT(fontsel),
+	                                              "purple_toolbar");
 
-	fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(fontsel));
+	if (fontname) {
+		const gchar *family_name = NULL;
+		PangoFontDescription *desc = NULL;
 
-	space = strrchr(fontname, ' ');
-	if(space && isdigit(*(space+1)))
-		*space = '\0';
+		desc = pango_font_description_from_string(fontname);
+		family_name = pango_font_description_get_family(desc);
 
-	gtk_imhtml_toggle_fontface(GTK_IMHTML(toolbar->imhtml), fontname);
-	g_free(fontname);
+		if (family_name) {
+			gtk_imhtml_toggle_fontface(GTK_IMHTML(toolbar->imhtml),
+			                           family_name);
+		}
+
+		pango_font_description_free(desc);
+		g_free(fontname);
+	}
 
 	cancel_toolbar_font(NULL, toolbar);
 }
@@ -1224,13 +1232,14 @@
 		{PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER, do_small, &toolbar->smaller_size, _("Decrease Font Size")},
 		{"", NULL, NULL, NULL},
 		{PIDGIN_STOCK_TOOLBAR_FONT_FACE, toggle_font, &toolbar->font, _("Font Face")},
+		{PIDGIN_STOCK_TOOLBAR_FGCOLOR, toggle_fg_color, &toolbar->fgcolor, _("Foreground Color")},
 		{PIDGIN_STOCK_TOOLBAR_BGCOLOR, toggle_bg_color, &toolbar->bgcolor, _("Background Color")},
-		{PIDGIN_STOCK_TOOLBAR_FGCOLOR, toggle_fg_color, &toolbar->fgcolor, _("Foreground Color")},
 		{"", NULL, NULL, NULL},
 		{PIDGIN_STOCK_CLEAR, clear_formatting_cb, &toolbar->clear, _("Reset Formatting")},
 		{"", NULL, NULL, NULL},
+		{PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, insert_image_cb, &toolbar->image, _("Insert IM Image")},
 		{PIDGIN_STOCK_TOOLBAR_INSERT_LINK, insert_link_cb, &toolbar->link, _("Insert Link")},
-		{PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, insert_image_cb, &toolbar->image, _("Insert IM Image")},
+		{"", NULL, NULL, NULL},
 		{PIDGIN_STOCK_TOOLBAR_SMILEY, insert_smiley_cb, &toolbar->smiley, _("Insert Smiley")},
 		{NULL, NULL, NULL, NULL}
 	};
--- a/pidgin/gtkmain.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkmain.c	Wed Sep 16 15:36:24 2009 +0000
@@ -406,34 +406,35 @@
 	if (terse) {
 		text = g_strdup_printf(_("%s %s. Try `%s -h' for more information.\n"), PIDGIN_NAME, DISPLAY_VERSION, name);
 	} else {
+		GString *str = g_string_new(NULL);
+		g_string_append_printf(str, "%s %s\n", PIDGIN_NAME, DISPLAY_VERSION);
+		g_string_append_printf(str, _("Usage: %s [OPTION]...\n\n"), name);
+		g_string_append_printf(str, "  -c, --config=%s    %s\n",
+				_("DIR"), _("use DIR for config files"));
+		g_string_append_printf(str, "  -d, --debug         %s\n",
+				_("print debugging messages to stdout"));
+		g_string_append_printf(str, "  -f, --force-online  %s\n",
+				_("force online, regardless of network status"));
+		g_string_append_printf(str, "  -h, --help          %s\n",
+				_("display this help and exit"));
+		g_string_append_printf(str, "  -m, --multiple      %s\n",
+				_("allow multiple instances"));
+		g_string_append_printf(str, "  -n, --nologin       %s\n",
+				_("don't automatically login"));
+		g_string_append_printf(str, "  -l, --login[=%s]  %s\n",
+				_("NAME"),
+				_("enable specified account(s) (optional argument NAME\n"
+				  "                      "
+				  "specifies account(s) to use, separated by commas.\n"
+				  "                      "
+				  "Without this only the first account will be enabled)."));
 #ifndef WIN32
-		text = g_strdup_printf(_("%s %s\n"
-		       "Usage: %s [OPTION]...\n\n"
-		       "  -c, --config=DIR    use DIR for config files\n"
-		       "  -d, --debug         print debugging messages to stdout\n"
-		       "  -f, --force-online  force online, regardless of network status\n"
-		       "  -h, --help          display this help and exit\n"
-		       "  -m, --multiple      do not ensure single instance\n"
-		       "  -n, --nologin       don't automatically login\n"
-		       "  -l, --login[=NAME]  enable specified account(s) (optional argument NAME\n"
-		       "                      specifies account(s) to use, separated by commas.\n"
-		       "                      Without this only the first account will be enabled).\n"
-		       "  --display=DISPLAY   X display to use\n"
-		       "  -v, --version       display the current version and exit\n"), PIDGIN_NAME, DISPLAY_VERSION, name);
-#else
-		text = g_strdup_printf(_("%s %s\n"
-		       "Usage: %s [OPTION]...\n\n"
-		       "  -c, --config=DIR    use DIR for config files\n"
-		       "  -d, --debug         print debugging messages to stdout\n"
-		       "  -f, --force-online  force online, regardless of network status\n"
-		       "  -h, --help          display this help and exit\n"
-		       "  -m, --multiple      do not ensure single instance\n"
-		       "  -n, --nologin       don't automatically login\n"
-		       "  -l, --login[=NAME]  enable specified account(s) (optional argument NAME\n"
-		       "                      specifies account(s) to use, separated by commas.\n"
-		       "                      Without this only the first account will be enabled).\n"
-		       "  -v, --version       display the current version and exit\n"), PIDGIN_NAME, DISPLAY_VERSION, name);
-#endif
+		g_string_append_printf(str, "  --display=DISPLAY   %s\n",
+				_("X display to use"));
+#endif /* !WIN32 */
+		g_string_append_printf(str, "  -v, --version       %s\n",
+				_("display the current version and exit"));
+		text = g_string_free(str, FALSE);
 	}
 
 	purple_print_utf8_to_console(stdout, text);
--- a/pidgin/gtkmedia.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkmedia.c	Wed Sep 16 15:36:24 2009 +0000
@@ -20,7 +20,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
 #include <string.h>
@@ -34,6 +34,7 @@
 
 #include "gtkmedia.h"
 #include "gtkutils.h"
+#include "pidginstock.h"
 
 #ifdef USE_VV
 #include "media-gst.h"
@@ -499,13 +500,14 @@
 	}
 
 	gtkmedia->priv->request_type = PURPLE_MEDIA_NONE;
-
-	purple_request_accept_cancel(gtkmedia, _("Incoming Call"),
-			message, NULL, PURPLE_DEFAULT_ACTION_NONE,
-			(void*)account, gtkmedia->priv->screenname, NULL,
-			gtkmedia->priv->media,
-			pidgin_media_accept_cb,
-			pidgin_media_reject_cb);
+	if (!purple_media_accepted(gtkmedia->priv->media, NULL, NULL)) {
+		purple_request_accept_cancel(gtkmedia, _("Incoming Call"),
+				message, NULL, PURPLE_DEFAULT_ACTION_NONE,
+				(void*)account, gtkmedia->priv->screenname,
+				NULL, gtkmedia->priv->media,
+				pidgin_media_accept_cb,
+				pidgin_media_reject_cb);
+	}
 	pidgin_media_emit_message(gtkmedia, message);
 	g_free(message);
 	return FALSE;
@@ -609,6 +611,7 @@
 	GtkWidget *send_widget = NULL, *recv_widget = NULL, *button_widget = NULL;
 	PurpleMediaSessionType type =
 			purple_media_get_session_type(media, sid);
+	GdkPixbuf *icon = NULL;
 
 	if (gtkmedia->priv->recv_widget == NULL
 			&& type & (PURPLE_MEDIA_RECV_VIDEO |
@@ -742,6 +745,22 @@
 				gtkmedia);
 	}
 
+	/* set the window icon according to the type */
+	if (type & PURPLE_MEDIA_VIDEO) {
+		icon = gtk_widget_render_icon(GTK_WIDGET(gtkmedia),
+			PIDGIN_STOCK_TOOLBAR_VIDEO_CALL,
+			gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_LARGE), NULL);
+	} else if (type & PURPLE_MEDIA_AUDIO) {
+		icon = gtk_widget_render_icon(GTK_WIDGET(gtkmedia),
+			PIDGIN_STOCK_TOOLBAR_AUDIO_CALL,
+			gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_LARGE), NULL);
+	}
+
+	if (icon) {
+		gtk_window_set_icon(GTK_WINDOW(gtkmedia), icon);
+		g_object_unref(icon);
+	}
+	
 	gtk_widget_show(gtkmedia->priv->display);
 }
 
@@ -772,6 +791,8 @@
 		pidgin_media_emit_message(gtkmedia,
 				_("You have rejected the call."));
 	} else if (type == PURPLE_MEDIA_INFO_ACCEPT) {
+		if (local == TRUE)
+			purple_request_close_with_handle(gtkmedia);
 		pidgin_media_set_state(gtkmedia, PIDGIN_MEDIA_ACCEPTED);
 		pidgin_media_emit_message(gtkmedia, _("Call in progress."));
 		gtk_statusbar_push(GTK_STATUSBAR(gtkmedia->priv->statusbar),
--- a/pidgin/gtkmedia.h	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkmedia.h	Wed Sep 16 15:36:24 2009 +0000
@@ -21,7 +21,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA
  */
 
 #ifndef __GTKMEDIA_H_
--- a/pidgin/gtknotify.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtknotify.c	Wed Sep 16 15:36:24 2009 +0000
@@ -60,6 +60,7 @@
 {
 	PurpleAccount *account;
 	PurplePounce *pounce;
+	char *pouncee;
 } PidginNotifyPounceData;
 
 
@@ -155,6 +156,7 @@
 				-1);
 		gtk_tree_store_remove(dialog->treemodel, &iter);
 
+		g_free(pounce_data->pouncee);
 		g_free(pounce_data);
 	}
 
@@ -173,8 +175,29 @@
 			PIDGIN_POUNCE_DATA, &pounce_data,
 			-1);
 
-	if (pounce_data != NULL)
+	if (pounce_data != NULL) {
+		g_free(pounce_data->pouncee);
 		g_free(pounce_data);
+	}
+}
+
+static void
+open_im_foreach(GtkTreeModel *model, GtkTreePath *path,
+		GtkTreeIter *iter, gpointer data)
+{
+	PidginNotifyPounceData *pounce_data;
+
+	gtk_tree_model_get(model, iter,
+			PIDGIN_POUNCE_DATA, &pounce_data,
+			-1);
+
+	if (pounce_data != NULL) {
+		PurpleConversation *conv;
+
+		conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
+				pounce_data->account, pounce_data->pouncee);
+		purple_conversation_present(conv);
+	}
 }
 
 static void
@@ -184,25 +207,69 @@
 	GList **list = data;
 	*list = g_list_prepend(*list, gtk_tree_path_copy(path));
 }
+
 static void
 pounce_response_dismiss()
 {
+	GtkTreeModel *model = GTK_TREE_MODEL(pounce_dialog->treemodel);
 	GtkTreeSelection *selection;
+	GtkTreeIter iter;
+	GtkTreeIter new_selection;
 	GList *list = NULL;
+	gboolean found_selection = FALSE;
 
 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pounce_dialog->treeview));
 	gtk_tree_selection_selected_foreach(selection, delete_foreach, pounce_dialog);
 	gtk_tree_selection_selected_foreach(selection, append_to_list, &list);
 
+	g_return_if_fail(list != NULL);
+
+	if (list->next == NULL) {
+		gtk_tree_model_get_iter(model, &new_selection, list->data);
+		if (gtk_tree_model_iter_next(model, &new_selection))
+			found_selection = TRUE;
+		else {
+			/* This is the last thing in the list */
+			GtkTreePath *path;
+
+			/* Because gtk_tree_model_iter_prev doesn't exist... */
+			gtk_tree_model_get_iter(model, &new_selection, list->data);
+			path = gtk_tree_model_get_path(model, &new_selection);
+			if (gtk_tree_path_prev(path)) {
+				gtk_tree_model_get_iter(model, &new_selection, path);
+				found_selection = TRUE;
+			}
+
+			gtk_tree_path_free(path);
+		}
+	}
+
 	while (list) {
-		GtkTreeIter iter;
-		if (gtk_tree_model_get_iter(GTK_TREE_MODEL(pounce_dialog->treemodel), &iter,
-					list->data)) {
+		if (gtk_tree_model_get_iter(model, &iter, list->data)) {
 			gtk_tree_store_remove(GTK_TREE_STORE(pounce_dialog->treemodel), &iter);
 		}
 		gtk_tree_path_free(list->data);
 		list = g_list_delete_link(list, list);
 	}
+
+	if (gtk_tree_model_get_iter_first(model, &iter)) {
+		if (found_selection)
+			gtk_tree_selection_select_iter(selection, &new_selection);
+		else
+			gtk_tree_selection_select_iter(selection, &iter);
+	} else
+		pounce_response_close(pounce_dialog);
+}
+
+static void
+pounce_response_open_ims()
+{
+	GtkTreeSelection *selection;
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pounce_dialog->treeview));
+	gtk_tree_selection_selected_foreach(selection, open_im_foreach, pounce_dialog);
+
+	pounce_response_dismiss();
 }
 
 static void
@@ -241,6 +308,9 @@
 		case GTK_RESPONSE_DELETE_EVENT:
 			pounce_response_close(dialog);
 			break;
+		case GTK_RESPONSE_YES:
+			pounce_response_open_ims();
+			break;
 		case GTK_RESPONSE_NO:
 			pounce_response_dismiss();
 			break;
@@ -256,40 +326,47 @@
 pounce_row_selected_cb(GtkTreeView *tv, GtkTreePath *path,
 	GtkTreeViewColumn *col, gpointer data)
 {
-	GtkTreeIter iter;
 	GtkTreeSelection *selection;
-	gboolean selected;
-	GList *list;
+	int count;
 
 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pounce_dialog->treeview));
 
-	selected = gtk_tree_selection_get_selected(selection,
-			NULL, &iter);
+	count = gtk_tree_selection_count_selected_rows(selection);
 
-	if (selected) {
-		PurplePounce *pounce;
+	if (count == 0) {
+		gtk_widget_set_sensitive(pounce_dialog->open_button, FALSE);
+		gtk_widget_set_sensitive(pounce_dialog->edit_button, FALSE);
+		gtk_widget_set_sensitive(pounce_dialog->dismiss_button, FALSE);
+	} else if (count == 1) {
+		GList *pounces;
+		GList *list;
 		PidginNotifyPounceData *pounce_data;
+		GtkTreeIter iter;
 
-		list = purple_pounces_get_all();
-
+		list = gtk_tree_selection_get_selected_rows(selection, NULL);
+		gtk_tree_model_get_iter(GTK_TREE_MODEL(pounce_dialog->treemodel),
+				&iter, list->data);
 		gtk_tree_model_get(GTK_TREE_MODEL(pounce_dialog->treemodel), &iter,
 				PIDGIN_POUNCE_DATA, &pounce_data,
 				-1);
-
-		gtk_widget_set_sensitive(pounce_dialog->edit_button, FALSE);
+		g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
+		g_list_free(list);
 
-		for (; list != NULL; list = list->next) {
-			pounce = list->data;
+		pounces = purple_pounces_get_all();
+		for (; pounces != NULL; pounces = pounces->next) {
+			PurplePounce *pounce = pounces->data;
 			if (pounce == pounce_data->pounce) {
 				gtk_widget_set_sensitive(pounce_dialog->edit_button, TRUE);
 				break;
 			}
 		}
 
+		gtk_widget_set_sensitive(pounce_dialog->open_button, TRUE);
 		gtk_widget_set_sensitive(pounce_dialog->dismiss_button, TRUE);
 	} else {
+		gtk_widget_set_sensitive(pounce_dialog->open_button, TRUE);
 		gtk_widget_set_sensitive(pounce_dialog->edit_button, FALSE);
-		gtk_widget_set_sensitive(pounce_dialog->dismiss_button, FALSE);
+		gtk_widget_set_sensitive(pounce_dialog->dismiss_button, TRUE);
 	}
 
 
@@ -1351,6 +1428,7 @@
 	GdkPixbuf *icon;
 	GtkTreeIter iter;
 	PidginNotifyPounceData *pounce_data;
+	gboolean first = (pounce_dialog == NULL);
 
 	if (pounce_dialog == NULL)
 		pounce_dialog = pidgin_create_notification_dialog(PIDGIN_NOTIFY_POUNCE);
@@ -1361,6 +1439,7 @@
 
 	pounce_data->account = account;
 	pounce_data->pounce = pounce;
+	pounce_data->pouncee = g_strdup(purple_pounce_get_pouncee(pounce));
 
 	gtk_tree_store_append(pounce_dialog->treemodel, &iter, NULL);
 
@@ -1373,6 +1452,12 @@
 			PIDGIN_POUNCE_DATA, pounce_data,
 			-1);
 
+	if (first) {
+		GtkTreeSelection *selection =
+				gtk_tree_view_get_selection(GTK_TREE_VIEW(pounce_dialog->treeview));
+		gtk_tree_selection_select_iter(selection, &iter);
+	}
+
 	if (icon)
 		g_object_unref(icon);
 
@@ -1411,9 +1496,7 @@
 				G_TYPE_STRING, G_TYPE_POINTER);
 	}
 
-	dialog = gtk_dialog_new_with_buttons(NULL, NULL, 0,
-			GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
-			NULL);
+	dialog = gtk_dialog_new();
 
 	/* Setup the dialog */
 	gtk_container_set_border_width(GTK_CONTAINER(dialog), PIDGIN_HIG_BOX_SPACE);
@@ -1484,15 +1567,20 @@
 		gtk_window_set_title(GTK_WINDOW(dialog), _("New Pounces"));
 
 		button = gtk_dialog_add_button(GTK_DIALOG(dialog),
+						_("IM"), GTK_RESPONSE_YES);
+		gtk_widget_set_sensitive(button, FALSE);
+		spec_dialog->open_button = button;
+
+		button = gtk_dialog_add_button(GTK_DIALOG(dialog),
+						PIDGIN_STOCK_MODIFY, GTK_RESPONSE_APPLY);
+		gtk_widget_set_sensitive(button, FALSE);
+		spec_dialog->edit_button = button;
+
+		button = gtk_dialog_add_button(GTK_DIALOG(dialog),
 						_("Dismiss"), GTK_RESPONSE_NO);
 		gtk_widget_set_sensitive(button, FALSE);
 		spec_dialog->dismiss_button = button;
 
-		button = gtk_dialog_add_button(GTK_DIALOG(dialog),
-						PIDGIN_STOCK_EDIT, GTK_RESPONSE_APPLY);
-		gtk_widget_set_sensitive(button, FALSE);
-		spec_dialog->edit_button = button;
-
 		g_signal_connect(G_OBJECT(dialog), "response",
 						 G_CALLBACK(pounce_response_cb), spec_dialog);
 
@@ -1536,11 +1624,16 @@
 		gtk_label_set_markup(GTK_LABEL(label), _("<span weight=\"bold\" size=\"larger\">You have pounced!</span>"));
 
 		sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(spec_dialog->treeview));
-		gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
+		gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
 		g_signal_connect(G_OBJECT(sel), "changed",
 			G_CALLBACK(pounce_row_selected_cb), NULL);
+		g_signal_connect(G_OBJECT(spec_dialog->treeview), "row-activated",
+			G_CALLBACK(pounce_response_open_ims), NULL);
 	}
 
+	button = gtk_dialog_add_button(GTK_DIALOG(dialog),
+	                               GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
+
 	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
 	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
 	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
--- a/pidgin/gtkprefs.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkprefs.c	Wed Sep 16 15:36:24 2009 +0000
@@ -91,6 +91,8 @@
 static GtkWidget *prefs_blist_themes_combo_box;
 static GtkWidget *prefs_status_themes_combo_box;
 
+static gboolean prefs_sound_themes_loading;
+
 /*
  * PROTOTYPES
  */
@@ -580,6 +582,7 @@
 	gchar *filename;
 	GtkTreeIter iter;
 
+	prefs_sound_themes_loading = TRUE;
 	/* refresh the list of themes in the manager */
 	purple_theme_manager_refresh();
 
@@ -614,6 +617,7 @@
 	prefs_set_active_theme_combo(prefs_sound_themes_combo_box, prefs_sound_themes, purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/theme"));
 	prefs_set_active_theme_combo(prefs_blist_themes_combo_box, prefs_blist_themes, purple_prefs_get_string(PIDGIN_PREFS_ROOT "/blist/theme"));
 	prefs_set_active_theme_combo(prefs_status_themes_combo_box, prefs_status_icon_themes, purple_prefs_get_string(PIDGIN_PREFS_ROOT "/status/icon-theme"));
+	prefs_sound_themes_loading = FALSE;
 }
 
 /* init all the theme variables so that the themes can be sorted later and used by pref pages */
@@ -930,7 +934,11 @@
 {
 	GtkCellRenderer *cell_rend;
 	GtkWidget *combo_box;
-	GtkTargetEntry te[3] = {{"text/plain", 0, 0},{"text/uri-list", 0, 1},{"STRING", 0, 2}};
+	GtkTargetEntry te[3] = {
+		{"text/plain", 0, 0},
+		{"text/uri-list", 0, 1},
+		{"STRING", 0, 2}
+	};
 
 	g_return_val_if_fail(store != NULL && current_theme != NULL, NULL);
 
@@ -965,7 +973,7 @@
 	gchar *new_theme;
 	GtkTreeIter new_iter;
 
-	if(gtk_combo_box_get_active_iter(combo_box, &new_iter)) {
+	if(gtk_combo_box_get_active_iter(combo_box, &new_iter) && !prefs_sound_themes_loading) {
 
 		gtk_tree_model_get(GTK_TREE_MODEL(prefs_sound_themes), &new_iter, 2, &new_theme, -1);
 
@@ -1086,12 +1094,17 @@
 	GtkTreeSelection *sel;
 	GtkTreeRowReference *rowref;
 	GtkWidget *label;
-	GtkTargetEntry te[3] = {{"text/plain", 0, 0},{"text/uri-list", 0, 1},{"STRING", 0, 2}};
+	GtkTargetEntry te[3] = {
+		{"text/plain", 0, 0},
+		{"text/uri-list", 0, 1},
+		{"STRING", 0, 2}
+	};
 
 	ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
 	gtk_container_set_border_width (GTK_CONTAINER (ret), PIDGIN_HIG_BORDER);
 
-	label = gtk_label_new(_("Select a smiley theme that you would like to use from the list below. New themes can be installed by dragging and dropping them onto the theme list."));
+	label = gtk_label_new(_("Select a smiley theme that you would like to use from the list below."
+	                        " New themes can be installed by dragging and dropping them onto the theme list."));
 
 	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
 	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
@@ -1409,6 +1422,7 @@
 		g_free(name);
 
 		pidgin_stock_load_status_icon_theme(theme);
+		pidgin_blist_refresh(purple_get_blist());
 	}
 }
 
@@ -1743,19 +1757,54 @@
 	g_error_free(err);
 }
 
+static void
+auto_ip_button_clicked_cb(GtkWidget *button, gpointer null)
+{
+	const char *ip;
+	PurpleStunNatDiscovery *stun;
+	char *auto_ip_text;
+
+	/* purple_network_get_my_ip will return the IP that was set by the user with
+	   purple_network_set_public_ip, so make a lookup for the auto-detected IP
+	   ourselves. */
+
+	if (purple_prefs_get_bool("/purple/network/auto_ip")) {
+		/* Check if STUN discovery was already done */
+		stun = purple_stun_discover(NULL);
+		if ((stun != NULL) && (stun->status == PURPLE_STUN_STATUS_DISCOVERED)) {
+			ip = stun->publicip;
+		} else {
+			/* Attempt to get the IP from a NAT device using UPnP */
+			ip = purple_upnp_get_public_ip();
+			if (ip == NULL) {
+				/* Attempt to get the IP from a NAT device using NAT-PMP */
+				ip = purple_pmp_get_public_ip();
+				if (ip == NULL) {
+					/* Just fetch the IP of the local system */
+					ip = purple_network_get_local_system_ip(-1);
+				}
+			}
+		}
+	}
+	else
+		ip = _("Disabled");
+
+	auto_ip_text = g_strdup_printf(_("Use _automatically detected IP address: %s"), ip);
+	gtk_button_set_label(GTK_BUTTON(button), auto_ip_text);
+	g_free(auto_ip_text);
+}
+
 static GtkWidget *
 network_page(void)
 {
 	GtkWidget *ret;
 	GtkWidget *vbox, *hbox, *entry;
-	GtkWidget *table, *label, *auto_ip_checkbox, *ports_checkbox, *spin_button;
+	GtkWidget *table = NULL;
+	GtkWidget *label, *auto_ip_checkbox, *ports_checkbox, *spin_button;
 	GtkWidget *proxy_warning = NULL, *browser_warning = NULL;
 	GtkWidget *proxy_button = NULL, *browser_button = NULL;
 	GtkSizeGroup *sg;
 	PurpleProxyInfo *proxy_info = NULL;
-	const char *ip;
-	PurpleStunNatDiscovery *stun;
-	char *auto_ip_text;
 
 	ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
 	gtk_container_set_border_width (GTK_CONTAINER (ret), PIDGIN_HIG_BORDER);
@@ -1786,58 +1835,26 @@
 	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
 	gtk_container_add(GTK_CONTAINER(hbox), label);
 
-	/* purple_network_get_my_ip will return the IP that was set by the user with
-	   purple_network_set_public_ip, so make a lookup for the auto-detected IP
-	   ourselves. */
-
-	/* Check if STUN discovery was already done */
-	stun = purple_stun_discover(NULL);
-	if ((stun != NULL) && (stun->status == PURPLE_STUN_STATUS_DISCOVERED)) {
-		ip = stun->publicip;
-	} else {
-		/* Attempt to get the IP from a NAT device using UPnP */
-		ip = purple_upnp_get_public_ip();
-		if (ip == NULL) {
-			/* Attempt to get the IP from a NAT device using NAT-PMP */
-			ip = purple_pmp_get_public_ip();
-			if (ip == NULL) {
-				/* Just fetch the IP of the local system */
-				ip = purple_network_get_local_system_ip(-1);
-			}
-		}
-	}
-
-	auto_ip_text = g_strdup_printf(_("Use _automatically detected IP address: %s"), ip);
-	auto_ip_checkbox = pidgin_prefs_checkbox(auto_ip_text, "/purple/network/auto_ip", vbox);
-	g_free(auto_ip_text);
-
-	table = gtk_table_new(2, 2, FALSE);
-	gtk_container_set_border_width(GTK_CONTAINER(table), 0);
-	gtk_table_set_col_spacings(GTK_TABLE(table), 5);
-	gtk_table_set_row_spacings(GTK_TABLE(table), 10);
-	gtk_container_add(GTK_CONTAINER(vbox), table);
-
-	label = gtk_label_new_with_mnemonic(_("Public _IP:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, 0, 0, 0);
-	gtk_size_group_add_widget(sg, label);
+	auto_ip_checkbox = pidgin_prefs_checkbox("Use _automatically detected IP address",
+	                                         "/purple/network/auto_ip", vbox);
+	g_signal_connect(G_OBJECT(auto_ip_checkbox), "clicked",
+	                 G_CALLBACK(auto_ip_button_clicked_cb), NULL);
+	auto_ip_button_clicked_cb(auto_ip_checkbox, NULL); /* Update label */
 
 	entry = gtk_entry_new();
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry);
-	gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 0, 1, GTK_FILL, 0, 0, 0);
+	gtk_entry_set_text(GTK_ENTRY(entry), purple_network_get_public_ip());
 	g_signal_connect(G_OBJECT(entry), "changed",
 					 G_CALLBACK(network_ip_changed), NULL);
 
-	gtk_entry_set_text(GTK_ENTRY(entry), purple_network_get_public_ip());
-
-	pidgin_set_accessible_label(entry, label);
+	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Public _IP:"),
+			sg, entry, TRUE, NULL);
 
 	if (purple_prefs_get_bool("/purple/network/auto_ip")) {
-		gtk_widget_set_sensitive(GTK_WIDGET(table), FALSE);
+		gtk_widget_set_sensitive(GTK_WIDGET(hbox), FALSE);
 	}
 
 	g_signal_connect(G_OBJECT(auto_ip_checkbox), "clicked",
-					 G_CALLBACK(pidgin_toggle_sensitive), table);
+					 G_CALLBACK(pidgin_toggle_sensitive), hbox);
 
 	g_object_unref(sg);
 
@@ -1877,14 +1894,14 @@
 			G_CALLBACK(network_turn_server_changed_cb), NULL);
 	gtk_widget_show(entry);
 
-	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), "_TURN server:",
+	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_TURN server:"),
 			sg, entry, TRUE, NULL);
 
 	pidgin_prefs_labeled_spin_button(hbox, _("_Port:"),
 		"/purple/network/turn_port", 0, 65535, NULL);
-	hbox = pidgin_prefs_labeled_entry(vbox, "_Username:",
+	hbox = pidgin_prefs_labeled_entry(vbox, _("_Username:"),
 		"/purple/network/turn_username", sg);
-	pidgin_prefs_labeled_password(hbox, "_Password:",
+	pidgin_prefs_labeled_password(hbox, _("_Password:"),
 		"/purple/network/turn_password", NULL);
 
 	if (purple_running_gnome()) {
--- a/pidgin/gtksmiley.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtksmiley.c	Wed Sep 16 15:36:24 2009 +0000
@@ -601,10 +601,17 @@
 		GdkPixbuf *smiley_image = pidgin_pixbuf_from_imgstore(img);
 		purple_imgstore_unref(img);
 
-		if (smiley_image != NULL)
-			sized_smiley = gdk_pixbuf_scale_simple(smiley_image,
+		if (smiley_image != NULL) {
+			if (gdk_pixbuf_get_width(smiley_image) > 22 ||
+				gdk_pixbuf_get_height(smiley_image) > 22) {
+				sized_smiley = gdk_pixbuf_scale_simple(smiley_image,
 					22, 22, GDK_INTERP_HYPER);
-		g_object_unref(G_OBJECT(smiley_image));
+				g_object_unref(G_OBJECT(smiley_image));
+			} else {
+				/* don't scale up smaller smileys, avoid blurryness */
+				sized_smiley = smiley_image;
+			}
+		}
 	}
 
 
--- a/pidgin/gtksound.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtksound.c	Wed Sep 16 15:36:24 2009 +0000
@@ -212,6 +212,8 @@
 		return;
 
 	if (flags & PURPLE_MESSAGE_NICK || purple_utf8_has_word(message, chat->nick))
+		/* This isn't quite right; if you have the PURPLE_SOUND_CHAT_NICK event disabled
+		 * and the PURPLE_SOUND_CHAT_SAY event enabled, you won't get a sound at all */
 		play_conv_event(conv, PURPLE_SOUND_CHAT_NICK);
 	else
 		play_conv_event(conv, event);
@@ -591,6 +593,7 @@
 				purple_debug_error("sound", "The file: (%s) %s\n from theme: %s, was not found or wasn't readable\n",
 							sounds[event].pref, filename, theme_name);
 				g_free(filename);
+				filename = NULL;
 			}
 		}
 
@@ -614,19 +617,16 @@
 pidgin_sound_is_customized(void)
 {
 	gint i;
-	gchar *path, *file;
+	gchar *path;
+	const char *file;
 
 	for (i = 0; i < PURPLE_NUM_SOUNDS; i++) {
 		path = g_strdup_printf(PIDGIN_PREFS_ROOT "/sound/file/%s", sounds[i].pref);
-		file = g_strdup(purple_prefs_get_path(path));
+		file = purple_prefs_get_path(path);
 		g_free(path);
 
-		if (file && file[0] != '\0'){
-			g_free(file);
+		if (file && file[0] != '\0')
 			return TRUE;
-		}
-
-		g_free(file);
 	}
 
 	return FALSE;
--- a/pidgin/gtkutils.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/gtkutils.c	Wed Sep 16 15:36:24 2009 +0000
@@ -1533,25 +1533,25 @@
 void
 pidgin_dnd_file_manage(GtkSelectionData *sd, PurpleAccount *account, const char *who)
 {
-	GList *tmp;
 	GdkPixbuf *pb;
 	GList *files = purple_uri_list_extract_filenames((const gchar *)sd->data);
 	PurpleConnection *gc = purple_account_get_connection(account);
 	PurplePluginProtocolInfo *prpl_info = NULL;
-	gboolean file_send_ok = FALSE;
 #ifndef _WIN32
 	PurpleDesktopItem *item;
 #endif
+	gchar *filename = NULL;
+	gchar *basename = NULL;
 
 	g_return_if_fail(account != NULL);
 	g_return_if_fail(who != NULL);
 
-	for(tmp = files; tmp != NULL ; tmp = g_list_next(tmp)) {
-		gchar *filename = tmp->data;
-		gchar *basename = g_path_get_basename(filename);
-
-		/* Set the default action: don't send anything */
-		file_send_ok = FALSE;
+	for ( ; files; files = g_list_delete_link(files, files)) {
+		g_free(filename);
+		g_free(basename);
+
+		filename = files->data;
+		basename = g_path_get_basename(filename);
 
 		/* XXX - Make ft API support creating a transfer with more than one file */
 		if (!g_file_test(filename, G_FILE_TEST_EXISTS)) {
@@ -1571,7 +1571,6 @@
 
 			g_free(str);
 			g_free(str2);
-
 			continue;
 		}
 
@@ -1629,6 +1628,12 @@
 						    (ft ? _("Send image file") : _("Insert in message")), (ft ? DND_FILE_TRANSFER : DND_IM_IMAGE),
 							NULL);
 			g_object_unref(G_OBJECT(pb));
+
+			g_free(basename);
+			while (files) {
+				g_free(files->data);
+				files = g_list_delete_link(files, files);
+			}
 			return;
 		}
 
@@ -1686,15 +1691,21 @@
 				break;
 			}
 			purple_desktop_item_unref(item);
+			g_free(basename);
+			while (files) {
+				g_free(files->data);
+				files = g_list_delete_link(files, files);
+			}
 			return;
 		}
 #endif /* _WIN32 */
 
 		/* Everything is fine, let's send */
 		serv_send_file(gc, who, filename);
-		g_free(filename);
 	}
-	g_list_free(files);
+
+	g_free(filename);
+	g_free(basename);
 }
 
 void pidgin_buddy_icon_get_scale_size(GdkPixbuf *buf, PurpleBuddyIconSpec *spec, PurpleIconScaleRules rules, int *width, int *height)
@@ -3699,9 +3710,13 @@
 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
 
 	/* Open Containing Directory */
+#if GTK_CHECK_VERSION(2,6,0)
 	img = gtk_image_new_from_stock(GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_MENU);
 	item = gtk_image_menu_item_new_with_mnemonic(_("Open _Containing Directory"));
 	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img);
+#else
+	item = gtk_menu_item_new_with_mnemonic(_("Open _Containing Directory"));
+#endif
 	g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(open_containing_cb), (gpointer)url);
 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
 
@@ -3727,7 +3742,7 @@
 	char *temp_file = user_data;
 	gchar *contents;
 	gsize length;
-	GError *error;
+	GError *error = NULL;
 
 	if (!g_file_get_contents(temp_file, &contents, &length, &error)) {
 		purple_debug_error("gtkutils", "Unable to read contents of %s: %s\n",
@@ -3767,9 +3782,13 @@
 	url = gtk_imhtml_link_get_url(link);
 
 	/* Play Sound */
+#if GTK_CHECK_VERSION(2,6,0)
 	img = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_MENU);
 	item = gtk_image_menu_item_new_with_mnemonic(_("_Play Sound"));
 	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img);
+#else
+	item = gtk_menu_item_new_with_mnemonic(_("_Play Sound"));
+#endif
 	g_signal_connect_swapped(G_OBJECT(item), "activate", G_CALLBACK(gtk_imhtml_link_activate), link);
 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
 
--- a/pidgin/pidginstock.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/pidginstock.c	Wed Sep 16 15:36:24 2009 +0000
@@ -583,11 +583,13 @@
 	/* Setup the status icon theme */
 	loader = g_object_new(PIDGIN_TYPE_ICON_THEME_LOADER, "type", "status-icon", NULL);
 	purple_theme_manager_register_type(PURPLE_THEME_LOADER(loader));
+	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/status");
 	purple_prefs_add_string(PIDGIN_PREFS_ROOT "/status/icon-theme", "");
 	purple_prefs_add_path(PIDGIN_PREFS_ROOT "/status/icon-theme-dir", "");
 
 	stockloader = g_object_new(PIDGIN_TYPE_ICON_THEME_LOADER, "type", "stock-icon", NULL);
 	purple_theme_manager_register_type(PURPLE_THEME_LOADER(stockloader));
+	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/stock");
 	purple_prefs_add_string(PIDGIN_PREFS_ROOT "/stock/icon-theme", "");
 	purple_prefs_add_path(PIDGIN_PREFS_ROOT "/stock/icon-theme-dir", "");
 
@@ -602,12 +604,13 @@
 	pidgin_stock_load_stock_icon_theme(NULL);
 
 	/* Pre-load Status icon theme - this avoids a bug with displaying the correct icon in the tray, theme is destroyed after*/
-	if (purple_prefs_get_string(PIDGIN_PREFS_ROOT "/icon/status/theme") &&
+	if (purple_prefs_get_string(PIDGIN_PREFS_ROOT "/status/icon-theme") &&
 	   (path = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/status/icon-theme-dir"))) {
 
 		PidginStatusIconTheme *theme = PIDGIN_STATUS_ICON_THEME(purple_theme_loader_build(PURPLE_THEME_LOADER(loader), path));
 		pidgin_stock_load_status_icon_theme(theme);
-		g_object_unref(G_OBJECT(theme));
+		if (theme)
+			g_object_unref(G_OBJECT(theme));
 
 	}
 	else
--- a/pidgin/pixmaps/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/pixmaps/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -448,28 +448,28 @@
 TOOLBAR_22_SCALABLE = \
 		toolbar/22/scalable/select-avatar.svg \
 		toolbar/22/scalable/video-call.svg \
-		toolbar/22/scalable/voice-call.svg
+		toolbar/22/scalable/audio-call.svg
 
 TOOLBAR_22 = \
 		toolbar/22/select-avatar.png \
 		toolbar/22/video-call.png \
-		toolbar/22/voice-call.png
+		toolbar/22/audio-call.png
 
 TOOLBAR_32_SCALABLE = \
 		toolbar/32/scalable/video-call.svg \
-		toolbar/32/scalable/voice-call.svg
+		toolbar/32/scalable/audio-call.svg
 
 TOOLBAR_32 = \
 		toolbar/32/video-call.png \
-		toolbar/32/voice-call.png
+		toolbar/32/audio-call.png
 
 TOOLBAR_48_SCALABLE = \
 		toolbar/48/scalable/video-call.svg \
-		toolbar/48/scalable/voice-call.svg
+		toolbar/48/scalable/audio-call.svg
 
 TOOLBAR_48 = \
 		toolbar/48/video-call.png \
-		toolbar/48/voice-call.png
+		toolbar/48/audio-call.png
 
 TRAY_16_ICO = \
 		tray/16/available_4bit.ico \
--- a/pidgin/pixmaps/emotes/default/24/default.theme.in	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/pixmaps/emotes/default/24/default.theme.in	Wed Sep 16 15:36:24 2009 +0000
@@ -364,6 +364,98 @@
 female-fighter.png  o-+     O-+
 yin-yang.png        (%)
 
+# Following Yahoo! Messenger 8.1
+[Yahoo JAPAN]
+smile.png           :)      :-)
+question.png        :-/     :-\\
+shock.png           :-O     :O      :-o     :o 
+devil.png           >:)
+angel.png           O:-)    o:-)    0:-)
+sick.png            :-&
+yawn.png            (:|
+hypnotized.png      @-)
+on-the-phone.png    :)]
+sad.png             :(      :-(
+in-love.png         :x      :-x     :X      :-X
+angry.png           X-(     x-(     X(      x(
+crying.png          :((
+glasses-nerdy.png   :-B     :-b
+quiet.png           :-$
+drool.png           =P~     =p~
+lying.png           :^O     :^o
+call-me.png         :-c
+wink.png            ;)      ;-)
+embarrassed.png     :">
+mean.png            :->     :>
+laugh.png           :))     :-))
+bye.png             =;
+arrogant.png        [-(
+thinking.png        :-?
+waiting.png         :-w     :-W
+at-wits-end.png     ~x(     ~X(
+smile-big.png       :D      :-D     :d      :-d
+tongue.png          :-P     :P      :-p     :p
+glasses-cool.png    B-)     b-)
+neutral.png         :|      :-|
+sleepy.png          I-)     i-)     |-)
+clown.png           :o)     :O)
+doh.png             #-o     #-O
+weep.png            :-<
+go-away.png         :-h
+lashes.png          ;;)
+kiss.png            :-*     :*
+confused.png        :-S     :-s
+sarcastic.png       /:)
+eyeroll.png         8-|
+silly.png           8-}
+clap.png            =D>     =d>
+mad-tongue.png      >:P     >:p
+time-out.png        :-t     :-T
+hug-left.png        >:D<    >:d<
+love-over.png       =((
+sweat.png           #:-S    #:-s
+rotfl.png           =)) :-j :-J 
+loser.png           L-)     l-)
+party.png           <:-P    <:-p
+nailbiting.png      :-SS	:-Ss	:-sS	:-ss
+cowboy.png          <):)
+desire.png          8->
+! skywalker.png     C:-)    c:-)    C:)     c:)
+! monkey.png        :-(|)  :(|)
+
+# Hidden Yahoo emotes
+alien.png           =:)     >-)
+beat-up.png         b-(     B-(
+chicken.png         ~:>
+coffee.png          ~o)     ~O)
+cow.png             3:-O    3:-o
+dance.png           \\:D/   \\:d/
+rose.png            @};-
+dont-know.png       :-L     :-l
+skeleton.png        8-X     8-x
+lamp.png            *-:)
+monkey.png          :(|)
+coins.png           $-)
+peace.png           :)>-
+pig.png             :@)
+pray.png            [-o<    [-O<
+pumpkin.png         (~~)
+shame.png           [-X     [-x
+flag.png            **==
+clover.png          %%-
+musical-note.png    :-"
+giggle.png          ;))
+worship.png         ^:)^
+star.png            (*)
+waving.png          >:/
+talktohand.png      :-@
+
+# Only available after activating the Yahoo! Fighter IMVironment
+male-fighter1.png   o->     O->
+male-fighter2.png   o=>     O=>
+female-fighter.png  o-+     O-+
+yin-yang.png        (%)
+
 
 # Following MySpaceIM Beta 1.0.697.0
 [MySpaceIM]
--- a/pidgin/pixmaps/emotes/small/16/small.theme.in	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/pixmaps/emotes/small/16/small.theme.in	Wed Sep 16 15:36:24 2009 +0000
@@ -139,7 +139,34 @@
 shame.png           [-X     [-x
 musical-note.png    :-"
 
-# Only available after activating the Yahoo! Fighter IMVironment
+# Following Yahoo! Messenger 8.1
+[Yahoo JAPAN]
+smile.png           :)      :-)
+question.png        :-/     :-\\
+shock.png           :-O     :O      :-o     :o 
+devil.png           >:)
+angel.png           O:-)    o:-)    0:-)
+sick.png            :-&
+yawn.png            (:|
+sad.png             :(      :-(
+angry.png           X-(     x-(     X(      x(
+crying.png          :((
+wink.png            ;)      ;-)
+thinking.png        :-?
+smile-big.png       :D      :-D     :d      :-d
+tongue.png          :-P     :P      :-p     :p
+neutral.png         :|      :-|
+sleepy.png          I-)     i-)     |-)
+kiss.png            :-*     :*
+confused.png        :-S     :-s
+hug-left.png        >:D<    >:d<
+party.png           <:-P    <:-p
+
+# Hidden Yahoo emotes
+coffee.png          ~o)     ~O)
+dont-know.png       :-L     :-l
+shame.png           [-X     [-x
+musical-note.png    :-"
 
 
 # Following MySpaceIM Beta 1.0.697.0
Binary file pidgin/pixmaps/status/11/invisible.png has changed
Binary file pidgin/pixmaps/toolbar/22/audio-call.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/toolbar/22/scalable/audio-call.svg	Wed Sep 16 15:36:24 2009 +0000
@@ -0,0 +1,795 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="24"
+   height="24"
+   id="svg3879"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel r20974"
+   version="1.0"
+   sodipodi:docname="voice-24.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3881">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3617">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop3619" />
+      <stop
+         style="stop-color:#0b0c0d;stop-opacity:1"
+         offset="1"
+         id="stop3621" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1.0338738,0,0,1.022703,49.113708,-252.03388)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient4976"
+       id="linearGradient4984"
+       x1="-24.687374"
+       y1="245.84587"
+       x2="-24.687374"
+       y2="247.61009"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4976">
+      <stop
+         style="stop-color:#555753;stop-opacity:1;"
+         offset="0"
+         id="stop4978" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="1"
+         id="stop4980" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5677-7"
+       id="linearGradient5723-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0038316,0,0,0.67291737,-299.60391,95.209072)"
+       x1="305.89481"
+       y1="-120.46718"
+       x2="306.04715"
+       y2="-120.46718" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5677-7">
+      <stop
+         style="stop-color:#ff2de7;stop-opacity:1"
+         offset="0"
+         id="stop5679-1" />
+      <stop
+         style="stop-color:#7b009b;stop-opacity:1"
+         offset="1"
+         id="stop5681-4" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5043-9-6-1"
+       id="radialGradient5721-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.48374104,0.92161718,-1.0869289,0.53973041,10.51482,359.09454)"
+       cx="-306.03387"
+       cy="-120.8595"
+       fx="-306.03387"
+       fy="-120.8595"
+       r="3.03685" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5043-9-6-1">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5045-4-8-8" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5047-1-2-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5655-9"
+       id="linearGradient5719-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.52563657,0,0,0.74896722,153.12631,104.25845)"
+       x1="-300.82822"
+       y1="-126.31032"
+       x2="-300.82822"
+       y2="-114.83224" />
+    <linearGradient
+       id="linearGradient5655-9"
+       inkscape:collect="always">
+      <stop
+         id="stop5657-5"
+         offset="0"
+         style="stop-color:#2e3436;stop-opacity:1" />
+      <stop
+         id="stop5659-1"
+         offset="1"
+         style="stop-color:#707e83;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       y2="-36.569096"
+       x2="-219.25159"
+       y1="-43.842201"
+       x1="-219.25159"
+       gradientTransform="matrix(-0.78353222,0,0,0.63823472,-176.89854,41.230437)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5758"
+       xlink:href="#linearGradient5853"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5853"
+       inkscape:collect="always">
+      <stop
+         id="stop5855"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         id="stop5857"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5626"
+       id="linearGradient5632"
+       x1="-25.743168"
+       y1="-243.09763"
+       x2="-23.90864"
+       y2="-240.62437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34459514,0,0,0.65761929,31.073819,161.60062)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5626">
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1;"
+         offset="0"
+         id="stop5628" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:0;"
+         offset="1"
+         id="stop5630" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4971"
+       id="linearGradient4977"
+       x1="-105.74262"
+       y1="-282.20282"
+       x2="-102.94624"
+       y2="-282.20282"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4971">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4973" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4975" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4786"
+       id="linearGradient4792"
+       x1="-106.91152"
+       y1="280.91522"
+       x2="-101.28181"
+       y2="282.32028"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.40915917,0,0,0.50230701,64.794864,-139.49239)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4786">
+      <stop
+         style="stop-color:#555753;stop-opacity:1"
+         offset="0"
+         id="stop4788" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1"
+         id="stop4790" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5206"
+       id="linearGradient5212"
+       x1="-304.49771"
+       y1="-142.89493"
+       x2="-262.4259"
+       y2="-143.92334"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5206">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop5208" />
+      <stop
+         style="stop-color:#dededd;stop-opacity:0;"
+         offset="1"
+         id="stop5210" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5388"
+       id="linearGradient5394"
+       x1="-283.80222"
+       y1="-143.74782"
+       x2="-283.80222"
+       y2="-141.12897"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.52812148,0,0,0.55524807,152.92759,81.21193)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5388">
+      <stop
+         style="stop-color:#555753;stop-opacity:1"
+         offset="0"
+         id="stop5390" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1"
+         id="stop5392" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5376"
+       id="radialGradient5382"
+       cx="-284.44626"
+       cy="-153.18155"
+       fx="-284.44626"
+       fy="-153.18155"
+       r="17.449057"
+       gradientTransform="matrix(0.39680407,0.00462157,-0.0039183,0.50203811,114.94145,79.306255)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5376">
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1"
+         offset="0"
+         id="stop5378" />
+      <stop
+         style="stop-color:#434542;stop-opacity:1"
+         offset="1"
+         id="stop5380" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617"
+       id="linearGradient3623"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0323022,0,0,0.62872826,-5.0367759,-2.8264081)" />
+    <linearGradient
+       id="linearGradient5853-9"
+       inkscape:collect="always">
+      <stop
+         id="stop5855-9"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         id="stop5857-6"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5655-9-5"
+       id="linearGradient2892-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.77127394,0,0,0.69309231,220.91736,97.227704)"
+       x1="-300.82822"
+       y1="-126.31032"
+       x2="-300.82822"
+       y2="-114.83224" />
+    <linearGradient
+       id="linearGradient5655-9-5"
+       inkscape:collect="always">
+      <stop
+         id="stop5657-5-8"
+         offset="0"
+         style="stop-color:#2e3436;stop-opacity:1" />
+      <stop
+         id="stop5659-1-7"
+         offset="1"
+         style="stop-color:#707e83;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617-3"
+       id="linearGradient2894-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.77739212,0,0,0.56621027,-10.810779,-1.5472934)"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3617-3">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop3619-4" />
+      <stop
+         style="stop-color:#0b0c0d;stop-opacity:1"
+         offset="1"
+         id="stop3621-6" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5043-9-6-1-1"
+       id="radialGradient2896-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.48374104,0.92161718,1.0869289,0.53973041,-4.6726884,359.09453)"
+       cx="-306.03387"
+       cy="-120.8595"
+       fx="-306.03387"
+       fy="-120.8595"
+       r="3.03685" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5043-9-6-1-1">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5045-4-8-8-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5047-1-2-6-8" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5677-7-2"
+       id="linearGradient2898-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.74926868,0,0,0.67528296,-215.80931,95.061921)"
+       x1="305.89481"
+       y1="-120.46718"
+       x2="306.04715"
+       y2="-120.46718" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5677-7-2">
+      <stop
+         style="stop-color:#ff2de7;stop-opacity:1"
+         offset="0"
+         id="stop5679-1-6" />
+      <stop
+         style="stop-color:#7b009b;stop-opacity:1"
+         offset="1"
+         id="stop5681-4-3" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555-8"
+       id="linearGradient2900-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69961638,0,0,0.83812243,167.85054,51.827596)"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991" />
+    <linearGradient
+       id="linearGradient4555-8"
+       inkscape:collect="always">
+      <stop
+         id="stop4557-5"
+         offset="0"
+         style="stop-color:#545652;stop-opacity:1;" />
+      <stop
+         id="stop4559-4"
+         offset="1"
+         style="stop-color:#80837d;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="-36.569096"
+       x2="-219.25159"
+       y1="-43.842201"
+       x1="-219.25159"
+       gradientTransform="matrix(0.736656,0,0,0.58794323,172.57296,38.700092)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2944"
+       xlink:href="#linearGradient5853-9"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555-8"
+       id="linearGradient3017"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99999661,0,0,0.84879369,263.57748,52.023106)"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5853"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.78353222,0,0,0.63823472,182.7448,41.268763)"
+       x1="-219.25159"
+       y1="-43.842201"
+       x2="-219.25159"
+       y2="-36.569096" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5655-9"
+       id="linearGradient3054"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.52563657,0,0,0.74896722,147.28005,104.29678)"
+       x1="-300.82822"
+       y1="-126.31032"
+       x2="-300.82822"
+       y2="-114.83224" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617"
+       id="linearGradient3056"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0323022,0,0,0.62872826,-10.883035,-2.7880825)"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5043-9-6-1"
+       id="radialGradient3058"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.48374104,0.92161718,1.0869289,0.53973041,-4.6685612,359.13287)"
+       cx="-306.03387"
+       cy="-120.8595"
+       fx="-306.03387"
+       fy="-120.8595"
+       r="3.03685" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5677-7"
+       id="linearGradient3060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0038316,0,0,0.67291737,-293.75765,95.247398)"
+       x1="305.89481"
+       y1="-120.46718"
+       x2="306.04715"
+       y2="-120.46718" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555-8"
+       id="linearGradient3062"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.97519982,0,0,0.84415901,263.06047,51.763511)"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="45.254834"
+     inkscape:cx="11.202323"
+     inkscape:cy="4.1597985"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="752"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2855"
+       empspacing="5"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3884">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(8.5714283,-0.14285715)">
+    <rect
+       style="fill:#cc0000;fill-opacity:0;stroke:none"
+       id="rect5861"
+       width="24.790443"
+       height="24.790268"
+       x="-9.2806616"
+       y="-0.527372"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       d="m -0.48273876,1.0629519 c -3.52465864,0 -6.05863694,2.8300983 -6.05863694,6.3428228 l 0,3.3085963 c 0,0.37141 0.035895,0.72774 0.097163,1.081347 l 0.9991275,0 c -0.065659,-0.350767 -0.097169,-0.710737 -0.097169,-1.081347 l 0,-3.3085963 c 0,-3.2355382 2.6134218,-5.8263589 5.85995222,-5.8263589 l 5.78571128,0 c 3.2465298,0 5.3244047,2.5908207 5.3244047,5.8263589 l 0,3.3085963 c 0,0.37061 -0.03151,0.73058 -0.09716,1.081347 l 1.009535,0 c 0.06128,-0.353607 0.09717,-0.709937 0.09717,-1.081347 l 0,-3.3085963 c 0,-3.5127245 -2.5943893,-6.3428228 -6.1190468,-6.3428228 l -6.80105096,0 z"
+       id="rect5549"
+       sodipodi:nodetypes="ccccccccccccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="fill:url(#radialGradient5382);fill-opacity:1;stroke:none"
+       d="M -6.1124165,5.0092681 C -6.2937011,4.857301 -6.3656082,4.6552646 -6.3508656,4.3393305 c 0.015145,-0.3246281 0.074427,-0.4224572 0.5782217,-0.9542902 2.4612924,-2.59830661 7.0821101,-3.80012252 11.4352585,-2.9741749 1.9884343,0.37728499 3.8595526,1.2045329 5.1621134,2.2822431 0.700934,0.5799423 1.227547,1.2049406 1.287114,1.5275892 0.08117,0.4396387 -0.165477,0.8816512 -0.492195,0.8820587 C 11.511915,5.1028987 11.414663,5.0482236 11.192716,4.8627671 8.7626236,2.8321186 4.9304322,2.0520483 1.1786312,2.4838271 -1.3654872,2.7766089 -3.5952197,3.4219776 -5.3219525,4.7999737 -5.7481258,5.1400754 -5.9063913,5.1819745 -6.1124165,5.0092681 l 0,0 z"
+       id="path5202"
+       sodipodi:nodetypes="cssssssssscc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:url(#linearGradient5394);fill-opacity:1;stroke:none;stroke-width:1.36950052;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       d="M 2.2314285,0.15982254 C 1.5681819,0.18486471 0.90718512,0.24568013 0.26747679,0.33930091 -2.2757235,0.71150594 -4.5645706,1.6180373 -6.0369733,2.9956022 c -0.00903,0.00844 -0.024029,0.00944 -0.033007,0.017935 -0.012792,0.016513 -0.023888,0.034598 -0.033008,0.053804 -0.4403793,0.3375798 -0.5877622,0.9911622 -0.3135721,1.5076317 0.2695585,0.5077469 0.8359264,0.8666088 1.3203037,0.6391068 0.00871,-0.00389 0.024399,0.00444 0.033008,0 0.023394,-0.00852 0.045687,-0.020622 0.066015,-0.035869 0.00423,-0.00222 0.012306,0.00278 0.016478,0 0.00998,-0.00699 0.022974,-0.010993 0.033007,-0.017935 0.00618,-0.00389 0.010301,-0.013659 0.016478,-0.017935 3.3537088,-2.3260348 9.7006937,-2.6339833 14.0447311,-0.7955125 0.6082274,0.2574074 1.1553506,0.4018799 1.6338756,0.7237182 0.0052,0.00623 0.01073,0.012223 0.01649,0.017935 0.0063,0.00389 0.01023,0.013659 0.01649,0.017935 0.01419,0.020208 0.0309,0.038354 0.04948,0.053804 0.502483,0.3154924 1.162228,-0.038811 1.452335,-0.5852639 0.247807,-0.4667638 0.146702,-1.0421673 -0.198045,-1.399947 -0.0047,-0.012372 -0.01023,-0.024385 -0.01649,-0.035924 -0.0032,-0.00278 -0.01325,0.00278 -0.01648,0 -0.0052,-0.00623 -0.01075,-0.012222 -0.01649,-0.017935 -0.01451,-0.013159 -0.01774,-0.041477 -0.03301,-0.053804 1.69e-4,-0.00598 1.69e-4,-0.011958 0,-0.017935 C 11.063525,2.1438018 9.7288832,1.420058 8.123231,0.9136051 6.881406,0.52191092 5.5618524,0.2860859 4.2283351,0.19568594 3.5615763,0.15048887 2.8946224,0.13475869 2.2313757,0.15981702 l 5.28e-5,5.52e-6 z M 3.2216546,1.118851 C 4.8434103,1.1445592 6.47508,1.381683 7.9747488,1.8547154 l 0.016477,0 c 1.4589832,0.4622162 2.6653182,0.7504142 3.5153102,1.5177947 0.02512,0.053659 0.06618,0.098318 0.115525,0.1256361 0.255306,0.1602946 0.345445,0.5120662 0.198047,0.7897126 -0.125292,0.2360026 -0.381595,0.5148033 -0.610642,0.4416827 -0.02417,-0.023244 -0.05231,-0.041582 -0.08252,-0.053803 C 10.586764,4.2971254 9.9816422,3.6699592 9.2950271,3.3793701 7.0201121,2.4165922 4.2797424,2.0800172 1.6537692,2.2613612 -0.92727635,2.439607 -3.385666,3.4217546 -5.1622985,4.6398355 c -0.00423,0.00278 -0.012516,-0.00278 -0.016478,0 -0.011369,0.00513 -0.022407,0.011131 -0.033007,0.017935 -0.011368,0.00513 -0.022407,0.011131 -0.033008,0.017935 -0.00629,0.00444 -0.010248,0.013549 -0.016478,0.017935 -0.2519456,0.1440146 -0.5659508,-0.1350971 -0.709663,-0.4057859 -0.1414944,-0.2665301 -0.066845,-0.6038212 0.165038,-0.7717671 0.011365,-0.00513 0.022402,-0.011131 0.033007,-0.017935 0.039117,-0.020455 0.073468,-0.051585 0.099022,-0.089739 C -4.3207441,2.1583496 -2.1238168,1.6579803 0.33351644,1.2983351 1.2668605,1.1617328 2.2486277,1.1033985 3.2216811,1.1188565 l -2.65e-5,-5.5e-6 z"
+       id="path5194"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963"
+       sodipodi:nodetypes="csssssssssssssssssssssscssccccccsssssssssssssscscc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:url(#linearGradient5212);stroke-width:1.91763961;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       id="path5204"
+       sodipodi:cx="-285.49203"
+       sodipodi:cy="-135.7495"
+       sodipodi:rx="18.775068"
+       sodipodi:ry="9.3875341"
+       d="m -300.83968,-141.15673 a 18.775068,9.3875341 0 0 1 30.74554,0.0358"
+       transform="matrix(-0.53178943,0,0,0.51135941,-148.92763,75.903492)"
+       sodipodi:start="3.7554218"
+       sodipodi:end="5.6740176"
+       sodipodi:open="true"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       d="m -6.5611649,17.801468 0,0.01611 c 0,3.512724 2.8301183,6.342822 6.34286708,6.342822 L 4.5590266,23.541443 4.7566141,22.863449 0.3433825,23.189216 c -3.2355607,0 -5.8263995,-2.470095 -5.8263995,-5.705633 l 0,-0.01611 -1.0781479,0.333995 z"
+       id="rect5551"
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       ry="1.0211699"
+       rx="1.0211699"
+       y="-0.10164929"
+       x="21.63047"
+       height="5.0177956"
+       width="2.0423398"
+       id="rect4784"
+       style="fill:#555753;fill-opacity:1;stroke:url(#linearGradient4792);stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       transform="matrix(0,1,1,0,0,0)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0081301"
+       inkscape:original="M -103.46875 -287.5 C -104.58751 -287.5 -105.5 -286.58751 -105.5 -285.46875 L -105.5 -279.53125 C -105.5 -278.41249 -104.58751 -277.5 -103.46875 -277.5 L -102.53125 -277.5 C -101.41249 -277.5 -100.5 -278.41249 -100.5 -279.53125 L -100.5 -285.46875 C -100.5 -286.58751 -101.41249 -287.5 -102.53125 -287.5 L -103.46875 -287.5 z "
+       style="opacity:0.6081081;fill:none;stroke:url(#linearGradient4977);stroke-width:3.76500607;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       id="path4967"
+       d="m -103.46875,-286.5 c -0.57059,0 -1.03125,0.46066 -1.03125,1.03125 l 0,5.9375 c 0,0.57059 0.46066,1.03125 1.03125,1.03125 l 0.9375,0 c 0.57059,0 1.03125,-0.46066 1.03125,-1.03125 l 0,-5.9375 c 0,-0.57059 -0.46066,-1.03125 -1.03125,-1.03125 l -0.9375,0 z"
+       transform="matrix(0,0.1801693,0.39155051,0,113.06595,41.440494)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       transform="matrix(0,1,1,0,0,0)"
+       style="fill:url(#linearGradient5632);fill-opacity:1;stroke:none"
+       id="rect5572"
+       width="1.0458575"
+       height="3.8989625"
+       x="22.13949"
+       y="0.49657452"
+       rx="0.99727494"
+       ry="0.99727511"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient5758);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       d="m -5.3765984,9.6362166 c -1.49077,0 -2.6907551,1.0642814 -2.6907551,2.3864794 l 0,4.192469 c 0,1.322192 1.1999851,2.38648 2.6907551,2.38648 l 1.2651311,0.0013 0.015891,-8.9736896 c -0.9561106,0.024323 -0.3962926,0.00686 -1.2810216,0.00686 l 0,-5.62e-5 1e-7,6.63e-5 z"
+       id="path5707"
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient5719-5);fill-opacity:1;stroke:none"
+       id="rect5709"
+       width="0.98004872"
+       height="8.9388952"
+       x="-5.5517335"
+       y="9.1426477"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient3623);fill-opacity:1;stroke:none"
+       id="rect5711"
+       width="2.0254388"
+       height="10.001933"
+       x="-4.5823889"
+       y="9.1315699"
+       rx="1.0133103"
+       ry="1.0133103"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path5713"
+       d="m -5.8661826,9.9499715 c -0.9407715,0 -1.698042,0.8558425 -1.698042,1.9190855 l 0,3.371356 c 0,1.063237 0.7572705,1.919079 1.698042,1.919079 l 1.2401832,-0.01722 0,-7.19223 c -0.6033633,0.019548 -0.6818611,0 -1.2401832,0 l 0,-7.25e-5 z"
+       style="opacity:0.5;fill:url(#radialGradient5721-4);fill-opacity:1;stroke:none"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient5723-8);fill-opacity:1;stroke:none"
+       id="rect5715"
+       width="2.0024893"
+       height="5.9961619"
+       x="6.5585375"
+       y="11.146509"
+       rx="0.99742299"
+       ry="0.99742311"
+       transform="scale(-1,1)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#dee1e3;fill-opacity:1;stroke:none"
+       id="path5859"
+       sodipodi:cx="-244.01906"
+       sodipodi:cy="-24.045986"
+       sodipodi:rx="0.83739835"
+       sodipodi:ry="1.3739837"
+       d="m -243.18166,-24.045986 a 0.83739835,1.3739837 0 1 1 -1.6748,0 0.83739835,1.3739837 0 1 1 1.6748,0 z"
+       transform="matrix(0.62336294,0,0,0.3800951,153.07483,31.796377)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient4984);fill-opacity:1;stroke:none"
+       id="rect5811-4"
+       width="1.042106"
+       height="2.3800838"
+       x="23.119368"
+       y="-1.4279883"
+       rx="0.50398123"
+       ry="0.50398123"
+       transform="matrix(0,1,-1,0,0,0)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       y="-0.527372"
+       x="-9.2806616"
+       height="24.790268"
+       width="24.790443"
+       id="rect5863"
+       style="fill:#ffffff;fill-opacity:0;stroke:none"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
+    <rect
+       transform="scale(-1,1)"
+       style="fill:url(#linearGradient3017);fill-opacity:1;stroke:none"
+       id="rect3015"
+       width="1.0079591"
+       height="3.0484221"
+       x="5.5438328"
+       y="8.1219101"
+       rx="0.50398123"
+       ry="0.50398123"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       sodipodi:nodetypes="ccccccccc"
+       id="path3040"
+       d="m 11.222858,9.6745422 c 1.49077,0 2.690755,1.0642818 2.690755,2.3864798 l 0,4.192469 c 0,1.322192 -1.199985,2.38648 -2.690755,2.38648 l -1.2651315,0.0013 -0.015891,-8.97369 c 0.9561105,0.024323 0.3962925,0.00686 1.2810215,0.00686 l 0,-5.62e-5 0,6.63e-5 z"
+       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3052);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220" />
+    <rect
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       y="9.1809731"
+       x="-11.397993"
+       height="8.9388952"
+       width="0.98004872"
+       id="rect3042"
+       style="fill:url(#linearGradient3054);fill-opacity:1;stroke:none"
+       transform="scale(-1,1)" />
+    <rect
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       ry="1.0133103"
+       rx="1.0133103"
+       y="9.1698952"
+       x="-10.428648"
+       height="10.001933"
+       width="2.0254388"
+       id="rect3044"
+       style="fill:url(#linearGradient3056);fill-opacity:1;stroke:none"
+       transform="scale(-1,1)" />
+    <path
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       style="opacity:0.5;fill:url(#radialGradient3058);fill-opacity:1;stroke:none"
+       d="m 11.712442,9.9882971 c 0.940771,0 1.698042,0.8558429 1.698042,1.9190859 l 0,3.371356 c 0,1.063237 -0.757271,1.919079 -1.698042,1.919079 l -1.240183,-0.01722 0,-7.1922304 c 0.603363,0.019548 0.681861,0 1.240183,0 l 0,-7.25e-5 z"
+       id="path3046"
+       sodipodi:nodetypes="cccccccc" />
+    <rect
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       ry="0.99742311"
+       rx="0.99742299"
+       y="11.184834"
+       x="12.404797"
+       height="5.9961619"
+       width="2.0024893"
+       id="rect3048"
+       style="fill:url(#linearGradient3060);fill-opacity:1;stroke:none" />
+    <rect
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       ry="0.50398123"
+       rx="0.50398123"
+       y="8.1020288"
+       x="11.425255"
+       height="3.0317767"
+       width="0.98296487"
+       id="rect3050"
+       style="fill:url(#linearGradient3062);fill-opacity:1;stroke:none" />
+  </g>
+</svg>
--- a/pidgin/pixmaps/toolbar/22/scalable/voice-call.svg	Wed Sep 16 15:35:45 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,795 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="24"
-   height="24"
-   id="svg3879"
-   sodipodi:version="0.32"
-   inkscape:version="0.46+devel r20974"
-   version="1.0"
-   sodipodi:docname="voice-24.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs3881">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3617">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1;"
-         offset="0"
-         id="stop3619" />
-      <stop
-         style="stop-color:#0b0c0d;stop-opacity:1"
-         offset="1"
-         id="stop3621" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(1.0338738,0,0,1.022703,49.113708,-252.03388)"
-       inkscape:collect="always"
-       xlink:href="#linearGradient4976"
-       id="linearGradient4984"
-       x1="-24.687374"
-       y1="245.84587"
-       x2="-24.687374"
-       y2="247.61009"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4976">
-      <stop
-         style="stop-color:#555753;stop-opacity:1;"
-         offset="0"
-         id="stop4978" />
-      <stop
-         style="stop-color:#808080;stop-opacity:1"
-         offset="1"
-         id="stop4980" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5677-7"
-       id="linearGradient5723-8"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0038316,0,0,0.67291737,-299.60391,95.209072)"
-       x1="305.89481"
-       y1="-120.46718"
-       x2="306.04715"
-       y2="-120.46718" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5677-7">
-      <stop
-         style="stop-color:#ff2de7;stop-opacity:1"
-         offset="0"
-         id="stop5679-1" />
-      <stop
-         style="stop-color:#7b009b;stop-opacity:1"
-         offset="1"
-         id="stop5681-4" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5043-9-6-1"
-       id="radialGradient5721-4"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.48374104,0.92161718,-1.0869289,0.53973041,10.51482,359.09454)"
-       cx="-306.03387"
-       cy="-120.8595"
-       fx="-306.03387"
-       fy="-120.8595"
-       r="3.03685" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5043-9-6-1">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop5045-4-8-8" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop5047-1-2-6" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5655-9"
-       id="linearGradient5719-5"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.52563657,0,0,0.74896722,153.12631,104.25845)"
-       x1="-300.82822"
-       y1="-126.31032"
-       x2="-300.82822"
-       y2="-114.83224" />
-    <linearGradient
-       id="linearGradient5655-9"
-       inkscape:collect="always">
-      <stop
-         id="stop5657-5"
-         offset="0"
-         style="stop-color:#2e3436;stop-opacity:1" />
-      <stop
-         id="stop5659-1"
-         offset="1"
-         style="stop-color:#707e83;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       y2="-36.569096"
-       x2="-219.25159"
-       y1="-43.842201"
-       x1="-219.25159"
-       gradientTransform="matrix(-0.78353222,0,0,0.63823472,-176.89854,41.230437)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient5758"
-       xlink:href="#linearGradient5853"
-       inkscape:collect="always" />
-    <linearGradient
-       id="linearGradient5853"
-       inkscape:collect="always">
-      <stop
-         id="stop5855"
-         offset="0"
-         style="stop-color:#888a85;stop-opacity:1" />
-      <stop
-         id="stop5857"
-         offset="1"
-         style="stop-color:#555753;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5626"
-       id="linearGradient5632"
-       x1="-25.743168"
-       y1="-243.09763"
-       x2="-23.90864"
-       y2="-240.62437"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.34459514,0,0,0.65761929,31.073819,161.60062)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5626">
-      <stop
-         style="stop-color:#babdb6;stop-opacity:1;"
-         offset="0"
-         id="stop5628" />
-      <stop
-         style="stop-color:#babdb6;stop-opacity:0;"
-         offset="1"
-         id="stop5630" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4971"
-       id="linearGradient4977"
-       x1="-105.74262"
-       y1="-282.20282"
-       x2="-102.94624"
-       y2="-282.20282"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4971">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop4973" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop4975" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4786"
-       id="linearGradient4792"
-       x1="-106.91152"
-       y1="280.91522"
-       x2="-101.28181"
-       y2="282.32028"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.40915917,0,0,0.50230701,64.794864,-139.49239)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4786">
-      <stop
-         style="stop-color:#555753;stop-opacity:1"
-         offset="0"
-         id="stop4788" />
-      <stop
-         style="stop-color:#000000;stop-opacity:1"
-         offset="1"
-         id="stop4790" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5206"
-       id="linearGradient5212"
-       x1="-304.49771"
-       y1="-142.89493"
-       x2="-262.4259"
-       y2="-143.92334"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5206">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="0"
-         id="stop5208" />
-      <stop
-         style="stop-color:#dededd;stop-opacity:0;"
-         offset="1"
-         id="stop5210" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5388"
-       id="linearGradient5394"
-       x1="-283.80222"
-       y1="-143.74782"
-       x2="-283.80222"
-       y2="-141.12897"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.52812148,0,0,0.55524807,152.92759,81.21193)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5388">
-      <stop
-         style="stop-color:#555753;stop-opacity:1"
-         offset="0"
-         id="stop5390" />
-      <stop
-         style="stop-color:#000000;stop-opacity:1"
-         offset="1"
-         id="stop5392" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5376"
-       id="radialGradient5382"
-       cx="-284.44626"
-       cy="-153.18155"
-       fx="-284.44626"
-       fy="-153.18155"
-       r="17.449057"
-       gradientTransform="matrix(0.39680407,0.00462157,-0.0039183,0.50203811,114.94145,79.306255)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5376">
-      <stop
-         style="stop-color:#babdb6;stop-opacity:1"
-         offset="0"
-         id="stop5378" />
-      <stop
-         style="stop-color:#434542;stop-opacity:1"
-         offset="1"
-         id="stop5380" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617"
-       id="linearGradient3623"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0323022,0,0,0.62872826,-5.0367759,-2.8264081)" />
-    <linearGradient
-       id="linearGradient5853-9"
-       inkscape:collect="always">
-      <stop
-         id="stop5855-9"
-         offset="0"
-         style="stop-color:#888a85;stop-opacity:1" />
-      <stop
-         id="stop5857-6"
-         offset="1"
-         style="stop-color:#555753;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5655-9-5"
-       id="linearGradient2892-5"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.77127394,0,0,0.69309231,220.91736,97.227704)"
-       x1="-300.82822"
-       y1="-126.31032"
-       x2="-300.82822"
-       y2="-114.83224" />
-    <linearGradient
-       id="linearGradient5655-9-5"
-       inkscape:collect="always">
-      <stop
-         id="stop5657-5-8"
-         offset="0"
-         style="stop-color:#2e3436;stop-opacity:1" />
-      <stop
-         id="stop5659-1-7"
-         offset="1"
-         style="stop-color:#707e83;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617-3"
-       id="linearGradient2894-1"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.77739212,0,0,0.56621027,-10.810779,-1.5472934)"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3617-3">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1;"
-         offset="0"
-         id="stop3619-4" />
-      <stop
-         style="stop-color:#0b0c0d;stop-opacity:1"
-         offset="1"
-         id="stop3621-6" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5043-9-6-1-1"
-       id="radialGradient2896-0"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.48374104,0.92161718,1.0869289,0.53973041,-4.6726884,359.09453)"
-       cx="-306.03387"
-       cy="-120.8595"
-       fx="-306.03387"
-       fy="-120.8595"
-       r="3.03685" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5043-9-6-1-1">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop5045-4-8-8-6" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop5047-1-2-6-8" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5677-7-2"
-       id="linearGradient2898-1"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.74926868,0,0,0.67528296,-215.80931,95.061921)"
-       x1="305.89481"
-       y1="-120.46718"
-       x2="306.04715"
-       y2="-120.46718" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5677-7-2">
-      <stop
-         style="stop-color:#ff2de7;stop-opacity:1"
-         offset="0"
-         id="stop5679-1-6" />
-      <stop
-         style="stop-color:#7b009b;stop-opacity:1"
-         offset="1"
-         id="stop5681-4-3" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555-8"
-       id="linearGradient2900-3"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.69961638,0,0,0.83812243,167.85054,51.827596)"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991" />
-    <linearGradient
-       id="linearGradient4555-8"
-       inkscape:collect="always">
-      <stop
-         id="stop4557-5"
-         offset="0"
-         style="stop-color:#545652;stop-opacity:1;" />
-      <stop
-         id="stop4559-4"
-         offset="1"
-         style="stop-color:#80837d;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       y2="-36.569096"
-       x2="-219.25159"
-       y1="-43.842201"
-       x1="-219.25159"
-       gradientTransform="matrix(0.736656,0,0,0.58794323,172.57296,38.700092)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient2944"
-       xlink:href="#linearGradient5853-9"
-       inkscape:collect="always" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555-8"
-       id="linearGradient3017"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.99999661,0,0,0.84879369,263.57748,52.023106)"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5853"
-       id="linearGradient3052"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.78353222,0,0,0.63823472,182.7448,41.268763)"
-       x1="-219.25159"
-       y1="-43.842201"
-       x2="-219.25159"
-       y2="-36.569096" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5655-9"
-       id="linearGradient3054"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.52563657,0,0,0.74896722,147.28005,104.29678)"
-       x1="-300.82822"
-       y1="-126.31032"
-       x2="-300.82822"
-       y2="-114.83224" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617"
-       id="linearGradient3056"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0323022,0,0,0.62872826,-10.883035,-2.7880825)"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5043-9-6-1"
-       id="radialGradient3058"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.48374104,0.92161718,1.0869289,0.53973041,-4.6685612,359.13287)"
-       cx="-306.03387"
-       cy="-120.8595"
-       fx="-306.03387"
-       fy="-120.8595"
-       r="3.03685" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5677-7"
-       id="linearGradient3060"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0038316,0,0,0.67291737,-293.75765,95.247398)"
-       x1="305.89481"
-       y1="-120.46718"
-       x2="306.04715"
-       y2="-120.46718" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555-8"
-       id="linearGradient3062"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.97519982,0,0,0.84415901,263.06047,51.763511)"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="45.254834"
-     inkscape:cx="11.202323"
-     inkscape:cy="4.1597985"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1280"
-     inkscape:window-height="752"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:snap-global="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2855"
-       empspacing="5"
-       visible="true"
-       enabled="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata3884">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     transform="translate(8.5714283,-0.14285715)">
-    <rect
-       style="fill:#cc0000;fill-opacity:0;stroke:none"
-       id="rect5861"
-       width="24.790443"
-       height="24.790268"
-       x="-9.2806616"
-       y="-0.527372"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
-    <path
-       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-       d="m -0.48273876,1.0629519 c -3.52465864,0 -6.05863694,2.8300983 -6.05863694,6.3428228 l 0,3.3085963 c 0,0.37141 0.035895,0.72774 0.097163,1.081347 l 0.9991275,0 c -0.065659,-0.350767 -0.097169,-0.710737 -0.097169,-1.081347 l 0,-3.3085963 c 0,-3.2355382 2.6134218,-5.8263589 5.85995222,-5.8263589 l 5.78571128,0 c 3.2465298,0 5.3244047,2.5908207 5.3244047,5.8263589 l 0,3.3085963 c 0,0.37061 -0.03151,0.73058 -0.09716,1.081347 l 1.009535,0 c 0.06128,-0.353607 0.09717,-0.709937 0.09717,-1.081347 l 0,-3.3085963 c 0,-3.5127245 -2.5943893,-6.3428228 -6.1190468,-6.3428228 l -6.80105096,0 z"
-       id="rect5549"
-       sodipodi:nodetypes="ccccccccccccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="fill:url(#radialGradient5382);fill-opacity:1;stroke:none"
-       d="M -6.1124165,5.0092681 C -6.2937011,4.857301 -6.3656082,4.6552646 -6.3508656,4.3393305 c 0.015145,-0.3246281 0.074427,-0.4224572 0.5782217,-0.9542902 2.4612924,-2.59830661 7.0821101,-3.80012252 11.4352585,-2.9741749 1.9884343,0.37728499 3.8595526,1.2045329 5.1621134,2.2822431 0.700934,0.5799423 1.227547,1.2049406 1.287114,1.5275892 0.08117,0.4396387 -0.165477,0.8816512 -0.492195,0.8820587 C 11.511915,5.1028987 11.414663,5.0482236 11.192716,4.8627671 8.7626236,2.8321186 4.9304322,2.0520483 1.1786312,2.4838271 -1.3654872,2.7766089 -3.5952197,3.4219776 -5.3219525,4.7999737 -5.7481258,5.1400754 -5.9063913,5.1819745 -6.1124165,5.0092681 l 0,0 z"
-       id="path5202"
-       sodipodi:nodetypes="cssssssssscc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:url(#linearGradient5394);fill-opacity:1;stroke:none;stroke-width:1.36950052;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-       d="M 2.2314285,0.15982254 C 1.5681819,0.18486471 0.90718512,0.24568013 0.26747679,0.33930091 -2.2757235,0.71150594 -4.5645706,1.6180373 -6.0369733,2.9956022 c -0.00903,0.00844 -0.024029,0.00944 -0.033007,0.017935 -0.012792,0.016513 -0.023888,0.034598 -0.033008,0.053804 -0.4403793,0.3375798 -0.5877622,0.9911622 -0.3135721,1.5076317 0.2695585,0.5077469 0.8359264,0.8666088 1.3203037,0.6391068 0.00871,-0.00389 0.024399,0.00444 0.033008,0 0.023394,-0.00852 0.045687,-0.020622 0.066015,-0.035869 0.00423,-0.00222 0.012306,0.00278 0.016478,0 0.00998,-0.00699 0.022974,-0.010993 0.033007,-0.017935 0.00618,-0.00389 0.010301,-0.013659 0.016478,-0.017935 3.3537088,-2.3260348 9.7006937,-2.6339833 14.0447311,-0.7955125 0.6082274,0.2574074 1.1553506,0.4018799 1.6338756,0.7237182 0.0052,0.00623 0.01073,0.012223 0.01649,0.017935 0.0063,0.00389 0.01023,0.013659 0.01649,0.017935 0.01419,0.020208 0.0309,0.038354 0.04948,0.053804 0.502483,0.3154924 1.162228,-0.038811 1.452335,-0.5852639 0.247807,-0.4667638 0.146702,-1.0421673 -0.198045,-1.399947 -0.0047,-0.012372 -0.01023,-0.024385 -0.01649,-0.035924 -0.0032,-0.00278 -0.01325,0.00278 -0.01648,0 -0.0052,-0.00623 -0.01075,-0.012222 -0.01649,-0.017935 -0.01451,-0.013159 -0.01774,-0.041477 -0.03301,-0.053804 1.69e-4,-0.00598 1.69e-4,-0.011958 0,-0.017935 C 11.063525,2.1438018 9.7288832,1.420058 8.123231,0.9136051 6.881406,0.52191092 5.5618524,0.2860859 4.2283351,0.19568594 3.5615763,0.15048887 2.8946224,0.13475869 2.2313757,0.15981702 l 5.28e-5,5.52e-6 z M 3.2216546,1.118851 C 4.8434103,1.1445592 6.47508,1.381683 7.9747488,1.8547154 l 0.016477,0 c 1.4589832,0.4622162 2.6653182,0.7504142 3.5153102,1.5177947 0.02512,0.053659 0.06618,0.098318 0.115525,0.1256361 0.255306,0.1602946 0.345445,0.5120662 0.198047,0.7897126 -0.125292,0.2360026 -0.381595,0.5148033 -0.610642,0.4416827 -0.02417,-0.023244 -0.05231,-0.041582 -0.08252,-0.053803 C 10.586764,4.2971254 9.9816422,3.6699592 9.2950271,3.3793701 7.0201121,2.4165922 4.2797424,2.0800172 1.6537692,2.2613612 -0.92727635,2.439607 -3.385666,3.4217546 -5.1622985,4.6398355 c -0.00423,0.00278 -0.012516,-0.00278 -0.016478,0 -0.011369,0.00513 -0.022407,0.011131 -0.033007,0.017935 -0.011368,0.00513 -0.022407,0.011131 -0.033008,0.017935 -0.00629,0.00444 -0.010248,0.013549 -0.016478,0.017935 -0.2519456,0.1440146 -0.5659508,-0.1350971 -0.709663,-0.4057859 -0.1414944,-0.2665301 -0.066845,-0.6038212 0.165038,-0.7717671 0.011365,-0.00513 0.022402,-0.011131 0.033007,-0.017935 0.039117,-0.020455 0.073468,-0.051585 0.099022,-0.089739 C -4.3207441,2.1583496 -2.1238168,1.6579803 0.33351644,1.2983351 1.2668605,1.1617328 2.2486277,1.1033985 3.2216811,1.1188565 l -2.65e-5,-5.5e-6 z"
-       id="path5194"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963"
-       sodipodi:nodetypes="csssssssssssssssssssssscssccccccsssssssssssssscscc" />
-    <path
-       sodipodi:type="arc"
-       style="fill:none;stroke:url(#linearGradient5212);stroke-width:1.91763961;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       id="path5204"
-       sodipodi:cx="-285.49203"
-       sodipodi:cy="-135.7495"
-       sodipodi:rx="18.775068"
-       sodipodi:ry="9.3875341"
-       d="m -300.83968,-141.15673 a 18.775068,9.3875341 0 0 1 30.74554,0.0358"
-       transform="matrix(-0.53178943,0,0,0.51135941,-148.92763,75.903492)"
-       sodipodi:start="3.7554218"
-       sodipodi:end="5.6740176"
-       sodipodi:open="true"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-       d="m -6.5611649,17.801468 0,0.01611 c 0,3.512724 2.8301183,6.342822 6.34286708,6.342822 L 4.5590266,23.541443 4.7566141,22.863449 0.3433825,23.189216 c -3.2355607,0 -5.8263995,-2.470095 -5.8263995,-5.705633 l 0,-0.01611 -1.0781479,0.333995 z"
-       id="rect5551"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       ry="1.0211699"
-       rx="1.0211699"
-       y="-0.10164929"
-       x="21.63047"
-       height="5.0177956"
-       width="2.0423398"
-       id="rect4784"
-       style="fill:#555753;fill-opacity:1;stroke:url(#linearGradient4792);stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       transform="matrix(0,1,1,0,0,0)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:type="inkscape:offset"
-       inkscape:radius="-1.0081301"
-       inkscape:original="M -103.46875 -287.5 C -104.58751 -287.5 -105.5 -286.58751 -105.5 -285.46875 L -105.5 -279.53125 C -105.5 -278.41249 -104.58751 -277.5 -103.46875 -277.5 L -102.53125 -277.5 C -101.41249 -277.5 -100.5 -278.41249 -100.5 -279.53125 L -100.5 -285.46875 C -100.5 -286.58751 -101.41249 -287.5 -102.53125 -287.5 L -103.46875 -287.5 z "
-       style="opacity:0.6081081;fill:none;stroke:url(#linearGradient4977);stroke-width:3.76500607;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       id="path4967"
-       d="m -103.46875,-286.5 c -0.57059,0 -1.03125,0.46066 -1.03125,1.03125 l 0,5.9375 c 0,0.57059 0.46066,1.03125 1.03125,1.03125 l 0.9375,0 c 0.57059,0 1.03125,-0.46066 1.03125,-1.03125 l 0,-5.9375 c 0,-0.57059 -0.46066,-1.03125 -1.03125,-1.03125 l -0.9375,0 z"
-       transform="matrix(0,0.1801693,0.39155051,0,113.06595,41.440494)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       transform="matrix(0,1,1,0,0,0)"
-       style="fill:url(#linearGradient5632);fill-opacity:1;stroke:none"
-       id="rect5572"
-       width="1.0458575"
-       height="3.8989625"
-       x="22.13949"
-       y="0.49657452"
-       rx="0.99727494"
-       ry="0.99727511"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient5758);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       d="m -5.3765984,9.6362166 c -1.49077,0 -2.6907551,1.0642814 -2.6907551,2.3864794 l 0,4.192469 c 0,1.322192 1.1999851,2.38648 2.6907551,2.38648 l 1.2651311,0.0013 0.015891,-8.9736896 c -0.9561106,0.024323 -0.3962926,0.00686 -1.2810216,0.00686 l 0,-5.62e-5 1e-7,6.63e-5 z"
-       id="path5707"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient5719-5);fill-opacity:1;stroke:none"
-       id="rect5709"
-       width="0.98004872"
-       height="8.9388952"
-       x="-5.5517335"
-       y="9.1426477"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient3623);fill-opacity:1;stroke:none"
-       id="rect5711"
-       width="2.0254388"
-       height="10.001933"
-       x="-4.5823889"
-       y="9.1315699"
-       rx="1.0133103"
-       ry="1.0133103"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:nodetypes="cccccccc"
-       id="path5713"
-       d="m -5.8661826,9.9499715 c -0.9407715,0 -1.698042,0.8558425 -1.698042,1.9190855 l 0,3.371356 c 0,1.063237 0.7572705,1.919079 1.698042,1.919079 l 1.2401832,-0.01722 0,-7.19223 c -0.6033633,0.019548 -0.6818611,0 -1.2401832,0 l 0,-7.25e-5 z"
-       style="opacity:0.5;fill:url(#radialGradient5721-4);fill-opacity:1;stroke:none"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient5723-8);fill-opacity:1;stroke:none"
-       id="rect5715"
-       width="2.0024893"
-       height="5.9961619"
-       x="6.5585375"
-       y="11.146509"
-       rx="0.99742299"
-       ry="0.99742311"
-       transform="scale(-1,1)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:type="arc"
-       style="fill:#dee1e3;fill-opacity:1;stroke:none"
-       id="path5859"
-       sodipodi:cx="-244.01906"
-       sodipodi:cy="-24.045986"
-       sodipodi:rx="0.83739835"
-       sodipodi:ry="1.3739837"
-       d="m -243.18166,-24.045986 a 0.83739835,1.3739837 0 1 1 -1.6748,0 0.83739835,1.3739837 0 1 1 1.6748,0 z"
-       transform="matrix(0.62336294,0,0,0.3800951,153.07483,31.796377)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient4984);fill-opacity:1;stroke:none"
-       id="rect5811-4"
-       width="1.042106"
-       height="2.3800838"
-       x="23.119368"
-       y="-1.4279883"
-       rx="0.50398123"
-       ry="0.50398123"
-       transform="matrix(0,1,-1,0,0,0)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       y="-0.527372"
-       x="-9.2806616"
-       height="24.790268"
-       width="24.790443"
-       id="rect5863"
-       style="fill:#ffffff;fill-opacity:0;stroke:none"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
-    <rect
-       transform="scale(-1,1)"
-       style="fill:url(#linearGradient3017);fill-opacity:1;stroke:none"
-       id="rect3015"
-       width="1.0079591"
-       height="3.0484221"
-       x="5.5438328"
-       y="8.1219101"
-       rx="0.50398123"
-       ry="0.50398123"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       sodipodi:nodetypes="ccccccccc"
-       id="path3040"
-       d="m 11.222858,9.6745422 c 1.49077,0 2.690755,1.0642818 2.690755,2.3864798 l 0,4.192469 c 0,1.322192 -1.199985,2.38648 -2.690755,2.38648 l -1.2651315,0.0013 -0.015891,-8.97369 c 0.9561105,0.024323 0.3962925,0.00686 1.2810215,0.00686 l 0,-5.62e-5 0,6.63e-5 z"
-       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3052);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220" />
-    <rect
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       y="9.1809731"
-       x="-11.397993"
-       height="8.9388952"
-       width="0.98004872"
-       id="rect3042"
-       style="fill:url(#linearGradient3054);fill-opacity:1;stroke:none"
-       transform="scale(-1,1)" />
-    <rect
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       ry="1.0133103"
-       rx="1.0133103"
-       y="9.1698952"
-       x="-10.428648"
-       height="10.001933"
-       width="2.0254388"
-       id="rect3044"
-       style="fill:url(#linearGradient3056);fill-opacity:1;stroke:none"
-       transform="scale(-1,1)" />
-    <path
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       style="opacity:0.5;fill:url(#radialGradient3058);fill-opacity:1;stroke:none"
-       d="m 11.712442,9.9882971 c 0.940771,0 1.698042,0.8558429 1.698042,1.9190859 l 0,3.371356 c 0,1.063237 -0.757271,1.919079 -1.698042,1.919079 l -1.240183,-0.01722 0,-7.1922304 c 0.603363,0.019548 0.681861,0 1.240183,0 l 0,-7.25e-5 z"
-       id="path3046"
-       sodipodi:nodetypes="cccccccc" />
-    <rect
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       ry="0.99742311"
-       rx="0.99742299"
-       y="11.184834"
-       x="12.404797"
-       height="5.9961619"
-       width="2.0024893"
-       id="rect3048"
-       style="fill:url(#linearGradient3060);fill-opacity:1;stroke:none" />
-    <rect
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       ry="0.50398123"
-       rx="0.50398123"
-       y="8.1020288"
-       x="11.425255"
-       height="3.0317767"
-       width="0.98296487"
-       id="rect3050"
-       style="fill:url(#linearGradient3062);fill-opacity:1;stroke:none" />
-  </g>
-</svg>
Binary file pidgin/pixmaps/toolbar/22/voice-call.png has changed
Binary file pidgin/pixmaps/toolbar/32/audio-call.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/toolbar/32/scalable/audio-call.svg	Wed Sep 16 15:36:24 2009 +0000
@@ -0,0 +1,990 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3879"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel r20974"
+   version="1.0"
+   sodipodi:docname="voice-32.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3881">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3617">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop3619" />
+      <stop
+         style="stop-color:#0b0c0d;stop-opacity:1"
+         offset="1"
+         id="stop3621" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective96" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555"
+       id="linearGradient4563"
+       gradientUnits="userSpaceOnUse"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991"
+       gradientTransform="matrix(0.66407978,0,0,0.75715849,190.43006,50.728904)" />
+    <linearGradient
+       id="linearGradient4555"
+       inkscape:collect="always">
+      <stop
+         id="stop4557"
+         offset="0"
+         style="stop-color:#545652;stop-opacity:1;" />
+      <stop
+         id="stop4559"
+         offset="1"
+         style="stop-color:#80837d;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1.0450411,0,0,1.0014371,56.421478,-248.82007)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient4976"
+       id="linearGradient4984"
+       x1="-24.687374"
+       y1="245.84587"
+       x2="-24.687374"
+       y2="247.61009"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4976">
+      <stop
+         style="stop-color:#555753;stop-opacity:1;"
+         offset="0"
+         id="stop4978" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="1"
+         id="stop4980" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555"
+       id="linearGradient4553"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68621958,0,0,0.68621958,170.73384,47.327606)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5677-7"
+       id="linearGradient5723-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99553756,0,0,0.89724059,-297.05952,126.21271)"
+       x1="305.89481"
+       y1="-120.46718"
+       x2="306.04715"
+       y2="-120.46718" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5677-7">
+      <stop
+         style="stop-color:#ff2de7;stop-opacity:1"
+         offset="0"
+         id="stop5679-1" />
+      <stop
+         style="stop-color:#7b009b;stop-opacity:1"
+         offset="1"
+         id="stop5681-4" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5043-9-6-1"
+       id="radialGradient5721-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.64273656,1.224542,-1.4441796,0.7171335,16.526738,477.02976)"
+       cx="-306.03387"
+       cy="-120.8595"
+       fx="-306.03387"
+       fy="-120.8595"
+       r="3.03685" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5043-9-6-1">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5045-4-8-8" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5047-1-2-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5655-9"
+       id="linearGradient5719-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0247755,0,0,0.92090367,303.84649,129.09036)"
+       x1="-300.82822"
+       y1="-126.31032"
+       x2="-300.82822"
+       y2="-114.83224" />
+    <linearGradient
+       id="linearGradient5655-9"
+       inkscape:collect="always">
+      <stop
+         id="stop5657-5"
+         offset="0"
+         style="stop-color:#2e3436;stop-opacity:1" />
+      <stop
+         id="stop5659-1"
+         offset="1"
+         style="stop-color:#707e83;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       y2="-36.569096"
+       x2="-219.25159"
+       y1="-43.842201"
+       x1="-219.25159"
+       gradientTransform="matrix(-0.97877933,0,0,0.78119332,-218.97584,51.325392)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5758"
+       xlink:href="#linearGradient5853"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5853"
+       inkscape:collect="always">
+      <stop
+         id="stop5855"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         id="stop5857"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5626"
+       id="linearGradient5632"
+       x1="-25.743168"
+       y1="-243.09763"
+       x2="-23.90864"
+       y2="-240.62437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.6571758,0,0,1.0085905,46.149483,249.53936)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5626">
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1;"
+         offset="0"
+         id="stop5628" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:0;"
+         offset="1"
+         id="stop5630" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4971"
+       id="linearGradient4977"
+       x1="-105.74262"
+       y1="-282.20282"
+       x2="-102.94624"
+       y2="-282.20282"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4971">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4973" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4975" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4786"
+       id="linearGradient4792"
+       x1="-106.91152"
+       y1="280.91522"
+       x2="-101.28181"
+       y2="282.32028"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.60027296,0,0,0.696962,91.940589,-191.45315)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4786">
+      <stop
+         style="stop-color:#555753;stop-opacity:1"
+         offset="0"
+         id="stop4788" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1"
+         id="stop4790" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5677"
+       id="linearGradient5449-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68621958,0,0,0.76218683,-188.89688,109.60097)"
+       x1="305.89481"
+       y1="-120.46718"
+       x2="306.04715"
+       y2="-120.46718" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5677">
+      <stop
+         style="stop-color:#ff2de7;stop-opacity:1"
+         offset="0"
+         id="stop5679" />
+      <stop
+         style="stop-color:#7b009b;stop-opacity:1"
+         offset="1"
+         id="stop5681" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5043-9-6"
+       id="radialGradient5447-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.64273656,1.224542,1.4441796,0.7171335,-3.1640994,476.83323)"
+       cx="-306.03387"
+       cy="-120.8595"
+       fx="-306.03387"
+       fy="-120.8595"
+       r="3.03685" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5043-9-6">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5045-4-8" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5047-1-2" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5655"
+       id="linearGradient5443-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.75005399,0,0,0.85573606,208.06197,120.96548)"
+       x1="-300.82822"
+       y1="-126.31032"
+       x2="-300.82822"
+       y2="-114.83224" />
+    <linearGradient
+       id="linearGradient5655"
+       inkscape:collect="always">
+      <stop
+         id="stop5657"
+         offset="0"
+         style="stop-color:#2e3436;stop-opacity:1" />
+      <stop
+         id="stop5659"
+         offset="1"
+         style="stop-color:#707e83;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5661"
+       id="linearGradient5667"
+       x1="-219.25159"
+       y1="-43.842201"
+       x2="-219.25159"
+       y2="-36.569096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.77824526,0,0,0.72964259,189.11899,48.738021)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5661">
+      <stop
+         style="stop-color:#888a85;stop-opacity:1;"
+         offset="0"
+         id="stop5663" />
+      <stop
+         style="stop-color:#555753;stop-opacity:1"
+         offset="1"
+         id="stop5665" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5206"
+       id="linearGradient5212"
+       x1="-304.49771"
+       y1="-142.89493"
+       x2="-262.4259"
+       y2="-143.92334"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5206">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop5208" />
+      <stop
+         style="stop-color:#dededd;stop-opacity:0;"
+         offset="1"
+         id="stop5210" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5388"
+       id="linearGradient5394"
+       x1="-283.80222"
+       y1="-143.74782"
+       x2="-283.80222"
+       y2="-141.12897"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69617626,0,0,0.77539869,204.63341,113.36017)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5388">
+      <stop
+         style="stop-color:#555753;stop-opacity:1"
+         offset="0"
+         id="stop5390" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1"
+         id="stop5392" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5376"
+       id="radialGradient5382"
+       cx="-284.44626"
+       cy="-153.18155"
+       fx="-284.44626"
+       fy="-153.18155"
+       r="17.449057"
+       gradientTransform="matrix(0.52159422,0.00570372,-0.00515056,0.61959156,154.17873,98.370923)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5376">
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1"
+         offset="0"
+         id="stop5378" />
+      <stop
+         style="stop-color:#434542;stop-opacity:1"
+         offset="1"
+         id="stop5380" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617"
+       id="linearGradient3623"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0329046,0,0,0.75231698,-4.0458192,-2.1508414)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617"
+       id="linearGradient3627"
+       gradientUnits="userSpaceOnUse"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505"
+       gradientTransform="translate(27.998451,0)" />
+    <inkscape:perspective
+       id="perspective3637"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617-8"
+       id="linearGradient3627-1"
+       gradientUnits="userSpaceOnUse"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505"
+       gradientTransform="translate(27.998451,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3617-8">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop3619-2" />
+      <stop
+         style="stop-color:#0b0c0d;stop-opacity:1"
+         offset="1"
+         id="stop3621-4" />
+    </linearGradient>
+    <linearGradient
+       y2="34.927505"
+       x2="1.421198"
+       y1="19.01931"
+       x1="1.421198"
+       gradientTransform="matrix(0.68621958,0,0,0.68621958,15.319865,-0.89371418)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3646"
+       xlink:href="#linearGradient3617-8"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5853"
+       id="linearGradient2890"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.97877933,0,0,0.78119332,232.83687,51.325392)"
+       x1="-219.25159"
+       y1="-43.842201"
+       x2="-219.25159"
+       y2="-36.569096" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5655-9"
+       id="linearGradient2892"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0247755,0,0,0.92090367,289.98546,129.09036)"
+       x1="-300.82822"
+       y1="-126.31032"
+       x2="-300.82822"
+       y2="-114.83224" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617"
+       id="linearGradient2894"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0329046,0,0,0.75231698,-17.906854,-2.1508414)"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5043-9-6-1"
+       id="radialGradient2896"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.64273656,1.224542,1.4441796,0.7171335,-2.6657025,477.02976)"
+       cx="-306.03387"
+       cy="-120.8595"
+       fx="-306.03387"
+       fy="-120.8595"
+       r="3.03685" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5677-7"
+       id="linearGradient2898"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99553756,0,0,0.89724059,-283.19849,126.21271)"
+       x1="305.89481"
+       y1="-120.46718"
+       x2="306.04715"
+       y2="-120.46718" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555"
+       id="linearGradient2900"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68621958,0,0,0.68621958,156.87281,47.327606)"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991" />
+    <inkscape:perspective
+       id="perspective2910"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5853-9"
+       id="linearGradient2890-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.97877933,0,0,0.78119332,232.83687,51.325392)"
+       x1="-219.25159"
+       y1="-43.842201"
+       x2="-219.25159"
+       y2="-36.569096" />
+    <linearGradient
+       id="linearGradient5853-9"
+       inkscape:collect="always">
+      <stop
+         id="stop5855-9"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         id="stop5857-6"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5655-9-5"
+       id="linearGradient2892-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0247755,0,0,0.92090367,290.97234,129.09035)"
+       x1="-300.82822"
+       y1="-126.31032"
+       x2="-300.82822"
+       y2="-114.83224" />
+    <linearGradient
+       id="linearGradient5655-9-5"
+       inkscape:collect="always">
+      <stop
+         id="stop5657-5-8"
+         offset="0"
+         style="stop-color:#2e3436;stop-opacity:1" />
+      <stop
+         id="stop5659-1-7"
+         offset="1"
+         style="stop-color:#707e83;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617-3"
+       id="linearGradient2894-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0329046,0,0,0.75231698,-16.919972,-2.1508407)"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3617-3">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop3619-4" />
+      <stop
+         style="stop-color:#0b0c0d;stop-opacity:1"
+         offset="1"
+         id="stop3621-6" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5043-9-6-1-1"
+       id="radialGradient2896-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.64273656,1.224542,1.4441796,0.7171335,-3.6525853,477.02975)"
+       cx="-306.03387"
+       cy="-120.8595"
+       fx="-306.03387"
+       fy="-120.8595"
+       r="3.03685" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5043-9-6-1-1">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5045-4-8-8-6" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5047-1-2-6-8" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5677-7-2"
+       id="linearGradient2898-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99553756,0,0,0.89724059,-284.18537,126.2127)"
+       x1="305.89481"
+       y1="-120.46718"
+       x2="306.04715"
+       y2="-120.46718" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5677-7-2">
+      <stop
+         style="stop-color:#ff2de7;stop-opacity:1"
+         offset="0"
+         id="stop5679-1-6" />
+      <stop
+         style="stop-color:#7b009b;stop-opacity:1"
+         offset="1"
+         id="stop5681-4-3" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555-8"
+       id="linearGradient2900-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9295656,0,0,1.1136035,220.46357,68.767752)"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991" />
+    <linearGradient
+       id="linearGradient4555-8"
+       inkscape:collect="always">
+      <stop
+         id="stop4557-5"
+         offset="0"
+         style="stop-color:#545652;stop-opacity:1;" />
+      <stop
+         id="stop4559-4"
+         offset="1"
+         style="stop-color:#80837d;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="-36.569096"
+       x2="-219.25159"
+       y1="-43.842201"
+       x1="-219.25159"
+       gradientTransform="matrix(0.97877933,0,0,0.78119332,231.84999,51.325392)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2944"
+       xlink:href="#linearGradient5853-9"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555-8"
+       id="linearGradient3017"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9295656,0,0,1.1136035,245.41352,68.767752)"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.313708"
+     inkscape:cx="30.024929"
+     inkscape:cy="6.5961333"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="752"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2855"
+       empspacing="5"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3884">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(8.5714283,-0.14285715)">
+    <rect
+       style="fill:#cc0000;fill-opacity:0;stroke:none"
+       id="rect5861"
+       width="32.938541"
+       height="32.938541"
+       x="-9.7751017"
+       y="-0.79568303"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       d="m 1.9145026,1.3173618 c -4.6831399,0 -8.4777215,3.7603186 -8.4777215,8.4276345 l 0,4.3960947 c 0,0.493488 0.047692,0.966938 0.1290984,1.436772 l 1.0219853,0 c -0.087239,-0.46606 -0.1291054,-0.944348 -0.1291054,-1.436772 l 0,-4.3960947 c 0,-4.2990218 4.2056809,-7.7414149 8.5192778,-7.7414149 l 7.6873528,0 c 4.313596,0 7.789175,3.4423931 7.789175,7.7414149 l 0,4.3960947 c 0,0.492424 -0.04186,0.970712 -0.129105,1.436772 l 0.974072,0 c 0.08141,-0.469834 0.129105,-0.943284 0.129105,-1.436772 l 0,-4.3960947 c 0,-4.6673159 -3.794582,-8.4276345 -8.477721,-8.4276345 l -9.0364134,0 z"
+       id="rect5549"
+       sodipodi:nodetypes="ccccccccccccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="fill:url(#radialGradient5382);fill-opacity:1;stroke:none"
+       d="m -4.9451328,6.6771159 c -0.2382967,-0.1875506 -0.3328176,-0.4368942 -0.3134387,-0.826805 0.019908,-0.4006407 0.097834,-0.5213766 0.7600657,-1.1777397 3.2353396,-3.2067063 9.3093493,-4.6899303 15.0315108,-3.670585 2.613773,0.4656271 5.073336,1.4865771 6.785537,2.8166358 0.921369,0.7157372 1.613595,1.4870802 1.691896,1.8852778 0.106689,0.542581 -0.217518,1.088092 -0.646986,1.0885949 C 18.22184,6.7926704 18.094005,6.725193 17.802257,6.4963114 14.60793,3.9901815 9.5705605,3.0274559 4.6388625,3.5603368 1.2946491,3.9216742 -1.6363077,4.7181575 -3.9060775,6.4188147 -4.4662772,6.8385521 -4.6743153,6.8902619 -4.9451328,6.6771159 l 0,0 z"
+       id="path5202"
+       sodipodi:nodetypes="cssssssssscc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:url(#linearGradient5394);fill-opacity:1;stroke:none;stroke-width:1.36950052;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       d="M 5.9838584,0.17166026 C 5.1095585,0.20663073 4.2382243,0.29156016 3.394953,0.42230013 0.04247471,0.94208089 -2.9747116,2.2080433 -4.915651,4.1317997 c -0.011904,0.011787 -0.031676,0.013182 -0.043511,0.025045 -0.016864,0.023062 -0.031489,0.048317 -0.043511,0.075137 -0.5805135,0.4714269 -0.7747954,1.3841486 -0.4133546,2.1053935 0.3553353,0.7090636 1.1019287,0.9693649 1.7404406,0.6516606 0.011487,-0.00543 0.032163,0.00621 0.043511,0 0.030839,-0.011883 0.060226,-0.028799 0.087022,-0.050091 0.00557,-0.0031 0.016221,0.00388 0.021721,0 0.013158,-0.00977 0.030284,-0.015352 0.043511,-0.025045 0.00815,-0.00543 0.013575,-0.019075 0.021721,-0.025045 4.42090043,-3.2482857 12.7875743,-3.6783329 18.513938,-1.1109257 0.801771,0.359467 1.522996,0.5612214 2.153794,1.0106657 0.0069,0.00871 0.01416,0.01707 0.02172,0.025045 0.0083,0.00543 0.0135,0.019075 0.02172,0.025045 0.01873,0.028221 0.04073,0.053561 0.06523,0.075137 0.662378,0.4405821 1.532062,0.1866468 1.914485,-0.5764698 0.32666,-0.6518311 0.193384,-1.4553767 -0.261066,-1.9550127 -0.0062,-0.017277 -0.01349,-0.034053 -0.02172,-0.050168 -0.0042,-0.00388 -0.01747,0.00388 -0.02172,0 -0.0069,-0.00871 -0.01417,-0.017069 -0.02172,-0.025045 -0.01914,-0.018377 -0.02339,-0.057923 -0.04351,-0.075137 2.23e-4,-0.00835 2.23e-4,-0.016699 0,-0.025045 C 17.626438,2.9422684 15.867096,1.9315671 13.750505,1.2243105 12.113516,0.67731325 10.374064,0.34798591 8.6162053,0.22174326 7.7372758,0.15862581 6.8580887,0.13665877 5.9837888,0.1716525 l 6.96e-5,7.76e-6 z M 7.2891889,1.1336088 c 2.1378181,0.035901 4.2887031,0.3670427 6.2655851,1.0276281 l 0.02172,0 c 1.92325,0.6454806 3.513456,1.4252715 4.633924,2.4969112 0.03311,0.074934 0.08725,0.1372993 0.152288,0.1754495 0.336545,0.2238499 0.455369,0.7150959 0.261066,1.1028263 -0.16516,0.3295754 -0.503022,0.478072 -0.804953,0.3759598 -0.03188,-0.03246 -0.06896,-0.058069 -0.108777,-0.075136 C 16.997965,5.7085187 16.200286,5.2394489 15.295181,4.833644 12.29636,3.4891337 8.6839711,2.9762928 5.2223808,3.229538 1.8200146,3.4784567 -1.420665,4.4860717 -3.7626438,6.1871102 c -0.00557,0.00388 -0.016499,-0.00388 -0.021721,0 -0.014986,0.00717 -0.029537,0.015544 -0.043511,0.025045 -0.014986,0.00717 -0.029537,0.015544 -0.043511,0.025045 -0.00829,0.00621 -0.013506,0.01892 -0.021721,0.025045 -0.3321179,0.2011152 -0.7460434,0.052185 -0.9354868,-0.3258303 -0.1865196,-0.3722068 -0.088115,-0.8432306 0.2175551,-1.0777654 0.014982,-0.00717 0.029532,-0.015544 0.043511,-0.025045 0.051565,-0.028565 0.096846,-0.072038 0.130533,-0.1253199 1.7837016,-1.7457008 4.67971835,-2.821787 7.9190054,-3.3240282 1.2303452,-0.1907636 2.524523,-0.272227 3.8072138,-0.2506399 l -3.48e-5,-7.7e-6 z"
+       id="path5194"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963"
+       sodipodi:nodetypes="csssssssssssssssssssssscssccccccsssssssssssssscscc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:url(#linearGradient5212);stroke-width:1.41199458;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       id="path5204"
+       sodipodi:cx="-285.49203"
+       sodipodi:cy="-135.7495"
+       sodipodi:rx="18.775068"
+       sodipodi:ry="9.3875341"
+       d="m -300.83968,-141.15673 a 18.775068,9.3875341 0 0 1 30.74554,0.0358"
+       transform="matrix(-0.70657745,0,0,0.70986232,-194.81186,105.68217)"
+       sodipodi:start="3.7554218"
+       sodipodi:end="5.6740176"
+       sodipodi:open="true"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       d="m -6.5233133,22.735232 0,0.02141 c 0,4.667316 3.7603187,8.427634 8.4276344,8.427634 l 6.3475307,0 0.2625302,-0.900842 -6.3475307,0 c -4.2990216,0 -7.7414148,-3.442393 -7.7414148,-7.741415 l 0,-0.02141 -0.9487498,0.214623 z"
+       id="rect5551"
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       ry="1.4981471"
+       rx="1.4981471"
+       y="1.9545606"
+       x="28.614576"
+       height="6.9623013"
+       width="2.9962943"
+       id="rect4784"
+       style="fill:#555753;fill-opacity:1;stroke:url(#linearGradient4792);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       transform="matrix(0,1,1,0,0,0)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0081301"
+       inkscape:original="M -103.46875 -287.5 C -104.58751 -287.5 -105.5 -286.58751 -105.5 -285.46875 L -105.5 -279.53125 C -105.5 -278.41249 -104.58751 -277.5 -103.46875 -277.5 L -102.53125 -277.5 C -101.41249 -277.5 -100.5 -278.41249 -100.5 -279.53125 L -100.5 -285.46875 C -100.5 -286.58751 -101.41249 -287.5 -102.53125 -287.5 L -103.46875 -287.5 z "
+       style="opacity:0.6081081;fill:none;stroke:url(#linearGradient4977);stroke-width:2.1435864;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       id="path4967"
+       d="m -103.46875,-286.5 c -0.57059,0 -1.03125,0.46066 -1.03125,1.03125 l 0,5.9375 c 0,0.57059 0.46066,1.03125 1.03125,1.03125 l 0.9375,0 c 0.57059,0 1.03125,-0.46066 1.03125,-1.03125 l 0,-5.9375 c 0,-0.57059 -0.46066,-1.03125 -1.03125,-1.03125 l -0.9375,0 z"
+       transform="matrix(0,0.35041293,0.62106611,0,180.86297,66.235476)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       transform="matrix(0,1,1,0,0,0)"
+       style="fill:url(#linearGradient5632);fill-opacity:1;stroke:none"
+       id="rect5572"
+       width="1.99455"
+       height="5.9798374"
+       x="29.110865"
+       y="2.4541459"
+       rx="0.99727499"
+       ry="0.99727499"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient5758);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       d="m -4.7126309,12.654361 c -1.8622525,0 -3.3612598,1.30267 -3.3612598,2.921028 l 0,5.131543 c 0,1.618351 1.4990073,2.921029 3.3612598,2.921029 l 1.5803872,0.0017 0.01985,-10.983712 c -1.1943624,0.02977 -0.4950442,0.0084 -1.6002373,0.0084 l 0,-6.9e-5 1e-7,8.1e-5 z"
+       id="path5707"
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient5719-5);fill-opacity:1;stroke:none"
+       id="rect5709"
+       width="1.9106927"
+       height="10.99095"
+       x="-5.5105519"
+       y="12.139328"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient3623);fill-opacity:1;stroke:none"
+       id="rect5711"
+       width="2.0266206"
+       height="11.968007"
+       x="-3.5911674"
+       y="12.157709"
+       rx="1.0133103"
+       ry="1.0133103"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path5713"
+       d="m -5.238356,13.125441 c -1.2499833,0 -2.2561527,1.137149 -2.2561527,2.549866 l 0,4.479482 c 0,1.41271 1.0061694,2.549858 2.2561527,2.549858 l 1.6478054,-0.02288 0,-9.556232 c -0.8016761,0.02597 -0.9059746,0 -1.6478054,0 l 0,-9.6e-5 z"
+       style="opacity:0.5;fill:url(#radialGradient5721-4);fill-opacity:1;stroke:none"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient5723-8);fill-opacity:1;stroke:none"
+       id="rect5715"
+       width="1.9859439"
+       height="7.995038"
+       x="6.5732913"
+       y="14.12711"
+       rx="0.99742299"
+       ry="0.99742305"
+       transform="scale(-1,1)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#dee1e3;fill-opacity:1;stroke:none"
+       id="path5859"
+       sodipodi:cx="-244.01906"
+       sodipodi:cy="-24.045986"
+       sodipodi:rx="0.83739835"
+       sodipodi:ry="1.3739837"
+       d="m -243.18166,-24.045986 a 0.83739835,1.3739837 0 1 1 -1.6748,0 0.83739835,1.3739837 0 1 1 1.6748,0 z"
+       transform="matrix(0.8690986,0,0,0.73826906,214.78423,47.887046)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient4984);fill-opacity:1;stroke:none"
+       id="rect5811-4"
+       width="1.0533623"
+       height="2.3305926"
+       x="30.146362"
+       y="-3.4252403"
+       rx="0.50398123"
+       ry="0.50398123"
+       transform="matrix(0,1,-1,0,0,0)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       y="-0.79568303"
+       x="-9.7751017"
+       height="32.938541"
+       width="32.938541"
+       id="rect5863"
+       style="fill:#ffffff;fill-opacity:0;stroke:none"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
+    <path
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       sodipodi:nodetypes="ccccccccc"
+       id="path2878"
+       d="m 17.586784,12.654361 c 1.862252,0 3.36126,1.30267 3.36126,2.921028 l 0,5.131543 c 0,1.618351 -1.499008,2.921029 -3.36126,2.921029 l -1.580387,0.0017 -0.01985,-10.983712 c 1.194362,0.02977 0.495044,0.0084 1.600237,0.0084 l 0,-6.9e-5 0,8.1e-5 z"
+       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient2944);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220" />
+    <rect
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       y="12.139328"
+       x="-18.384705"
+       height="10.99095"
+       width="1.9106927"
+       id="rect2880"
+       style="fill:url(#linearGradient2892-5);fill-opacity:1;stroke:none"
+       transform="scale(-1,1)" />
+    <rect
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       ry="1.0133103"
+       rx="1.0133103"
+       y="12.157709"
+       x="-16.465319"
+       height="11.968007"
+       width="2.0266206"
+       id="rect2882"
+       style="fill:url(#linearGradient2894-1);fill-opacity:1;stroke:none"
+       transform="scale(-1,1)" />
+    <path
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       style="opacity:0.5;fill:url(#radialGradient2896-0);fill-opacity:1;stroke:none"
+       d="m 18.112509,13.125441 c 1.249983,0 2.256153,1.137149 2.256153,2.549866 l 0,4.479482 c 0,1.41271 -1.00617,2.549858 -2.256153,2.549858 l -1.647805,-0.02288 0,-9.556232 c 0.801676,0.02597 0.905974,0 1.647805,0 l 0,-9.6e-5 z"
+       id="path2884"
+       sodipodi:nodetypes="cccccccc" />
+    <rect
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       ry="0.99742305"
+       rx="0.99742299"
+       y="14.12711"
+       x="19.447443"
+       height="7.995038"
+       width="1.9859439"
+       id="rect2886"
+       style="fill:url(#linearGradient2898-1);fill-opacity:1;stroke:none" />
+    <rect
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       ry="0.50398123"
+       rx="0.50398123"
+       y="11.170098"
+       x="-19.396423"
+       height="3.9994802"
+       width="0.93696725"
+       id="rect2888"
+       style="fill:url(#linearGradient2900-3);fill-opacity:1;stroke:none"
+       transform="scale(-1,1)" />
+    <rect
+       transform="scale(-1,1)"
+       style="fill:url(#linearGradient3017);fill-opacity:1;stroke:none"
+       id="rect3015"
+       width="0.93696725"
+       height="3.9994802"
+       x="5.5535235"
+       y="11.170098"
+       rx="0.50398123"
+       ry="0.50398123"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+  </g>
+</svg>
--- a/pidgin/pixmaps/toolbar/32/scalable/voice-call.svg	Wed Sep 16 15:35:45 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,990 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="32"
-   height="32"
-   id="svg3879"
-   sodipodi:version="0.32"
-   inkscape:version="0.46+devel r20974"
-   version="1.0"
-   sodipodi:docname="voice-32.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs3881">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3617">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1;"
-         offset="0"
-         id="stop3619" />
-      <stop
-         style="stop-color:#0b0c0d;stop-opacity:1"
-         offset="1"
-         id="stop3621" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 24 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="48 : 24 : 1"
-       inkscape:persp3d-origin="24 : 16 : 1"
-       id="perspective96" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555"
-       id="linearGradient4563"
-       gradientUnits="userSpaceOnUse"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991"
-       gradientTransform="matrix(0.66407978,0,0,0.75715849,190.43006,50.728904)" />
-    <linearGradient
-       id="linearGradient4555"
-       inkscape:collect="always">
-      <stop
-         id="stop4557"
-         offset="0"
-         style="stop-color:#545652;stop-opacity:1;" />
-      <stop
-         id="stop4559"
-         offset="1"
-         style="stop-color:#80837d;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="matrix(1.0450411,0,0,1.0014371,56.421478,-248.82007)"
-       inkscape:collect="always"
-       xlink:href="#linearGradient4976"
-       id="linearGradient4984"
-       x1="-24.687374"
-       y1="245.84587"
-       x2="-24.687374"
-       y2="247.61009"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4976">
-      <stop
-         style="stop-color:#555753;stop-opacity:1;"
-         offset="0"
-         id="stop4978" />
-      <stop
-         style="stop-color:#808080;stop-opacity:1"
-         offset="1"
-         id="stop4980" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555"
-       id="linearGradient4553"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.68621958,0,0,0.68621958,170.73384,47.327606)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5677-7"
-       id="linearGradient5723-8"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.99553756,0,0,0.89724059,-297.05952,126.21271)"
-       x1="305.89481"
-       y1="-120.46718"
-       x2="306.04715"
-       y2="-120.46718" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5677-7">
-      <stop
-         style="stop-color:#ff2de7;stop-opacity:1"
-         offset="0"
-         id="stop5679-1" />
-      <stop
-         style="stop-color:#7b009b;stop-opacity:1"
-         offset="1"
-         id="stop5681-4" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5043-9-6-1"
-       id="radialGradient5721-4"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.64273656,1.224542,-1.4441796,0.7171335,16.526738,477.02976)"
-       cx="-306.03387"
-       cy="-120.8595"
-       fx="-306.03387"
-       fy="-120.8595"
-       r="3.03685" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5043-9-6-1">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop5045-4-8-8" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop5047-1-2-6" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5655-9"
-       id="linearGradient5719-5"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0247755,0,0,0.92090367,303.84649,129.09036)"
-       x1="-300.82822"
-       y1="-126.31032"
-       x2="-300.82822"
-       y2="-114.83224" />
-    <linearGradient
-       id="linearGradient5655-9"
-       inkscape:collect="always">
-      <stop
-         id="stop5657-5"
-         offset="0"
-         style="stop-color:#2e3436;stop-opacity:1" />
-      <stop
-         id="stop5659-1"
-         offset="1"
-         style="stop-color:#707e83;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       y2="-36.569096"
-       x2="-219.25159"
-       y1="-43.842201"
-       x1="-219.25159"
-       gradientTransform="matrix(-0.97877933,0,0,0.78119332,-218.97584,51.325392)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient5758"
-       xlink:href="#linearGradient5853"
-       inkscape:collect="always" />
-    <linearGradient
-       id="linearGradient5853"
-       inkscape:collect="always">
-      <stop
-         id="stop5855"
-         offset="0"
-         style="stop-color:#888a85;stop-opacity:1" />
-      <stop
-         id="stop5857"
-         offset="1"
-         style="stop-color:#555753;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5626"
-       id="linearGradient5632"
-       x1="-25.743168"
-       y1="-243.09763"
-       x2="-23.90864"
-       y2="-240.62437"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6571758,0,0,1.0085905,46.149483,249.53936)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5626">
-      <stop
-         style="stop-color:#babdb6;stop-opacity:1;"
-         offset="0"
-         id="stop5628" />
-      <stop
-         style="stop-color:#babdb6;stop-opacity:0;"
-         offset="1"
-         id="stop5630" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4971"
-       id="linearGradient4977"
-       x1="-105.74262"
-       y1="-282.20282"
-       x2="-102.94624"
-       y2="-282.20282"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4971">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop4973" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop4975" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4786"
-       id="linearGradient4792"
-       x1="-106.91152"
-       y1="280.91522"
-       x2="-101.28181"
-       y2="282.32028"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.60027296,0,0,0.696962,91.940589,-191.45315)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4786">
-      <stop
-         style="stop-color:#555753;stop-opacity:1"
-         offset="0"
-         id="stop4788" />
-      <stop
-         style="stop-color:#000000;stop-opacity:1"
-         offset="1"
-         id="stop4790" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5677"
-       id="linearGradient5449-8"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.68621958,0,0,0.76218683,-188.89688,109.60097)"
-       x1="305.89481"
-       y1="-120.46718"
-       x2="306.04715"
-       y2="-120.46718" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5677">
-      <stop
-         style="stop-color:#ff2de7;stop-opacity:1"
-         offset="0"
-         id="stop5679" />
-      <stop
-         style="stop-color:#7b009b;stop-opacity:1"
-         offset="1"
-         id="stop5681" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5043-9-6"
-       id="radialGradient5447-5"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.64273656,1.224542,1.4441796,0.7171335,-3.1640994,476.83323)"
-       cx="-306.03387"
-       cy="-120.8595"
-       fx="-306.03387"
-       fy="-120.8595"
-       r="3.03685" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5043-9-6">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop5045-4-8" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop5047-1-2" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5655"
-       id="linearGradient5443-6"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.75005399,0,0,0.85573606,208.06197,120.96548)"
-       x1="-300.82822"
-       y1="-126.31032"
-       x2="-300.82822"
-       y2="-114.83224" />
-    <linearGradient
-       id="linearGradient5655"
-       inkscape:collect="always">
-      <stop
-         id="stop5657"
-         offset="0"
-         style="stop-color:#2e3436;stop-opacity:1" />
-      <stop
-         id="stop5659"
-         offset="1"
-         style="stop-color:#707e83;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5661"
-       id="linearGradient5667"
-       x1="-219.25159"
-       y1="-43.842201"
-       x2="-219.25159"
-       y2="-36.569096"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.77824526,0,0,0.72964259,189.11899,48.738021)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5661">
-      <stop
-         style="stop-color:#888a85;stop-opacity:1;"
-         offset="0"
-         id="stop5663" />
-      <stop
-         style="stop-color:#555753;stop-opacity:1"
-         offset="1"
-         id="stop5665" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5206"
-       id="linearGradient5212"
-       x1="-304.49771"
-       y1="-142.89493"
-       x2="-262.4259"
-       y2="-143.92334"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5206">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="0"
-         id="stop5208" />
-      <stop
-         style="stop-color:#dededd;stop-opacity:0;"
-         offset="1"
-         id="stop5210" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5388"
-       id="linearGradient5394"
-       x1="-283.80222"
-       y1="-143.74782"
-       x2="-283.80222"
-       y2="-141.12897"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.69617626,0,0,0.77539869,204.63341,113.36017)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5388">
-      <stop
-         style="stop-color:#555753;stop-opacity:1"
-         offset="0"
-         id="stop5390" />
-      <stop
-         style="stop-color:#000000;stop-opacity:1"
-         offset="1"
-         id="stop5392" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5376"
-       id="radialGradient5382"
-       cx="-284.44626"
-       cy="-153.18155"
-       fx="-284.44626"
-       fy="-153.18155"
-       r="17.449057"
-       gradientTransform="matrix(0.52159422,0.00570372,-0.00515056,0.61959156,154.17873,98.370923)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5376">
-      <stop
-         style="stop-color:#babdb6;stop-opacity:1"
-         offset="0"
-         id="stop5378" />
-      <stop
-         style="stop-color:#434542;stop-opacity:1"
-         offset="1"
-         id="stop5380" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617"
-       id="linearGradient3623"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0329046,0,0,0.75231698,-4.0458192,-2.1508414)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617"
-       id="linearGradient3627"
-       gradientUnits="userSpaceOnUse"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505"
-       gradientTransform="translate(27.998451,0)" />
-    <inkscape:perspective
-       id="perspective3637"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617-8"
-       id="linearGradient3627-1"
-       gradientUnits="userSpaceOnUse"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505"
-       gradientTransform="translate(27.998451,0)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3617-8">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1;"
-         offset="0"
-         id="stop3619-2" />
-      <stop
-         style="stop-color:#0b0c0d;stop-opacity:1"
-         offset="1"
-         id="stop3621-4" />
-    </linearGradient>
-    <linearGradient
-       y2="34.927505"
-       x2="1.421198"
-       y1="19.01931"
-       x1="1.421198"
-       gradientTransform="matrix(0.68621958,0,0,0.68621958,15.319865,-0.89371418)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3646"
-       xlink:href="#linearGradient3617-8"
-       inkscape:collect="always" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5853"
-       id="linearGradient2890"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.97877933,0,0,0.78119332,232.83687,51.325392)"
-       x1="-219.25159"
-       y1="-43.842201"
-       x2="-219.25159"
-       y2="-36.569096" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5655-9"
-       id="linearGradient2892"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0247755,0,0,0.92090367,289.98546,129.09036)"
-       x1="-300.82822"
-       y1="-126.31032"
-       x2="-300.82822"
-       y2="-114.83224" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617"
-       id="linearGradient2894"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0329046,0,0,0.75231698,-17.906854,-2.1508414)"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5043-9-6-1"
-       id="radialGradient2896"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.64273656,1.224542,1.4441796,0.7171335,-2.6657025,477.02976)"
-       cx="-306.03387"
-       cy="-120.8595"
-       fx="-306.03387"
-       fy="-120.8595"
-       r="3.03685" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5677-7"
-       id="linearGradient2898"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.99553756,0,0,0.89724059,-283.19849,126.21271)"
-       x1="305.89481"
-       y1="-120.46718"
-       x2="306.04715"
-       y2="-120.46718" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555"
-       id="linearGradient2900"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.68621958,0,0,0.68621958,156.87281,47.327606)"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991" />
-    <inkscape:perspective
-       id="perspective2910"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5853-9"
-       id="linearGradient2890-4"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.97877933,0,0,0.78119332,232.83687,51.325392)"
-       x1="-219.25159"
-       y1="-43.842201"
-       x2="-219.25159"
-       y2="-36.569096" />
-    <linearGradient
-       id="linearGradient5853-9"
-       inkscape:collect="always">
-      <stop
-         id="stop5855-9"
-         offset="0"
-         style="stop-color:#888a85;stop-opacity:1" />
-      <stop
-         id="stop5857-6"
-         offset="1"
-         style="stop-color:#555753;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5655-9-5"
-       id="linearGradient2892-5"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0247755,0,0,0.92090367,290.97234,129.09035)"
-       x1="-300.82822"
-       y1="-126.31032"
-       x2="-300.82822"
-       y2="-114.83224" />
-    <linearGradient
-       id="linearGradient5655-9-5"
-       inkscape:collect="always">
-      <stop
-         id="stop5657-5-8"
-         offset="0"
-         style="stop-color:#2e3436;stop-opacity:1" />
-      <stop
-         id="stop5659-1-7"
-         offset="1"
-         style="stop-color:#707e83;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617-3"
-       id="linearGradient2894-1"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0329046,0,0,0.75231698,-16.919972,-2.1508407)"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3617-3">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1;"
-         offset="0"
-         id="stop3619-4" />
-      <stop
-         style="stop-color:#0b0c0d;stop-opacity:1"
-         offset="1"
-         id="stop3621-6" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5043-9-6-1-1"
-       id="radialGradient2896-0"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.64273656,1.224542,1.4441796,0.7171335,-3.6525853,477.02975)"
-       cx="-306.03387"
-       cy="-120.8595"
-       fx="-306.03387"
-       fy="-120.8595"
-       r="3.03685" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5043-9-6-1-1">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop5045-4-8-8-6" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop5047-1-2-6-8" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5677-7-2"
-       id="linearGradient2898-1"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.99553756,0,0,0.89724059,-284.18537,126.2127)"
-       x1="305.89481"
-       y1="-120.46718"
-       x2="306.04715"
-       y2="-120.46718" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5677-7-2">
-      <stop
-         style="stop-color:#ff2de7;stop-opacity:1"
-         offset="0"
-         id="stop5679-1-6" />
-      <stop
-         style="stop-color:#7b009b;stop-opacity:1"
-         offset="1"
-         id="stop5681-4-3" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555-8"
-       id="linearGradient2900-3"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9295656,0,0,1.1136035,220.46357,68.767752)"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991" />
-    <linearGradient
-       id="linearGradient4555-8"
-       inkscape:collect="always">
-      <stop
-         id="stop4557-5"
-         offset="0"
-         style="stop-color:#545652;stop-opacity:1;" />
-      <stop
-         id="stop4559-4"
-         offset="1"
-         style="stop-color:#80837d;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       y2="-36.569096"
-       x2="-219.25159"
-       y1="-43.842201"
-       x1="-219.25159"
-       gradientTransform="matrix(0.97877933,0,0,0.78119332,231.84999,51.325392)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient2944"
-       xlink:href="#linearGradient5853-9"
-       inkscape:collect="always" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555-8"
-       id="linearGradient3017"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9295656,0,0,1.1136035,245.41352,68.767752)"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.313708"
-     inkscape:cx="30.024929"
-     inkscape:cy="6.5961333"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1280"
-     inkscape:window-height="752"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:snap-global="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2855"
-       empspacing="5"
-       visible="true"
-       enabled="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata3884">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     transform="translate(8.5714283,-0.14285715)">
-    <rect
-       style="fill:#cc0000;fill-opacity:0;stroke:none"
-       id="rect5861"
-       width="32.938541"
-       height="32.938541"
-       x="-9.7751017"
-       y="-0.79568303"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
-    <path
-       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-       d="m 1.9145026,1.3173618 c -4.6831399,0 -8.4777215,3.7603186 -8.4777215,8.4276345 l 0,4.3960947 c 0,0.493488 0.047692,0.966938 0.1290984,1.436772 l 1.0219853,0 c -0.087239,-0.46606 -0.1291054,-0.944348 -0.1291054,-1.436772 l 0,-4.3960947 c 0,-4.2990218 4.2056809,-7.7414149 8.5192778,-7.7414149 l 7.6873528,0 c 4.313596,0 7.789175,3.4423931 7.789175,7.7414149 l 0,4.3960947 c 0,0.492424 -0.04186,0.970712 -0.129105,1.436772 l 0.974072,0 c 0.08141,-0.469834 0.129105,-0.943284 0.129105,-1.436772 l 0,-4.3960947 c 0,-4.6673159 -3.794582,-8.4276345 -8.477721,-8.4276345 l -9.0364134,0 z"
-       id="rect5549"
-       sodipodi:nodetypes="ccccccccccccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="fill:url(#radialGradient5382);fill-opacity:1;stroke:none"
-       d="m -4.9451328,6.6771159 c -0.2382967,-0.1875506 -0.3328176,-0.4368942 -0.3134387,-0.826805 0.019908,-0.4006407 0.097834,-0.5213766 0.7600657,-1.1777397 3.2353396,-3.2067063 9.3093493,-4.6899303 15.0315108,-3.670585 2.613773,0.4656271 5.073336,1.4865771 6.785537,2.8166358 0.921369,0.7157372 1.613595,1.4870802 1.691896,1.8852778 0.106689,0.542581 -0.217518,1.088092 -0.646986,1.0885949 C 18.22184,6.7926704 18.094005,6.725193 17.802257,6.4963114 14.60793,3.9901815 9.5705605,3.0274559 4.6388625,3.5603368 1.2946491,3.9216742 -1.6363077,4.7181575 -3.9060775,6.4188147 -4.4662772,6.8385521 -4.6743153,6.8902619 -4.9451328,6.6771159 l 0,0 z"
-       id="path5202"
-       sodipodi:nodetypes="cssssssssscc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:url(#linearGradient5394);fill-opacity:1;stroke:none;stroke-width:1.36950052;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-       d="M 5.9838584,0.17166026 C 5.1095585,0.20663073 4.2382243,0.29156016 3.394953,0.42230013 0.04247471,0.94208089 -2.9747116,2.2080433 -4.915651,4.1317997 c -0.011904,0.011787 -0.031676,0.013182 -0.043511,0.025045 -0.016864,0.023062 -0.031489,0.048317 -0.043511,0.075137 -0.5805135,0.4714269 -0.7747954,1.3841486 -0.4133546,2.1053935 0.3553353,0.7090636 1.1019287,0.9693649 1.7404406,0.6516606 0.011487,-0.00543 0.032163,0.00621 0.043511,0 0.030839,-0.011883 0.060226,-0.028799 0.087022,-0.050091 0.00557,-0.0031 0.016221,0.00388 0.021721,0 0.013158,-0.00977 0.030284,-0.015352 0.043511,-0.025045 0.00815,-0.00543 0.013575,-0.019075 0.021721,-0.025045 4.42090043,-3.2482857 12.7875743,-3.6783329 18.513938,-1.1109257 0.801771,0.359467 1.522996,0.5612214 2.153794,1.0106657 0.0069,0.00871 0.01416,0.01707 0.02172,0.025045 0.0083,0.00543 0.0135,0.019075 0.02172,0.025045 0.01873,0.028221 0.04073,0.053561 0.06523,0.075137 0.662378,0.4405821 1.532062,0.1866468 1.914485,-0.5764698 0.32666,-0.6518311 0.193384,-1.4553767 -0.261066,-1.9550127 -0.0062,-0.017277 -0.01349,-0.034053 -0.02172,-0.050168 -0.0042,-0.00388 -0.01747,0.00388 -0.02172,0 -0.0069,-0.00871 -0.01417,-0.017069 -0.02172,-0.025045 -0.01914,-0.018377 -0.02339,-0.057923 -0.04351,-0.075137 2.23e-4,-0.00835 2.23e-4,-0.016699 0,-0.025045 C 17.626438,2.9422684 15.867096,1.9315671 13.750505,1.2243105 12.113516,0.67731325 10.374064,0.34798591 8.6162053,0.22174326 7.7372758,0.15862581 6.8580887,0.13665877 5.9837888,0.1716525 l 6.96e-5,7.76e-6 z M 7.2891889,1.1336088 c 2.1378181,0.035901 4.2887031,0.3670427 6.2655851,1.0276281 l 0.02172,0 c 1.92325,0.6454806 3.513456,1.4252715 4.633924,2.4969112 0.03311,0.074934 0.08725,0.1372993 0.152288,0.1754495 0.336545,0.2238499 0.455369,0.7150959 0.261066,1.1028263 -0.16516,0.3295754 -0.503022,0.478072 -0.804953,0.3759598 -0.03188,-0.03246 -0.06896,-0.058069 -0.108777,-0.075136 C 16.997965,5.7085187 16.200286,5.2394489 15.295181,4.833644 12.29636,3.4891337 8.6839711,2.9762928 5.2223808,3.229538 1.8200146,3.4784567 -1.420665,4.4860717 -3.7626438,6.1871102 c -0.00557,0.00388 -0.016499,-0.00388 -0.021721,0 -0.014986,0.00717 -0.029537,0.015544 -0.043511,0.025045 -0.014986,0.00717 -0.029537,0.015544 -0.043511,0.025045 -0.00829,0.00621 -0.013506,0.01892 -0.021721,0.025045 -0.3321179,0.2011152 -0.7460434,0.052185 -0.9354868,-0.3258303 -0.1865196,-0.3722068 -0.088115,-0.8432306 0.2175551,-1.0777654 0.014982,-0.00717 0.029532,-0.015544 0.043511,-0.025045 0.051565,-0.028565 0.096846,-0.072038 0.130533,-0.1253199 1.7837016,-1.7457008 4.67971835,-2.821787 7.9190054,-3.3240282 1.2303452,-0.1907636 2.524523,-0.272227 3.8072138,-0.2506399 l -3.48e-5,-7.7e-6 z"
-       id="path5194"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963"
-       sodipodi:nodetypes="csssssssssssssssssssssscssccccccsssssssssssssscscc" />
-    <path
-       sodipodi:type="arc"
-       style="fill:none;stroke:url(#linearGradient5212);stroke-width:1.41199458;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       id="path5204"
-       sodipodi:cx="-285.49203"
-       sodipodi:cy="-135.7495"
-       sodipodi:rx="18.775068"
-       sodipodi:ry="9.3875341"
-       d="m -300.83968,-141.15673 a 18.775068,9.3875341 0 0 1 30.74554,0.0358"
-       transform="matrix(-0.70657745,0,0,0.70986232,-194.81186,105.68217)"
-       sodipodi:start="3.7554218"
-       sodipodi:end="5.6740176"
-       sodipodi:open="true"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-       d="m -6.5233133,22.735232 0,0.02141 c 0,4.667316 3.7603187,8.427634 8.4276344,8.427634 l 6.3475307,0 0.2625302,-0.900842 -6.3475307,0 c -4.2990216,0 -7.7414148,-3.442393 -7.7414148,-7.741415 l 0,-0.02141 -0.9487498,0.214623 z"
-       id="rect5551"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       ry="1.4981471"
-       rx="1.4981471"
-       y="1.9545606"
-       x="28.614576"
-       height="6.9623013"
-       width="2.9962943"
-       id="rect4784"
-       style="fill:#555753;fill-opacity:1;stroke:url(#linearGradient4792);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       transform="matrix(0,1,1,0,0,0)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:type="inkscape:offset"
-       inkscape:radius="-1.0081301"
-       inkscape:original="M -103.46875 -287.5 C -104.58751 -287.5 -105.5 -286.58751 -105.5 -285.46875 L -105.5 -279.53125 C -105.5 -278.41249 -104.58751 -277.5 -103.46875 -277.5 L -102.53125 -277.5 C -101.41249 -277.5 -100.5 -278.41249 -100.5 -279.53125 L -100.5 -285.46875 C -100.5 -286.58751 -101.41249 -287.5 -102.53125 -287.5 L -103.46875 -287.5 z "
-       style="opacity:0.6081081;fill:none;stroke:url(#linearGradient4977);stroke-width:2.1435864;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       id="path4967"
-       d="m -103.46875,-286.5 c -0.57059,0 -1.03125,0.46066 -1.03125,1.03125 l 0,5.9375 c 0,0.57059 0.46066,1.03125 1.03125,1.03125 l 0.9375,0 c 0.57059,0 1.03125,-0.46066 1.03125,-1.03125 l 0,-5.9375 c 0,-0.57059 -0.46066,-1.03125 -1.03125,-1.03125 l -0.9375,0 z"
-       transform="matrix(0,0.35041293,0.62106611,0,180.86297,66.235476)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       transform="matrix(0,1,1,0,0,0)"
-       style="fill:url(#linearGradient5632);fill-opacity:1;stroke:none"
-       id="rect5572"
-       width="1.99455"
-       height="5.9798374"
-       x="29.110865"
-       y="2.4541459"
-       rx="0.99727499"
-       ry="0.99727499"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient5758);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       d="m -4.7126309,12.654361 c -1.8622525,0 -3.3612598,1.30267 -3.3612598,2.921028 l 0,5.131543 c 0,1.618351 1.4990073,2.921029 3.3612598,2.921029 l 1.5803872,0.0017 0.01985,-10.983712 c -1.1943624,0.02977 -0.4950442,0.0084 -1.6002373,0.0084 l 0,-6.9e-5 1e-7,8.1e-5 z"
-       id="path5707"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient5719-5);fill-opacity:1;stroke:none"
-       id="rect5709"
-       width="1.9106927"
-       height="10.99095"
-       x="-5.5105519"
-       y="12.139328"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient3623);fill-opacity:1;stroke:none"
-       id="rect5711"
-       width="2.0266206"
-       height="11.968007"
-       x="-3.5911674"
-       y="12.157709"
-       rx="1.0133103"
-       ry="1.0133103"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:nodetypes="cccccccc"
-       id="path5713"
-       d="m -5.238356,13.125441 c -1.2499833,0 -2.2561527,1.137149 -2.2561527,2.549866 l 0,4.479482 c 0,1.41271 1.0061694,2.549858 2.2561527,2.549858 l 1.6478054,-0.02288 0,-9.556232 c -0.8016761,0.02597 -0.9059746,0 -1.6478054,0 l 0,-9.6e-5 z"
-       style="opacity:0.5;fill:url(#radialGradient5721-4);fill-opacity:1;stroke:none"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient5723-8);fill-opacity:1;stroke:none"
-       id="rect5715"
-       width="1.9859439"
-       height="7.995038"
-       x="6.5732913"
-       y="14.12711"
-       rx="0.99742299"
-       ry="0.99742305"
-       transform="scale(-1,1)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:type="arc"
-       style="fill:#dee1e3;fill-opacity:1;stroke:none"
-       id="path5859"
-       sodipodi:cx="-244.01906"
-       sodipodi:cy="-24.045986"
-       sodipodi:rx="0.83739835"
-       sodipodi:ry="1.3739837"
-       d="m -243.18166,-24.045986 a 0.83739835,1.3739837 0 1 1 -1.6748,0 0.83739835,1.3739837 0 1 1 1.6748,0 z"
-       transform="matrix(0.8690986,0,0,0.73826906,214.78423,47.887046)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient4984);fill-opacity:1;stroke:none"
-       id="rect5811-4"
-       width="1.0533623"
-       height="2.3305926"
-       x="30.146362"
-       y="-3.4252403"
-       rx="0.50398123"
-       ry="0.50398123"
-       transform="matrix(0,1,-1,0,0,0)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       y="-0.79568303"
-       x="-9.7751017"
-       height="32.938541"
-       width="32.938541"
-       id="rect5863"
-       style="fill:#ffffff;fill-opacity:0;stroke:none"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
-    <path
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       sodipodi:nodetypes="ccccccccc"
-       id="path2878"
-       d="m 17.586784,12.654361 c 1.862252,0 3.36126,1.30267 3.36126,2.921028 l 0,5.131543 c 0,1.618351 -1.499008,2.921029 -3.36126,2.921029 l -1.580387,0.0017 -0.01985,-10.983712 c 1.194362,0.02977 0.495044,0.0084 1.600237,0.0084 l 0,-6.9e-5 0,8.1e-5 z"
-       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient2944);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220" />
-    <rect
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       y="12.139328"
-       x="-18.384705"
-       height="10.99095"
-       width="1.9106927"
-       id="rect2880"
-       style="fill:url(#linearGradient2892-5);fill-opacity:1;stroke:none"
-       transform="scale(-1,1)" />
-    <rect
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       ry="1.0133103"
-       rx="1.0133103"
-       y="12.157709"
-       x="-16.465319"
-       height="11.968007"
-       width="2.0266206"
-       id="rect2882"
-       style="fill:url(#linearGradient2894-1);fill-opacity:1;stroke:none"
-       transform="scale(-1,1)" />
-    <path
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       style="opacity:0.5;fill:url(#radialGradient2896-0);fill-opacity:1;stroke:none"
-       d="m 18.112509,13.125441 c 1.249983,0 2.256153,1.137149 2.256153,2.549866 l 0,4.479482 c 0,1.41271 -1.00617,2.549858 -2.256153,2.549858 l -1.647805,-0.02288 0,-9.556232 c 0.801676,0.02597 0.905974,0 1.647805,0 l 0,-9.6e-5 z"
-       id="path2884"
-       sodipodi:nodetypes="cccccccc" />
-    <rect
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       ry="0.99742305"
-       rx="0.99742299"
-       y="14.12711"
-       x="19.447443"
-       height="7.995038"
-       width="1.9859439"
-       id="rect2886"
-       style="fill:url(#linearGradient2898-1);fill-opacity:1;stroke:none" />
-    <rect
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       ry="0.50398123"
-       rx="0.50398123"
-       y="11.170098"
-       x="-19.396423"
-       height="3.9994802"
-       width="0.93696725"
-       id="rect2888"
-       style="fill:url(#linearGradient2900-3);fill-opacity:1;stroke:none"
-       transform="scale(-1,1)" />
-    <rect
-       transform="scale(-1,1)"
-       style="fill:url(#linearGradient3017);fill-opacity:1;stroke:none"
-       id="rect3015"
-       width="0.93696725"
-       height="3.9994802"
-       x="5.5535235"
-       y="11.170098"
-       rx="0.50398123"
-       ry="0.50398123"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-  </g>
-</svg>
Binary file pidgin/pixmaps/toolbar/32/voice-call.png has changed
Binary file pidgin/pixmaps/toolbar/48/audio-call.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/toolbar/48/scalable/audio-call.svg	Wed Sep 16 15:36:24 2009 +0000
@@ -0,0 +1,756 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48"
+   height="48"
+   id="svg3879"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel r20974"
+   version="1.0"
+   sodipodi:docname="voice.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3881">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3617">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop3619" />
+      <stop
+         style="stop-color:#0b0c0d;stop-opacity:1"
+         offset="1"
+         id="stop3621" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective96" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555"
+       id="linearGradient4563"
+       gradientUnits="userSpaceOnUse"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991"
+       gradientTransform="matrix(0.96773657,0,0,1.1033764,283.17944,75.227551)" />
+    <linearGradient
+       id="linearGradient4555"
+       inkscape:collect="always">
+      <stop
+         id="stop4557"
+         offset="0"
+         style="stop-color:#545652;stop-opacity:1;" />
+      <stop
+         id="stop4559"
+         offset="1"
+         style="stop-color:#80837d;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(70.143605,-254.44307)"
+       inkscape:collect="always"
+       xlink:href="#linearGradient4976"
+       id="linearGradient4984"
+       x1="-24.687374"
+       y1="245.84587"
+       x2="-24.687374"
+       y2="247.61009"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4976">
+      <stop
+         style="stop-color:#555753;stop-opacity:1;"
+         offset="0"
+         id="stop4978" />
+      <stop
+         style="stop-color:#808080;stop-opacity:1"
+         offset="1"
+         id="stop4980" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4555"
+       id="linearGradient4553"
+       x1="-257.51324"
+       y1="-50.301723"
+       x2="-257.49792"
+       y2="-51.439991"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(254.47694,70.270976)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5677-7"
+       id="linearGradient5723-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.110704,-300.45156,160.82553)"
+       x1="305.89481"
+       y1="-120.46718"
+       x2="306.04715"
+       y2="-120.46718" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5677-7">
+      <stop
+         style="stop-color:#ff2de7;stop-opacity:1"
+         offset="0"
+         id="stop5679-1" />
+      <stop
+         style="stop-color:#7b009b;stop-opacity:1"
+         offset="1"
+         id="stop5681-4" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5043-9-6-1"
+       id="radialGradient5721-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.93663395,1.7844755,-2.1045445,1.0450496,29.790687,695.97821)"
+       cx="-306.03387"
+       cy="-120.8595"
+       fx="-306.03387"
+       fy="-120.8595"
+       r="3.03685" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5043-9-6-1">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5045-4-8-8" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5047-1-2-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5655-9"
+       id="linearGradient5719-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0739995,0,0,1.2558918,322.6417,178.48569)"
+       x1="-300.82822"
+       y1="-126.31032"
+       x2="-300.82822"
+       y2="-114.83224" />
+    <linearGradient
+       id="linearGradient5655-9"
+       inkscape:collect="always">
+      <stop
+         id="stop5657-5"
+         offset="0"
+         style="stop-color:#2e3436;stop-opacity:1" />
+      <stop
+         id="stop5659-1"
+         offset="1"
+         style="stop-color:#707e83;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       y2="-36.569096"
+       x2="-219.25159"
+       y1="-43.842201"
+       x1="-219.25159"
+       gradientTransform="matrix(-1.1341053,0,0,1.0684624,-250.41566,72.38903)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5758"
+       xlink:href="#linearGradient5853"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5853"
+       inkscape:collect="always">
+      <stop
+         id="stop5855"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1" />
+      <stop
+         id="stop5857"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5626"
+       id="linearGradient5632"
+       x1="-25.743168"
+       y1="-243.09763"
+       x2="-23.90864"
+       y2="-240.62437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.4970962,69.91678,375.11023)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5626">
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1;"
+         offset="0"
+         id="stop5628" />
+      <stop
+         style="stop-color:#babdb6;stop-opacity:0;"
+         offset="1"
+         id="stop5630" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4971"
+       id="linearGradient4977"
+       x1="-105.74262"
+       y1="-282.20282"
+       x2="-102.94624"
+       y2="-282.20282"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4971">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4973" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4975" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4786"
+       id="linearGradient4792"
+       x1="-106.91152"
+       y1="280.91522"
+       x2="-101.28181"
+       y2="282.32028"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.81265471,0,0,1,129.18772,-269.64677)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4786">
+      <stop
+         style="stop-color:#555753;stop-opacity:1"
+         offset="0"
+         id="stop4788" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1"
+         id="stop4790" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5677"
+       id="linearGradient5449-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.110704,-269.59835,161.01943)"
+       x1="305.89481"
+       y1="-120.46718"
+       x2="306.04715"
+       y2="-120.46718" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5677">
+      <stop
+         style="stop-color:#ff2de7;stop-opacity:1"
+         offset="0"
+         id="stop5679" />
+      <stop
+         style="stop-color:#7b009b;stop-opacity:1"
+         offset="1"
+         id="stop5681" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5043-9-6"
+       id="radialGradient5447-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.93663395,1.7844755,2.1045445,1.0450496,1.0625172,696.17212)"
+       cx="-306.03387"
+       cy="-120.8595"
+       fx="-306.03387"
+       fy="-120.8595"
+       r="3.03685" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5043-9-6">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5045-4-8" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5047-1-2" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5655"
+       id="linearGradient5443-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0930233,0,0,1.2470295,297.52685,177.58046)"
+       x1="-300.82822"
+       y1="-126.31032"
+       x2="-300.82822"
+       y2="-114.83224" />
+    <linearGradient
+       id="linearGradient5655"
+       inkscape:collect="always">
+      <stop
+         id="stop5657"
+         offset="0"
+         style="stop-color:#2e3436;stop-opacity:1" />
+      <stop
+         id="stop5659"
+         offset="1"
+         style="stop-color:#707e83;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5661"
+       id="linearGradient5667"
+       x1="-219.25159"
+       y1="-43.842201"
+       x2="-219.25159"
+       y2="-36.569096"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1341053,0,0,1.0632786,281.26887,72.326317)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5661">
+      <stop
+         style="stop-color:#888a85;stop-opacity:1;"
+         offset="0"
+         id="stop5663" />
+      <stop
+         style="stop-color:#555753;stop-opacity:1"
+         offset="1"
+         id="stop5665" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5206"
+       id="linearGradient5212"
+       x1="-304.49771"
+       y1="-142.89493"
+       x2="-262.4259"
+       y2="-143.92334"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5206">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop5208" />
+      <stop
+         style="stop-color:#dededd;stop-opacity:0;"
+         offset="1"
+         id="stop5210" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5388"
+       id="linearGradient5394"
+       x1="-283.80222"
+       y1="-143.74782"
+       x2="-283.80222"
+       y2="-141.12897"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(299.49582,147.12151)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5388">
+      <stop
+         style="stop-color:#555753;stop-opacity:1"
+         offset="0"
+         id="stop5390" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1"
+         id="stop5392" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5376"
+       id="radialGradient5382"
+       cx="-284.44626"
+       cy="-153.18155"
+       fx="-284.44626"
+       fy="-153.18155"
+       r="17.449057"
+       gradientTransform="matrix(0.7493289,0.0071443,-0.00739936,0.77608101,227.05992,124.25584)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5376">
+      <stop
+         style="stop-color:#babdb6;stop-opacity:1"
+         offset="0"
+         id="stop5378" />
+      <stop
+         style="stop-color:#434542;stop-opacity:1"
+         offset="1"
+         id="stop5380" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617"
+       id="linearGradient3623"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617"
+       id="linearGradient3627"
+       gradientUnits="userSpaceOnUse"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505"
+       gradientTransform="translate(27.998451,0)" />
+    <inkscape:perspective
+       id="perspective3637"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3617-8"
+       id="linearGradient3627-1"
+       gradientUnits="userSpaceOnUse"
+       x1="1.421198"
+       y1="19.01931"
+       x2="1.421198"
+       y2="34.927505"
+       gradientTransform="translate(27.998451,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3617-8">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop3619-2" />
+      <stop
+         style="stop-color:#0b0c0d;stop-opacity:1"
+         offset="1"
+         id="stop3621-4" />
+    </linearGradient>
+    <linearGradient
+       y2="34.927505"
+       x2="1.421198"
+       y1="19.01931"
+       x1="1.421198"
+       gradientTransform="translate(27.998451,2.9924335e-7)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3646"
+       xlink:href="#linearGradient3617-8"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="275.47836"
+     inkscape:cy="12.04013"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="752"
+     inkscape:window-x="0"
+     inkscape:window-y="0" />
+  <metadata
+     id="metadata3884">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(8.5714283,-0.14285715)">
+    <rect
+       style="fill:#cc0000;fill-opacity:0;stroke:none"
+       id="rect5861"
+       width="48"
+       height="48"
+       x="-8.5714283"
+       y="0.14285715"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       d="m 8.7956674,3.2221118 c -6.82455,0 -12.3542402,5.47976 -12.3542402,12.2812502 l 0,6.40625 c 0,0.71914 0.0695,1.40908 0.18813,2.09375 l 1.0034,0 c -0.12713,-0.67917 -0.18814,-1.37616 -0.18814,-2.09375 l 0,-6.40625 c 0,-6.2647902 5.0648202,-11.2812502 11.3508502,-11.2812502 l 13.2912696,0 c 6.28603,0 11.35085,5.01646 11.35085,11.2812502 l 0,6.40625 c 0,0.71759 -0.061,1.41458 -0.18814,2.09375 l 1.00339,0 c 0.11864,-0.68467 0.18814,-1.37461 0.18814,-2.09375 l 0,-6.40625 c 0,-6.8014902 -5.52969,-12.2812502 -12.35424,-12.2812502 l -13.2912696,0 z"
+       id="rect5549"
+       sodipodi:nodetypes="ccccccccccccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="fill:url(#radialGradient5382);fill-opacity:1;stroke:none"
+       d="m -1.5394328,9.4030418 c -0.34234,-0.23492 -0.47813,-0.54724 -0.45029,-1.03563 0.0286,-0.50183 0.14055,-0.65306 1.09192003,-1.4752 4.64793017,-4.01662 13.37392977,-5.87446 21.59445977,-4.59766 3.75498,0.58323 7.28842,1.86204 9.74819,3.52803 1.32365,0.89651 2.31811,1.86267 2.4306,2.36144 0.15327,0.67962 -0.31249,1.36291 -0.92947,1.36354 -0.20344,2.2e-4 -0.38709,-0.0843 -0.80622,-0.37099 -4.58901,-3.1391 -11.82576,-4.34498 -18.9107,-3.67751 -4.8043396,0.4526 -9.0149896,1.45025 -12.27576977,3.58044 -0.80479,0.52575 -1.10366003,0.59052 -1.49272003,0.32354 l 0,0 z"
+       id="path5202"
+       sodipodi:nodetypes="cssssssssscc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:url(#linearGradient5394);fill-opacity:1;stroke:none;stroke-width:1.36950052;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       d="m 14.152067,1.1469218 c -1.25586,0.0451 -2.50746,0.15463 -3.71875,0.32324 -4.8155596,0.67034 -9.1494998,2.303 -11.9374998,4.78399 -0.0171,0.0152 -0.0455,0.017 -0.0625,0.0323 a 0.50262213,0.52231753 0 0 0 -0.0625,0.0969 c -0.83386,0.60798 -1.11293,1.78508 -0.59375,2.71524 0.51041,0.9144502 1.58283003,1.2501502 2.50000003,0.84042 0.0165,-0.007 0.0462,0.008 0.0625,0 a 0.4997817,0.5193658 0 0 0 0.125,-0.0646 c 0.008,-0.004 0.0233,0.005 0.0312,0 0.0189,-0.0126 0.0435,-0.0198 0.0625,-0.0323 0.0117,-0.007 0.0195,-0.0246 0.0312,-0.0323 6.35026017,-4.18918 18.36829977,-4.99194 26.59374977,-1.68086 1.15168,0.46359 2.18766,0.97193 3.09375,1.55156 a 0.50097,0.51819158 0 0 0 0.0312,0.0323 c 0.0119,0.007 0.0194,0.0246 0.0312,0.0323 a 0.50097,0.51819158 0 0 0 0.0937,0.0969 c 0.95145,0.5682002 2.20068,0.2407102 2.75,-0.74345 0.46922,-0.84064 0.27778,-1.87694 -0.375,-2.5213 a 0.50262213,0.52231753 0 0 0 -0.0312,-0.0647 c -0.006,-0.005 -0.0251,0.005 -0.0312,0 a 0.50262213,0.52231753 0 0 0 -0.0312,-0.0323 c -0.0275,-0.0237 -0.0336,-0.0747 -0.0625,-0.0969 a 0.50262213,0.52231753 0 0 0 0,-0.0323 c -1.77629,-1.631 -4.30344,-2.93446 -7.34375,-3.84658 -2.3514,-0.70544 -4.84998,-1.13016 -7.375,-1.29297 -1.26251,-0.0814 -2.52539,-0.10973 -3.78125,-0.0646 z m 1.875,1.03438 c 3.0708,0.0463 6.16037,0.47336 9,1.32529 l 0.0312,0 c 2.76259,0.83245 5.04679,2.04432 6.65625,3.42637 a 0.50005001,0.51723997 0 0 0 0.21875,0.22627 c 0.48342,0.28869 0.6541,0.92223 0.375,1.42227 -0.23724,0.42504 -0.72255,0.61655 -1.15625,0.48486 a 0.49889166,0.51844088 0 0 0 -0.15625,-0.0969 c -1.02284,-0.68188 -2.16864,-1.28682 -3.46875,-1.81017 -4.30756,-1.73396 -9.49646,-2.39535 -14.46875,-2.06875 -4.8872196,0.32102 -9.5421896,1.6205 -12.90624977,3.81426 -0.008,0.005 -0.0237,-0.005 -0.0312,0 a 0.50097251,0.51819418 0 0 0 -0.0625,0.0323 0.50097251,0.51819418 0 0 0 -0.0625,0.0323 c -0.0119,0.008 -0.0194,0.0244 -0.0312,0.0323 -0.47706,0.25937 -1.07163003,0.0673 -1.34375003,-0.42021 -0.26792,-0.48002 -0.12657,-1.08748 0.3125,-1.38995 a 0.50262213,0.52231753 0 0 0 0.0625,-0.0323 0.50005001,0.51723997 0 0 0 0.18750003,-0.16162 c 2.56214017,-2.25136 6.72203017,-3.84535 11.37499977,-4.49307 1.76729,-0.24602 3.62627,-0.35108 5.46875,-0.32324 z"
+       id="path5194"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:url(#linearGradient5212);stroke-width:0.96893835;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       id="path5204"
+       sodipodi:cx="-285.49203"
+       sodipodi:cy="-135.7495"
+       sodipodi:rx="18.775068"
+       sodipodi:ry="9.3875341"
+       d="m -300.83968,-141.15673 c 5.97266,-4.23814 17.68585,-5.25293 26.16212,-2.26659 1.7838,0.62846 3.33482,1.4076 4.58342,2.30242"
+       transform="matrix(-1.0296667,0,0,1.0344536,-278.49445,154.74398)"
+       sodipodi:start="3.7554218"
+       sodipodi:end="5.6740176"
+       sodipodi:open="true"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       d="m -3.5925728,33.735378 0,0.0312 c 0,6.80149 5.4797602,12.28125 12.2812502,12.28125 l 9.2499996,0 0,-1 -9.2499996,0 c -6.26479,0 -11.2812502,-5.01646 -11.2812502,-11.28125 l 0,-0.0312 -1,0 z"
+       id="rect5551"
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path5431"
+       d="m 33.003467,19.691354 c 2.15778,0 3.89467,1.77306 3.89467,3.975801 l 0,6.984518 c 0,2.20273 -1.73689,3.9758 -3.89467,3.9758 l -3.07307,0.04092 -0.0268,-14.992278 c 1.3839,0.04051 1.81932,0.01533 3.0999,0.01533 l 0,-9.2e-5 z"
+       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient5667);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       y="19.212761"
+       x="-32.432659"
+       height="14.883246"
+       width="2.0379403"
+       id="rect5433"
+       style="fill:url(#linearGradient5443-6);fill-opacity:1;stroke:none"
+       transform="scale(-1,1)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="opacity:0.5;fill:url(#radialGradient5447-5);fill-opacity:1;stroke:none"
+       d="m 32.779907,20.143134 c 1.82155,0 3.2878,1.657121 3.2878,3.715816 l 0,6.527768 c 0,2.058685 -1.46625,3.715805 -3.2878,3.715805 l -2.40128,-0.03334 0,-13.925911 c 1.16825,0.03784 1.32024,0 2.40128,0 l 0,-1.39e-4 z"
+       id="path5437"
+       sodipodi:nodetypes="cccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       ry="0.99742299"
+       rx="0.99742299"
+       y="22.267445"
+       x="35.395443"
+       height="9.8971453"
+       width="1.994846"
+       id="rect5439"
+       style="fill:url(#linearGradient5449-8);fill-opacity:1;stroke:none"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       ry="2.0194242"
+       rx="2.0194242"
+       y="7.854322"
+       x="43.456417"
+       height="9.9894991"
+       width="4.0564089"
+       id="rect4784"
+       style="fill:#555753;fill-opacity:1;stroke:url(#linearGradient4792);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       transform="matrix(0,1,1,0,0,0)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0081301"
+       inkscape:original="M -103.46875 -287.5 C -104.58751 -287.5 -105.5 -286.58751 -105.5 -285.46875 L -105.5 -279.53125 C -105.5 -278.41249 -104.58751 -277.5 -103.46875 -277.5 L -102.53125 -277.5 C -101.41249 -277.5 -100.5 -278.41249 -100.5 -279.53125 L -100.5 -285.46875 C -100.5 -286.58751 -101.41249 -287.5 -102.53125 -287.5 L -103.46875 -287.5 z "
+       style="opacity:0.6081081;fill:none;stroke:url(#linearGradient4977);stroke-width:1.22016776;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       id="path4967"
+       d="m -103.46875,-286.5 c -0.57059,0 -1.03125,0.46066 -1.03125,1.03125 l 0,5.9375 c 0,0.57059 0.46066,1.03125 1.03125,1.03125 l 0.9375,0 c 0.57059,0 1.03125,-0.46066 1.03125,-1.03125 l 0,-5.9375 c 0,-0.57059 -0.46066,-1.03125 -1.03125,-1.03125 l -0.9375,0 z"
+       transform="matrix(0,0.67167761,1,0,295.34493,114.69191)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       transform="matrix(0,1,1,0,0,0)"
+       style="fill:url(#linearGradient5632);fill-opacity:1;stroke:none"
+       id="rect5572"
+       width="3.0350325"
+       height="8.8761415"
+       x="43.98975"
+       y="8.3505688"
+       rx="1.5175163"
+       ry="1.5023295"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient5758);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
+       d="m -2.1502628,19.497458 c -2.15778,0 -3.89467,1.781702 -3.89467,3.995182 l 0,7.01857 c 0,2.213469 1.73689,3.995183 3.89467,3.995183 l 3.05582003,0.0024 0.023,-15.022765 c -1.3839,0.04071 -1.79824,0.0115 -3.07882003,0.0115 l 0,-9.6e-5 z"
+       id="path5707"
+       sodipodi:nodetypes="cccccccc"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient5719-5);fill-opacity:1;stroke:none"
+       id="rect5709"
+       width="2.0024707"
+       height="14.989019"
+       x="-1.5749686"
+       y="18.992523"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient3623);fill-opacity:1;stroke:none"
+       id="rect5711"
+       width="1.9620597"
+       height="15.908196"
+       x="0.44016811"
+       y="19.01931"
+       rx="0.98102987"
+       ry="0.98102987"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path5713"
+       d="m -1.9267028,19.949234 c -1.82155,0 -3.2878,1.657121 -3.2878,3.715816 l 0,6.527768 c 0,2.058685 1.46625,3.715805 3.2878,3.715805 l 2.40128003,-0.03334 0,-13.925911 c -1.16825,0.03784 -1.32024,0 -2.40128003,0 l 0,-1.39e-4 z"
+       style="opacity:0.5;fill:url(#radialGradient5721-4);fill-opacity:1;stroke:none"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient5723-8);fill-opacity:1;stroke:none"
+       id="rect5715"
+       width="1.994846"
+       height="9.8971453"
+       x="4.542254"
+       y="22.073544"
+       rx="0.99742299"
+       ry="0.99742299"
+       transform="scale(-1,1)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient4553);fill-opacity:1;stroke:none"
+       id="rect5811"
+       width="1.0079625"
+       height="3.591476"
+       x="-3.557543"
+       y="18.549107"
+       rx="0.50398123"
+       ry="0.50398123"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#dee1e3;fill-opacity:1;stroke:none"
+       id="path5859"
+       sodipodi:cx="-244.01906"
+       sodipodi:cy="-24.045986"
+       sodipodi:rx="0.83739835"
+       sodipodi:ry="1.3739837"
+       d="m -243.18166,-24.045986 c 0,0.75883 -0.37492,1.373984 -0.8374,1.373984 -0.46248,0 -0.8374,-0.615154 -0.8374,-1.373984 0,-0.75883 0.37492,-1.373984 0.8374,-1.373984 0.46248,0 0.8374,0.615154 0.8374,1.373984 z"
+       transform="matrix(1.2048093,0,0,1.0941414,303.39913,71.819285)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       style="fill:url(#linearGradient4984);fill-opacity:1;stroke:none"
+       id="rect5811-4"
+       width="1.0079625"
+       height="2.3272483"
+       x="45.000946"
+       y="-9.4003887"
+       rx="0.50398123"
+       ry="0.50398123"
+       transform="matrix(0,1,-1,0,0,0)"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963" />
+    <rect
+       y="0.14285715"
+       x="-8.5714283"
+       height="48"
+       width="48"
+       id="rect5863"
+       style="fill:#ffffff;fill-opacity:0;stroke:none"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
+    <rect
+       ry="0.50398123"
+       rx="0.50398123"
+       y="18.158859"
+       x="33.470028"
+       height="3.9627495"
+       width="0.97544211"
+       id="rect4561"
+       style="fill:url(#linearGradient4563);fill-opacity:1;stroke:none"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
+    <rect
+       inkscape:export-ydpi="90.108963"
+       inkscape:export-xdpi="90.108963"
+       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
+       ry="0.98102987"
+       rx="0.98102987"
+       y="19.01931"
+       x="28.43862"
+       height="15.908196"
+       width="1.9620597"
+       id="rect3625"
+       style="fill:url(#linearGradient3646);fill-opacity:1;stroke:none" />
+  </g>
+</svg>
--- a/pidgin/pixmaps/toolbar/48/scalable/voice-call.svg	Wed Sep 16 15:35:45 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,756 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="48"
-   height="48"
-   id="svg3879"
-   sodipodi:version="0.32"
-   inkscape:version="0.46+devel r20974"
-   version="1.0"
-   sodipodi:docname="voice.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs3881">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3617">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1;"
-         offset="0"
-         id="stop3619" />
-      <stop
-         style="stop-color:#0b0c0d;stop-opacity:1"
-         offset="1"
-         id="stop3621" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 24 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="48 : 24 : 1"
-       inkscape:persp3d-origin="24 : 16 : 1"
-       id="perspective96" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555"
-       id="linearGradient4563"
-       gradientUnits="userSpaceOnUse"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991"
-       gradientTransform="matrix(0.96773657,0,0,1.1033764,283.17944,75.227551)" />
-    <linearGradient
-       id="linearGradient4555"
-       inkscape:collect="always">
-      <stop
-         id="stop4557"
-         offset="0"
-         style="stop-color:#545652;stop-opacity:1;" />
-      <stop
-         id="stop4559"
-         offset="1"
-         style="stop-color:#80837d;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="translate(70.143605,-254.44307)"
-       inkscape:collect="always"
-       xlink:href="#linearGradient4976"
-       id="linearGradient4984"
-       x1="-24.687374"
-       y1="245.84587"
-       x2="-24.687374"
-       y2="247.61009"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4976">
-      <stop
-         style="stop-color:#555753;stop-opacity:1;"
-         offset="0"
-         id="stop4978" />
-      <stop
-         style="stop-color:#808080;stop-opacity:1"
-         offset="1"
-         id="stop4980" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4555"
-       id="linearGradient4553"
-       x1="-257.51324"
-       y1="-50.301723"
-       x2="-257.49792"
-       y2="-51.439991"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(254.47694,70.270976)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5677-7"
-       id="linearGradient5723-8"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.110704,-300.45156,160.82553)"
-       x1="305.89481"
-       y1="-120.46718"
-       x2="306.04715"
-       y2="-120.46718" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5677-7">
-      <stop
-         style="stop-color:#ff2de7;stop-opacity:1"
-         offset="0"
-         id="stop5679-1" />
-      <stop
-         style="stop-color:#7b009b;stop-opacity:1"
-         offset="1"
-         id="stop5681-4" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5043-9-6-1"
-       id="radialGradient5721-4"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.93663395,1.7844755,-2.1045445,1.0450496,29.790687,695.97821)"
-       cx="-306.03387"
-       cy="-120.8595"
-       fx="-306.03387"
-       fy="-120.8595"
-       r="3.03685" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5043-9-6-1">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop5045-4-8-8" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop5047-1-2-6" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5655-9"
-       id="linearGradient5719-5"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0739995,0,0,1.2558918,322.6417,178.48569)"
-       x1="-300.82822"
-       y1="-126.31032"
-       x2="-300.82822"
-       y2="-114.83224" />
-    <linearGradient
-       id="linearGradient5655-9"
-       inkscape:collect="always">
-      <stop
-         id="stop5657-5"
-         offset="0"
-         style="stop-color:#2e3436;stop-opacity:1" />
-      <stop
-         id="stop5659-1"
-         offset="1"
-         style="stop-color:#707e83;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       y2="-36.569096"
-       x2="-219.25159"
-       y1="-43.842201"
-       x1="-219.25159"
-       gradientTransform="matrix(-1.1341053,0,0,1.0684624,-250.41566,72.38903)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient5758"
-       xlink:href="#linearGradient5853"
-       inkscape:collect="always" />
-    <linearGradient
-       id="linearGradient5853"
-       inkscape:collect="always">
-      <stop
-         id="stop5855"
-         offset="0"
-         style="stop-color:#888a85;stop-opacity:1" />
-      <stop
-         id="stop5857"
-         offset="1"
-         style="stop-color:#555753;stop-opacity:1" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5626"
-       id="linearGradient5632"
-       x1="-25.743168"
-       y1="-243.09763"
-       x2="-23.90864"
-       y2="-240.62437"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.4970962,69.91678,375.11023)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5626">
-      <stop
-         style="stop-color:#babdb6;stop-opacity:1;"
-         offset="0"
-         id="stop5628" />
-      <stop
-         style="stop-color:#babdb6;stop-opacity:0;"
-         offset="1"
-         id="stop5630" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4971"
-       id="linearGradient4977"
-       x1="-105.74262"
-       y1="-282.20282"
-       x2="-102.94624"
-       y2="-282.20282"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4971">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop4973" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop4975" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4786"
-       id="linearGradient4792"
-       x1="-106.91152"
-       y1="280.91522"
-       x2="-101.28181"
-       y2="282.32028"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.81265471,0,0,1,129.18772,-269.64677)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4786">
-      <stop
-         style="stop-color:#555753;stop-opacity:1"
-         offset="0"
-         id="stop4788" />
-      <stop
-         style="stop-color:#000000;stop-opacity:1"
-         offset="1"
-         id="stop4790" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5677"
-       id="linearGradient5449-8"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.110704,-269.59835,161.01943)"
-       x1="305.89481"
-       y1="-120.46718"
-       x2="306.04715"
-       y2="-120.46718" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5677">
-      <stop
-         style="stop-color:#ff2de7;stop-opacity:1"
-         offset="0"
-         id="stop5679" />
-      <stop
-         style="stop-color:#7b009b;stop-opacity:1"
-         offset="1"
-         id="stop5681" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5043-9-6"
-       id="radialGradient5447-5"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-0.93663395,1.7844755,2.1045445,1.0450496,1.0625172,696.17212)"
-       cx="-306.03387"
-       cy="-120.8595"
-       fx="-306.03387"
-       fy="-120.8595"
-       r="3.03685" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5043-9-6">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop5045-4-8" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop5047-1-2" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5655"
-       id="linearGradient5443-6"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0930233,0,0,1.2470295,297.52685,177.58046)"
-       x1="-300.82822"
-       y1="-126.31032"
-       x2="-300.82822"
-       y2="-114.83224" />
-    <linearGradient
-       id="linearGradient5655"
-       inkscape:collect="always">
-      <stop
-         id="stop5657"
-         offset="0"
-         style="stop-color:#2e3436;stop-opacity:1" />
-      <stop
-         id="stop5659"
-         offset="1"
-         style="stop-color:#707e83;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5661"
-       id="linearGradient5667"
-       x1="-219.25159"
-       y1="-43.842201"
-       x2="-219.25159"
-       y2="-36.569096"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1341053,0,0,1.0632786,281.26887,72.326317)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5661">
-      <stop
-         style="stop-color:#888a85;stop-opacity:1;"
-         offset="0"
-         id="stop5663" />
-      <stop
-         style="stop-color:#555753;stop-opacity:1"
-         offset="1"
-         id="stop5665" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5206"
-       id="linearGradient5212"
-       x1="-304.49771"
-       y1="-142.89493"
-       x2="-262.4259"
-       y2="-143.92334"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5206">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="0"
-         id="stop5208" />
-      <stop
-         style="stop-color:#dededd;stop-opacity:0;"
-         offset="1"
-         id="stop5210" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5388"
-       id="linearGradient5394"
-       x1="-283.80222"
-       y1="-143.74782"
-       x2="-283.80222"
-       y2="-141.12897"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(299.49582,147.12151)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5388">
-      <stop
-         style="stop-color:#555753;stop-opacity:1"
-         offset="0"
-         id="stop5390" />
-      <stop
-         style="stop-color:#000000;stop-opacity:1"
-         offset="1"
-         id="stop5392" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5376"
-       id="radialGradient5382"
-       cx="-284.44626"
-       cy="-153.18155"
-       fx="-284.44626"
-       fy="-153.18155"
-       r="17.449057"
-       gradientTransform="matrix(0.7493289,0.0071443,-0.00739936,0.77608101,227.05992,124.25584)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5376">
-      <stop
-         style="stop-color:#babdb6;stop-opacity:1"
-         offset="0"
-         id="stop5378" />
-      <stop
-         style="stop-color:#434542;stop-opacity:1"
-         offset="1"
-         id="stop5380" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617"
-       id="linearGradient3623"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617"
-       id="linearGradient3627"
-       gradientUnits="userSpaceOnUse"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505"
-       gradientTransform="translate(27.998451,0)" />
-    <inkscape:perspective
-       id="perspective3637"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3617-8"
-       id="linearGradient3627-1"
-       gradientUnits="userSpaceOnUse"
-       x1="1.421198"
-       y1="19.01931"
-       x2="1.421198"
-       y2="34.927505"
-       gradientTransform="translate(27.998451,0)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3617-8">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1;"
-         offset="0"
-         id="stop3619-2" />
-      <stop
-         style="stop-color:#0b0c0d;stop-opacity:1"
-         offset="1"
-         id="stop3621-4" />
-    </linearGradient>
-    <linearGradient
-       y2="34.927505"
-       x2="1.421198"
-       y1="19.01931"
-       x1="1.421198"
-       gradientTransform="translate(27.998451,2.9924335e-7)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3646"
-       xlink:href="#linearGradient3617-8"
-       inkscape:collect="always" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="275.47836"
-     inkscape:cy="12.04013"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1280"
-     inkscape:window-height="752"
-     inkscape:window-x="0"
-     inkscape:window-y="0" />
-  <metadata
-     id="metadata3884">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     transform="translate(8.5714283,-0.14285715)">
-    <rect
-       style="fill:#cc0000;fill-opacity:0;stroke:none"
-       id="rect5861"
-       width="48"
-       height="48"
-       x="-8.5714283"
-       y="0.14285715"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
-    <path
-       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-       d="m 8.7956674,3.2221118 c -6.82455,0 -12.3542402,5.47976 -12.3542402,12.2812502 l 0,6.40625 c 0,0.71914 0.0695,1.40908 0.18813,2.09375 l 1.0034,0 c -0.12713,-0.67917 -0.18814,-1.37616 -0.18814,-2.09375 l 0,-6.40625 c 0,-6.2647902 5.0648202,-11.2812502 11.3508502,-11.2812502 l 13.2912696,0 c 6.28603,0 11.35085,5.01646 11.35085,11.2812502 l 0,6.40625 c 0,0.71759 -0.061,1.41458 -0.18814,2.09375 l 1.00339,0 c 0.11864,-0.68467 0.18814,-1.37461 0.18814,-2.09375 l 0,-6.40625 c 0,-6.8014902 -5.52969,-12.2812502 -12.35424,-12.2812502 l -13.2912696,0 z"
-       id="rect5549"
-       sodipodi:nodetypes="ccccccccccccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="fill:url(#radialGradient5382);fill-opacity:1;stroke:none"
-       d="m -1.5394328,9.4030418 c -0.34234,-0.23492 -0.47813,-0.54724 -0.45029,-1.03563 0.0286,-0.50183 0.14055,-0.65306 1.09192003,-1.4752 4.64793017,-4.01662 13.37392977,-5.87446 21.59445977,-4.59766 3.75498,0.58323 7.28842,1.86204 9.74819,3.52803 1.32365,0.89651 2.31811,1.86267 2.4306,2.36144 0.15327,0.67962 -0.31249,1.36291 -0.92947,1.36354 -0.20344,2.2e-4 -0.38709,-0.0843 -0.80622,-0.37099 -4.58901,-3.1391 -11.82576,-4.34498 -18.9107,-3.67751 -4.8043396,0.4526 -9.0149896,1.45025 -12.27576977,3.58044 -0.80479,0.52575 -1.10366003,0.59052 -1.49272003,0.32354 l 0,0 z"
-       id="path5202"
-       sodipodi:nodetypes="cssssssssscc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:url(#linearGradient5394);fill-opacity:1;stroke:none;stroke-width:1.36950052;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-       d="m 14.152067,1.1469218 c -1.25586,0.0451 -2.50746,0.15463 -3.71875,0.32324 -4.8155596,0.67034 -9.1494998,2.303 -11.9374998,4.78399 -0.0171,0.0152 -0.0455,0.017 -0.0625,0.0323 a 0.50262213,0.52231753 0 0 0 -0.0625,0.0969 c -0.83386,0.60798 -1.11293,1.78508 -0.59375,2.71524 0.51041,0.9144502 1.58283003,1.2501502 2.50000003,0.84042 0.0165,-0.007 0.0462,0.008 0.0625,0 a 0.4997817,0.5193658 0 0 0 0.125,-0.0646 c 0.008,-0.004 0.0233,0.005 0.0312,0 0.0189,-0.0126 0.0435,-0.0198 0.0625,-0.0323 0.0117,-0.007 0.0195,-0.0246 0.0312,-0.0323 6.35026017,-4.18918 18.36829977,-4.99194 26.59374977,-1.68086 1.15168,0.46359 2.18766,0.97193 3.09375,1.55156 a 0.50097,0.51819158 0 0 0 0.0312,0.0323 c 0.0119,0.007 0.0194,0.0246 0.0312,0.0323 a 0.50097,0.51819158 0 0 0 0.0937,0.0969 c 0.95145,0.5682002 2.20068,0.2407102 2.75,-0.74345 0.46922,-0.84064 0.27778,-1.87694 -0.375,-2.5213 a 0.50262213,0.52231753 0 0 0 -0.0312,-0.0647 c -0.006,-0.005 -0.0251,0.005 -0.0312,0 a 0.50262213,0.52231753 0 0 0 -0.0312,-0.0323 c -0.0275,-0.0237 -0.0336,-0.0747 -0.0625,-0.0969 a 0.50262213,0.52231753 0 0 0 0,-0.0323 c -1.77629,-1.631 -4.30344,-2.93446 -7.34375,-3.84658 -2.3514,-0.70544 -4.84998,-1.13016 -7.375,-1.29297 -1.26251,-0.0814 -2.52539,-0.10973 -3.78125,-0.0646 z m 1.875,1.03438 c 3.0708,0.0463 6.16037,0.47336 9,1.32529 l 0.0312,0 c 2.76259,0.83245 5.04679,2.04432 6.65625,3.42637 a 0.50005001,0.51723997 0 0 0 0.21875,0.22627 c 0.48342,0.28869 0.6541,0.92223 0.375,1.42227 -0.23724,0.42504 -0.72255,0.61655 -1.15625,0.48486 a 0.49889166,0.51844088 0 0 0 -0.15625,-0.0969 c -1.02284,-0.68188 -2.16864,-1.28682 -3.46875,-1.81017 -4.30756,-1.73396 -9.49646,-2.39535 -14.46875,-2.06875 -4.8872196,0.32102 -9.5421896,1.6205 -12.90624977,3.81426 -0.008,0.005 -0.0237,-0.005 -0.0312,0 a 0.50097251,0.51819418 0 0 0 -0.0625,0.0323 0.50097251,0.51819418 0 0 0 -0.0625,0.0323 c -0.0119,0.008 -0.0194,0.0244 -0.0312,0.0323 -0.47706,0.25937 -1.07163003,0.0673 -1.34375003,-0.42021 -0.26792,-0.48002 -0.12657,-1.08748 0.3125,-1.38995 a 0.50262213,0.52231753 0 0 0 0.0625,-0.0323 0.50005001,0.51723997 0 0 0 0.18750003,-0.16162 c 2.56214017,-2.25136 6.72203017,-3.84535 11.37499977,-4.49307 1.76729,-0.24602 3.62627,-0.35108 5.46875,-0.32324 z"
-       id="path5194"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:type="arc"
-       style="fill:none;stroke:url(#linearGradient5212);stroke-width:0.96893835;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       id="path5204"
-       sodipodi:cx="-285.49203"
-       sodipodi:cy="-135.7495"
-       sodipodi:rx="18.775068"
-       sodipodi:ry="9.3875341"
-       d="m -300.83968,-141.15673 c 5.97266,-4.23814 17.68585,-5.25293 26.16212,-2.26659 1.7838,0.62846 3.33482,1.4076 4.58342,2.30242"
-       transform="matrix(-1.0296667,0,0,1.0344536,-278.49445,154.74398)"
-       sodipodi:start="3.7554218"
-       sodipodi:end="5.6740176"
-       sodipodi:open="true"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-       d="m -3.5925728,33.735378 0,0.0312 c 0,6.80149 5.4797602,12.28125 12.2812502,12.28125 l 9.2499996,0 0,-1 -9.2499996,0 c -6.26479,0 -11.2812502,-5.01646 -11.2812502,-11.28125 l 0,-0.0312 -1,0 z"
-       id="rect5551"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:nodetypes="cccccccc"
-       id="path5431"
-       d="m 33.003467,19.691354 c 2.15778,0 3.89467,1.77306 3.89467,3.975801 l 0,6.984518 c 0,2.20273 -1.73689,3.9758 -3.89467,3.9758 l -3.07307,0.04092 -0.0268,-14.992278 c 1.3839,0.04051 1.81932,0.01533 3.0999,0.01533 l 0,-9.2e-5 z"
-       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient5667);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       y="19.212761"
-       x="-32.432659"
-       height="14.883246"
-       width="2.0379403"
-       id="rect5433"
-       style="fill:url(#linearGradient5443-6);fill-opacity:1;stroke:none"
-       transform="scale(-1,1)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="opacity:0.5;fill:url(#radialGradient5447-5);fill-opacity:1;stroke:none"
-       d="m 32.779907,20.143134 c 1.82155,0 3.2878,1.657121 3.2878,3.715816 l 0,6.527768 c 0,2.058685 -1.46625,3.715805 -3.2878,3.715805 l -2.40128,-0.03334 0,-13.925911 c 1.16825,0.03784 1.32024,0 2.40128,0 l 0,-1.39e-4 z"
-       id="path5437"
-       sodipodi:nodetypes="cccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       ry="0.99742299"
-       rx="0.99742299"
-       y="22.267445"
-       x="35.395443"
-       height="9.8971453"
-       width="1.994846"
-       id="rect5439"
-       style="fill:url(#linearGradient5449-8);fill-opacity:1;stroke:none"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       ry="2.0194242"
-       rx="2.0194242"
-       y="7.854322"
-       x="43.456417"
-       height="9.9894991"
-       width="4.0564089"
-       id="rect4784"
-       style="fill:#555753;fill-opacity:1;stroke:url(#linearGradient4792);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       transform="matrix(0,1,1,0,0,0)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:type="inkscape:offset"
-       inkscape:radius="-1.0081301"
-       inkscape:original="M -103.46875 -287.5 C -104.58751 -287.5 -105.5 -286.58751 -105.5 -285.46875 L -105.5 -279.53125 C -105.5 -278.41249 -104.58751 -277.5 -103.46875 -277.5 L -102.53125 -277.5 C -101.41249 -277.5 -100.5 -278.41249 -100.5 -279.53125 L -100.5 -285.46875 C -100.5 -286.58751 -101.41249 -287.5 -102.53125 -287.5 L -103.46875 -287.5 z "
-       style="opacity:0.6081081;fill:none;stroke:url(#linearGradient4977);stroke-width:1.22016776;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       id="path4967"
-       d="m -103.46875,-286.5 c -0.57059,0 -1.03125,0.46066 -1.03125,1.03125 l 0,5.9375 c 0,0.57059 0.46066,1.03125 1.03125,1.03125 l 0.9375,0 c 0.57059,0 1.03125,-0.46066 1.03125,-1.03125 l 0,-5.9375 c 0,-0.57059 -0.46066,-1.03125 -1.03125,-1.03125 l -0.9375,0 z"
-       transform="matrix(0,0.67167761,1,0,295.34493,114.69191)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       transform="matrix(0,1,1,0,0,0)"
-       style="fill:url(#linearGradient5632);fill-opacity:1;stroke:none"
-       id="rect5572"
-       width="3.0350325"
-       height="8.8761415"
-       x="43.98975"
-       y="8.3505688"
-       rx="1.5175163"
-       ry="1.5023295"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       style="fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient5758);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:220"
-       d="m -2.1502628,19.497458 c -2.15778,0 -3.89467,1.781702 -3.89467,3.995182 l 0,7.01857 c 0,2.213469 1.73689,3.995183 3.89467,3.995183 l 3.05582003,0.0024 0.023,-15.022765 c -1.3839,0.04071 -1.79824,0.0115 -3.07882003,0.0115 l 0,-9.6e-5 z"
-       id="path5707"
-       sodipodi:nodetypes="cccccccc"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient5719-5);fill-opacity:1;stroke:none"
-       id="rect5709"
-       width="2.0024707"
-       height="14.989019"
-       x="-1.5749686"
-       y="18.992523"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient3623);fill-opacity:1;stroke:none"
-       id="rect5711"
-       width="1.9620597"
-       height="15.908196"
-       x="0.44016811"
-       y="19.01931"
-       rx="0.98102987"
-       ry="0.98102987"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:nodetypes="cccccccc"
-       id="path5713"
-       d="m -1.9267028,19.949234 c -1.82155,0 -3.2878,1.657121 -3.2878,3.715816 l 0,6.527768 c 0,2.058685 1.46625,3.715805 3.2878,3.715805 l 2.40128003,-0.03334 0,-13.925911 c -1.16825,0.03784 -1.32024,0 -2.40128003,0 l 0,-1.39e-4 z"
-       style="opacity:0.5;fill:url(#radialGradient5721-4);fill-opacity:1;stroke:none"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient5723-8);fill-opacity:1;stroke:none"
-       id="rect5715"
-       width="1.994846"
-       height="9.8971453"
-       x="4.542254"
-       y="22.073544"
-       rx="0.99742299"
-       ry="0.99742299"
-       transform="scale(-1,1)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient4553);fill-opacity:1;stroke:none"
-       id="rect5811"
-       width="1.0079625"
-       height="3.591476"
-       x="-3.557543"
-       y="18.549107"
-       rx="0.50398123"
-       ry="0.50398123"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <path
-       sodipodi:type="arc"
-       style="fill:#dee1e3;fill-opacity:1;stroke:none"
-       id="path5859"
-       sodipodi:cx="-244.01906"
-       sodipodi:cy="-24.045986"
-       sodipodi:rx="0.83739835"
-       sodipodi:ry="1.3739837"
-       d="m -243.18166,-24.045986 c 0,0.75883 -0.37492,1.373984 -0.8374,1.373984 -0.46248,0 -0.8374,-0.615154 -0.8374,-1.373984 0,-0.75883 0.37492,-1.373984 0.8374,-1.373984 0.46248,0 0.8374,0.615154 0.8374,1.373984 z"
-       transform="matrix(1.2048093,0,0,1.0941414,303.39913,71.819285)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       style="fill:url(#linearGradient4984);fill-opacity:1;stroke:none"
-       id="rect5811-4"
-       width="1.0079625"
-       height="2.3272483"
-       x="45.000946"
-       y="-9.4003887"
-       rx="0.50398123"
-       ry="0.50398123"
-       transform="matrix(0,1,-1,0,0,0)"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963" />
-    <rect
-       y="0.14285715"
-       x="-8.5714283"
-       height="48"
-       width="48"
-       id="rect5863"
-       style="fill:#ffffff;fill-opacity:0;stroke:none"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
-    <rect
-       ry="0.50398123"
-       rx="0.50398123"
-       y="18.158859"
-       x="33.470028"
-       height="3.9627495"
-       width="0.97544211"
-       id="rect4561"
-       style="fill:url(#linearGradient4563);fill-opacity:1;stroke:none"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png" />
-    <rect
-       inkscape:export-ydpi="90.108963"
-       inkscape:export-xdpi="90.108963"
-       inkscape:export-filename="/home/hbons/Desktop/Pidgin VV/voice.png"
-       ry="0.98102987"
-       rx="0.98102987"
-       y="19.01931"
-       x="28.43862"
-       height="15.908196"
-       width="1.9620597"
-       id="rect3625"
-       style="fill:url(#linearGradient3646);fill-opacity:1;stroke:none" />
-  </g>
-</svg>
Binary file pidgin/pixmaps/toolbar/48/voice-call.png has changed
--- a/pidgin/plugins/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/plugins/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -47,6 +47,7 @@
 themeedit_la_LDFLAGS        = -module -avoid-version
 timestamp_la_LDFLAGS        = -module -avoid-version
 timestamp_format_la_LDFLAGS = -module -avoid-version
+vvconfig_la_LDFLAGS         = -module -avoid-version
 xmppconsole_la_LDFLAGS      = -module -avoid-version
 
 if PLUGINS
@@ -68,6 +69,10 @@
 	timestamp_format.la \
 	xmppconsole.la
 
+if USE_VV
+plugin_LTLIBRARIES +=	vvconfig.la
+endif
+
 noinst_LTLIBRARIES = \
 	contact_priority.la \
 	gtk_signals_test.la
@@ -88,6 +93,7 @@
 themeedit_la_SOURCES        = themeedit.c themeedit-icon.c themeedit-icon.h
 timestamp_la_SOURCES        = timestamp.c
 timestamp_format_la_SOURCES = timestamp_format.c
+vvconfig_la_SOURCES         = vvconfig.c
 xmppconsole_la_SOURCES      = xmppconsole.c
 
 convcolors_la_LIBADD        = $(GTK_LIBS)
@@ -106,6 +112,7 @@
 themeedit_la_LIBADD         = $(GTK_LIBS)
 timestamp_la_LIBADD         = $(GTK_LIBS)
 timestamp_format_la_LIBADD  = $(GTK_LIBS)
+vvconfig_la_LIBADD          = $(GTK_LIBS) $(GSTREAMER_LIBS)
 xmppconsole_la_LIBADD       = $(GTK_LIBS)
 
 endif # PLUGINS
@@ -129,6 +136,7 @@
 	-I$(top_srcdir)/pidgin \
 	$(DEBUG_CFLAGS) \
 	$(GTK_CFLAGS) \
+	$(GSTREAMER_CFLAGS) \
 	$(PLUGIN_CFLAGS)
 
 #
--- a/pidgin/plugins/disco/Makefile.am	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/plugins/disco/Makefile.am	Wed Sep 16 15:36:24 2009 +0000
@@ -2,6 +2,9 @@
 
 xmppdisco_la_LDFLAGS = -module -avoid-version
 
+EXTRA_DIST = \
+        Makefile.mingw
+
 if PLUGINS
 
 plugin_LTLIBRARIES = xmppdisco.la
--- a/pidgin/plugins/disco/gtkdisco.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/plugins/disco/gtkdisco.c	Wed Sep 16 15:36:24 2009 +0000
@@ -224,6 +224,8 @@
 		/* This shouldn't ever happen since the account is connected */
 		server = g_strdup("jabber.org");
 
+	/* Note to translators: The string "Enter an XMPP Server" is asking the
+	   user to type the name of an XMPP server which will then be queried */
 	purple_request_input(my_plugin, _("Server name request"), _("Enter an XMPP Server"),
 			_("Select an XMPP server to query"),
 			server, FALSE, FALSE, NULL,
--- a/pidgin/plugins/gestures/stroke.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/plugins/gestures/stroke.c	Wed Sep 16 15:36:24 2009 +0000
@@ -207,10 +207,7 @@
       metrics->max_x = -1;
       metrics->max_y = -1;
 
-      metrics->pointList = (GSList*) g_malloc (sizeof (GSList));
-
-      metrics->pointList->data = new_point_p;
-      metrics->pointList->next = NULL;
+      metrics->pointList = g_slist_prepend(metrics->pointList, new_point_p);
       metrics->point_count = 0;
 
     } else {
--- a/pidgin/plugins/gevolution/eds-utils.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/plugins/gevolution/eds-utils.c	Wed Sep 16 15:36:24 2009 +0000
@@ -53,7 +53,7 @@
 gevo_addrbooks_model_populate(GtkTreeModel *model)
 {
 	ESourceList *addressbooks;
-	GError *err;
+	GError *err = NULL;
 	GSList *groups, *g;
 	GtkTreeIter iter;
 	GtkListStore *list;
@@ -173,7 +173,7 @@
 gevo_search_buddy_in_contacts(PurpleBuddy *buddy, EBookQuery *query)
 {
 	ESourceList *addressbooks;
-	GError *err;
+	GError *err = NULL;
 	EBookQuery *full_query;
 	GSList *groups, *g;
 	EContact *result;
--- a/pidgin/plugins/gevolution/gevo-util.c	Wed Sep 16 15:35:45 2009 +0000
+++ b/pidgin/plugins/gevolution/gevo-util.c	Wed Sep 16 15:36:24 2009 +0000
@@ -35,14 +35,16 @@
 
 	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, buddy_name, account);
 
-	if ((group = purple_find_group(group_name)) == NULL)
+	group = purple_find_group(group_name);
+	if (group == NULL)
 	{
 		group = purple_group_new(group_name);
 		purple_blist_add_group(group, NULL);
 	}
 
-	if ((buddy = purple_find_buddy_in_group(account, buddy_name, group)))
-	{	
+	buddy = purple_find_buddy_in_group(account, buddy_name, group);
+	if (buddy == NULL)
+	{
 		buddy = purple_buddy_new(account, buddy_name, alias);
 		purple_blist_add_buddy(buddy, NULL, group, NULL);
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/vvconfig.c	Wed Sep 16 15:36:24 2009 +0000
@@ -0,0 +1,566 @@
+/*
+ * Configures microphones and webcams for voice and video
+ * Copyright (C) 2009 Mike Ruprecht <cmaiku@gmail.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA.
+ */
+#include "internal.h"
+
+#include "debug.h"
+#include "mediamanager.h"
+#include "media-gst.h"
+#include "version.h"
+#include "gtkplugin.h"
+#include "gtkutils.h"
+#include "gtkprefs.h"
+
+#include <gst/interfaces/propertyprobe.h>
+
+static PurpleMediaElementInfo *old_video_src = NULL, *old_video_sink = NULL,
+		*old_audio_src = NULL, *old_audio_sink = NULL;
+
+static const gchar *AUDIO_SRC_PLUGINS[] = {
+	"alsasrc",	"ALSA",
+	/* "esdmon",	"ESD", ? */
+	"osssrc",	"OSS",
+	"pulsesrc",	"PulseAudio",
+	/* "audiotestsrc wave=silence", "Silence", */
+	"audiotestsrc",	"Test Sound",
+	NULL
+};
+
+static const gchar *AUDIO_SINK_PLUGINS[] = {
+	"alsasink",	"ALSA",
+	"artsdsink",	"aRts",
+	"esdsink",	"ESD",
+	"osssink",	"OSS",
+	"pulsesink",	"PulseAudio",
+	NULL
+};
+
+static const gchar *VIDEO_SRC_PLUGINS[] = {
+	"videotestsrc",	"Test Input",
+	"dshowvideosrc","DirectDraw",
+	"ksvideosrc",	"KS Video",
+	"qcamsrc",	"Quickcam",
+	"v4lsrc",	"Video4Linux",
+	"v4l2src",	"Video4Linux2",
+	"v4lmjpegsrc",	"Video4Linux MJPEG",
+	NULL
+};
+
+static const gchar *VIDEO_SINK_PLUGINS[] = {
+	/* "aasink",	"AALib", Didn't work for me */
+	"directdrawsink","DirectDraw",
+	"glimagesink",	"OpenGL",
+	"ximagesink",	"X Window System",
+	"xvimagesink",	"X Window System (Xv)",
+	NULL
+};
+
+static GList *
+get_element_devices(const gchar *element_name)
+{
+	GList *ret = NULL;
+	GstElement *element;
+	GObjectClass *klass;
+	GstPropertyProbe *probe;
+	const GParamSpec *pspec;
+
+	if (!strcmp(element_name, "<custom>")) {
+		ret = g_list_prepend(ret, NULL);
+		ret = g_list_prepend(ret, (gpointer)_("Default"));
+		ret = g_list_prepend(ret, "");
+		return ret;
+	}
+
+	ret = g_list_prepend(ret, (gpointer)_("Default"));
+	ret = g_list_prepend(ret, "");
+
+	if (*element_name == '\0') {
+		ret = g_list_prepend(ret, NULL);
+		ret = g_list_reverse(ret);
+		return ret;
+	}
+
+	element = gst_element_factory_make(element_name, "test");
+	klass = G_OBJECT_GET_CLASS (element);
+	if (!g_object_class_find_property(klass, "device") ||
+			!GST_IS_PROPERTY_PROBE(element) ||
+			!(probe = GST_PROPERTY_PROBE(element)) ||
+			!(pspec = gst_property_probe_get_property(probe, "device"))) {
+		purple_debug_info("vvconfig", "'%s' - no device\n", element_name);
+	} else {
+		gint n;
+		GValueArray *array;
+
+		/* Set autoprobe[-fps] to FALSE to avoid delays when probing. */
+		if (g_object_class_find_property (klass, "autoprobe")) {
+			g_object_set (G_OBJECT (element), "autoprobe", FALSE, NULL);
+			if (g_object_class_find_property (klass, "autoprobe-fps")) {
+				g_object_set (G_OBJECT (element), "autoprobe-fps", FALSE, NULL);
+			}
+		}
+
+		array = gst_property_probe_probe_and_get_values (probe, pspec);
+		if (array == NULL) {
+			purple_debug_info("vvconfig", "'%s' has no devices\n", element_name);
+			ret = g_list_prepend(ret, NULL);
+			ret = g_list_reverse(ret);
+			return ret;
+		}
+			
+		for (n=0; n < array->n_values; ++n) {
+			GValue *device;
+			const gchar *name;
+			const gchar *device_name;
+
+			device = g_value_array_get_nth(array, n);
+			g_object_set_property(G_OBJECT(element), "device", device);
+			if (gst_element_set_state(element, GST_STATE_READY)
+					!= GST_STATE_CHANGE_SUCCESS) {
+				purple_debug_warning("vvconfig",
+						"Error changing state of %s\n",
+						element_name);
+				continue;
+			}
+
+			g_object_get(G_OBJECT(element), "device-name", &name, NULL);
+			device_name = g_value_get_string(device);
+			if (name == NULL)
+				name = _("Unknown");
+			purple_debug_info("vvconfig", "Found device %s : %s for %s\n",
+					device_name, name, element_name);
+			ret = g_list_prepend(ret, (gpointer)name);
+			ret = g_list_prepend(ret, (gpointer)device_name);
+			gst_element_set_state(element, GST_STATE_NULL);
+		}
+	}
+	gst_object_unref(element);
+	
+	ret = g_list_prepend(ret, NULL);
+	ret = g_list_reverse(ret);
+
+	return ret;
+}
+
+static GList *
+get_element_plugins(const gchar **plugins)
+{
+	GList *ret = NULL;
+
+	ret = g_list_prepend(ret, "Default");
+	ret = g_list_prepend(ret, "");
+	for (; plugins[0] && plugins[1]; plugins += 2) {
+		if (gst_default_registry_check_feature_version(
+				plugins[0], 0, 0, 0)) {
+			ret = g_list_prepend(ret, (gpointer)plugins[1]);
+			ret = g_list_prepend(ret, (gpointer)plugins[0]);
+		}
+	}
+	ret = g_list_prepend(ret, NULL);
+	ret = g_list_reverse(ret);
+	return ret;
+}
+
+static void
+device_changed_cb(const gchar *name, PurplePrefType type,
+		gconstpointer value, gpointer data)
+{
+	GtkSizeGroup *sg = data;
+	GtkWidget *parent, *widget;
+	GSList *widgets;
+	GList *devices;
+	GValue gvalue;
+	gint position;
+	gchar *label, *pref;
+
+	widgets = gtk_size_group_get_widgets(GTK_SIZE_GROUP(sg));
+	for (; widgets; widgets = g_slist_next(widgets)) {
+		const gchar *widget_name =
+				gtk_widget_get_name(GTK_WIDGET(widgets->data));
+		if (!strcmp(widget_name, name)) {
+			gchar *temp_str;
+			gchar delimiters[3] = {0, 0, 0};
+			const gchar *text;
+			gint keyval, pos;
+
+			widget = widgets->data;
+			/* Get label with _ from the GtkLabel */
+			text = gtk_label_get_text(GTK_LABEL(widget));
+			keyval = gtk_label_get_mnemonic_keyval(GTK_LABEL(widget));
+			delimiters[0] = g_ascii_tolower(keyval);
+			delimiters[1] = g_ascii_toupper(keyval);
+			pos = strcspn(text, delimiters);
+			if (pos != -1) {
+				temp_str = g_strndup(text, pos);
+				label = g_strconcat(temp_str, "_",
+						text + pos, NULL);
+				g_free(temp_str);
+			} else {
+				label = g_strdup(text);
+			}
+			break;
+		}
+	}
+
+	if (widgets == NULL)
+		return;
+
+	parent = gtk_widget_get_parent(widget);
+	widget = parent;
+	parent = gtk_widget_get_parent(GTK_WIDGET(widget));
+	gvalue.g_type = 0;
+	g_value_init(&gvalue, G_TYPE_INT);
+	gtk_container_child_get_property(GTK_CONTAINER(parent),
+			GTK_WIDGET(widget), "position", &gvalue);
+	position = g_value_get_int(&gvalue);
+	g_value_unset(&gvalue);
+	gtk_widget_destroy(widget);
+
+	pref = g_strdup(name);
+	strcpy(pref + strlen(pref) - strlen("plugin"), "device");
+	devices = get_element_devices(value);
+	if (g_list_find(devices, purple_prefs_get_string(pref)) == NULL)
+		purple_prefs_set_string(pref, g_list_next(devices)->data);
+	widget = pidgin_prefs_dropdown_from_list(parent,
+			label, PURPLE_PREF_STRING,
+			pref, devices);
+	g_list_free(devices);
+	g_signal_connect_swapped(widget, "destroy",
+			G_CALLBACK(g_free), pref);
+	g_free(label);
+	gtk_misc_set_alignment(GTK_MISC(widget), 0, 0.5);
+	gtk_widget_set_name(widget, name);
+	gtk_size_group_add_widget(sg, widget);
+	gtk_box_reorder_child(GTK_BOX(parent),
+			gtk_widget_get_parent(GTK_WIDGET(widget)), position);
+}
+
+static void
+get_plugin_frame(GtkWidget *parent, GtkSizeGroup *sg,
+		const gchar *name, const gchar *plugin_label,
+		const gchar **plugin_strs, const gchar *plugin_pref,
+		const gchar *device_label, const gchar *device_pref)
+{
+	GtkWidget *vbox, *widget;
+	GList *plugins, *devices;
+
+	vbox = pidgin_make_frame(parent, name);
+
+	/* Setup plugin preference */
+	plugins = get_element_plugins(plugin_strs);
+	widget = pidgin_prefs_dropdown_from_list(vbox, plugin_label,
+			PURPLE_PREF_STRING, plugin_pref, plugins);
+	g_list_free(plugins);
+	gtk_size_group_add_widget(sg, widget);
+	gtk_misc_set_alignment(GTK_MISC(widget), 0, 0.5);
+
+	/* Setup device preference */
+	devices = get_element_devices(purple_prefs_get_string(plugin_pref));
+	if (g_list_find(devices, purple_prefs_get_string(device_pref)) == NULL)
+		purple_prefs_set_string(device_pref, g_list_next(devices)->data);
+	widget = pidgin_prefs_dropdown_from_list(vbox, device_label,
+			PURPLE_PREF_STRING, device_pref, devices);
+	g_list_free(devices);
+	gtk_widget_set_name(widget, plugin_pref);
+	gtk_size_group_add_widget(sg, widget);
+	gtk_misc_set_alignment(GTK_MISC(widget), 0, 0.5);
+
+	purple_prefs_connect_callback(vbox, plugin_pref,
+			device_changed_cb, sg);
+	g_signal_connect_swapped(vbox, "destroy",
+			G_CALLBACK(purple_prefs_disconnect_by_handle), vbox);
+}
+
+static GtkWidget *
+get_plugin_config_frame(PurplePlugin *plugin) {
+	GtkWidget *notebook, *vbox_audio, *vbox_video;
+	GtkSizeGroup *sg;
+
+	notebook = gtk_notebook_new();
+	gtk_container_set_border_width(GTK_CONTAINER(notebook),
+			PIDGIN_HIG_BORDER);
+	gtk_widget_show(notebook);
+
+	vbox_audio = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	vbox_video = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+			vbox_audio, gtk_label_new(_("Audio")));
+	gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+			vbox_video, gtk_label_new(_("Video")));
+	gtk_container_set_border_width(GTK_CONTAINER (vbox_audio),
+			PIDGIN_HIG_BORDER);
+	gtk_container_set_border_width(GTK_CONTAINER (vbox_video),
+			PIDGIN_HIG_BORDER);
+