changeset 21453:93e69f29bc5f

merge of '45a353a8a7978312260680050564b3a32f0d07aa' and 'c7f6969f2405aa75f2e945cb239e6bf9ff0d6372'
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Mon, 12 Nov 2007 16:53:54 +0000
parents b068b2d146d1 (diff) 14f06265d134 (current diff)
children d78e440584e0
files pidgin/pixmaps/dialogs/16/Makefile.am pidgin/pixmaps/dialogs/16/Makefile.mingw pidgin/pixmaps/dialogs/64/Makefile.am pidgin/pixmaps/dialogs/64/Makefile.mingw pidgin/pixmaps/emblems/16/Makefile.am pidgin/pixmaps/emblems/16/Makefile.mingw pidgin/pixmaps/emotes/default/Makefile.mingw pidgin/pixmaps/icons/16/Makefile.am pidgin/pixmaps/icons/16/pidgin.png pidgin/pixmaps/icons/16/scalable/pidgin.svg pidgin/pixmaps/icons/22/Makefile.am pidgin/pixmaps/icons/22/pidgin.png pidgin/pixmaps/icons/22/scalable/pidgin.svg pidgin/pixmaps/icons/24/Makefile.am pidgin/pixmaps/icons/24/pidgin.png pidgin/pixmaps/icons/24/scalable/pidgin.svg pidgin/pixmaps/icons/32/Makefile.am pidgin/pixmaps/icons/32/pidgin.png pidgin/pixmaps/icons/32/scalable/pidgin.svg pidgin/pixmaps/icons/48/Makefile.am pidgin/pixmaps/icons/48/pidgin.png pidgin/pixmaps/icons/48/scalable/pidgin.svg pidgin/pixmaps/protocols/16/Makefile.am pidgin/pixmaps/protocols/16/Makefile.mingw pidgin/pixmaps/protocols/22/Makefile.am pidgin/pixmaps/protocols/22/Makefile.mingw pidgin/pixmaps/protocols/48/Makefile.am pidgin/pixmaps/protocols/48/Makefile.mingw pidgin/pixmaps/status/11/Makefile.am pidgin/pixmaps/status/11/Makefile.mingw pidgin/pixmaps/status/11/rtl/Makefile.am pidgin/pixmaps/status/11/rtl/Makefile.mingw pidgin/pixmaps/status/16/Makefile.am pidgin/pixmaps/status/16/Makefile.mingw pidgin/pixmaps/status/16/rtl/Makefile.am pidgin/pixmaps/status/16/rtl/Makefile.mingw pidgin/pixmaps/status/22/Makefile.am pidgin/pixmaps/status/22/Makefile.mingw pidgin/pixmaps/status/22/rtl/Makefile.am pidgin/pixmaps/status/22/rtl/Makefile.mingw pidgin/pixmaps/status/32/Makefile.am pidgin/pixmaps/status/32/Makefile.mingw pidgin/pixmaps/status/32/rtl/Makefile.am pidgin/pixmaps/status/32/rtl/Makefile.mingw pidgin/pixmaps/status/48/Makefile.am pidgin/pixmaps/status/48/Makefile.mingw pidgin/pixmaps/status/48/rtl/Makefile.am pidgin/pixmaps/status/48/rtl/Makefile.mingw pidgin/pixmaps/toolbar/16/Makefile.am pidgin/pixmaps/toolbar/16/Makefile.mingw pidgin/pixmaps/toolbar/22/Makefile.am pidgin/pixmaps/toolbar/22/Makefile.mingw pidgin/pixmaps/tray/16/Makefile.am pidgin/pixmaps/tray/16/Makefile.mingw pidgin/pixmaps/tray/16/scalable/Makefile.am pidgin/pixmaps/tray/22/Makefile.am pidgin/pixmaps/tray/22/Makefile.mingw pidgin/pixmaps/tray/22/scalable/Makefile.am pidgin/pixmaps/tray/32/Makefile.am pidgin/pixmaps/tray/32/Makefile.mingw pidgin/pixmaps/tray/48/Makefile.am pidgin/pixmaps/tray/48/Makefile.mingw share/Makefile.am share/Makefile.mingw
diffstat 218 files changed, 28033 insertions(+), 8069 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Mon Nov 12 16:15:53 2007 +0000
+++ b/COPYRIGHT	Mon Nov 12 16:53:54 2007 +0000
@@ -80,6 +80,7 @@
 Graham Cole
 Jono Cole
 Lorenzo Colitti
+Collabora Ltd.
 Jeff Connelly
 Nathan Conrad
 Felipe Contreras
--- a/ChangeLog.API	Mon Nov 12 16:15:53 2007 +0000
+++ b/ChangeLog.API	Mon Nov 12 16:53:54 2007 +0000
@@ -15,6 +15,38 @@
 		  to unload a plugin--fails.  This then prevents the plugin
 		  from being saved in the saved plugins list, so it'll won't
 		  be loaded at the next startup.
+
+		* PurpleDisconnectReason enumeration of machine-readable
+		  types of connection error.
+		* purple_connection_error_reason(), to be used by prpls
+		  (instead of purple_connection_error() and setting
+		  gc->wants_to_die) to report errors along with a
+		  PurpleDisconnectReason.
+		* PurpleConnectionUiOps.report_disconnect_reason, to be
+		  implemented by UIs (rather than .report_disconnect) if
+		  they want to use the reported PurpleDisconnectReason
+		  to give a more specific error.
+		* A connection-error signal, fired just after the UiOp is
+		  called with the same information.
+		* purple_connection_reason_is_fatal(), acting as a hint
+		  to whether automatic reconnection should be attempted
+		  after a connection error (rather than checking
+		  gc->wants_to_die).
+		* PurpleConnectionErrorInfo, a struct to hold a
+		  PurpleConnectionError and a const char *description.
+		* purple_account_get_current_error() to get the most recent
+		  PurpleConnectionError and description (or NULL if the
+		  account is happy with life), to allow bits of the UI to know
+		  the last error without caching it themselves (as
+		  PidginBuddyList does).
+		* purple_account_clear_current_error() to reset an account's
+		  error state to NULL.
+		* An account-error-changed signal, firing when
+		  purple_account_get_current_error()'s return value changes.
+
+		* PidginMiniDialog, a Gtk widget-ified version of
+		  pidgin_make_mini_dialog().
+
 		* purple_util_init()
 		* purple_util_uninit()
 
@@ -61,6 +93,11 @@
 		  when a dependent plugin fails to unload.  The UI should do
 		  something appropriate.
 
+		* pidgin_make_mini_dialog() now declares its return type to be
+		  GtkWidget * rather than void *.  This should not break any
+		  existing code since any code using it must already rely on
+		  the return type actually being GtkWidget * all along.
+
 		Deprecated:
 		* pidgin_dialogs_about()
 		* pidgin_log_show_contact()
@@ -82,6 +119,10 @@
 		* purple_request_ok_cancel()
 		* purple_request_yes_no()
 
+		* purple_connection_error()
+		* pidgin_blist_update_account_error_state()
+		* PidginBuddyList.connection_errors
+
 		MSN:
 		* A new independant status type with PURPLE_STATUS_TUNE primitive, and
 		  PURPLE_TUNE_ARTIST, PURPLE_TUNE_ALBUM and PURPLE_TUNE_TITLE
--- a/ChangeLog.win32	Mon Nov 12 16:15:53 2007 +0000
+++ b/ChangeLog.win32	Mon Nov 12 16:53:54 2007 +0000
@@ -1,5 +1,7 @@
 version 2.2.3:
-	* No changes
+	* Updated GTK+ to 2.12.1 (This was actually included in 2.2.2, but 
+	  didn't get into the Changelog.)
+	* Upgrade SILC to use the 1.1.5 toolkit
 
 version 2.2.2 (10/23/2007):
 	* Updated gtkspell to include a patch to share Aspell dictionaries
@@ -11,6 +13,7 @@
 	* libpurple now looks for a default prefs.xml in the COMMON_APPDATA
 	  directory (e.g. \Documents and Settings\All Users\Application Data\purple\prefs.xml)
 	  similarly to how this is done on other platforms.
+	* Updated GTK+ to 2.12.1
 
 version 2.2.1 (09/29/2007):
 	* No changes
--- a/Doxyfile.in	Mon Nov 12 16:15:53 2007 +0000
+++ b/Doxyfile.in	Mon Nov 12 16:53:54 2007 +0000
@@ -1,4 +1,4 @@
-# Doxyfile 1.4.4
+# Doxyfile 1.5.3
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project
@@ -14,6 +14,14 @@
 # Project related configuration options
 #---------------------------------------------------------------------------
 
+# This tag specifies the encoding used for all characters in the config file that 
+# follow. The default is UTF-8 which is also the encoding used for all text before 
+# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into 
+# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of 
+# possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
 # by quotes) that should identify the project.
 
@@ -45,23 +53,14 @@
 # documentation generated by doxygen is written. Doxygen will use this 
 # information to generate all constant output in the proper language. 
 # The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, 
-# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en 
-# (Japanese with English messages), Korean, Norwegian, Polish, Portuguese, 
-# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, 
+# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, 
+# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, 
+# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
 
 OUTPUT_LANGUAGE        = English
 
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
 # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
 # include brief member descriptions after the members that are listed in 
 # the file and class documentation (similar to JavaDoc). 
@@ -76,16 +75,28 @@
 
 REPEAT_BRIEF           = YES
 
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
 # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
 # Doxygen will generate a detailed section even if there is only a brief 
 # description.
 
 ALWAYS_DETAILED_SEC    = NO
 
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited 
-# members of a class in the documentation of that class as if those members were 
-# ordinary class members. Constructors, destructors and assignment operators of 
-# the base classes will not be shown.
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
 
 INLINE_INHERITED_MEMB  = NO
 
@@ -98,10 +109,21 @@
 # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
 # can be used to strip a user-defined part of the path. Stripping is 
 # only done if one of the specified strings matches the left-hand part of 
-# the path. It is allowed to use relative paths in the argument list.
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
 
 STRIP_FROM_PATH        = 
 
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
 # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
 # (but less readable) file names. This can be useful is your file systems 
 # doesn't support long names like on DOS, Mac, or CD-ROM.
@@ -111,11 +133,19 @@
 # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
 # will interpret the first line (until the first dot) of a JavaDoc-style 
 # comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explict @brief command for a brief description.
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
 
 JAVADOC_AUTOBRIEF      = YES
 
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
 # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
 # treat a multi-line C++ special comment block (i.e. a block of //! or /// 
 # comments) as a brief description. This used to be the default behaviour. 
@@ -133,17 +163,10 @@
 
 # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
 # member inherits the documentation from any documented member that it 
-# reimplements.
+# re-implements.
 
 INHERIT_DOCS           = YES
 
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
 # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
 # a new page for each member. If set to NO, the documentation of a member will 
 # be part of the file/class/namespace that contains it.
@@ -162,30 +185,51 @@
 # will result in a user-defined paragraph with heading "Side Effects:". 
 # You can put \n's in the value part of an alias to insert newlines.
 
-ALIASES                = "signal=- @ref" \
-                         "signaldef=@section" \
-                         "endsignaldef=" \
-                         "signalproto=@code" \
-                         "endsignalproto=@endcode" \
-                         "signaldesc=@par Description:" \
-                         "signals=@b Signals:" \
-                         "endsignals=" \
-                         "constreturn=@note The return value of this function must not be modified or freed. @return"
+ALIASES                = "signal=- @ref  " \
+                         "signaldef=@section  " \
+                         "endsignaldef=  " \
+                         "signalproto=@code  " \
+                         "endsignalproto=@endcode  " \
+                         "signaldesc=@par Description:  " \
+                         "signals=@b Signals:  " \
+                         "endsignals=  " \
+                         "constreturn=@note The return value of this function must not be modified or freed. @return  "
 
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources 
-# only. Doxygen will then generate output that is more tailored for C. 
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
 # For instance, some of the names that are used will be different. The list 
 # of all members will be omitted, etc.
 
 OPTIMIZE_OUTPUT_FOR_C  = YES
 
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources 
-# only. Doxygen will then generate output that is more tailored for Java. 
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
 # For instance, namespaces will be presented as packages, qualified scopes 
 # will look different, etc.
 
 OPTIMIZE_OUTPUT_JAVA   = NO
 
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
 # Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
 # the same type (for instance a group of public functions) to be put as a 
 # subgroup of that type (e.g. under the Public Functions section). Set it to 
@@ -228,6 +272,13 @@
 
 EXTRACT_LOCAL_METHODS  = YES
 
+# If this flag is set to YES, the members of anonymous namespaces will be extracted 
+# and appear in the documentation as a namespace called 'anonymous_namespace{file}', 
+# where file will be replaced with the base name of the file that contains the anonymous 
+# namespace. By default anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
 # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
 # undocumented members of documented classes, files or namespaces. 
 # If set to NO (the default) these members will be included in the 
@@ -268,7 +319,7 @@
 # file names in lower-case letters. If set to YES upper-case letters are also 
 # allowed. This is useful if you have classes or files whose names only differ 
 # in case and if your file system supports case sensitive file names. Windows 
-# users are advised to set this option to NO.
+# and Mac users are advised to set this option to NO.
 
 CASE_SENSE_NAMES       = YES
 
@@ -360,7 +411,7 @@
 
 # If the sources in your project are distributed over multiple directories 
 # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is YES.
+# in the documentation. The default is NO.
 
 SHOW_DIRECTORIES       = YES
 
@@ -369,7 +420,7 @@
 # version control system). Doxygen will invoke the program by executing (via 
 # popen()) the command <command> <input-file>, where <command> is the value of 
 # the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the progam writes to standard output 
+# provided by doxygen. Whatever the program writes to standard output 
 # is used as the file version. See the manual for examples.
 
 FILE_VERSION_FILTER    = 
@@ -413,9 +464,11 @@
 # The WARN_FORMAT tag determines the format of the warning messages that 
 # doxygen can produce. The string should contain the $file, $line, and $text 
 # tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text.
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
 
-WARN_FORMAT            = "$file:$line: $text"
+WARN_FORMAT            = "$file:$line: $text  "
 
 # The WARN_LOGFILE tag can be used to specify a file to which warning 
 # and error messages should be written. If left blank the output is written 
@@ -433,17 +486,24 @@
 # with spaces.
 
 INPUT                  = libpurple \
-	                     finch \
-	                     finch/libgnt \
-	                     pidgin \
+                         finch \
+                         finch/libgnt \
+                         pidgin \
                          doc
 
+# This tag can be used to specify the character encoding of the source files that 
+# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
+# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. 
+# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
 # If the value of the INPUT tag contains directories, you can use the 
 # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
 # and *.h) to filter out the source-files in the directories. If left 
 # blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp 
-# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
 
 FILE_PATTERNS          = *.h \
                          *.dox
@@ -461,17 +521,27 @@
 EXCLUDE                = libpurple/purple-client.h \
                          libpurple/purple-client-bindings.h
 
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories 
-# that are symbolic links (a Unix filesystem feature) are excluded from the input.
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
 
 EXCLUDE_SYMLINKS       = NO
 
 # If the value of the INPUT tag contains directories, you can use the 
 # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories.
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
 
 EXCLUDE_PATTERNS       = 
 
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the output. 
+# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, 
+# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
 # The EXAMPLE_PATH tag can be used to specify one or more files or 
 # directories that contain example code fragments that are included (see 
 # the \include command).
@@ -503,7 +573,8 @@
 # by executing (via popen()) the command <filter> <input-file>, where <filter> 
 # is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
 # input file. Doxygen will then use the output that the filter program writes 
-# to standard output.
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
 
 INPUT_FILTER           = 
 
@@ -527,7 +598,11 @@
 #---------------------------------------------------------------------------
 
 # If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources.
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH 
+# then you must also enable this option. If you don't then doxygen will produce 
+# a warning and turn it on anyway
 
 SOURCE_BROWSER         = NO
 
@@ -554,6 +629,13 @@
 
 REFERENCES_RELATION    = YES
 
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.  Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
 # If the USE_HTAGS tag is set to YES then the references to source code 
 # will point to the HTML generated by the htags(1) tool instead of doxygen 
 # built-in source browser. The htags tool is part of GNU's global source 
@@ -629,7 +711,9 @@
 # The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
 # style sheet that is used by each HTML page. It can be used to 
 # fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
 
 HTML_STYLESHEET        = 
 
@@ -646,10 +730,18 @@
 
 GENERATE_HTMLHELP      = YES
 
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
 # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
 # be used to specify the file name of the resulting .chm file. You 
 # can add a path in front of the file if the result should not be 
-# written to the html output dir.
+# written to the html output directory.
 
 CHM_FILE               = 
 
@@ -784,7 +876,7 @@
 #---------------------------------------------------------------------------
 
 # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimised for Word 97 and may not look very pretty with 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
 # other RTF readers or editors.
 
 GENERATE_RTF           = NO
@@ -811,7 +903,7 @@
 RTF_HYPERLINKS         = NO
 
 # Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assigments. You only have to provide 
+# config file, i.e. a series of assignments. You only have to provide 
 # replacements, missing definitions are set to their default value.
 
 RTF_STYLESHEET_FILE    = 
@@ -855,9 +947,7 @@
 
 # If the GENERATE_XML tag is set to YES Doxygen will 
 # generate an XML file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
+# the code including all documentation.
 
 GENERATE_XML           = YES
 
@@ -879,6 +969,13 @@
 
 XML_DTD                = 
 
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
 #---------------------------------------------------------------------------
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
@@ -943,7 +1040,7 @@
 
 # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
 # then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+# PREDEFINED and EXPAND_AS_DEFINED tags.
 
 EXPAND_ONLY_PREDEF     = NO
 
@@ -969,7 +1066,9 @@
 # are defined before the preprocessor is started (similar to the -D option of 
 # gcc). The argument of the tag is a list of macros of the form: name 
 # or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed.
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
 
 PREDEFINED             = 
 
@@ -983,13 +1082,13 @@
 # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
 # doxygen's preprocessor will remove all function-like macros that are alone 
 # on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse the 
-# parser if not removed.
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
 
 SKIP_FUNCTION_MACROS   = YES
 
 #---------------------------------------------------------------------------
-# Configuration::addtions related to external references   
+# Configuration::additions related to external references   
 #---------------------------------------------------------------------------
 
 # The TAGFILES option can be used to specify one or more tagfiles. 
@@ -1036,13 +1135,22 @@
 #---------------------------------------------------------------------------
 
 # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or 
-# super classes. Setting the tag to NO turns the diagrams off. Note that this 
-# option is superceded by the HAVE_DOT option below. This is only a fallback. It is 
-# recommended to install and use dot, since it yields more powerful graphs.
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
 
 CLASS_DIAGRAMS         = YES
 
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to 
+# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to 
+# specify the directory where the mscgen tool resides. If left empty the tool is assumed to 
+# be found in the default search path.
+
+MSCGEN_PATH            = 
+
 # If set to YES, the inheritance and collaboration graphs will hide 
 # inheritance and usage relations if the target is undocumented 
 # or is not a class.
@@ -1076,7 +1184,7 @@
 GROUP_GRAPHS           = YES
 
 # If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similiar to the OMG's Unified Modeling 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
 # Language.
 
 UML_LOOK               = YES
@@ -1100,7 +1208,7 @@
 
 INCLUDED_BY_GRAPH      = YES
 
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
+# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
 # generate a call dependency graph for every global function or class method. 
 # Note that enabling this option will significantly increase the time of a run. 
 # So in most cases it will be better to enable call graphs for selected 
@@ -1108,6 +1216,14 @@
 
 CALL_GRAPH             = YES
 
+# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
+# generate a caller dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable caller graphs for selected 
+# functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
 # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
 # will graphical hierarchy of all classes instead of a textual one.
 
@@ -1127,7 +1243,7 @@
 DOT_IMAGE_FORMAT       = png
 
 # The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found on the path.
+# found. If left blank, it is assumed the dot tool can be found in the path.
 
 DOT_PATH               = 
 
@@ -1137,30 +1253,23 @@
 
 DOTFILE_DIRS           = 
 
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
+# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the number 
+# of direct children of the root node in a graph is already larger than 
+# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
 
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
+DOT_GRAPH_MAX_NODES    = 50
 
 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
 # graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes that 
-# lay further from the root node will be omitted. Note that setting this option to 
-# 1 or 2 may greatly reduce the computation time needed for large code bases. Also 
-# note that a graph may be further truncated if the graph's image dimensions are 
-# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). 
-# If 0 is used for the depth value (the default), the graph is not depth-constrained.
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
 
 MAX_DOT_GRAPH_DEPTH    = 2
 
@@ -1192,7 +1301,7 @@
 DOT_CLEANUP            = YES
 
 #---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine   
+# Configuration::additions related to the search engine   
 #---------------------------------------------------------------------------
 
 # The SEARCHENGINE tag specifies whether or not a search engine should be 
--- a/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ b/Makefile.am	Mon Nov 12 16:53:54 2007 +0000
@@ -42,7 +42,7 @@
 GNT_DIR=finch
 endif
 
-SUBDIRS = libpurple doc $(GNT_DIR) $(GTK_DIR) m4macros po share
+SUBDIRS = libpurple doc $(GNT_DIR) $(GTK_DIR) m4macros po share/ca-certs share/sounds
 
 docs: Doxyfile
 if HAVE_DOXYGEN
--- a/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ b/Makefile.mingw	Mon Nov 12 16:53:54 2007 +0000
@@ -86,7 +86,8 @@
 ifndef DISABLE_NLS
 	$(MAKE) -C $(PURPLE_PO_TOP) -f $(MINGW_MAKEFILE) install
 endif
-	$(MAKE) -C share -f $(MINGW_MAKEFILE) install
+	$(MAKE) -C share/ca-certs -f $(MINGW_MAKEFILE) install
+	$(MAKE) -C share/sounds -f $(MINGW_MAKEFILE) install
 
 create_release_install_dir: install
 	rm -rf $(STRIPPED_RELEASE_DIR)
--- a/configure.ac	Mon Nov 12 16:15:53 2007 +0000
+++ b/configure.ac	Mon Nov 12 16:53:54 2007 +0000
@@ -900,7 +900,7 @@
 	CPPFLAGS_save="$CPPFLAGS"
 	CPPFLAGS="$CPPFLAGS $GADU_CFLAGS"
 	AC_TRY_COMPILE([#include <libgadu.h>], [
-#ifdef __GG_LIBGADU_HAVE_OPENSSL
+#if defined(__GG_LIBGADU_HAVE_OPENSSL) || defined(GG_CONFIG_HAVE_OPENSSL)
 #error "libgadu is not compatible with the GPL when compiled with OpenSSL support."
 #endif
 	], [
@@ -912,10 +912,11 @@
 		echo
 		echo
 		echo "libgadu is not compatible with the GPL when compiled with OpenSSL support."
-		echo "Please recompile libgadu using:"
+		echo "To compile against system libgadu, please recompile libgadu using:"
 		echo "./autogen.sh --disable-libgadu-openssl --disable-static --enable-shared"
 		echo "Then rerun this ./configure"
 		echo
+		echo "Falling back to using our own copy of libgadu"
 		echo
 		GADU_LIBS=""
 		GADU_CFLAGS=""
@@ -929,6 +930,7 @@
 AC_SUBST(GADU_LIBS)
 AC_SUBST(GADU_CFLAGS)
 
+AC_ARG_ENABLE(msnp14,[AC_HELP_STRING([--disable-msnp14], [Disable the newer MSNP14 protocol])],,enable_msnp14=yes)
 
 AC_ARG_ENABLE(distrib,,,enable_distrib=no)
 AM_CONDITIONAL(DISTRIB, test "x$enable_distrib" = "xyes")
@@ -949,6 +951,9 @@
 		STATIC_PRPLS=`echo $STATIC_PRPLS | $sedpath 's/bonjour//'`
 	fi
 fi
+if test "x$enable_msnp14" != "xyes" ; then
+	STATIC_PRPLS=`echo $STATIC_PRPLS | $sedpath 's/msn/msnp9/'`
+fi
 if test "x$silcincludes" != "xyes" -o "x$silcclient" != "xyes"; then
 	STATIC_PRPLS=`echo $STATIC_PRPLS | $sedpath 's/silc/silc10/'`
 fi
@@ -973,6 +978,8 @@
 			STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/lib${i}purple.a"
 		elif test "x$i" = "xsilc10"; then
 			STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/libsilcpurple.a"
+		elif test "x$i" = "xmsnp9"; then
+			STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/libmsn.a"
 		else
 			STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/lib$i.a"
 		fi
@@ -985,6 +992,7 @@
 		irc)		static_irc=yes ;;
 		jabber)		static_jabber=yes ;;
 		msn)		static_msn=yes ;;
+		msnp9)		static_msn=yes ;;
 		myspace)	static_myspace=yes ;;
 		novell)		static_novell=yes ;;
 		oscar)		static_oscar=yes ;;
@@ -1032,6 +1040,9 @@
 		DYNAMIC_PRPLS=`echo $DYNAMIC_PRPLS | $sedpath 's/bonjour//'`
 	fi
 fi
+if test "x$enable_msnp14" != "xyes" ; then
+	DYNAMIC_PRPLS=`echo $DYNAMIC_PRPLS | $sedpath 's/msn/msnp9/'`
+fi
 if test "x$silcincludes" != "xyes" -o "x$silcclient" != "xyes"; then
 	DYNAMIC_PRPLS=`echo $DYNAMIC_PRPLS | $sedpath 's/silc/silc10/'`
 fi
@@ -1046,6 +1057,7 @@
 		irc)		dynamic_irc=yes ;;
 		jabber)		dynamic_jabber=yes ;;
 		msn)		dynamic_msn=yes ;;
+		msnp9)		dynamic_msn=yes ;;
 		myspace)	dynamic_myspace=yes ;;
 		novell)		dynamic_novell=yes ;;
 		oscar)		dynamic_oscar=yes ;;
@@ -2206,35 +2218,8 @@
 		   pidgin/pidgin-uninstalled.pc
 		   pidgin/pixmaps/Makefile
 		   pidgin/pixmaps/buddy_icons/qq/Makefile
-		   pidgin/pixmaps/dialogs/16/Makefile
-		   pidgin/pixmaps/dialogs/64/Makefile
-		   pidgin/pixmaps/emblems/16/Makefile
 		   pidgin/pixmaps/emotes/default/24/Makefile
 		   pidgin/pixmaps/emotes/none/Makefile
-		   pidgin/pixmaps/icons/16/Makefile
-		   pidgin/pixmaps/icons/22/Makefile
-		   pidgin/pixmaps/icons/24/Makefile
-		   pidgin/pixmaps/icons/32/Makefile
-		   pidgin/pixmaps/icons/48/Makefile
-		   pidgin/pixmaps/protocols/16/Makefile
-		   pidgin/pixmaps/protocols/22/Makefile
-		   pidgin/pixmaps/protocols/48/Makefile
-		   pidgin/pixmaps/status/11/Makefile
-		   pidgin/pixmaps/status/11/rtl/Makefile
-		   pidgin/pixmaps/status/16/Makefile
-		   pidgin/pixmaps/status/16/rtl/Makefile
-		   pidgin/pixmaps/status/22/Makefile
-		   pidgin/pixmaps/status/22/rtl/Makefile
-		   pidgin/pixmaps/status/32/Makefile
-		   pidgin/pixmaps/status/32/rtl/Makefile
-		   pidgin/pixmaps/status/48/Makefile
-		   pidgin/pixmaps/status/48/rtl/Makefile
-		   pidgin/pixmaps/toolbar/16/Makefile
-		   pidgin/pixmaps/toolbar/22/Makefile
-		   pidgin/pixmaps/tray/16/Makefile
-		   pidgin/pixmaps/tray/22/Makefile
-		   pidgin/pixmaps/tray/32/Makefile
-		   pidgin/pixmaps/tray/48/Makefile
 		   pidgin/plugins/Makefile
 		   pidgin/plugins/cap/Makefile
 		   pidgin/plugins/gestures/Makefile
@@ -2262,6 +2247,7 @@
 		   libpurple/protocols/irc/Makefile
 		   libpurple/protocols/jabber/Makefile
 		   libpurple/protocols/msn/Makefile
+		   libpurple/protocols/msnp9/Makefile
 		   libpurple/protocols/myspace/Makefile
 		   libpurple/protocols/novell/Makefile
 		   libpurple/protocols/null/Makefile
@@ -2277,7 +2263,6 @@
 		   libpurple/tests/Makefile
 		   libpurple/purple.h
 		   libpurple/version.h
-		   share/Makefile
 		   share/sounds/Makefile
 		   share/ca-certs/Makefile
 		   finch/finch.pc
--- a/doc/account-signals.dox	Mon Nov 12 16:15:53 2007 +0000
+++ b/doc/account-signals.dox	Mon Nov 12 16:53:54 2007 +0000
@@ -12,6 +12,7 @@
   @signal account-authorization-requested
   @signal account-authorization-denied
   @signal account-authorization-granted
+  @signal account-error-changed
  @endsignals
 
  @see account.h
@@ -141,5 +142,23 @@
   @since 2.3.0
  @endsignaldef
 
+ @signaldef account-error-changed
+  @signalproto
+void (*account_error_changed)(PurpleAccount *account, const PurpleConnectionErrorInfo *old_error, const PurpleConnectionErrorInfo *current_error);
+  @endsignalproto
+  @signaldesc
+   Emitted when @a account's error changes.
+  @param account   The account whose error has changed.
+  @param old_error The account's previous error, or @c NULL if it had no
+                   error.  After this signal is emitted, @a old_error is
+                   not guaranteed to be a valid pointer.
+  @param new_error The account's new error, or @c NULL if it has no error.
+                   If not @c NULL, @a new_error will remain a valid until
+                   pointer just after the next time this signal is emitted
+                   for this @a account.
+  @see purple_account_get_current_error()
+  @since 2.3.0
+ @endsignaldef
+
  */
 // vim: syntax=c.doxygen tw=75 et
--- a/doc/connection-signals.dox	Mon Nov 12 16:15:53 2007 +0000
+++ b/doc/connection-signals.dox	Mon Nov 12 16:53:54 2007 +0000
@@ -47,5 +47,16 @@
   @param gc The connection that has signed off.
  @endsignaldef
 
+ @signaldef connection-error
+  @signalproto
+void (*connection_error)(PurpleConnection *gc, PurpleConnectionError err, const gchar *desc)
+  @endsignalproto
+  @signaldesc
+   Emitted when a connection error occurs, before @ref signed-off.
+   @param gc     The connection on which the error has occured
+   @param err    The error that occured
+   @param desc   A description of the error, giving more information.
+ @endsignaldef
+
  */
 // vim: syntax=c.doxygen tw=75 et
--- a/doc/pidgin.1.in	Mon Nov 12 16:15:53 2007 +0000
+++ b/doc/pidgin.1.in	Mon Nov 12 16:53:54 2007 +0000
@@ -17,8 +17,8 @@
 .\"
 .\" You should have received a copy of the GNU General Public
 .\" License along with this manual; if not, write to the Free
-.\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
-.\" USA.
+.\" Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+.\" Boston, MA  02111-1301  USA.
 .TH pidgin 1
 .SH NAME
 Pidgin v@VERSION@ \- Instant Messaging client
@@ -58,22 +58,22 @@
 .TP
 .B \-l, \-\-login[=\fINAME\fR,\fINAME\fR,...]
 Sign in the comma-separated list of accounts provided, in addition to the
-accounts that would be logged in anyway.  If you do not specify such a
-comma-separated list, your first account will be signed in.
+accounts that would be logged in anyway.  If the user does not specify such a
+comma-separated list, the first account in accounts.xml will be signed in.
 .TP
 .B \-v, \-\-version
 Print the current version and exit.
 
 .SH BUDDY LIST
 The \fBBuddy List\fR window is Pidgin's main interface window.  Using
-this window you can see which of your buddies is online, away, idle, etc.
-You can also add and remove buddies from your buddy list.
+this window a user can see which of his/her buddies is online, away, idle,
+etc.  The user can also add buddies to and remove buddies from the buddy list.
 
-The \fBBuddy List\fR window contains a list of your buddies who are online
-and have allowed you to be notified of their presence.  The icon to the
-left of each buddy indicates the buddy's current status.  Double clicking
-a buddy will open a new \fBConversation\fR window.  Right clicking will
-pop up a menu:
+The \fBBuddy List\fR window contains a list of the user's buddies who are
+online and have allowed the user to be notified of their presence.  The icon
+to the left of each buddy indicates the buddy's current status.  Double
+clicking a buddy will open a new \fBConversation\fR window.  Right clicking
+will pop up a menu:
 .TP
 .B Get Info
 Retrieves and displays information about the buddy.  This information is
@@ -121,9 +121,9 @@
 them.  It can be accessed by selecting \fBManage\fR from the Tools menu.
 Clicking \fIDelete\fR will delete the currently selected account.
 Clicking \fIAdd\fR or \fIModify\fR will invoke a \fBModify Account\fR
-window.  Here, you can add or alter account information.  When creating a
-new account, you will submit your screen name and password.  You will also
-choose your protocol.
+window.  Here, the user  can add or alter account information.  When creating
+a new account, the user will submit a screen name and password.  The user will
+also choose the protocol for the account.
 
 If \fIRemember Password\fR is chosen, the password will be saved in
 Pidgin's \fI~/.purple/accounts.xml\fR configuration file.
@@ -143,7 +143,7 @@
 
 .TP
 .B Show system tray icon
-Specifies when to show a Pidgin icon in the notification area of your
+Specifies when to show a Pidgin icon in the notification area of the user's
 panel (commonly referred to as the System Tray).
 
 .TP
@@ -299,8 +299,8 @@
 .B Report idle time
 Determines under which conditions to report idle time.  \fBBased on keyboard
 and mouse use\fR uses keyboard and mouse activity to determine idle time.
-\fBFrom last sent message\fR uses the time at which you last sent a message
-in Pidgin to determine idle.  \fBNever\fR disables idle reporting.
+\fBFrom last sent message\fR uses the time at which the user last sent a
+message in Pidgin to determine idle.  \fBNever\fR disables idle reporting.
 
 .TP
 .B Auto-reply
@@ -358,8 +358,7 @@
 For protocols that allow it, \fBChats\fR can be entered through the
 \fIBuddies\fR menu.
 
-
-Additional commands available in chat, depending on the protocol are:
+Additional features available in chat, depending on the protocol are:
 .TP
 .B Whisper
 The text will appear in the chat conversation, but it will only be visible
@@ -374,6 +373,10 @@
 .B Set Topic
 Set the topic of the chat room.  This is usually a brief sentence
 describing the nature of the chat--an explanation of the chat room's name.
+.TP
+.B Private Message (IM)
+Send a message to a specific person in the chat.  Messages sent this way will
+not appear in the chat window, but instead open a new IM conversation.
 
 .SH STATUS MESSAGES
 Most protocols allow for status messages.  By using status messages, a user
@@ -457,7 +460,7 @@
 button.  A pounce can be set to occur on any combination of the
 events listed, and any combination of actions can result.  If \fIPounce
 only when my status is not Available\fR is checked, the pounce will occur
-only if you are set to a non-available status, such as invisible, do not
+only if the user is set to a non-available status, such as invisible, do not
 disturb, away, etc.  If \fIRecurring\fR is checked, the pounce will remain
 until removed by the \fBDelete\fR button.
 
@@ -487,20 +490,20 @@
 
 .SH D-Bus
 Pidgin allows for interaction via D-Bus.  Currently very little documentation
-on this interaction exists.
+about this interaction exists.
 
 .SH FILES
   \fI@prefix@/bin/pidgin\fR: Pidgin's location.
 .br
   \fI~/.purple/blist.xml\fR: the buddy list.
 .br
-  \fI~/.purple/accounts.xml\fR: information about your accounts.
+  \fI~/.purple/accounts.xml\fR: information about the user's accounts.
 .br
-  \fI~/.purple/pounces.xml\fR: stores your buddy pounces.
+  \fI~/.purple/pounces.xml\fR: stores the user's buddy pounces.
 .br
   \fI~/.purple/prefs.xml\fR: Pidgin's configuration file.
 .br
-  \fI~/.purple/status.xml\fR: stores your away messages.
+  \fI~/.purple/status.xml\fR: stores the user's away messages.
 .br
   \fI~/.purple/logs/PROTOCOL/ACCOUNT/SCREENNAME/DATE.{html,txt}\fR: conversation logs.
 
--- a/finch/finch.pc.in	Mon Nov 12 16:15:53 2007 +0000
+++ b/finch/finch.pc.in	Mon Nov 12 16:53:54 2007 +0000
@@ -3,6 +3,7 @@
 libdir=@libdir@
 includedir=@includedir@
 datadir=@datadir@
+datarootdir=@datarootdir@
 sysconfdir=@sysconfdir@
 
 Name: Finch
--- a/libpurple/account.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/account.c	Mon Nov 12 16:53:54 2007 +0000
@@ -41,6 +41,14 @@
 #include "util.h"
 #include "xmlnode.h"
 
+typedef struct
+{
+	PurpleConnectionErrorInfo *current_error;
+} PurpleAccountPrivate;
+
+#define PURPLE_ACCOUNT_GET_PRIVATE(account) \
+	((PurpleAccountPrivate *) (account->priv))
+
 /* TODO: Should use PurpleValue instead of this?  What about "ui"? */
 typedef struct
 {
@@ -77,6 +85,9 @@
 
 static GList *handles = NULL;
 
+static void set_current_error(PurpleAccount *account,
+	PurpleConnectionErrorInfo *new_err);
+
 /*********************************************************************
  * Writing to disk                                                   *
  *********************************************************************/
@@ -310,8 +321,32 @@
 }
 
 static xmlnode *
+current_error_to_xmlnode(PurpleConnectionErrorInfo *err)
+{
+	xmlnode *node, *child;
+	char type_str[3];
+
+	node = xmlnode_new("current_error");
+
+	if(err == NULL)
+		return node;
+
+	child = xmlnode_new_child(node, "type");
+	snprintf(type_str, sizeof(type_str), "%u", err->type);
+	xmlnode_insert_data(child, type_str, -1);
+
+	child = xmlnode_new_child(node, "description");
+	if(err->description)
+		xmlnode_insert_data(child, err->description, -1);
+
+	return node;
+}
+
+static xmlnode *
 account_to_xmlnode(PurpleAccount *account)
 {
+	PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
+
 	xmlnode *node, *child;
 	const char *tmp;
 	PurplePresence *presence;
@@ -368,6 +403,9 @@
 		xmlnode_insert_child(node, child);
 	}
 
+	child = current_error_to_xmlnode(priv->current_error);
+	xmlnode_insert_child(node, child);
+
 	return node;
 }
 
@@ -672,6 +710,42 @@
 	purple_account_set_proxy_info(account, proxy_info);
 }
 
+static void
+parse_current_error(xmlnode *node, PurpleAccount *account)
+{
+	guint type;
+	char *type_str = NULL, *description = NULL;
+	xmlnode *child;
+	PurpleConnectionErrorInfo *current_error = NULL;
+
+	child = xmlnode_get_child(node, "type");
+	if (child == NULL || (type_str = xmlnode_get_data(child)) == NULL)
+		return;
+	type = atoi(type_str);
+	g_free(type_str);
+
+	if (type > PURPLE_CONNECTION_ERROR_OTHER_ERROR)
+	{
+		purple_debug_error("account",
+			"Invalid PurpleConnectionError value %d found when "
+			"loading account information for %s\n",
+			type, purple_account_get_username(account));
+		type = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+	}
+
+	child = xmlnode_get_child(node, "description");
+	if (child)
+		description = xmlnode_get_data(child);
+	if (description == NULL)
+		description = g_strdup("");
+
+	current_error = g_new0(PurpleConnectionErrorInfo, 1);
+	current_error->type = type;
+	current_error->description = description;
+
+	set_current_error(account, current_error);
+}
+
 static PurpleAccount *
 parse_account(xmlnode *node)
 {
@@ -781,6 +855,13 @@
 		parse_proxy_info(child, ret);
 	}
 
+	/* Read current error */
+	child = xmlnode_get_child(node, "current_error");
+	if (child != NULL)
+	{
+		parse_current_error(child, ret);
+	}
+
 	return ret;
 }
 
@@ -827,6 +908,7 @@
 purple_account_new(const char *username, const char *protocol_id)
 {
 	PurpleAccount *account = NULL;
+	PurpleAccountPrivate *priv = NULL;
 	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleStatusType *status_type;
@@ -841,6 +923,8 @@
 
 	account = g_new0(PurpleAccount, 1);
 	PURPLE_DBUS_REGISTER_POINTER(account, PurpleAccount);
+	priv = g_new0(PurpleAccountPrivate, 1);
+	account->priv = priv;
 
 	purple_account_set_username(account, username);
 
@@ -881,6 +965,7 @@
 void
 purple_account_destroy(PurpleAccount *account)
 {
+	PurpleAccountPrivate *priv = NULL;
 	GList *l;
 
 	g_return_if_fail(account != NULL);
@@ -912,6 +997,10 @@
 	if(account->system_log)
 		purple_log_free(account->system_log);
 
+	priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
+	g_free(priv->current_error);
+	g_free(priv);
+
 	PURPLE_DBUS_UNREGISTER_POINTER(account);
 	g_free(account);
 }
@@ -2214,6 +2303,65 @@
 	return prpl_info->offline_message(buddy);
 }
 
+static void
+signed_on_cb(PurpleConnection *gc,
+             gpointer unused)
+{
+	PurpleAccount *account = purple_connection_get_account(gc);
+	purple_account_clear_current_error(account);
+}
+
+static void
+set_current_error(PurpleAccount *account,
+                  PurpleConnectionErrorInfo *new_err)
+{
+	PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
+	PurpleConnectionErrorInfo *old_err = priv->current_error;
+
+	if(new_err == old_err)
+		return;
+
+	priv->current_error = new_err;
+
+	purple_signal_emit(purple_accounts_get_handle(),
+	                   "account-error-changed",
+	                   account, old_err, new_err);
+	schedule_accounts_save();
+
+	if(old_err)
+		g_free(old_err->description);
+
+	g_free(old_err);
+}
+
+static void
+connection_error_cb(PurpleConnection *gc,
+                    PurpleConnectionError type,
+                    const gchar *description,
+                    gpointer unused)
+{
+	PurpleAccount *account = purple_connection_get_account(gc);
+	PurpleConnectionErrorInfo *err = g_new0(PurpleConnectionErrorInfo, 1);
+
+	err->type = type;
+	err->description = g_strdup(description);
+
+	set_current_error(account, err);
+}
+
+const PurpleConnectionErrorInfo *
+purple_account_get_current_error(PurpleAccount *account)
+{
+	PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
+	return priv->current_error;
+}
+
+void
+purple_account_clear_current_error(PurpleAccount *account)
+{
+	set_current_error(account, NULL);
+}
+
 void
 purple_accounts_add(PurpleAccount *account)
 {
@@ -2238,6 +2386,11 @@
 
 	schedule_accounts_save();
 
+	/* Clearing the error ensures that account-error-changed is emitted,
+	 * which is the end of the guarantee that the the error's pointer is
+	 * valid.
+	 */
+	purple_account_clear_current_error(account);
 	purple_signal_emit(purple_accounts_get_handle(), "account-removed", account);
 }
 
@@ -2443,6 +2596,7 @@
 purple_accounts_init(void)
 {
 	void *handle = purple_accounts_get_handle();
+	void *conn_handle = purple_connections_get_handle();
 
 	purple_signal_register(handle, "account-connecting",
 						 purple_marshal_VOID__POINTER, NULL, 1,
@@ -2513,6 +2667,19 @@
 										PURPLE_SUBTYPE_ACCOUNT),
 						purple_value_new(PURPLE_TYPE_STRING));
 
+	purple_signal_register(handle, "account-error-changed",
+	                       purple_marshal_VOID__POINTER_POINTER_POINTER,
+	                       NULL, 3,
+	                       purple_value_new(PURPLE_TYPE_SUBTYPE,
+	                                        PURPLE_SUBTYPE_ACCOUNT),
+	                       purple_value_new(PURPLE_TYPE_POINTER),
+	                       purple_value_new(PURPLE_TYPE_POINTER));
+
+	purple_signal_connect(conn_handle, "signed-on", handle,
+	                      PURPLE_CALLBACK(signed_on_cb), NULL);
+	purple_signal_connect(conn_handle, "connection-error", handle,
+	                      PURPLE_CALLBACK(connection_error_cb), NULL);
+
 	load_accounts();
 
 }
@@ -2520,6 +2687,7 @@
 void
 purple_accounts_uninit(void)
 {
+	gpointer handle = purple_accounts_get_handle();
 	if (save_timer != 0)
 	{
 		purple_timeout_remove(save_timer);
@@ -2527,5 +2695,6 @@
 		sync_accounts();
 	}
 
-	purple_signals_unregister_by_instance(purple_accounts_get_handle());
+	purple_signals_disconnect_by_handle(handle);
+	purple_signals_unregister_by_instance(handle);
 }
--- a/libpurple/account.h	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/account.h	Mon Nov 12 16:53:54 2007 +0000
@@ -140,6 +140,8 @@
 	void *ui_data;              /**< The UI can put data here.              */
 	PurpleAccountRegistrationCb registration_cb;
 	void *registration_cb_user_data;
+
+	gpointer priv;              /**< Pointer to opaque private data. */
 };
 
 #ifdef __cplusplus
@@ -893,6 +895,25 @@
  */
 gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy);
 
+/**
+ * Get the error that caused the account to be disconnected, or @c NULL if the
+ * account is happily connected or disconnected without an error.
+ *
+ * @param account The account whose error should be retrieved.
+ * @constreturn   The type of error and a human-readable description of the
+ *                current error, or @c NULL if there is no current error.  This
+ *                pointer is guaranteed to remain valid until the @ref
+ *                account-error-changed signal is emitted for @a account.
+ */
+const PurpleConnectionErrorInfo *purple_account_get_current_error(PurpleAccount *account);
+
+/**
+ * Clear an account's current error state, resetting it to @c NULL.
+ *
+ * @param account The account whose error state should be cleared.
+ */
+void purple_account_clear_current_error(PurpleAccount *account);
+
 /*@}*/
 
 /**************************************************************************/
--- a/libpurple/connection.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/connection.c	Mon Nov 12 16:53:54 2007 +0000
@@ -488,29 +488,120 @@
 void
 purple_connection_error(PurpleConnection *gc, const char *text)
 {
+	/* prpls that have not been updated to use disconnection reasons will
+	 * be setting wants_to_die before calling this function, so choose
+	 * PURPLE_CONNECTION_ERROR_OTHER_ERROR (which is fatal) if it's true,
+	 * and PURPLE_CONNECTION_ERROR_NETWORK_ERROR (which isn't) if not.  See
+	 * the documentation in connection.h.
+	 */
+	PurpleConnectionError reason = gc->wants_to_die
+	                             ? PURPLE_CONNECTION_ERROR_OTHER_ERROR
+	                             : PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+	purple_connection_error_reason (gc, reason, text);
+}
+
+void
+purple_connection_error_reason (PurpleConnection *gc,
+                                PurpleConnectionError reason,
+                                const char *description)
+{
 	PurpleConnectionUiOps *ops;
 
 	g_return_if_fail(gc   != NULL);
+	/* This sanity check relies on PURPLE_CONNECTION_ERROR_OTHER_ERROR
+	 * being the last member of the PurpleConnectionError enum in
+	 * connection.h; if other reasons are added after it, this check should
+	 * be updated.
+	 */
+	if (reason > PURPLE_CONNECTION_ERROR_OTHER_ERROR) {
+		purple_debug_error("connection",
+			"purple_connection_error_reason: reason %u isn't a "
+			"valid reason\n", reason);
+		reason = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+	}
 
-	if (text == NULL) {
-		purple_debug_error("connection", "purple_connection_error: check `text != NULL' failed\n");
-		text = _("Unknown error");
+	if (description == NULL) {
+		purple_debug_error("connection", "purple_connection_error_reason: check `description != NULL' failed\n");
+		description = _("Unknown error");
 	}
 
 	/* If we've already got one error, we don't need any more */
 	if (gc->disconnect_timeout)
 		return;
 
+	gc->wants_to_die = purple_connection_error_is_fatal (reason);
+
 	ops = purple_connections_get_ui_ops();
 
-	if (ops != NULL && ops->report_disconnect != NULL)
-		ops->report_disconnect(gc, text);
+	if (ops != NULL)
+	{
+		if (ops->report_disconnect_reason != NULL)
+			ops->report_disconnect_reason (gc, reason, description);
+		if (ops->report_disconnect != NULL)
+			ops->report_disconnect (gc, description);
+	}
+
+	purple_signal_emit(purple_connections_get_handle(), "connection-error",
+		gc, reason, description);
 
 	gc->disconnect_timeout = purple_timeout_add(0, purple_connection_disconnect_cb,
 			purple_connection_get_account(gc));
 }
 
 void
+purple_connection_ssl_error (PurpleConnection *gc,
+                             PurpleSslErrorType ssl_error)
+{
+	PurpleConnectionError reason;
+
+	switch (ssl_error) {
+		case PURPLE_SSL_HANDSHAKE_FAILED:
+		case PURPLE_SSL_CONNECT_FAILED:
+			reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR;
+			break;
+		case PURPLE_SSL_CERTIFICATE_INVALID:
+			/* TODO: maybe PURPLE_SSL_* should be more specific? */
+			reason = PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR;
+			break;
+		default:
+			g_assert_not_reached ();
+			reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR;
+	}
+
+	purple_connection_error_reason (gc, reason,
+		purple_ssl_strerror(ssl_error));
+}
+
+gboolean
+purple_connection_error_is_fatal (PurpleConnectionError reason)
+{
+	switch (reason)
+	{
+		case PURPLE_CONNECTION_ERROR_NETWORK_ERROR:
+			return FALSE;
+		case PURPLE_CONNECTION_ERROR_INVALID_USERNAME:
+		case PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED:
+		case PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE:
+		case PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT:
+		case PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR:
+		case PURPLE_CONNECTION_ERROR_NAME_IN_USE:
+		case PURPLE_CONNECTION_ERROR_INVALID_SETTINGS:
+		case PURPLE_CONNECTION_ERROR_OTHER_ERROR:
+		case PURPLE_CONNECTION_ERROR_CERT_NOT_PROVIDED:
+		case PURPLE_CONNECTION_ERROR_CERT_UNTRUSTED:
+		case PURPLE_CONNECTION_ERROR_CERT_EXPIRED:
+		case PURPLE_CONNECTION_ERROR_CERT_NOT_ACTIVATED:
+		case PURPLE_CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH:
+		case PURPLE_CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH:
+		case PURPLE_CONNECTION_ERROR_CERT_SELF_SIGNED:
+		case PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR:
+			return TRUE;
+		default:
+			g_return_val_if_reached(TRUE);
+	}
+}
+
+void
 purple_connections_disconnect_all(void)
 {
 	GList *l;
@@ -571,6 +662,14 @@
 						 purple_marshal_VOID__POINTER, NULL, 1,
 						 purple_value_new(PURPLE_TYPE_SUBTYPE,
 										PURPLE_SUBTYPE_CONNECTION));
+
+	purple_signal_register(handle, "connection-error",
+	                       purple_marshal_VOID__POINTER_INT_POINTER, NULL, 1,
+	                       purple_value_new(PURPLE_TYPE_SUBTYPE,
+	                                        PURPLE_SUBTYPE_CONNECTION),
+	                       purple_value_new(PURPLE_TYPE_ENUM),
+	                       purple_value_new(PURPLE_TYPE_STRING));
+
 }
 
 void
--- a/libpurple/connection.h	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/connection.h	Mon Nov 12 16:53:54 2007 +0000
@@ -54,11 +54,97 @@
 
 } PurpleConnectionState;
 
+/** Possible errors that can cause a connection to be closed.
+ *  @since 2.3.0
+ */
+typedef enum
+{
+	/** There was an error sending or receiving on the network socket, or
+	 *  there was some protocol error (such as the server sending malformed
+	 *  data).
+	 */
+	PURPLE_CONNECTION_ERROR_NETWORK_ERROR = 0,
+	/** The username supplied was not valid. */
+	PURPLE_CONNECTION_ERROR_INVALID_USERNAME = 1,
+	/** The username, password or some other credential was incorrect.  Use
+	 *  #PURPLE_CONNECTION_ERROR_INVALID_USERNAME instead if the username
+         *  is known to be invalid.
+	 */
+	PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED = 2,
+	/** libpurple doesn't speak any of the authentication methods the
+	 *  server offered.
+	 */
+	PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE = 3,
+	/** libpurple was built without SSL support, and the connection needs
+	 *  SSL.
+	 */
+	PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT = 4,
+	/** There was an error negotiating SSL on this connection, or the
+	 *  server does not support encryption but an account option was set to
+	 *  require it.
+	 */
+	PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR = 5,
+	/** Someone is already connected to the server using the name you are
+	 *  trying to connect with.
+	 */
+	PURPLE_CONNECTION_ERROR_NAME_IN_USE = 6,
+
+	/** The username/server/other preference for the account isn't valid.
+	 *  For instance, on IRC the screen name cannot contain white space.
+	 *  This reason should not be used for incorrect passwords etc: use
+	 *  #PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED for that.
+	 *
+	 *  @todo This reason really shouldn't be necessary.  Usernames and
+	 *        other account preferences should be validated when the
+	 *        account is created.
+	 */
+	PURPLE_CONNECTION_ERROR_INVALID_SETTINGS = 7,
+
+	/** The server did not provide a SSL certificate. */
+	PURPLE_CONNECTION_ERROR_CERT_NOT_PROVIDED = 8,
+	/** The server's SSL certificate could not be trusted. */
+	PURPLE_CONNECTION_ERROR_CERT_UNTRUSTED = 9,
+	/** The server's SSL certificate has expired. */
+	PURPLE_CONNECTION_ERROR_CERT_EXPIRED = 10,
+	/** The server's SSL certificate is not yet valid. */
+	PURPLE_CONNECTION_ERROR_CERT_NOT_ACTIVATED = 11,
+	/** The server's SSL certificate did not match its hostname. */
+	PURPLE_CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH = 12,
+	/** The server's SSL certificate does not have the expected
+	 *  fingerprint.
+	 */
+	PURPLE_CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH = 13,
+	/** The server's SSL certificate is self-signed.  */
+	PURPLE_CONNECTION_ERROR_CERT_SELF_SIGNED = 14,
+	/** There was some other error validating the server's SSL certificate.
+	 */
+	PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR = 15,
+
+	/** Some other error occured which fits into none of the other
+	 *  categories.
+	 */
+	/* purple_connection_error_reason() in connection.c uses the fact that
+	 * this is the last member of the enum when sanity-checking; if other
+	 * reasons are added after it, the check must be updated.
+	 */
+	PURPLE_CONNECTION_ERROR_OTHER_ERROR = 16
+} PurpleConnectionError;
+
+/** Holds the type of an error along with its description. */
+typedef struct
+{
+	/** The type of error. */
+	PurpleConnectionError type;
+	/** A localised, human-readable description of the error. */
+	char *description;
+} PurpleConnectionErrorInfo;
+
 #include <time.h>
 
 #include "account.h"
 #include "plugin.h"
 #include "status.h"
+#include "sslconn.h"
 
 /** Connection UI operations.  Used to notify the user of changes to
  *  connections, such as being disconnected, and to respond to the
@@ -73,11 +159,13 @@
 	 *  the UI of what is happening, as well as which @a step out of @a
 	 *  step_count has been reached (which might be displayed as a progress
 	 *  bar).
+	 *  @see #purple_connection_update_progress
 	 */
 	void (*connect_progress)(PurpleConnection *gc,
 	                         const char *text,
 	                         size_t step,
 	                         size_t step_count);
+
 	/** Called when a connection is established (just before the
 	 *  @ref signed-on signal).
 	 */
@@ -86,17 +174,23 @@
 	 *  and @ref signed-off signals).
 	 */
 	void (*disconnected)(PurpleConnection *gc);
+
 	/** Used to display connection-specific notices.  (Pidgin's Gtk user
 	 *  interface implements this as a no-op; #purple_connection_notice(),
 	 *  which uses this operation, is not used by any of the protocols
 	 *  shipped with libpurple.)
 	 */
 	void (*notice)(PurpleConnection *gc, const char *text);
+
 	/** Called when an error causes a connection to be disconnected.
 	 *  Called before #disconnected.
 	 *  @param text  a localized error message.
+	 *  @see #purple_connection_error
+	 *  @deprecated in favour of
+	 *              #PurpleConnectionUiOps.report_disconnect_reason.
 	 */
 	void (*report_disconnect)(PurpleConnection *gc, const char *text);
+
 	/** Called when libpurple discovers that the computer's network
 	 *  connection is active.  On Linux, this uses Network Manager if
 	 *  available; on Windows, it uses Win32's network change notification
@@ -108,10 +202,24 @@
 	 */
 	void (*network_disconnected)();
 
+	/** Called when an error causes a connection to be disconnected.
+	 *  Called before #disconnected.  This op is intended to replace
+	 *  #report_disconnect.  If both are implemented, this will be called
+	 *  first; however, there's no real reason to implement both.
+	 *  @param reason  why the connection ended, if known, or
+	 *                 #PURPLE_CONNECTION_ERROR_OTHER_ERROR, if not.
+	 *  @param text  a localized message describing the disconnection
+	 *               in more detail to the user.
+	 *  @see #purple_connection_error_reason
+	 *  @since 2.3.0
+	 */
+	void (*report_disconnect_reason)(PurpleConnection *gc,
+	                                 PurpleConnectionError reason,
+	                                 const char *text);
+
 	void (*_purple_reserved1)(void);
 	void (*_purple_reserved2)(void);
 	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
 } PurpleConnectionUiOps;
 
 struct _PurpleConnection
@@ -125,19 +233,23 @@
 	char *password;              /**< The password used.                 */
 	int inpa;                    /**< The input watcher.                 */
 
-	GSList *buddy_chats;         /**< A list of active chats.            */
+	GSList *buddy_chats;         /**< A list of active chats
+	                                  (#PurpleConversation structs of type
+	                                  #PURPLE_CONV_TYPE_CHAT).           */
 	void *proto_data;            /**< Protocol-specific data.            */
 
 	char *display_name;          /**< How you appear to other people.    */
 	guint keepalive;             /**< Keep-alive.                        */
 
+	/** Wants to Die state.  This is set when the user chooses to log out, or
+	 * when the protocol is disconnected and should not be automatically
+	 * reconnected (incorrect password, etc.).  prpls should rely on
+	 * purple_connection_error_reason() to set this for them rather than
+	 * setting it themselves.
+	 * @see purple_connection_error_is_fatal
+	 */
+	gboolean wants_to_die;
 
-	gboolean wants_to_die;	     /**< Wants to Die state.  This is set
-	                                  when the user chooses to log out,
-	                                  or when the protocol is
-	                                  disconnected and should not be
-	                                  automatically reconnected
-	                                  (incorrect password, etc.)         */
 	guint disconnect_timeout;    /**< Timer used for nasty stack tricks  */
 };
 
@@ -209,7 +321,7 @@
 
 /**
  * Sets the connection state.  PRPLs should call this and pass in
- * the state "PURPLE_CONNECTED" when the account is completely
+ * the state #PURPLE_CONNECTED when the account is completely
  * signed on.  What does it mean to be completely signed on?  If
  * the core can call prpl->set_status, and it successfully changes
  * your status, then the account is online.
@@ -302,10 +414,65 @@
  * Closes a connection with an error.
  *
  * @param gc     The connection.
- * @param reason The error text.
+ * @param reason The error text, which may not be @c NULL.
+ * @deprecated in favour of #purple_connection_error_reason.  Calling
+ *  @c purple_connection_error(gc, text) is equivalent to calling
+ *  @c purple_connection_error_reason(gc, reason, text) where @c reason is
+ *  #PURPLE_CONNECTION_ERROR_OTHER_ERROR if @c gc->wants_to_die is @c TRUE, and
+ *  #PURPLE_CONNECTION_ERROR_NETWORK_ERROR if not.  (This is to keep
+ *  auto-reconnection behaviour the same when using old prpls which don't use
+ *  reasons yet.)
  */
 void purple_connection_error(PurpleConnection *gc, const char *reason);
 
+/**
+ * Closes a connection with an error and a human-readable description of the
+ * error.  It also sets @c gc->wants_to_die to the value of
+ * #purple_connection_error_is_fatal(@a reason), mainly for
+ * backwards-compatibility.
+ *
+ * @param gc          the connection which is closing.
+ * @param reason      why the connection is closing.
+ * @param description a non-@c NULL localized description of the error.
+ * @since 2.3.0
+ */
+void
+purple_connection_error_reason (PurpleConnection *gc,
+                                PurpleConnectionError reason,
+                                const char *description);
+
+/**
+ * Closes a connection due to an SSL error; this is basically a shortcut to
+ * turning the #PurpleSslErrorType into a #PurpleConnectionError and a
+ * human-readable string and then calling purple_connection_error_reason().
+ * @since 2.3.0
+ */
+void
+purple_connection_ssl_error (PurpleConnection *gc,
+                             PurpleSslErrorType ssl_error);
+
+/**
+ * Reports whether a disconnection reason is fatal (in which case the account
+ * should probably not be automatically reconnected) or transient (so
+ * auto-reconnection is a good idea).
+ * For instance, #PURPLE_CONNECTION_ERROR_NETWORK_ERROR is a temporary error,
+ * which might be caused by losing the network connection, so <tt>
+ * purple_connection_error_is_fatal (PURPLE_CONNECTION_ERROR_NETWORK_ERROR)</tt>
+ * is @c FALSE.  On the other hand,
+ * #PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED probably indicates a
+ * misconfiguration of the account which needs the user to go fix it up, so
+ * <tt> purple_connection_error_is_fatal
+ * (PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED)</tt> is @c TRUE.
+ *
+ * (This function is meant to replace checking PurpleConnection.wants_to_die.)
+ *
+ * @return @c TRUE if the account should not be automatically reconnected, and
+ *         @c FALSE otherwise.
+ * @since 2.3.0
+ */
+gboolean
+purple_connection_error_is_fatal (PurpleConnectionError reason);
+
 /*@}*/
 
 /**************************************************************************/
--- a/libpurple/core.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/core.c	Mon Nov 12 16:53:54 2007 +0000
@@ -138,15 +138,17 @@
 	/* The buddy icon code uses the imgstore, so init it early. */
 	purple_imgstore_init();
 
-	/* Accounts use status and buddy icons, so initialize these before accounts */
+	/* Accounts use status, buddy icons and connection signals, so
+	 * initialize these before accounts
+	 */
 	purple_status_init();
 	purple_buddy_icons_init();
+	purple_connections_init();
 
 	purple_accounts_init();
 	purple_savedstatuses_init();
 	purple_notify_init();
 	purple_certificate_init();
-	purple_connections_init();
 	purple_conversations_init();
 	purple_blist_init();
 	purple_log_init();
--- a/libpurple/plugins/signals-test.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/plugins/signals-test.c	Mon Nov 12 16:53:54 2007 +0000
@@ -226,6 +226,18 @@
 					purple_account_get_username(purple_connection_get_account(gc)));
 }
 
+static void
+connection_error_cb(PurpleConnection *gc,
+                    PurpleConnectionError err,
+                    const gchar *desc,
+                    void *data)
+{
+	const gchar *username =
+		purple_account_get_username(purple_connection_get_account(gc));
+	purple_debug_misc("signals test", "connection-error (%s, %u, %s)\n",
+		username, err, desc);
+}
+
 /**************************************************************************
  * Conversation subsystem signal callbacks
  **************************************************************************/
@@ -626,6 +638,8 @@
 						plugin, PURPLE_CALLBACK(signing_off_cb), NULL);
 	purple_signal_connect(conn_handle, "signed-off",
 						plugin, PURPLE_CALLBACK(signed_off_cb), NULL);
+	purple_signal_connect(conn_handle, "connection-error",
+						plugin, PURPLE_CALLBACK(connection_error_cb), NULL);
 
 	/* Conversations subsystem signals */
 	purple_signal_connect(conv_handle, "writing-im-msg",
--- a/libpurple/protocols/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/Makefile.am	Mon Nov 12 16:53:54 2007 +0000
@@ -1,5 +1,5 @@
 EXTRA_DIST = Makefile.mingw
 
-DIST_SUBDIRS = bonjour gg irc jabber msn myspace novell null oscar qq sametime silc silc10 toc simple yahoo zephyr
+DIST_SUBDIRS = bonjour gg irc jabber msn msnp9 myspace novell null oscar qq sametime silc silc10 toc simple yahoo zephyr
 
 SUBDIRS = $(DYNAMIC_PRPLS) $(STATIC_PRPLS)
--- a/libpurple/protocols/bonjour/bonjour.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/bonjour/bonjour.c	Mon Nov 12 16:53:54 2007 +0000
@@ -102,8 +102,8 @@
 
 #ifdef _WIN32
 	if (!dns_sd_available()) {
-		gc->wants_to_die = TRUE;
-		purple_connection_error(gc,
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_OTHER_ERROR,
 			_("The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: "
 			  "http://developer.pidgin.im/wiki/Using%20Pidgin#CanIusePidginforBonjourLink-LocalMessaging"
 			  " for more information."));
@@ -121,7 +121,9 @@
 
 	if (bonjour_jabber_start(bd->jabber_data) == -1) {
 		/* Send a message about the connection error */
-		purple_connection_error(gc, _("Unable to listen for incoming IM connections\n"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Unable to listen for incoming IM connections\n"));
 		return;
 	}
 
@@ -146,7 +148,9 @@
 	bd->dns_sd_data->account = account;
 	if (!bonjour_dns_sd_start(bd->dns_sd_data))
 	{
-		purple_connection_error(gc, _("Unable to establish connection with the local mDNS server.  Is it running?"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Unable to establish connection with the local mDNS server.  Is it running?"));
 		return;
 	}
 
--- a/libpurple/protocols/bonjour/jabber.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/bonjour/jabber.c	Mon Nov 12 16:53:54 2007 +0000
@@ -584,7 +584,9 @@
 	if ((data->socket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
 	{
 		purple_debug_error("bonjour", "Cannot open socket: %s\n", g_strerror(errno));
-		purple_connection_error(data->account->gc, _("Cannot open socket"));
+		purple_connection_error_reason (data->account->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Cannot open socket"));
 		return -1;
 	}
 
@@ -592,7 +594,9 @@
 	if (setsockopt(data->socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0)
 	{
 		purple_debug_error("bonjour", "Error setting socket options: %s\n", g_strerror(errno));
-		purple_connection_error(data->account->gc, _("Error setting socket options"));
+		purple_connection_error_reason (data->account->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Error setting socket options"));
 		return -1;
 	}
 
@@ -616,7 +620,9 @@
 	if (!bind_successful)
 	{
 		purple_debug_error("bonjour", "Cannot bind socket: %s\n", g_strerror(errno));
-		purple_connection_error(data->account->gc, _("Could not bind socket to port"));
+		purple_connection_error_reason (data->account->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Could not bind socket to port"));
 		return -1;
 	}
 
@@ -624,7 +630,9 @@
 	if (listen(data->socket, 10) != 0)
 	{
 		purple_debug_error("bonjour", "Cannot listen on socket: %s\n", g_strerror(errno));
-		purple_connection_error(data->account->gc, _("Could not listen on socket"));
+		purple_connection_error_reason (data->account->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Could not listen on socket"));
 		return -1;
 	}
 
--- a/libpurple/protocols/gg/gg.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/gg/gg.c	Mon Nov 12 16:53:54 2007 +0000
@@ -254,16 +254,14 @@
 /*
  */
 /* static void ggp_callback_buddylist_save_ok(PurpleConnection *gc, const char *file) {{{ */
-static void ggp_callback_buddylist_save_ok(PurpleConnection *gc, const char *file)
+static void ggp_callback_buddylist_save_ok(PurpleConnection *gc, const char *filename)
 {
 	PurpleAccount *account = purple_connection_get_account(gc);
 
-	FILE *fh;
 	char *buddylist = ggp_buddylist_dump(account);
-	gchar *msg;
 
 	purple_debug_info("gg", "Saving...\n");
-	purple_debug_info("gg", "file = %s\n", file);
+	purple_debug_info("gg", "file = %s\n", filename);
 
 	if (buddylist == NULL) {
 		purple_notify_info(account, _("Save Buddylist..."),
@@ -272,21 +270,19 @@
 		return;
 	}
 
-	if ((fh = g_fopen(file, "wb")) == NULL) {
-		msg = g_strconcat(_("Couldn't open file"), ": ", file, "\n", NULL);
-		purple_debug_error("gg", "Could not open file: %s\n", file);
-		purple_notify_error(account, _("Couldn't open file"), msg, NULL);
-		g_free(msg);
-		g_free(buddylist);
-		return;
+	if(purple_util_write_data_to_file_absolute(filename, buddylist, -1)) {
+		purple_notify_info(account, _("Save Buddylist..."),
+			 _("Buddylist saved successfully!"), NULL);
+	} else {
+		gchar *primary = g_strdup_printf(
+			_("Couldn't write buddy list for %s to %s"),
+			purple_account_get_username(account), filename);
+		purple_notify_error(account, _("Save Buddylist..."),
+			primary, NULL);
+		g_free(primary);
 	}
 
-	fwrite(buddylist, sizeof(char), g_utf8_strlen(buddylist, -1), fh);
-	fclose(fh);
 	g_free(buddylist);
-
-	purple_notify_info(account, _("Save Buddylist..."),
-			 _("Buddylist saved successfully!"), NULL);
 }
 /* }}} */
 
@@ -381,12 +377,16 @@
 
 	if (email == NULL || p1 == NULL || p2 == NULL || t == NULL ||
 	    *email == '\0' || *p1 == '\0' || *p2 == '\0' || *t == '\0') {
-		purple_connection_error(gc, _("Fill in the registration fields."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+			_("Fill in the registration fields."));
 		goto exit_err;
 	}
 
 	if (g_utf8_collate(p1, p2) != 0) {
-		purple_connection_error(gc, _("Passwords do not match."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
+			_("Passwords do not match."));
 		goto exit_err;
 	}
 
@@ -394,7 +394,8 @@
 			token->id, t);
 	h = gg_register3(email, p1, token->id, t, 0);
 	if (h == NULL || !(s = h->data) || !s->success) {
-		purple_connection_error(gc,
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_OTHER_ERROR,
 			_("Unable to register new account. Error occurred.\n"));
 		goto exit_err;
 	}
@@ -1308,7 +1309,9 @@
 	if (!(ev = gg_watch_fd(info->session))) {
 		purple_debug_error("gg",
 			"ggp_callback_recv: gg_watch_fd failed -- CRITICAL!\n");
-		purple_connection_error(gc, _("Unable to read socket"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Unable to read socket"));
 		return;
 	}
 
@@ -1461,7 +1464,9 @@
 
 	if (!(ev = gg_watch_fd(info->session))) {
 		purple_debug_error("gg", "login_handler: gg_watch_fd failed!\n");
-		purple_connection_error(gc, _("Unable to read socket"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Unable to read socket"));
 		return;
 	}
 	purple_debug_info("gg", "login_handler: session->fd = %d\n", info->session->fd);
@@ -1507,7 +1512,9 @@
 		case GG_EVENT_CONN_FAILED:
 			purple_input_remove(gc->inpa);
 			gc->inpa = 0;
-			purple_connection_error(gc, _("Connection failed."));
+			purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Connection failed."));
 			break;
 		default:
 			purple_debug_error("gg", "strange event: %d\n", ev->type);
@@ -1713,7 +1720,9 @@
 
 	info->session = gg_login(glp);
 	if (info->session == NULL) {
-		purple_connection_error(gc, _("Connection failed."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Connection failed."));
 		g_free(glp);
 		return;
 	}
@@ -2005,7 +2014,9 @@
 	if (gg_ping(info->session) < 0) {
 		purple_debug_info("gg", "Not connected to the server "
 				"or gg_session is not correct\n");
-		purple_connection_error(gc, _("Not connected to the server."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Not connected to the server."));
 	}
 }
 /* }}} */
--- a/libpurple/protocols/irc/irc.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/irc/irc.c	Mon Nov 12 16:53:54 2007 +0000
@@ -123,8 +123,10 @@
 	if (ret < 0 && errno == EAGAIN)
 		return;
 	else if (ret <= 0) {
-		purple_connection_error(purple_account_get_connection(irc->account),
-			      _("Server has disconnected"));
+		PurpleConnection *gc = purple_account_get_connection(irc->account);
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Server has disconnected"));
 		return;
 	}
 
@@ -161,8 +163,10 @@
 	/* purple_debug(PURPLE_DEBUG_MISC, "irc", "sent%s: %s",
 		irc->gsc ? " (ssl)" : "", tosend); */
 	if (ret <= 0 && errno != EAGAIN) {
-		purple_connection_error(purple_account_get_connection(irc->account),
-				      _("Server has disconnected"));
+		PurpleConnection *gc = purple_account_get_connection(irc->account);
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Server has disconnected"));
 	} else if (ret < buflen) {
 		if (ret < 0)
 			ret = 0;
@@ -295,7 +299,9 @@
 	gc->flags |= PURPLE_CONNECTION_NO_NEWLINES;
 
 	if (strpbrk(username, " \t\v\r\n") != NULL) {
-		purple_connection_error(gc, _("IRC nicks may not contain whitespace"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
+			_("IRC nicks may not contain whitespace"));
 		return;
 	}
 
@@ -324,7 +330,9 @@
 					purple_account_get_int(account, "port", IRC_DEFAULT_SSL_PORT),
 					irc_login_cb_ssl, irc_ssl_connect_failure, gc);
 		} else {
-			purple_connection_error(gc, _("SSL support unavailable"));
+			purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
+				_("SSL support unavailable"));
 			return;
 		}
 	}
@@ -335,7 +343,9 @@
 				 purple_account_get_int(account, "port", IRC_DEFAULT_PORT),
 				 irc_login_cb, gc) == NULL)
 		{
-			purple_connection_error(gc, _("Couldn't create socket"));
+			purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Couldn't create socket"));
 			return;
 		}
 	}
@@ -352,7 +362,6 @@
 	if (pass && *pass) {
 		buf = irc_format(irc, "vv", "PASS", pass);
 		if (irc_send(irc, buf) < 0) {
-/*			purple_connection_error(gc, "Error sending password"); */
 			g_free(buf);
 			return FALSE;
 		}
@@ -384,14 +393,12 @@
 			      strlen(realname) ? realname : IRC_DEFAULT_ALIAS);
 	g_free(tmp);
 	if (irc_send(irc, buf) < 0) {
-/*		purple_connection_error(gc, "Error registering with server");*/
 		g_free(buf);
 		return FALSE;
 	}
 	g_free(buf);
 	buf = irc_format(irc, "vn", "NICK", purple_connection_get_display_name(gc));
 	if (irc_send(irc, buf) < 0) {
-/*		purple_connection_error(gc, "Error sending nickname");*/
 		g_free(buf);
 		return FALSE;
 	}
@@ -418,7 +425,9 @@
 	struct irc_conn *irc = gc->proto_data;
 
 	if (source < 0) {
-		purple_connection_error(gc, _("Couldn't connect to host"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Couldn't connect to host"));
 		return;
 	}
 
@@ -438,7 +447,7 @@
 
 	irc->gsc = NULL;
 
-	purple_connection_error(gc, purple_ssl_strerror(error));
+	purple_connection_ssl_error (gc, error);
 }
 
 static void irc_close(PurpleConnection *gc)
@@ -606,10 +615,14 @@
 		/* Try again later */
 		return;
 	} else if (len < 0) {
-		purple_connection_error(gc, _("Read error"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Read error"));
 		return;
 	} else if (len == 0) {
-		purple_connection_error(gc, _("Server has disconnected"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Server has disconnected"));
 		return;
 	}
 
@@ -631,10 +644,14 @@
 	if (len < 0 && errno == EAGAIN) {
 		return;
 	} else if (len < 0) {
-		purple_connection_error(gc, _("Read error"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Read error"));
 		return;
 	} else if (len == 0) {
-		purple_connection_error(gc, _("Server has disconnected"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Server has disconnected"));
 		return;
 	}
 
--- a/libpurple/protocols/irc/msgs.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/irc/msgs.c	Mon Nov 12 16:53:54 2007 +0000
@@ -913,9 +913,9 @@
 				  _("Your selected nickname was rejected by the server.  It probably contains invalid characters."));
 
 	} else {
-		gc->wants_to_die = TRUE;
-		purple_connection_error(purple_account_get_connection(irc->account),
-				      _("Your selected account name was rejected by the server.  It probably contains invalid characters."));
+		purple_connection_error_reason (gc,
+				  PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
+				  _("Your selected account name was rejected by the server.  It probably contains invalid characters."));
 	}
 }
 
--- a/libpurple/protocols/irc/parse.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/irc/parse.c	Mon Nov 12 16:53:54 2007 +0000
@@ -612,6 +612,7 @@
 	struct _irc_msg *msgent;
 	char *cur, *end, *tmp, *from, *msgname, *fmt, **args, *msg;
 	guint i;
+	PurpleConnection *gc = purple_account_get_connection(irc->account);
 
 	irc->recv_time = time(NULL);
 
@@ -620,7 +621,7 @@
 	 * TODO: It should be passed as an array of bytes and a length
 	 * instead of a null terminated string.
 	 */
-	purple_signal_emit(_irc_plugin, "irc-receiving-text", purple_account_get_connection(irc->account), &input);
+	purple_signal_emit(_irc_plugin, "irc-receiving-text", gc, &input);
 	
 	if (!strncmp(input, "PING ", 5)) {
 		msg = irc_format(irc, "vv", "PONG", input + 5);
@@ -630,10 +631,13 @@
 	} else if (!strncmp(input, "ERROR ", 6)) {
 		if (g_utf8_validate(input, -1, NULL)) {
 			char *tmp = g_strdup_printf("%s\n%s", _("Disconnected."), input);
-			purple_connection_error(purple_account_get_connection(irc->account), tmp);
+			purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 			g_free(tmp);
 		} else
-			purple_connection_error(purple_account_get_connection(irc->account), _("Disconnected."));
+			purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Disconnected."));
 		return;
 	}
 
--- a/libpurple/protocols/jabber/adhoccommands.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/jabber/adhoccommands.c	Mon Nov 12 16:53:54 2007 +0000
@@ -138,7 +138,7 @@
 	const char *type = xmlnode_get_attrib(packet,"type");
 	
 	if(type && !strcmp(type,"error")) {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 		if(!msg)
 			msg = g_strdup(_("Unknown Error"));
 		
--- a/libpurple/protocols/jabber/auth.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/jabber/auth.c	Mon Nov 12 16:53:54 2007 +0000
@@ -50,7 +50,9 @@
 					"<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>", -1);
 			return TRUE;
 		} else if(xmlnode_get_child(starttls, "required")) {
-			purple_connection_error(js->gc, _("Server requires TLS/SSL for login.  No TLS/SSL support found."));
+			purple_connection_error_reason (js->gc,
+				PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
+				_("Server requires TLS/SSL for login.  No TLS/SSL support found."));
 			return TRUE;
 		}
 	}
@@ -113,7 +115,9 @@
 
 static void disallow_plaintext_auth(PurpleAccount *account)
 {
-	purple_connection_error(account->gc, _("Server requires plaintext authentication over an unencrypted stream"));
+	purple_connection_error_reason (account->gc,
+		PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
+		_("Server requires plaintext authentication over an unencrypted stream"));
 }
 
 #ifdef HAVE_CYRUS_SASL
@@ -331,7 +335,9 @@
 				 * error here.
 				 */
 				} else {
-					purple_connection_error(js->gc, _("Server does not use any supported authentication method"));
+					purple_connection_error_reason (js->gc,
+						PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE,
+						_("Server does not use any supported authentication method"));
 					return;
 				}
 				/* not reached */
@@ -386,7 +392,9 @@
 		jabber_send(js, auth);
 		xmlnode_free(auth);
 	} else {
-		purple_connection_error(js->gc, "SASL authentication failed\n");
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE,
+			"SASL authentication failed\n");
 	}
 }
 
@@ -459,7 +467,9 @@
 	mechs = xmlnode_get_child(packet, "mechanisms");
 
 	if(!mechs) {
-		purple_connection_error(js->gc, _("Invalid response from server."));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Invalid response from server."));
 		return;
 	}
 
@@ -519,7 +529,8 @@
 		}
 		finish_plaintext_authentication(js);
 	} else {
-		purple_connection_error(js->gc,
+		purple_connection_error_reason (js->gc,
+				PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE,
 				_("Server does not use any supported authentication method"));
 	}
 #endif
@@ -532,20 +543,22 @@
 	if(type && !strcmp(type, "result")) {
 		jabber_stream_set_state(js, JABBER_STREAM_CONNECTED);
 	} else {
-		char *msg = jabber_parse_error(js, packet);
+		PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+		char *msg = jabber_parse_error(js, packet, &reason);
 		xmlnode *error;
 		const char *err_code;
 
+		/* FIXME: Why is this not in jabber_parse_error? */
 		if((error = xmlnode_get_child(packet, "error")) &&
 					(err_code = xmlnode_get_attrib(error, "code")) &&
 					!strcmp(err_code, "401")) {
-			js->gc->wants_to_die = TRUE;
+			reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
 			/* Clear the pasword if it isn't being saved */
 			if (!purple_account_get_remember_password(js->gc->account))
 				purple_account_set_password(js->gc->account, NULL);
 		}
 
-		purple_connection_error(js->gc, msg);
+		purple_connection_error_reason (js->gc, reason, msg);
 		g_free(msg);
 	}
 }
@@ -558,11 +571,14 @@
 	const char *pw = purple_connection_get_password(js->gc);
 
 	if(!type) {
-		purple_connection_error(js->gc, _("Invalid response from server."));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Invalid response from server."));
 		return;
 	} else if(!strcmp(type, "error")) {
-		char *msg = jabber_parse_error(js, packet);
-		purple_connection_error(js->gc, msg);
+		PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+		char *msg = jabber_parse_error(js, packet, &reason);
+		purple_connection_error_reason (js->gc, reason, msg);
 		g_free(msg);
 	} else if(!strcmp(type, "result")) {
 		query = xmlnode_get_child(packet, "query");
@@ -606,8 +622,9 @@
 			}
 			finish_plaintext_authentication(js);
 		} else {
-			purple_connection_error(js->gc,
-					_("Server does not use any supported authentication method"));
+			purple_connection_error_reason (js->gc,
+				PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE,
+				_("Server does not use any supported authentication method"));
 			return;
 		}
 	}
@@ -773,7 +790,9 @@
 		GHashTable *parts;
 
 		if(!enc_in) {
-			purple_connection_error(js->gc, _("Invalid response from server."));
+			purple_connection_error_reason (js->gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Invalid response from server."));
 			return;
 		}
 
@@ -794,7 +813,9 @@
 						"<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl' />",
 						-1);
 			} else {
-				purple_connection_error(js->gc, _("Invalid challenge from server"));
+				purple_connection_error_reason (js->gc,
+					PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+					_("Invalid challenge from server"));
 			}
 			g_free(js->expected_rspauth);
 		} else {
@@ -817,7 +838,9 @@
 				realm = js->user->domain;
 
 			if (nonce == NULL || realm == NULL)
-				purple_connection_error(js->gc, _("Invalid challenge from server"));
+				purple_connection_error_reason (js->gc,
+					PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+					_("Invalid challenge from server"));
 			else {
 				GString *response = g_string_new("");
 				char *a2;
@@ -889,7 +912,9 @@
 		g_free(dec_in);
 		if (js->sasl_state != SASL_CONTINUE && js->sasl_state != SASL_OK) {
 			purple_debug_error("jabber", "Error is %d : %s\n",js->sasl_state,sasl_errdetail(js->sasl));
-			purple_connection_error(js->gc, _("SASL error"));
+			purple_connection_error_reason (js->gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("SASL error"));
 			return;
 		} else {
 			response = xmlnode_new("response");
@@ -914,7 +939,9 @@
 #endif
 
 	if(!ns || strcmp(ns, "urn:ietf:params:xml:ns:xmpp-sasl")) {
-		purple_connection_error(js->gc, _("Invalid response from server."));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Invalid response from server."));
 		return;
 	}
 
@@ -939,7 +966,9 @@
 
 		if (js->sasl_state != SASL_OK) {
 			/* This should never happen! */
-			purple_connection_error(js->gc, _("Invalid response from server."));
+			purple_connection_error_reason (js->gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Invalid response from server."));
 		}
 	}
 	/* If we've negotiated a security layer, we need to enable it */
@@ -955,12 +984,15 @@
 
 void jabber_auth_handle_failure(JabberStream *js, xmlnode *packet)
 {
-	char *msg = jabber_parse_error(js, packet);
+	PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+	char *msg = jabber_parse_error(js, packet, &reason);
 
 	if(!msg) {
-		purple_connection_error(js->gc, _("Invalid response from server."));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Invalid response from server."));
 	} else {
-		purple_connection_error(js->gc, msg);
+		purple_connection_error_reason (js->gc, reason, msg);
 		g_free(msg);
 	}
 }
--- a/libpurple/protocols/jabber/buddy.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Mon Nov 12 16:53:54 2007 +0000
@@ -2344,7 +2344,7 @@
 		return;
 
 	if(!(type = xmlnode_get_attrib(packet, "type")) || !strcmp(type, "error")) {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 
 		if(!msg)
 			msg = g_strdup(_("Unknown error"));
--- a/libpurple/protocols/jabber/chat.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/jabber/chat.c	Mon Nov 12 16:53:54 2007 +0000
@@ -391,7 +391,7 @@
 			}
 		}
 	} else if(!strcmp(type, "error")) {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 
 		purple_notify_error(js->gc, _("Configuration error"), _("Configuration error"), msg);
 
@@ -465,7 +465,7 @@
 	const char *type = xmlnode_get_attrib(packet, "type");
 
 	if(type && !strcmp(type, "error")) {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 
 		purple_notify_error(js->gc, _("Registration error"), _("Registration error"), msg);
 
@@ -534,7 +534,7 @@
 			}
 		}
 	} else if(!strcmp(type, "error")) {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 
 		purple_notify_error(js->gc, _("Registration error"), _("Registration error"), msg);
 
@@ -673,7 +673,7 @@
 		return;
 
 	if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "result")) {
-		char *err = jabber_parse_error(js,packet);
+		char *err = jabber_parse_error(js, packet, NULL);
 		purple_notify_error(js->gc, _("Error"),
 				_("Error retrieving room list"), err);
 		purple_roomlist_set_in_progress(js->roomlist, FALSE);
@@ -684,7 +684,7 @@
 	}
 
 	if(!(query = xmlnode_get_child(packet, "query"))) {
-		char *err = jabber_parse_error(js, packet);
+		char *err = jabber_parse_error(js, packet, NULL);
 		purple_notify_error(js->gc, _("Error"),
 				_("Error retrieving room list"), err);
 		purple_roomlist_set_in_progress(js->roomlist, FALSE);
--- a/libpurple/protocols/jabber/jabber.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Mon Nov 12 16:53:54 2007 +0000
@@ -89,7 +89,9 @@
 		if(js->unregistration)
 			jabber_unregister_account_cb(js);
 	} else {
-		purple_connection_error(js->gc, _("Error initializing session"));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			("Error initializing session"));
 	}
 }
 
@@ -120,15 +122,18 @@
 			JabberBuddy *my_jb = NULL;
 			jabber_id_free(js->user);
 			if(!(js->user = jabber_id_new(full_jid))) {
-				purple_connection_error(js->gc, _("Invalid response from server."));
+				purple_connection_error_reason (js->gc,
+					PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+					_("Invalid response from server."));
 			}
 			if((my_jb = jabber_buddy_find(js, full_jid, TRUE)))
 				my_jb->subscription |= JABBER_SUB_BOTH;
 			g_free(full_jid);
 		}
 	} else {
-		char *msg = jabber_parse_error(js, packet);
-		purple_connection_error(js->gc, msg);
+		PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+		char *msg = jabber_parse_error(js, packet, &reason);
+		purple_connection_error_reason (js->gc, reason, msg);
 		g_free(msg);
 	}
 
@@ -141,8 +146,9 @@
 		if(jabber_process_starttls(js, packet))
 			return;
 	} else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !js->gsc) {
-		js->gc->wants_to_die = TRUE;
-		purple_connection_error(js->gc, _("You require encryption, but it is not available on this server."));
+		purple_connection_error_reason (js->gc,
+			 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
+			_("You require encryption, but it is not available on this server."));
 		return;
 	}
 
@@ -173,9 +179,11 @@
 
 static void jabber_stream_handle_error(JabberStream *js, xmlnode *packet)
 {
-	char *msg = jabber_parse_error(js, packet);
+	PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+	char *msg = jabber_parse_error(js, packet, &reason);
 
-	purple_connection_error(js->gc, msg);
+	purple_connection_error_reason (js->gc, reason, msg);
+
 	g_free(msg);
 }
 
@@ -256,7 +264,9 @@
 	if (ret < 0 && errno == EAGAIN)
 		return;
 	else if (ret <= 0) {
-		purple_connection_error(js->gc, _("Write error"));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Write error"));
 		return;
 	}
 
@@ -309,7 +319,9 @@
 			}
 
 			if (ret < 0 && errno != EAGAIN)
-				purple_connection_error(js->gc, _("Write error"));
+				purple_connection_error_reason (js->gc,
+					PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+					_("Write error"));
 			else if (ret < olen) {
 				if (ret < 0)
 					ret = 0;
@@ -337,7 +349,9 @@
 	}
 
 	if (ret < 0 && errno != EAGAIN)
-		purple_connection_error(js->gc, _("Write error"));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Write error"));
 	else if (ret < len) {
 		if (ret < 0)
 			ret = 0;
@@ -405,7 +419,9 @@
 	if(errno == EAGAIN)
 		return;
 	else
-		purple_connection_error(gc, _("Read Error"));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Read Error"));
 }
 
 static void
@@ -442,7 +458,9 @@
 	} else if(errno == EAGAIN) {
 		return;
 	} else {
-		purple_connection_error(gc, _("Read Error"));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Read Error"));
 	}
 }
 
@@ -481,7 +499,8 @@
 		gchar *tmp;
 		tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"),
 				error);
-		purple_connection_error(gc, tmp);
+		purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
 		return;
 	}
@@ -509,7 +528,7 @@
 	js = gc->proto_data;
 	js->gsc = NULL;
 
-	purple_connection_error(gc, purple_ssl_strerror(error));
+	purple_connection_ssl_error (gc, error);
 }
 
 static void tls_init(JabberStream *js)
@@ -526,7 +545,9 @@
 
 	if (purple_proxy_connect(js->gc, js->gc->account, host,
 			port, jabber_login_callback, js->gc) == NULL)
-		purple_connection_error(js->gc, _("Unable to create socket"));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Unable to create socket"));
 }
 
 static void srv_resolved_cb(PurpleSrvResponse *resp, int results, gpointer data)
@@ -572,12 +593,16 @@
 	js->old_length = -1;
 
 	if(!js->user) {
-		purple_connection_error(gc, _("Invalid XMPP ID"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
+			_("Invalid XMPP ID"));
 		return;
 	}
 	
 	if (!js->user->domain || *(js->user->domain) == '\0') {
-		purple_connection_error(gc, _("Invalid XMPP ID. Domain must be set."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
+			_("Invalid XMPP ID. Domain must be set."));
 		return;
 	}
 	
@@ -607,7 +632,9 @@
 					purple_account_get_int(account, "port", 5223), jabber_login_callback_ssl,
 					jabber_ssl_connect_failure, js->gc);
 		} else {
-			purple_connection_error(js->gc, _("SSL support unavailable"));
+			purple_connection_error_reason (js->gc,
+				PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
+				_("SSL support unavailable"));
 		}
 	}
 
@@ -665,7 +692,7 @@
 				_("Registration Successful"), buf);
 		g_free(buf);
 	} else {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 
 		if(!msg)
 			msg = g_strdup(_("Unknown Error"));
@@ -695,7 +722,7 @@
 						   _("Unregistration Successful"), buf);
 		g_free(buf);
 	} else {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 		
 		if(!msg)
 			msg = g_strdup(_("Unknown Error"));
@@ -1060,7 +1087,9 @@
 	js->old_length = -1;
 
 	if(!js->user) {
-		purple_connection_error(gc, _("Invalid XMPP ID"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
+			_("Invalid XMPP ID"));
 		return;
 	}
 
@@ -1092,7 +1121,9 @@
 					purple_account_get_int(account, "port", 5222),
 					jabber_login_callback_ssl, jabber_ssl_connect_failure, gc);
 		} else {
-			purple_connection_error(gc, _("SSL support unavailable"));
+			purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
+				_("SSL support unavailable"));
 		}
 	}
 
@@ -1115,7 +1146,7 @@
 	PurpleAccount *account = purple_connection_get_account(js->gc);
 	const char *type = xmlnode_get_attrib(packet,"type");
 	if(!strcmp(type,"error")) {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 		
 		purple_notify_error(js->gc, _("Error unregistering account"),
 							_("Error unregistering account"), msg);
@@ -1643,7 +1674,7 @@
 
 		purple_account_set_password(js->gc->account, (char *)data);
 	} else {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 
 		purple_notify_error(js->gc, _("Error changing password"),
 				_("Error changing password"), msg);
@@ -1807,13 +1838,18 @@
 }
 
 
-char *jabber_parse_error(JabberStream *js, xmlnode *packet)
+char *jabber_parse_error(JabberStream *js,
+                         xmlnode *packet,
+                         PurpleConnectionError *reason)
 {
 	xmlnode *error;
 	const char *code = NULL, *text = NULL;
 	const char *xmlns = xmlnode_get_namespace(packet);
 	char *cdata = NULL;
 
+#define SET_REASON(x) \
+	if(reason != NULL) { *reason = x; }
+
 	if((error = xmlnode_get_child(packet, "error"))) {
 		cdata = xmlnode_get_data(error);
 		code = xmlnode_get_attrib(error, "code");
@@ -1865,22 +1901,21 @@
 			text = _("Unknown Error");
 		}
 	} else if(xmlns && !strcmp(xmlns, "urn:ietf:params:xml:ns:xmpp-sasl")) {
+		/* Most common reason can be the default */
+		SET_REASON(PURPLE_CONNECTION_ERROR_NETWORK_ERROR);
 		if(xmlnode_get_child(packet, "aborted")) {
-			js->gc->wants_to_die = TRUE;
 			text = _("Authorization Aborted");
 		} else if(xmlnode_get_child(packet, "incorrect-encoding")) {
 			text = _("Incorrect encoding in authorization");
 		} else if(xmlnode_get_child(packet, "invalid-authzid")) {
-			js->gc->wants_to_die = TRUE;
 			text = _("Invalid authzid");
 		} else if(xmlnode_get_child(packet, "invalid-mechanism")) {
-			js->gc->wants_to_die = TRUE;
 			text = _("Invalid Authorization Mechanism");
 		} else if(xmlnode_get_child(packet, "mechanism-too-weak")) {
-			js->gc->wants_to_die = TRUE;
+			SET_REASON(PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE);
 			text = _("Authorization mechanism too weak");
 		} else if(xmlnode_get_child(packet, "not-authorized")) {
-			js->gc->wants_to_die = TRUE;
+			SET_REASON(PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED);
 			/* Clear the pasword if it isn't being saved */
 			if (!purple_account_get_remember_password(js->gc->account))
 				purple_account_set_password(js->gc->account, NULL);
@@ -1888,18 +1923,20 @@
 		} else if(xmlnode_get_child(packet, "temporary-auth-failure")) {
 			text = _("Temporary Authentication Failure");
 		} else {
-			js->gc->wants_to_die = TRUE;
+			SET_REASON(PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED);
 			text = _("Authentication Failure");
 		}
 	} else if(!strcmp(packet->name, "stream:error") ||
 			 (!strcmp(packet->name, "error") && xmlns &&
 				!strcmp(xmlns, "http://etherx.jabber.org/streams"))) {
+		/* Most common reason as default: */
+		SET_REASON(PURPLE_CONNECTION_ERROR_NETWORK_ERROR);
 		if(xmlnode_get_child(packet, "bad-format")) {
 			text = _("Bad Format");
 		} else if(xmlnode_get_child(packet, "bad-namespace-prefix")) {
 			text = _("Bad Namespace Prefix");
 		} else if(xmlnode_get_child(packet, "conflict")) {
-			js->gc->wants_to_die = TRUE;
+			SET_REASON(PURPLE_CONNECTION_ERROR_NAME_IN_USE);
 			text = _("Resource Conflict");
 		} else if(xmlnode_get_child(packet, "connection-timeout")) {
 			text = _("Connection Timeout");
@@ -1948,6 +1985,8 @@
 		}
 	}
 
+#undef SET_REASON
+
 	if(text || cdata) {
 		char *ret = g_strdup_printf("%s%s%s", code ? code : "",
 				code ? ": " : "", text ? text : cdata);
--- a/libpurple/protocols/jabber/jabber.h	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/jabber/jabber.h	Mon Nov 12 16:53:54 2007 +0000
@@ -216,7 +216,14 @@
 
 char *jabber_get_next_id(JabberStream *js);
 
-char *jabber_parse_error(JabberStream *js, xmlnode *packet);
+/** Parse an error into a human-readable string and optionally a disconnect
+ *  reason.
+ *  @param js     the stream on which the error occurred.
+ *  @param packet the error packet
+ *  @param reason where to store the disconnection reason, or @c NULL if you
+ *                don't care or you don't intend to close the connection.
+ */
+char *jabber_parse_error(JabberStream *js, xmlnode *packet, PurpleConnectionError *reason);
 
 void jabber_add_feature(const gchar *shortname, const gchar *namespace, JabberFeatureEnabled cb); /* cb may be NULL */
 void jabber_remove_feature(const gchar *shortname);
--- a/libpurple/protocols/jabber/parser.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/jabber/parser.c	Mon Nov 12 16:53:54 2007 +0000
@@ -193,7 +193,9 @@
 		js->context = xmlCreatePushParserCtxt(&jabber_parser_libxml, js, buf, len, NULL);
 		xmlParseChunk(js->context, "", 0, 0);
 	} else if (xmlParseChunk(js->context, buf, len, 0) < 0) {
-		purple_connection_error(js->gc, _("XML Parse error"));
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("XML Parse error"));
 	}
 }
 
--- a/libpurple/protocols/jabber/presence.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/jabber/presence.c	Mon Nov 12 16:53:54 2007 +0000
@@ -429,7 +429,7 @@
 	}
 
 	if(type && !strcmp(type, "error")) {
-		char *msg = jabber_parse_error(js, packet);
+		char *msg = jabber_parse_error(js, packet, NULL);
 
 		state = JABBER_BUDDY_STATE_ERROR;
 		jb->error_msg = msg ? msg : g_strdup(_("Unknown Error in presence"));
@@ -561,7 +561,7 @@
 		char *room_jid = g_strdup_printf("%s@%s", jid->node, jid->domain);
 
 		if(state == JABBER_BUDDY_STATE_ERROR) {
-			char *title, *msg = jabber_parse_error(js, packet);
+			char *title, *msg = jabber_parse_error(js, packet, NULL);
 
 			if(chat->conv) {
 				title = g_strdup_printf(_("Error in chat %s"), from);
--- a/libpurple/protocols/msn/contact.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/msn/contact.c	Mon Nov 12 16:53:54 2007 +0000
@@ -709,7 +709,7 @@
 		msn_get_address_book(contact, NULL, NULL);
 		*/
 		msn_session_disconnect(session);
-		purple_connection_error(session->account->gc, _("Unable to retrieve MSN Address Book"));
+		purple_connection_error_reason(session->account->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to retrieve MSN Address Book"));
 	}
 }
 
--- a/libpurple/protocols/msn/msn.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/msn/msn.c	Mon Nov 12 16:53:54 2007 +0000
@@ -844,8 +844,8 @@
 
 	if (!purple_ssl_is_supported())
 	{
-		gc->wants_to_die = TRUE;
-		purple_connection_error(gc,
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
 			_("SSL support is needed for MSN. Please install a supported "
 			  "SSL library."));
 		return;
@@ -874,7 +874,9 @@
 		purple_account_set_username(account, username);
 
 	if (!msn_session_connect(session, host, port, http_method))
-		purple_connection_error(gc, _("Failed to connect to server."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Failed to connect to server."));
 }
 
 static void
--- a/libpurple/protocols/msn/session.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/msn/session.c	Mon Nov 12 16:53:54 2007 +0000
@@ -333,6 +333,7 @@
 					  const char *info)
 {
 	PurpleConnection *gc;
+	PurpleConnectionError reason;
 	char *msg;
 
 	gc = purple_account_get_connection(session->account);
@@ -340,49 +341,56 @@
 	switch (error)
 	{
 		case MSN_ERROR_SERVCONN:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 			msg = g_strdup(info);
 			break;
 		case MSN_ERROR_UNSUPPORTED_PROTOCOL:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 			msg = g_strdup(_("Our protocol is not supported by the "
 							 "server."));
 			break;
 		case MSN_ERROR_HTTP_MALFORMED:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 			msg = g_strdup(_("Error parsing HTTP."));
 			break;
 		case MSN_ERROR_SIGN_OTHER:
-			gc->wants_to_die = TRUE;
+			reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE;
 			msg = g_strdup(_("You have signed on from another location."));
 			if (!purple_account_get_remember_password(session->account))
 				purple_account_set_password(session->account, NULL);
 			break;
 		case MSN_ERROR_SERV_UNAVAILABLE:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 			msg = g_strdup(_("The MSN servers are temporarily "
 							 "unavailable. Please wait and try "
 							 "again."));
 			break;
 		case MSN_ERROR_SERV_DOWN:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 			msg = g_strdup(_("The MSN servers are going down "
 							 "temporarily."));
 			break;
 		case MSN_ERROR_AUTH:
-			gc->wants_to_die = TRUE;
+			reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
 			msg = g_strdup_printf(_("Unable to authenticate: %s"),
 								  (info == NULL ) ?
 								  _("Unknown error") : info);
 			break;
 		case MSN_ERROR_BAD_BLIST:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 			msg = g_strdup(_("Your MSN buddy list is temporarily "
 							 "unavailable. Please wait and try "
 							 "again."));
 			break;
 		default:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 			msg = g_strdup(_("Unknown error."));
 			break;
 	}
 
 	msn_session_disconnect(session);
 
-	purple_connection_error(gc, msg);
+	purple_connection_error_reason (gc, reason, msg);
 
 	g_free(msg);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/Makefile.am	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,90 @@
+EXTRA_DIST = \
+		Makefile.mingw
+
+pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION)
+
+MSNP9SOURCES = \
+	cmdproc.c \
+	cmdproc.h \
+	command.c \
+	command.h \
+	dialog.c \
+	dialog.h \
+	directconn.c \
+	directconn.h \
+	error.c \
+	error.h \
+	group.c \
+	group.h \
+	history.c \
+	history.h \
+	httpconn.c \
+	httpconn.h \
+	msg.c \
+	msg.h \
+	msn.c \
+	msn.h \
+	nexus.c \
+	nexus.h \
+	notification.c \
+	notification.h \
+	object.c \
+	object.h \
+	page.c \
+	page.h \
+	servconn.c \
+	servconn.h \
+	session.c \
+	session.h \
+	slp.c \
+	slp.h \
+	slpcall.c \
+	slpcall.h \
+	slplink.c \
+	slplink.h \
+	slpmsg.c \
+	slpmsg.h \
+	slpsession.c \
+	slpsession.h \
+	state.c \
+	state.h \
+	switchboard.c \
+	switchboard.h \
+	sync.c \
+	sync.h \
+	table.c \
+	table.h \
+	transaction.c \
+	transaction.h \
+	user.c \
+	user.h \
+	userlist.c \
+	userlist.h \
+	msn-utils.c \
+	msn-utils.h
+
+AM_CFLAGS = $(st)
+
+libmsn_la_LDFLAGS = -module -avoid-version
+
+if STATIC_MSN
+
+st = -DPURPLE_STATIC_PRPL
+noinst_LIBRARIES = libmsn.a
+libmsn_a_SOURCES = $(MSNP9SOURCES)
+libmsn_a_CFLAGS  = $(AM_CFLAGS)
+
+else
+
+st =
+pkg_LTLIBRARIES   = libmsn.la
+libmsn_la_SOURCES = $(MSNP9SOURCES)
+libmsn_la_LIBADD  = $(GLIB_LIBS)
+
+endif
+
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/libpurple \
+	-I$(top_builddir)/libpurple \
+	$(GLIB_CFLAGS) \
+	$(DEBUG_CFLAGS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/Makefile.mingw	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,105 @@
+#
+# Makefile.mingw
+#
+# Description: Makefile for win32 (mingw) version of libmsn
+#
+
+PIDGIN_TREE_TOP := ../../..
+include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
+
+TARGET = libmsn
+TYPE = PLUGIN
+
+# Static or Plugin...
+ifeq ($(TYPE),STATIC)
+  DEFINES += -DSTATIC
+  DLL_INSTALL_DIR =	$(PURPLE_INSTALL_DIR)
+else
+ifeq ($(TYPE),PLUGIN)
+  DLL_INSTALL_DIR =	$(PURPLE_INSTALL_PLUGINS_DIR)
+endif
+endif
+
+##
+## INCLUDE PATHS
+##
+INCLUDE_PATHS +=	-I. \
+			-I$(GTK_TOP)/include \
+			-I$(GTK_TOP)/include/glib-2.0 \
+			-I$(GTK_TOP)/lib/glib-2.0/include \
+			-I$(PURPLE_TOP) \
+			-I$(PURPLE_TOP)/win32 \
+			-I$(PIDGIN_TREE_TOP)
+
+LIB_PATHS +=		-L$(GTK_TOP)/lib \
+			-L$(PURPLE_TOP)
+
+##
+##  SOURCES, OBJECTS
+##
+C_SRC =			cmdproc.c \
+			command.c \
+			dialog.c \
+			directconn.c \
+			error.c \
+			group.c \
+			history.c \
+			httpconn.c \
+			msg.c \
+			msn.c \
+			nexus.c \
+			notification.c \
+			object.c \
+			page.c \
+			servconn.c \
+			session.c \
+			slp.c \
+			slpcall.c \
+			slplink.c \
+			slpmsg.c \
+			slpsession.c \
+			state.c \
+			switchboard.c \
+			sync.c \
+			table.c \
+			transaction.c \
+			user.c \
+			userlist.c \
+			msn-utils.c
+
+OBJECTS = $(C_SRC:%.c=%.o)
+
+##
+## LIBRARIES
+##
+LIBS =	\
+			-lglib-2.0 \
+			-lintl \
+			-lws2_32 \
+			-lpurple
+
+include $(PIDGIN_COMMON_RULES)
+
+##
+## TARGET DEFINITIONS
+##
+.PHONY: all install clean
+
+all: $(TARGET).dll
+
+install: all $(DLL_INSTALL_DIR)
+	cp $(TARGET).dll $(DLL_INSTALL_DIR)
+
+$(OBJECTS): $(PURPLE_CONFIG_H)
+
+$(TARGET).dll: $(PURPLE_DLL).a $(OBJECTS)
+	$(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -o $(TARGET).dll
+
+##
+## CLEAN RULES
+##
+clean:
+	rm -f $(OBJECTS)
+	rm -f $(TARGET).dll
+
+include $(PIDGIN_COMMON_TARGETS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/cmdproc.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,336 @@
+/**
+ * @file cmdproc.c MSN command processor functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "cmdproc.h"
+
+MsnCmdProc *
+msn_cmdproc_new(MsnSession *session)
+{
+	MsnCmdProc *cmdproc;
+
+	cmdproc = g_new0(MsnCmdProc, 1);
+
+	cmdproc->session = session;
+	cmdproc->txqueue = g_queue_new();
+	cmdproc->history = msn_history_new();
+
+	return cmdproc;
+}
+
+void
+msn_cmdproc_destroy(MsnCmdProc *cmdproc)
+{
+	MsnTransaction *trans;
+
+	while ((trans = g_queue_pop_head(cmdproc->txqueue)) != NULL)
+		msn_transaction_destroy(trans);
+
+	g_queue_free(cmdproc->txqueue);
+
+	msn_history_destroy(cmdproc->history);
+
+	if (cmdproc->last_cmd != NULL)
+		msn_command_destroy(cmdproc->last_cmd);
+
+	g_free(cmdproc);
+}
+
+void
+msn_cmdproc_process_queue(MsnCmdProc *cmdproc)
+{
+	MsnTransaction *trans;
+
+	while ((trans = g_queue_pop_head(cmdproc->txqueue)) != NULL)
+		msn_cmdproc_send_trans(cmdproc, trans);
+}
+
+void
+msn_cmdproc_queue_trans(MsnCmdProc *cmdproc, MsnTransaction *trans)
+{
+	g_return_if_fail(cmdproc != NULL);
+	g_return_if_fail(trans   != NULL);
+
+	g_queue_push_tail(cmdproc->txqueue, trans);
+}
+
+static void
+show_debug_cmd(MsnCmdProc *cmdproc, gboolean incoming, const char *command)
+{
+	MsnServConn *servconn;
+	const char *names[] = { "NS", "SB" };
+	char *show;
+	char tmp;
+	size_t len;
+
+	servconn = cmdproc->servconn;
+	len = strlen(command);
+	show = g_strdup(command);
+
+	tmp = (incoming) ? 'S' : 'C';
+
+	if ((show[len - 1] == '\n') && (show[len - 2] == '\r'))
+	{
+		show[len - 2] = '\0';
+	}
+
+	purple_debug_misc("msn", "%c: %s %03d: %s\n", tmp,
+					names[servconn->type], servconn->num, show);
+
+	g_free(show);
+}
+
+void
+msn_cmdproc_send_trans(MsnCmdProc *cmdproc, MsnTransaction *trans)
+{
+	MsnServConn *servconn;
+	char *data;
+	size_t len;
+
+	g_return_if_fail(cmdproc != NULL);
+	g_return_if_fail(trans != NULL);
+
+	servconn = cmdproc->servconn;
+
+	if (!servconn->connected)
+		return;
+
+	msn_history_add(cmdproc->history, trans);
+
+	data = msn_transaction_to_string(trans);
+
+	len = strlen(data);
+
+	show_debug_cmd(cmdproc, FALSE, data);
+
+	if (trans->callbacks == NULL)
+		trans->callbacks = g_hash_table_lookup(cmdproc->cbs_table->cmds,
+											   trans->command);
+
+	if (trans->payload != NULL)
+	{
+		data = g_realloc(data, len + trans->payload_len);
+		memcpy(data + len, trans->payload, trans->payload_len);
+		len += trans->payload_len;
+	}
+
+	msn_servconn_write(servconn, data, len);
+
+	g_free(data);
+}
+
+void
+msn_cmdproc_send_quick(MsnCmdProc *cmdproc, const char *command,
+					   const char *format, ...)
+{
+	MsnServConn *servconn;
+	char *data;
+	char *params = NULL;
+	va_list arg;
+	size_t len;
+
+	g_return_if_fail(cmdproc != NULL);
+	g_return_if_fail(command != NULL);
+
+	servconn = cmdproc->servconn;
+
+	if (!servconn->connected)
+		return;
+
+	if (format != NULL)
+	{
+		va_start(arg, format);
+		params = g_strdup_vprintf(format, arg);
+		va_end(arg);
+	}
+
+	if (params != NULL)
+		data = g_strdup_printf("%s %s\r\n", command, params);
+	else
+		data = g_strdup_printf("%s\r\n", command);
+
+	g_free(params);
+
+	len = strlen(data);
+
+	show_debug_cmd(cmdproc, FALSE, data);
+
+	msn_servconn_write(servconn, data, len);
+
+	g_free(data);
+}
+
+void
+msn_cmdproc_send(MsnCmdProc *cmdproc, const char *command,
+				 const char *format, ...)
+{
+	MsnTransaction *trans;
+	va_list arg;
+
+	g_return_if_fail(cmdproc != NULL);
+	g_return_if_fail(command != NULL);
+
+	if (!cmdproc->servconn->connected)
+		return;
+
+	trans = g_new0(MsnTransaction, 1);
+
+	trans->command = g_strdup(command);
+
+	if (format != NULL)
+	{
+		va_start(arg, format);
+		trans->params = g_strdup_vprintf(format, arg);
+		va_end(arg);
+	}
+
+	msn_cmdproc_send_trans(cmdproc, trans);
+}
+
+void
+msn_cmdproc_process_payload(MsnCmdProc *cmdproc, char *payload,
+							int payload_len)
+{
+	MsnCommand *last;
+
+	g_return_if_fail(cmdproc != NULL);
+
+	last = cmdproc->last_cmd;
+	last->payload = g_memdup(payload, payload_len);
+	last->payload_len = payload_len;
+
+	if (last->payload_cb != NULL)
+		last->payload_cb(cmdproc, last, payload, payload_len);
+}
+
+void
+msn_cmdproc_process_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	MsnMsgTypeCb cb;
+
+	if (msn_message_get_content_type(msg) == NULL)
+	{
+		purple_debug_misc("msn", "failed to find message content\n");
+		return;
+	}
+
+	cb = g_hash_table_lookup(cmdproc->cbs_table->msgs,
+							 msn_message_get_content_type(msg));
+
+	if (cb == NULL)
+	{
+		purple_debug_warning("msn", "Unhandled content-type '%s'\n",
+						   msn_message_get_content_type(msg));
+
+		return;
+	}
+
+	cb(cmdproc, msg);
+}
+
+void
+msn_cmdproc_process_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnTransCb cb = NULL;
+	MsnTransaction *trans = NULL;
+
+	if (cmd->trId)
+		trans = msn_history_find(cmdproc->history, cmd->trId);
+
+	if (trans != NULL)
+		if (trans->timer)
+			purple_timeout_remove(trans->timer);
+
+	if (g_ascii_isdigit(cmd->command[0]))
+	{
+		if (trans != NULL)
+		{
+			MsnErrorCb error_cb = NULL;
+			int error;
+
+			error = atoi(cmd->command);
+
+			if (trans->error_cb != NULL)
+				error_cb = trans->error_cb;
+
+			if (error_cb == NULL && cmdproc->cbs_table->errors != NULL)
+				error_cb = g_hash_table_lookup(cmdproc->cbs_table->errors, trans->command);
+
+			if (error_cb != NULL)
+			{
+				error_cb(cmdproc, trans, error);
+			}
+			else
+			{
+#if 1
+				msn_error_handle(cmdproc->session, error);
+#else
+				purple_debug_warning("msn", "Unhandled error '%s'\n",
+								   cmd->command);
+#endif
+			}
+
+			return;
+		}
+	}
+
+	if (cmdproc->cbs_table->async != NULL)
+		cb = g_hash_table_lookup(cmdproc->cbs_table->async, cmd->command);
+
+	if (cb == NULL && trans != NULL)
+	{
+		cmd->trans = trans;
+
+		if (trans->callbacks != NULL)
+			cb = g_hash_table_lookup(trans->callbacks, cmd->command);
+	}
+
+	if (cb == NULL && cmdproc->cbs_table->fallback != NULL)
+		cb = g_hash_table_lookup(cmdproc->cbs_table->fallback, cmd->command);
+
+	if (cb != NULL)
+	{
+		cb(cmdproc, cmd);
+	}
+	else
+	{
+		purple_debug_warning("msn", "Unhandled command '%s'\n",
+						   cmd->command);
+	}
+
+	if (trans != NULL && trans->pendent_cmd != NULL)
+		msn_transaction_unqueue_cmd(trans, cmdproc);
+}
+
+void
+msn_cmdproc_process_cmd_text(MsnCmdProc *cmdproc, const char *command)
+{
+	show_debug_cmd(cmdproc, TRUE, command);
+
+	if (cmdproc->last_cmd != NULL)
+		msn_command_destroy(cmdproc->last_cmd);
+
+	cmdproc->last_cmd = msn_command_from_string(command);
+
+	msn_cmdproc_process_cmd(cmdproc, cmdproc->last_cmd);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/cmdproc.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,74 @@
+/**
+ * @file cmdproc.h MSN command processor functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_CMDPROC_H_
+#define _MSN_CMDPROC_H_
+
+typedef struct _MsnCmdProc MsnCmdProc;
+
+#include "session.h"
+#include "servconn.h"
+#include "error.h"
+#include "command.h"
+#include "table.h"
+#include "history.h"
+
+struct _MsnCmdProc
+{
+	MsnSession *session;
+	MsnServConn *servconn;
+
+	GQueue *txqueue;
+
+	MsnCommand *last_cmd;
+
+	MsnTable *cbs_table;
+
+	MsnHistory *history;
+
+	void *data; /**< Extra data, like the switchboard. */
+};
+
+MsnCmdProc *msn_cmdproc_new(MsnSession *session);
+void msn_cmdproc_destroy(MsnCmdProc *cmdproc);
+
+void msn_cmdproc_process_queue(MsnCmdProc *cmdproc);
+
+void msn_cmdproc_send_trans(MsnCmdProc *cmdproc, MsnTransaction *trans);
+void msn_cmdproc_queue_trans(MsnCmdProc *cmdproc,
+							 MsnTransaction *trans);
+void msn_cmdproc_send(MsnCmdProc *cmdproc, const char *command,
+					  const char *format, ...);
+void msn_cmdproc_send_quick(MsnCmdProc *cmdproc, const char *command,
+							const char *format, ...);
+
+void msn_cmdproc_process_msg(MsnCmdProc *cmdproc,
+							 MsnMessage *msg);
+void msn_cmdproc_process_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd);
+void msn_cmdproc_process_cmd_text(MsnCmdProc *cmdproc, const char *command);
+void msn_cmdproc_process_payload(MsnCmdProc *cmdproc,
+								 char *payload, int payload_len);
+
+void msn_cmdproc_disconnect(MsnCmdProc *cmdproc);
+
+#endif /* _MSN_CMDPROC_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/command.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,123 @@
+/**
+ * @file command.c MSN command functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "command.h"
+
+static gboolean
+is_num(char *str)
+{
+	char *c;
+	for (c = str; *c; c++) {
+		if (!(g_ascii_isdigit(*c)))
+			return FALSE;
+	}
+
+	return TRUE;
+}
+
+MsnCommand *
+msn_command_from_string(const char *string)
+{
+	MsnCommand *cmd;
+	char *tmp;
+	char *param_start;
+
+	g_return_val_if_fail(string != NULL, NULL);
+
+	tmp = g_strdup(string);
+	param_start = strchr(tmp, ' ');
+
+	cmd = g_new0(MsnCommand, 1);
+	cmd->command = tmp;
+
+	if (param_start)
+	{
+		*param_start++ = '\0';
+		cmd->params = g_strsplit(param_start, " ", 0);
+	}
+
+	if (cmd->params != NULL)
+	{
+		char *param;
+		int c;
+
+		for (c = 0; cmd->params[c]; c++);
+		cmd->param_count = c;
+
+		param = cmd->params[0];
+
+		cmd->trId = is_num(param) ? atoi(param) : 0;
+	}
+	else
+		cmd->trId = 0;
+
+	msn_command_ref(cmd);
+
+	return cmd;
+}
+
+void
+msn_command_destroy(MsnCommand *cmd)
+{
+	g_return_if_fail(cmd != NULL);
+
+	if (cmd->ref_count > 0)
+	{
+		msn_command_unref(cmd);
+		return;
+	}
+
+	if (cmd->payload != NULL)
+		g_free(cmd->payload);
+
+	g_free(cmd->command);
+	g_strfreev(cmd->params);
+	g_free(cmd);
+}
+
+MsnCommand *
+msn_command_ref(MsnCommand *cmd)
+{
+	g_return_val_if_fail(cmd != NULL, NULL);
+
+	cmd->ref_count++;
+	return cmd;
+}
+
+MsnCommand *
+msn_command_unref(MsnCommand *cmd)
+{
+	g_return_val_if_fail(cmd != NULL, NULL);
+	g_return_val_if_fail(cmd->ref_count > 0, NULL);
+
+	cmd->ref_count--;
+
+	if (cmd->ref_count == 0)
+	{
+		msn_command_destroy(cmd);
+		return NULL;
+	}
+
+	return cmd;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/command.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,61 @@
+/**
+ * @file command.h MSN command functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_COMMAND_H
+#define _MSN_COMMAND_H
+
+typedef struct _MsnCommand MsnCommand;
+
+#include "cmdproc.h"
+#include "transaction.h"
+
+typedef void (*MsnPayloadCb)(MsnCmdProc *cmdproc, MsnCommand *cmd,
+							 char *payload, size_t len);
+
+/**
+ * A received command.
+ */
+struct _MsnCommand
+{
+	unsigned int trId;
+
+	char *command;
+	char **params;
+	int param_count;
+
+	int ref_count;
+
+	MsnTransaction *trans;
+
+	char *payload;
+	size_t payload_len;
+
+	MsnPayloadCb payload_cb;
+};
+
+MsnCommand *msn_command_from_string(const char *string);
+void msn_command_destroy(MsnCommand *cmd);
+MsnCommand *msn_command_ref(MsnCommand *cmd);
+MsnCommand *msn_command_unref(MsnCommand *cmd);
+
+#endif /* _MSN_COMMAND_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/dialog.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,138 @@
+/**
+ * @file dialog.c Dialog functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+#include "msn.h"
+#include "dialog.h"
+
+typedef struct
+{
+	PurpleConnection *gc;
+	char *who;
+	char *group;
+	gboolean add;
+
+} MsnAddRemData;
+
+/* Remove the buddy referenced by the MsnAddRemData before the serverside list is changed.
+ * If the buddy will be added, he'll be added back; if he will be removed, he won't be. */
+static void
+msn_complete_sync_issue(MsnAddRemData *data)
+{
+	PurpleBuddy *buddy;
+	PurpleGroup *group = NULL;
+
+	if (data->group != NULL)
+		group = purple_find_group(data->group);
+	
+	if (group != NULL)
+		buddy = purple_find_buddy_in_group(purple_connection_get_account(data->gc), data->who, group);
+	else
+		buddy = purple_find_buddy(purple_connection_get_account(data->gc), data->who);
+	
+	if (buddy != NULL)
+		purple_blist_remove_buddy(buddy);
+}
+
+static void
+msn_add_cb(MsnAddRemData *data)
+{
+	MsnSession *session;
+	MsnUserList *userlist;
+
+	msn_complete_sync_issue(data);
+
+	session = data->gc->proto_data;
+	userlist = session->userlist;
+
+	msn_userlist_add_buddy(userlist, data->who, MSN_LIST_FL, data->group);
+
+	g_free(data->group);
+	g_free(data->who);
+	g_free(data);
+}
+
+static void
+msn_rem_cb(MsnAddRemData *data)
+{
+	MsnSession *session;
+	MsnUserList *userlist;
+
+	msn_complete_sync_issue(data);
+
+	session = data->gc->proto_data;
+	userlist = session->userlist;
+
+	msn_userlist_rem_buddy(userlist, data->who, MSN_LIST_FL, data->group);
+
+	g_free(data->group);
+	g_free(data->who);
+	g_free(data);
+}
+
+void
+msn_show_sync_issue(MsnSession *session, const char *passport,
+					const char *group_name)
+{
+	PurpleConnection *gc;
+	PurpleAccount *account;
+	MsnAddRemData *data;
+	char *msg, *reason;
+
+	account = session->account;
+	gc = purple_account_get_connection(account);
+
+	data        = g_new0(MsnAddRemData, 1);
+	data->who   = g_strdup(passport);
+	data->group = g_strdup(group_name);
+	data->gc    = gc;
+
+	msg = g_strdup_printf(_("Buddy list synchronization issue in %s (%s)"),
+						  purple_account_get_username(account),
+						  purple_account_get_protocol_name(account));
+
+	if (group_name != NULL)
+	{
+		reason = g_strdup_printf(_("%s on the local list is "
+								   "inside the group \"%s\" but not on "
+								   "the server list. "
+								   "Do you want this buddy to be added?"),
+								 passport, group_name);
+	}
+	else
+	{
+		reason = g_strdup_printf(_("%s is on the local list but "
+								   "not on the server list. "
+								   "Do you want this buddy to be added?"),
+								 passport);
+	}
+
+	purple_request_action(gc, NULL, msg, reason, PURPLE_DEFAULT_ACTION_NONE, 
+						purple_connection_get_account(gc), data->who, NULL,
+						data, 2,
+						_("Yes"), G_CALLBACK(msn_add_cb),
+						_("No"), G_CALLBACK(msn_rem_cb));
+
+	g_free(reason);
+	g_free(msg);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/dialog.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,30 @@
+/**
+ * @file dialog.h Dialog functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_DIALOG_H_
+#define _MSN_DIALOG_H_
+
+void msn_show_sync_issue(MsnSession *session, const char *passport,
+						 const char *group_name);
+
+#endif /* _MSN_DIALOG_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/directconn.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,494 @@
+/**
+ * @file directconn.c MSN direct connection functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "directconn.h"
+
+#include "slp.h"
+#include "slpmsg.h"
+
+/**************************************************************************
+ * Directconn Specific
+ **************************************************************************/
+
+void
+msn_directconn_send_handshake(MsnDirectConn *directconn)
+{
+	MsnSlpLink *slplink;
+	MsnSlpMessage *slpmsg;
+
+	g_return_if_fail(directconn != NULL);
+
+	slplink = directconn->slplink;
+
+	slpmsg = msn_slpmsg_new(slplink);
+	slpmsg->flags = 0x100;
+
+	if (directconn->nonce != NULL)
+	{
+		guint32 t1;
+		guint16 t2;
+		guint16 t3;
+		guint16 t4;
+		guint64 t5;
+
+		sscanf (directconn->nonce, "%08X-%04hX-%04hX-%04hX-%012" G_GINT64_MODIFIER "X", &t1, &t2, &t3, &t4, &t5);
+
+		t1 = GUINT32_TO_LE(t1);
+		t2 = GUINT16_TO_LE(t2);
+		t3 = GUINT16_TO_LE(t3);
+		t4 = GUINT16_TO_BE(t4);
+		t5 = GUINT64_TO_BE(t5);
+
+		slpmsg->ack_id     = t1;
+		slpmsg->ack_sub_id = t2 | (t3 << 16);
+		slpmsg->ack_size   = t4 | t5;
+	}
+
+	g_free(directconn->nonce);
+
+	msn_slplink_send_slpmsg(slplink, slpmsg);
+
+	directconn->acked =TRUE;
+}
+
+/**************************************************************************
+ * Connection Functions
+ **************************************************************************/
+
+#if 0
+static int
+create_listener(int port)
+{
+	int fd;
+	const int on = 1;
+
+#if 0
+	struct addrinfo hints;
+	struct addrinfo *c, *res;
+	char port_str[5];
+
+	snprintf(port_str, sizeof(port_str), "%d", port);
+
+	memset(&hints, 0, sizeof(hints));
+
+	hints.ai_flags = AI_PASSIVE;
+	hints.ai_family = AF_UNSPEC;
+	hints.ai_socktype = SOCK_STREAM;
+
+	if (getaddrinfo(NULL, port_str, &hints, &res) != 0)
+	{
+		purple_debug_error("msn", "Could not get address info: %s.\n",
+						 port_str);
+		return -1;
+	}
+
+	for (c = res; c != NULL; c = c->ai_next)
+	{
+		fd = socket(c->ai_family, c->ai_socktype, c->ai_protocol);
+
+		if (fd < 0)
+			continue;
+
+		setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+
+		if (bind(fd, c->ai_addr, c->ai_addrlen) == 0)
+			break;
+
+		close(fd);
+	}
+
+	if (c == NULL)
+	{
+		purple_debug_error("msn", "Could not find socket: %s.\n", port_str);
+		return -1;
+	}
+
+	freeaddrinfo(res);
+#else
+	struct sockaddr_in sockin;
+
+	fd = socket(AF_INET, SOCK_STREAM, 0);
+
+	if (fd < 0)
+		return -1;
+
+	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0)
+	{
+		close(fd);
+		return -1;
+	}
+
+	memset(&sockin, 0, sizeof(struct sockaddr_in));
+	sockin.sin_family = AF_INET;
+	sockin.sin_port = htons(port);
+
+	if (bind(fd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0)
+	{
+		close(fd);
+		return -1;
+	}
+#endif
+
+	if (listen (fd, 4) != 0)
+	{
+		close (fd);
+		return -1;
+	}
+
+	fcntl(fd, F_SETFL, O_NONBLOCK);
+
+	return fd;
+}
+#endif
+
+static size_t
+msn_directconn_write(MsnDirectConn *directconn,
+					 const char *data, size_t len)
+{
+	char *buffer, *tmp;
+	size_t buf_size;
+	size_t ret;
+	guint32 sent_len;
+
+	g_return_val_if_fail(directconn != NULL, 0);
+
+	buf_size = len + 4;
+	buffer = tmp = g_malloc(buf_size);
+
+	sent_len = GUINT32_TO_LE(len);
+
+	memcpy(tmp, &sent_len, 4);
+	tmp += 4;
+	memcpy(tmp, data, len);
+	tmp += len;
+
+	ret = write(directconn->fd, buffer, buf_size);
+
+#ifdef DEBUG_DC
+	char *str;
+	str = g_strdup_printf("%s/msntest/w%.4d.bin", g_get_home_dir(), directconn->c);
+
+	FILE *tf = g_fopen(str, "w");
+	fwrite(buffer, 1, buf_size, tf);
+	fclose(tf);
+
+	g_free(str);
+#endif
+
+	g_free(buffer);
+
+#if 0
+	/* Let's write the length of the data. */
+	ret = write(directconn->fd, &len, sizeof(len));
+
+	/* Let's write the data. */
+	ret = write(directconn->fd, data, len);
+
+	char *str;
+	str = g_strdup_printf("/home/revo/msntest/w%.4d.bin", directconn->c);
+
+	FILE *tf = g_fopen(str, "w");
+	fwrite(&len, 1, sizeof(len), tf);
+	fwrite(data, 1, len, tf);
+	fclose(tf);
+
+	g_free(str);
+#endif
+
+	directconn->c++;
+
+	return ret;
+}
+
+#if 0
+void
+msn_directconn_parse_nonce(MsnDirectConn *directconn, const char *nonce)
+{
+	guint32 t1;
+	guint16 t2;
+	guint16 t3;
+	guint16 t4;
+	guint64 t5;
+
+	g_return_if_fail(directconn != NULL);
+	g_return_if_fail(nonce      != NULL);
+
+	sscanf (nonce, "%08X-%04hX-%04hX-%04hX-%012llX", &t1, &t2, &t3, &t4, &t5);
+
+	t1 = GUINT32_TO_LE(t1);
+	t2 = GUINT16_TO_LE(t2);
+	t3 = GUINT16_TO_LE(t3);
+	t4 = GUINT16_TO_BE(t4);
+	t5 = GUINT64_TO_BE(t5);
+
+	directconn->slpheader = g_new0(MsnSlpHeader, 1);
+
+	directconn->slpheader->ack_id     = t1;
+	directconn->slpheader->ack_sub_id = t2 | (t3 << 16);
+	directconn->slpheader->ack_size   = t4 | t5;
+}
+#endif
+
+void
+msn_directconn_send_msg(MsnDirectConn *directconn, MsnMessage *msg)
+{
+	char *body;
+	size_t body_len;
+
+	body = msn_message_gen_slp_body(msg, &body_len);
+
+	msn_directconn_write(directconn, body, body_len);
+}
+
+static void
+msn_directconn_process_msg(MsnDirectConn *directconn, MsnMessage *msg)
+{
+	purple_debug_info("msn", "directconn: process_msg\n");
+
+	msn_slplink_process_msg(directconn->slplink, msg);
+}
+
+static void
+read_cb(gpointer data, gint source, PurpleInputCondition cond)
+{
+	MsnDirectConn* directconn;
+	char *body;
+	size_t len, body_len;
+
+	purple_debug_info("msn", "read_cb: %d, %d\n", source, cond);
+
+	directconn = data;
+
+	/* Let's read the length of the data. */
+	len = read(directconn->fd, &body_len, sizeof(body_len));
+
+	if (len <= 0)
+	{
+		/* ERROR */
+		purple_debug_error("msn", "error reading\n");
+
+		msn_directconn_destroy(directconn);
+
+		return;
+	}
+
+	body_len = GUINT32_FROM_LE(body_len);
+
+	purple_debug_info("msn", "body_len=%d\n", body_len);
+
+	if (body_len <= 0)
+	{
+		/* ERROR */
+		purple_debug_error("msn", "error reading\n");
+
+		msn_directconn_destroy(directconn);
+
+		return;
+	}
+
+	body = g_try_malloc(body_len);
+
+	if (body != NULL)
+	{
+		/* Let's read the data. */
+		len = read(directconn->fd, body, body_len);
+
+		purple_debug_info("msn", "len=%d\n", len);
+	}
+	else
+	{
+		purple_debug_error("msn", "Failed to allocate memory for read\n");
+		len = 0;
+	}
+
+	if (len > 0)
+	{
+		MsnMessage *msg;
+
+#ifdef DEBUG_DC
+		str = g_strdup_printf("/home/revo/msntest/r%.4d.bin", directconn->c);
+
+		FILE *tf = g_fopen(str, "w");
+		fwrite(body, 1, len, tf);
+		fclose(tf);
+
+		g_free(str);
+#endif
+
+		directconn->c++;
+
+		msg = msn_message_new_msnslp();
+		msn_message_parse_slp_body(msg, body, body_len);
+
+		msn_directconn_process_msg(directconn, msg);
+	}
+	else
+	{
+		/* ERROR */
+		purple_debug_error("msn", "error reading\n");
+
+		msn_directconn_destroy(directconn);
+	}
+}
+
+static void
+connect_cb(gpointer data, gint source, const gchar *error_message)
+{
+	MsnDirectConn* directconn;
+	int fd;
+
+	purple_debug_misc("msn", "directconn: connect_cb: %d\n", source);
+
+	directconn = data;
+	directconn->connect_data = NULL;
+
+	if (TRUE)
+	{
+		fd = source;
+	}
+	else
+	{
+		struct sockaddr_in client_addr;
+		socklen_t client;
+		fd = accept (source, (struct sockaddr *)&client_addr, &client);
+	}
+
+	directconn->fd = fd;
+
+	if (fd > 0)
+	{
+		directconn->inpa = purple_input_add(fd, PURPLE_INPUT_READ, read_cb,
+										  directconn);
+
+		if (TRUE)
+		{
+			/* Send foo. */
+			msn_directconn_write(directconn, "foo", strlen("foo") + 1);
+
+			/* Send Handshake */
+			msn_directconn_send_handshake(directconn);
+		}
+		else
+		{
+		}
+	}
+	else
+	{
+		/* ERROR */
+		purple_debug_error("msn", "could not add input\n");
+
+		if (directconn->inpa)
+			purple_input_remove(directconn->inpa);
+
+		close(directconn->fd);
+	}
+}
+
+gboolean
+msn_directconn_connect(MsnDirectConn *directconn, const char *host, int port)
+{
+	MsnSession *session;
+
+	g_return_val_if_fail(directconn != NULL, FALSE);
+	g_return_val_if_fail(host       != NULL, TRUE);
+	g_return_val_if_fail(port        > 0,    FALSE);
+
+	session = directconn->slplink->session;
+
+#if 0
+	if (session->http_method)
+	{
+		servconn->http_data->gateway_host = g_strdup(host);
+	}
+#endif
+
+	directconn->connect_data = purple_proxy_connect(NULL, session->account,
+			host, port, connect_cb, directconn);
+
+	if (directconn->connect_data != NULL)
+	{
+		return TRUE;
+	}
+	else
+		return FALSE;
+}
+
+#if 0
+void
+msn_directconn_listen(MsnDirectConn *directconn)
+{
+	int port;
+	int fd;
+
+	port = 7000;
+
+	for (fd = -1; fd < 0;)
+		fd = create_listener(++port);
+
+	directconn->fd = fd;
+
+	directconn->inpa = purple_input_add(fd, PURPLE_INPUT_READ, connect_cb,
+		directconn);
+
+	directconn->port = port;
+	directconn->c = 0;
+}
+#endif
+
+MsnDirectConn*
+msn_directconn_new(MsnSlpLink *slplink)
+{
+	MsnDirectConn *directconn;
+
+	directconn = g_new0(MsnDirectConn, 1);
+
+	directconn->slplink = slplink;
+
+	if (slplink->directconn != NULL)
+		purple_debug_info("msn", "got_transresp: LEAK\n");
+
+	slplink->directconn = directconn;
+
+	return directconn;
+}
+
+void
+msn_directconn_destroy(MsnDirectConn *directconn)
+{
+	if (directconn->connect_data != NULL)
+		purple_proxy_connect_cancel(directconn->connect_data);
+
+	if (directconn->inpa != 0)
+		purple_input_remove(directconn->inpa);
+
+	if (directconn->fd >= 0)
+		close(directconn->fd);
+
+	if (directconn->nonce != NULL)
+		g_free(directconn->nonce);
+
+	directconn->slplink->directconn = NULL;
+
+	g_free(directconn);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/directconn.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,63 @@
+/**
+ * @file directconn.h MSN direct connection functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_DIRECTCONN_H_
+#define _MSN_DIRECTCONN_H_
+
+typedef struct _MsnDirectConn MsnDirectConn;
+
+#include "slplink.h"
+#include "slp.h"
+#include "msg.h"
+
+struct _MsnDirectConn
+{
+	MsnSlpLink *slplink;
+	MsnSlpCall *initial_call;
+
+	PurpleProxyConnectData *connect_data;
+
+	gboolean acked;
+
+	char *nonce;
+
+	int fd;
+
+	int port;
+	int inpa;
+
+	int c;
+};
+
+MsnDirectConn *msn_directconn_new(MsnSlpLink *slplink);
+gboolean msn_directconn_connect(MsnDirectConn *directconn,
+								const char *host, int port);
+#if 0
+void msn_directconn_listen(MsnDirectConn *directconn);
+#endif
+void msn_directconn_send_msg(MsnDirectConn *directconn, MsnMessage *msg);
+void msn_directconn_parse_nonce(MsnDirectConn *directconn, const char *nonce);
+void msn_directconn_destroy(MsnDirectConn *directconn);
+void msn_directconn_send_handshake(MsnDirectConn *directconn);
+
+#endif /* _MSN_DIRECTCONN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/error.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,269 @@
+/**
+ * @file error.c Error functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "error.h"
+
+const char *
+msn_error_get_text(unsigned int type, gboolean *debug)
+{
+	static char msg[MSN_BUF_LEN];
+	*debug = FALSE;
+
+	switch (type) {
+		case 0:
+			g_snprintf(msg, sizeof(msg),
+					   _("Unable to parse message"));
+			*debug = TRUE;
+			break;
+		case 200:
+			g_snprintf(msg, sizeof(msg),
+					   _("Syntax Error (probably a client bug)"));
+			*debug = TRUE;
+			break;
+		case 201:
+			g_snprintf(msg, sizeof(msg),
+					   _("Invalid e-mail address"));
+			break;
+		case 205:
+			g_snprintf(msg, sizeof(msg), _("User does not exist"));
+			break;
+		case 206:
+			g_snprintf(msg, sizeof(msg),
+					   _("Fully qualified domain name missing"));
+			break;
+		case 207:
+			g_snprintf(msg, sizeof(msg), _("Already logged in"));
+			break;
+		case 208:
+			g_snprintf(msg, sizeof(msg), _("Invalid screen name"));
+			break;
+		case 209:
+			g_snprintf(msg, sizeof(msg), _("Invalid friendly name"));
+			break;
+		case 210:
+			g_snprintf(msg, sizeof(msg), _("List full"));
+			break;
+		case 215:
+			g_snprintf(msg, sizeof(msg), _("Already there"));
+			*debug = TRUE;
+			break;
+		case 216:
+			g_snprintf(msg, sizeof(msg), _("Not on list"));
+			break;
+		case 217:
+			g_snprintf(msg, sizeof(msg), _("User is offline"));
+			break;
+		case 218:
+			g_snprintf(msg, sizeof(msg), _("Already in the mode"));
+			*debug = TRUE;
+			break;
+		case 219:
+			g_snprintf(msg, sizeof(msg), _("Already in opposite list"));
+			*debug = TRUE;
+			break;
+		case 223:
+			g_snprintf(msg, sizeof(msg), _("Too many groups"));
+			break;
+		case 224:
+			g_snprintf(msg, sizeof(msg), _("Invalid group"));
+			break;
+		case 225:
+			g_snprintf(msg, sizeof(msg), _("User not in group"));
+			break;
+		case 229:
+			g_snprintf(msg, sizeof(msg), _("Group name too long"));
+			break;
+		case 230:
+			g_snprintf(msg, sizeof(msg), _("Cannot remove group zero"));
+			*debug = TRUE;
+			break;
+		case 231:
+			g_snprintf(msg, sizeof(msg),
+					   _("Tried to add a user to a group "
+						 "that doesn't exist"));
+			break;
+		case 280:
+			g_snprintf(msg, sizeof(msg), _("Switchboard failed"));
+			*debug = TRUE;
+			break;
+		case 281:
+			g_snprintf(msg, sizeof(msg), _("Notify transfer failed"));
+			*debug = TRUE;
+			break;
+
+		case 300:
+			g_snprintf(msg, sizeof(msg), _("Required fields missing"));
+			*debug = TRUE;
+			break;
+		case 301:
+			g_snprintf(msg, sizeof(msg), _("Too many hits to a FND"));
+			*debug = TRUE;
+			break;
+		case 302:
+			g_snprintf(msg, sizeof(msg), _("Not logged in"));
+			break;
+
+		case 500:
+			g_snprintf(msg, sizeof(msg), _("Service temporarily unavailable"));
+			break;
+		case 501:
+			g_snprintf(msg, sizeof(msg), _("Database server error"));
+			*debug = TRUE;
+			break;
+		case 502:
+			g_snprintf(msg, sizeof(msg), _("Command disabled"));
+			*debug = TRUE;
+			break;
+		case 510:
+			g_snprintf(msg, sizeof(msg), _("File operation error"));
+			*debug = TRUE;
+			break;
+		case 520:
+			g_snprintf(msg, sizeof(msg), _("Memory allocation error"));
+			*debug = TRUE;
+			break;
+		case 540:
+			g_snprintf(msg, sizeof(msg), _("Wrong CHL value sent to server"));
+			*debug = TRUE;
+			break;
+
+		case 600:
+			g_snprintf(msg, sizeof(msg), _("Server busy"));
+			break;
+		case 601:
+			g_snprintf(msg, sizeof(msg), _("Server unavailable"));
+			break;
+		case 602:
+			g_snprintf(msg, sizeof(msg), _("Peer notification server down"));
+			*debug = TRUE;
+			break;
+		case 603:
+			g_snprintf(msg, sizeof(msg), _("Database connect error"));
+			*debug = TRUE;
+			break;
+		case 604:
+			g_snprintf(msg, sizeof(msg),
+					   _("Server is going down (abandon ship)"));
+			break;
+		case 605:
+			g_snprintf(msg, sizeof(msg), _("Server unavailable"));
+			break;
+
+		case 707:
+			g_snprintf(msg, sizeof(msg), _("Error creating connection"));
+			*debug = TRUE;
+			break;
+		case 710:
+			g_snprintf(msg, sizeof(msg),
+					   _("CVR parameters are either unknown or not allowed"));
+			*debug = TRUE;
+			break;
+		case 711:
+			g_snprintf(msg, sizeof(msg), _("Unable to write"));
+			break;
+		case 712:
+			g_snprintf(msg, sizeof(msg), _("Session overload"));
+			*debug = TRUE;
+			break;
+		case 713:
+			g_snprintf(msg, sizeof(msg), _("User is too active"));
+			break;
+		case 714:
+			g_snprintf(msg, sizeof(msg), _("Too many sessions"));
+			break;
+		case 715:
+			g_snprintf(msg, sizeof(msg), _("Passport not verified"));
+			break;
+		case 717:
+			g_snprintf(msg, sizeof(msg), _("Bad friend file"));
+			*debug = TRUE;
+			break;
+		case 731:
+			g_snprintf(msg, sizeof(msg), _("Not expected"));
+			*debug = TRUE;
+			break;
+
+		case 800:
+			g_snprintf(msg, sizeof(msg),
+					   _("Friendly name changes too rapidly"));
+			break;
+
+		case 910:
+		case 912:
+		case 918:
+		case 919:
+		case 921:
+		case 922:
+			g_snprintf(msg, sizeof(msg), _("Server too busy"));
+			break;
+		case 911:
+		case 917:
+			g_snprintf(msg, sizeof(msg), _("Authentication failed"));
+			break;
+		case 913:
+			g_snprintf(msg, sizeof(msg), _("Not allowed when offline"));
+			break;
+		case 914:
+		case 915:
+		case 916:
+			g_snprintf(msg, sizeof(msg), _("Server unavailable"));
+			break;
+		case 920:
+			g_snprintf(msg, sizeof(msg), _("Not accepting new users"));
+			break;
+		case 923:
+			g_snprintf(msg, sizeof(msg),
+					   _("Kids Passport without parental consent"));
+			break;
+		case 924:
+			g_snprintf(msg, sizeof(msg),
+					   _("Passport account not yet verified"));
+			break;
+		case 928:
+			g_snprintf(msg, sizeof(msg), _("Bad ticket"));
+			*debug = TRUE;
+			break;
+
+		default:
+			g_snprintf(msg, sizeof(msg), _("Unknown Error Code %d"), type);
+			*debug = TRUE;
+			break;
+	}
+
+	return msg;
+}
+
+void
+msn_error_handle(MsnSession *session, unsigned int type)
+{
+	char buf[MSN_BUF_LEN];
+	gboolean debug;
+	
+	g_snprintf(buf, sizeof(buf), _("MSN Error: %s\n"),
+			   msn_error_get_text(type, &debug));
+	if (debug)
+		purple_debug_warning("msn", "error %d: %s\n", type, buf);
+	else
+		purple_notify_error(session->account->gc, NULL, buf, NULL);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/error.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,47 @@
+/**
+ * @file error.h Error functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_ERROR_H_
+#define _MSN_ERROR_H_
+
+#include "session.h"
+
+/**
+ * Returns the string representation of an error type.
+ *
+ * @param type The error type.
+ * @param debug Whether this should be treated as a debug log message or a user-visible error
+ *
+ * @return The string representation of the error type.
+ */
+const char *msn_error_get_text(unsigned int type, gboolean *debug);
+
+/**
+ * Handles an error.
+ *
+ * @param session The current session.
+ * @param type    The error type.
+ */
+void msn_error_handle(MsnSession *session, unsigned int type);
+
+#endif /* _MSN_ERROR_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/group.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,89 @@
+/**
+ * @file group.c Group functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "group.h"
+
+MsnGroup *
+msn_group_new(MsnUserList *userlist, int id, const char *name)
+{
+	MsnGroup *group;
+
+	g_return_val_if_fail(id >= 0,      NULL);
+	g_return_val_if_fail(name != NULL, NULL);
+
+	group = g_new0(MsnGroup, 1);
+
+	msn_userlist_add_group(userlist, group);
+
+	group->id      = id;
+	group->name    = g_strdup(name);
+
+	return group;
+}
+
+void
+msn_group_destroy(MsnGroup *group)
+{
+	g_return_if_fail(group != NULL);
+
+	g_free(group->name);
+	g_free(group);
+}
+
+void
+msn_group_set_id(MsnGroup *group, int id)
+{
+	g_return_if_fail(group != NULL);
+	g_return_if_fail(id >= 0);
+
+	group->id = id;
+}
+
+void
+msn_group_set_name(MsnGroup *group, const char *name)
+{
+	g_return_if_fail(group != NULL);
+	g_return_if_fail(name  != NULL);
+
+	if (group->name != NULL)
+		g_free(group->name);
+
+	group->name = g_strdup(name);
+}
+
+int
+msn_group_get_id(const MsnGroup *group)
+{
+	g_return_val_if_fail(group != NULL, -1);
+
+	return group->id;
+}
+
+const char *
+msn_group_get_name(const MsnGroup *group)
+{
+	g_return_val_if_fail(group != NULL, NULL);
+
+	return group->name;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/group.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,103 @@
+/**
+ * @file group.h Group functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_GROUP_H_
+#define _MSN_GROUP_H_
+
+typedef struct _MsnGroup  MsnGroup;
+
+#include <stdio.h>
+
+#include "session.h"
+#include "user.h"
+
+#include "userlist.h"
+
+/**
+ * A group.
+ */
+struct _MsnGroup
+{
+	MsnSession *session;    /**< The MSN session.           */
+
+	int id;                 /**< The group ID.              */
+	char *name;             /**< The name of the group.     */
+};
+
+/**************************************************************************/
+/** @name Group API                                                       */
+/**************************************************************************/
+/*@{*/
+
+/**
+ * Creates a new group structure.
+ *
+ * @param session The MSN session.
+ * @param id      The group ID.
+ * @param name    The name of the group.
+ *
+ * @return A new group structure.
+ */
+MsnGroup *msn_group_new(MsnUserList *userlist, int id, const char *name);
+
+/**
+ * Destroys a group structure.
+ *
+ * @param group The group to destroy.
+ */
+void msn_group_destroy(MsnGroup *group);
+
+/**
+ * Sets the ID for a group.
+ *
+ * @param group The group.
+ * @param id    The ID.
+ */
+void msn_group_set_id(MsnGroup *group, int id);
+
+/**
+ * Sets the name for a group.
+ *
+ * @param group The group.
+ * @param name  The name.
+ */
+void msn_group_set_name(MsnGroup *group, const char *name);
+
+/**
+ * Returns the ID for a group.
+ *
+ * @param group The group.
+ *
+ * @return The ID.
+ */
+int msn_group_get_id(const MsnGroup *group);
+
+/**
+ * Returns the name for a group.
+ *
+ * @param group The group.
+ *
+ * @return The name.
+ */
+const char *msn_group_get_name(const MsnGroup *group);
+#endif /* _MSN_GROUP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/history.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,86 @@
+/**
+ * @file history.c MSN history functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "history.h"
+
+MsnHistory *
+msn_history_new(void)
+{
+	MsnHistory *history = g_new0(MsnHistory, 1);
+
+	history->trId = 1;
+
+	history->queue = g_queue_new();
+
+	return history;
+}
+
+void
+msn_history_destroy(MsnHistory *history)
+{
+	MsnTransaction *trans;
+
+	while ((trans = g_queue_pop_head(history->queue)) != NULL)
+		msn_transaction_destroy(trans);
+
+	g_queue_free(history->queue);
+	g_free(history);
+}
+
+MsnTransaction *
+msn_history_find(MsnHistory *history, unsigned int trId)
+{
+	MsnTransaction *trans;
+	GList *list;
+
+	for (list = history->queue->head; list != NULL; list = list->next)
+	{
+		trans = list->data;
+		if (trans->trId == trId)
+			return trans;
+	}
+
+	return NULL;
+}
+
+void
+msn_history_add(MsnHistory *history, MsnTransaction *trans)
+{
+	GQueue *queue;
+
+	g_return_if_fail(history != NULL);
+	g_return_if_fail(trans   != NULL);
+
+	queue = history->queue;
+
+	trans->trId = history->trId++;
+
+	g_queue_push_tail(queue, trans);
+
+	if (queue->length > MSN_HIST_ELEMS)
+	{
+		trans = g_queue_pop_head(queue);
+		msn_transaction_destroy(trans);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/history.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,47 @@
+/**
+ * @file history.h MSN history functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_HISTORY_H
+#define _MSN_HISTORY_H
+
+#define MSN_HIST_ELEMS 0x30
+
+typedef struct _MsnHistory MsnHistory;
+
+#include "transaction.h"
+
+/**
+ * The history.
+ */
+struct _MsnHistory
+{
+	GQueue *queue;
+	unsigned int trId;
+};
+
+MsnHistory *msn_history_new(void);
+void msn_history_destroy(MsnHistory *history);
+MsnTransaction *msn_history_find(MsnHistory *history, unsigned int triId);
+void msn_history_add(MsnHistory *history, MsnTransaction *trans);
+
+#endif /* _MSN_HISTORY_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/httpconn.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,775 @@
+/**
+ * @file httpmethod.c HTTP connection method
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "debug.h"
+#include "httpconn.h"
+
+typedef struct
+{
+	MsnHttpConn *httpconn;
+	char *body;
+	size_t body_len;
+} MsnHttpQueueData;
+
+static void
+msn_httpconn_process_queue(MsnHttpConn *httpconn)
+{
+	httpconn->waiting_response = FALSE;
+
+	if (httpconn->queue != NULL)
+	{
+		MsnHttpQueueData *queue_data;
+
+		queue_data = (MsnHttpQueueData *)httpconn->queue->data;
+
+		httpconn->queue = g_list_remove(httpconn->queue, queue_data);
+
+		msn_httpconn_write(queue_data->httpconn,
+						   queue_data->body,
+						   queue_data->body_len);
+
+		g_free(queue_data->body);
+		g_free(queue_data);
+	}
+}
+
+static gboolean
+msn_httpconn_parse_data(MsnHttpConn *httpconn, const char *buf,
+						size_t size, char **ret_buf, size_t *ret_size,
+						gboolean *error)
+{
+	const char *s, *c;
+	char *header, *body;
+	const char *body_start;
+	char *tmp;
+	size_t body_len = 0;
+	gboolean wasted = FALSE;
+
+	g_return_val_if_fail(httpconn != NULL, FALSE);
+	g_return_val_if_fail(buf      != NULL, FALSE);
+	g_return_val_if_fail(size      > 0,    FALSE);
+	g_return_val_if_fail(ret_buf  != NULL, FALSE);
+	g_return_val_if_fail(ret_size != NULL, FALSE);
+	g_return_val_if_fail(error    != NULL, FALSE);
+
+#if 0
+	purple_debug_info("msn", "HTTP: parsing data {%s}\n", buf);
+#endif
+
+	/* Healthy defaults. */
+	body = NULL;
+
+	*ret_buf  = NULL;
+	*ret_size = 0;
+	*error    = FALSE;
+
+	/* First, some tests to see if we have a full block of stuff. */
+	if (((strncmp(buf, "HTTP/1.1 200 OK\r\n", 17) != 0) &&
+		 (strncmp(buf, "HTTP/1.1 100 Continue\r\n", 23) != 0)) &&
+		((strncmp(buf, "HTTP/1.0 200 OK\r\n", 17) != 0) &&
+		 (strncmp(buf, "HTTP/1.0 100 Continue\r\n", 23) != 0)))
+	{
+		*error = TRUE;
+
+		return FALSE;
+	}
+
+	if (strncmp(buf, "HTTP/1.1 100 Continue\r\n", 23) == 0)
+	{
+		if ((s = strstr(buf, "\r\n\r\n")) == NULL)
+			return FALSE;
+
+		s += 4;
+
+		if (*s == '\0')
+		{
+			*ret_buf = g_strdup("");
+			*ret_size = 0;
+
+			msn_httpconn_process_queue(httpconn);
+
+			return TRUE;
+		}
+
+		buf = s;
+		size -= (s - buf);
+	}
+
+	if ((s = strstr(buf, "\r\n\r\n")) == NULL)
+		/* Need to wait for the full HTTP header to arrive */
+		return FALSE;
+
+	s += 4; /* Skip \r\n */
+	header = g_strndup(buf, s - buf);
+	body_start = s;
+	body_len = size - (body_start - buf);
+
+	if ((s = purple_strcasestr(header, "Content-Length: ")) != NULL)
+	{
+		int tmp_len;
+
+		s += strlen("Content-Length: ");
+
+		if ((c = strchr(s, '\r')) == NULL)
+		{
+			g_free(header);
+
+			return FALSE;
+		}
+
+		tmp = g_strndup(s, c - s);
+		tmp_len = atoi(tmp);
+		g_free(tmp);
+
+		if (body_len != tmp_len)
+		{
+			/* Need to wait for the full packet to arrive */
+
+			g_free(header);
+
+#if 0
+			purple_debug_warning("msn",
+							   "body length (%d) != content length (%d)\n",
+							   body_len, tmp_len);
+#endif
+
+			return FALSE;
+		}
+	}
+
+	body = g_malloc0(body_len + 1);
+	memcpy(body, body_start, body_len);
+
+#ifdef MSN_DEBUG_HTTP
+	purple_debug_misc("msn", "Incoming HTTP buffer (header): {%s\r\n}\n",
+					header);
+#endif
+
+	/* Now we should be able to process the data. */
+	if ((s = purple_strcasestr(header, "X-MSN-Messenger: ")) != NULL)
+	{
+		char *full_session_id, *gw_ip, *session_action;
+		char *t, *session_id;
+		char **elems, **cur, **tokens;
+
+		full_session_id = gw_ip = session_action = NULL;
+
+		s += strlen("X-MSN-Messenger: ");
+
+		if ((c = strchr(s, '\r')) == NULL)
+		{
+			msn_session_set_error(httpconn->session,
+								  MSN_ERROR_HTTP_MALFORMED, NULL);
+			purple_debug_error("msn", "Malformed X-MSN-Messenger field.\n{%s}\n",
+							 buf);
+
+			g_free(body);
+			return FALSE;
+		}
+
+		tmp = g_strndup(s, c - s);
+
+		elems = g_strsplit(tmp, "; ", 0);
+
+		for (cur = elems; *cur != NULL; cur++)
+		{
+			tokens = g_strsplit(*cur, "=", 2);
+
+			if (strcmp(tokens[0], "SessionID") == 0)
+				full_session_id = tokens[1];
+			else if (strcmp(tokens[0], "GW-IP") == 0)
+				gw_ip = tokens[1];
+			else if (strcmp(tokens[0], "Session") == 0)
+				session_action = tokens[1];
+			else
+				g_free(tokens[1]);
+
+			g_free(tokens[0]);
+			/* Don't free each of the tokens, only the array. */
+			g_free(tokens);
+		}
+
+		g_strfreev(elems);
+
+		g_free(tmp);
+
+		if ((session_action != NULL) && (strcmp(session_action, "close") == 0))
+			wasted = TRUE;
+
+		g_free(session_action);
+
+		t = strchr(full_session_id, '.');
+		session_id = g_strndup(full_session_id, t - full_session_id);
+
+		if (!wasted)
+		{
+			g_free(httpconn->full_session_id);
+			httpconn->full_session_id = full_session_id;
+
+			g_free(httpconn->session_id);
+			httpconn->session_id = session_id;
+
+			g_free(httpconn->host);
+			httpconn->host = gw_ip;
+		}
+		else
+		{
+			MsnServConn *servconn;
+
+			/* It's going to die. */
+			/* poor thing */
+
+			servconn = httpconn->servconn;
+
+			/* I'll be honest, I don't fully understand all this, but this
+			 * causes crashes, Stu. */
+			/* if (servconn != NULL)
+				servconn->wasted = TRUE; */
+
+			g_free(full_session_id);
+			g_free(session_id);
+			g_free(gw_ip);
+		}
+	}
+
+	g_free(header);
+
+	*ret_buf  = body;
+	*ret_size = body_len;
+
+	msn_httpconn_process_queue(httpconn);
+
+	return TRUE;
+}
+
+static void
+read_cb(gpointer data, gint source, PurpleInputCondition cond)
+{
+	MsnHttpConn *httpconn;
+	MsnServConn *servconn;
+	MsnSession *session;
+	char buf[MSN_BUF_LEN];
+	char *cur, *end, *old_rx_buf;
+	int len, cur_len;
+	char *result_msg = NULL;
+	size_t result_len = 0;
+	gboolean error = FALSE;
+
+	httpconn = data;
+	servconn = NULL;
+	session = httpconn->session;
+
+	len = read(httpconn->fd, buf, sizeof(buf) - 1);
+
+	if (len < 0 && errno == EAGAIN)
+		return;
+	else if (len <= 0)
+	{
+		purple_debug_error("msn", "HTTP: Read error\n");
+		msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ);
+
+		return;
+	}
+
+	buf[len] = '\0';
+
+	httpconn->rx_buf = g_realloc(httpconn->rx_buf, len + httpconn->rx_len + 1);
+	memcpy(httpconn->rx_buf + httpconn->rx_len, buf, len + 1);
+	httpconn->rx_len += len;
+
+	if (!msn_httpconn_parse_data(httpconn, httpconn->rx_buf, httpconn->rx_len,
+								 &result_msg, &result_len, &error))
+	{
+		/* Either we must wait for more input, or something went wrong */
+		if (error)
+			msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ);
+
+		return;
+	}
+
+	httpconn->servconn->processing = FALSE;
+
+	servconn = httpconn->servconn;
+
+	if (error)
+	{
+		purple_debug_error("msn", "HTTP: Special error\n");
+		msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ);
+
+		return;
+	}
+
+	g_free(httpconn->rx_buf);
+	httpconn->rx_buf = NULL;
+	httpconn->rx_len = 0;
+
+	if (result_len == 0)
+	{
+		/* Nothing to do here */
+#if 0
+		purple_debug_info("msn", "HTTP: nothing to do here\n");
+#endif
+		g_free(result_msg);
+		return;
+	}
+
+	g_free(servconn->rx_buf);
+	servconn->rx_buf = result_msg;
+	servconn->rx_len = result_len;
+
+	end = old_rx_buf = servconn->rx_buf;
+
+	servconn->processing = TRUE;
+
+	do
+	{
+		cur = end;
+
+		if (servconn->payload_len)
+		{
+			if (servconn->payload_len > servconn->rx_len)
+				/* The payload is still not complete. */
+				break;
+
+			cur_len = servconn->payload_len;
+			end += cur_len;
+		}
+		else
+		{
+			end = strstr(cur, "\r\n");
+
+			if (end == NULL)
+				/* The command is still not complete. */
+				break;
+
+			*end = '\0';
+			end += 2;
+			cur_len = end - cur;
+		}
+
+		servconn->rx_len -= cur_len;
+
+		if (servconn->payload_len)
+		{
+			msn_cmdproc_process_payload(servconn->cmdproc, cur, cur_len);
+			servconn->payload_len = 0;
+		}
+		else
+		{
+			msn_cmdproc_process_cmd_text(servconn->cmdproc, cur);
+		}
+	} while (servconn->connected && servconn->rx_len > 0);
+
+	if (servconn->connected)
+	{
+		if (servconn->rx_len > 0)
+			servconn->rx_buf = g_memdup(cur, servconn->rx_len);
+		else
+			servconn->rx_buf = NULL;
+	}
+
+	servconn->processing = FALSE;
+
+	if (servconn->wasted)
+		msn_servconn_destroy(servconn);
+
+	g_free(old_rx_buf);
+}
+
+static void
+httpconn_write_cb(gpointer data, gint source, PurpleInputCondition cond)
+{
+	MsnHttpConn *httpconn;
+	int ret, writelen;
+
+	httpconn = data;
+	writelen = purple_circ_buffer_get_max_read(httpconn->tx_buf);
+
+	if (writelen == 0)
+	{
+		purple_input_remove(httpconn->tx_handler);
+		httpconn->tx_handler = 0;
+		return;
+	}
+
+	ret = write(httpconn->fd, httpconn->tx_buf->outptr, writelen);
+	if (ret <= 0)
+	{
+		if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
+			/* No worries */
+			return;
+
+		/* Error! */
+		msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_WRITE);
+		return;
+	}
+
+	purple_circ_buffer_mark_read(httpconn->tx_buf, ret);
+
+	/* TODO: I don't think these 2 lines are needed.  Remove them? */
+	if (ret == writelen)
+		httpconn_write_cb(data, source, cond);
+}
+
+static gboolean
+write_raw(MsnHttpConn *httpconn, const char *data, size_t data_len)
+{
+	ssize_t res; /* result of the write operation */
+
+	if (httpconn->tx_handler == 0)
+		res = write(httpconn->fd, data, data_len);
+	else
+	{
+		res = -1;
+		errno = EAGAIN;
+	}
+
+	if ((res <= 0) && ((errno != EAGAIN) && (errno != EWOULDBLOCK)))
+	{
+		msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_WRITE);
+		return FALSE;
+	}
+
+	if (res < 0 || res < data_len)
+	{
+		if (res < 0)
+			res = 0;
+		if (httpconn->tx_handler == 0 && httpconn->fd)
+			httpconn->tx_handler = purple_input_add(httpconn->fd,
+				PURPLE_INPUT_WRITE, httpconn_write_cb, httpconn);
+		purple_circ_buffer_append(httpconn->tx_buf, data + res,
+			data_len - res);
+	}
+
+	return TRUE;
+}
+
+static char *
+msn_httpconn_proxy_auth(MsnHttpConn *httpconn)
+{
+	PurpleAccount *account;
+	PurpleProxyInfo *gpi;
+	const char *username, *password;
+	char *auth = NULL;
+
+	account = httpconn->session->account;
+
+	gpi = purple_proxy_get_setup(account);
+
+	if (gpi == NULL || !(purple_proxy_info_get_type(gpi) == PURPLE_PROXY_HTTP ||
+						 purple_proxy_info_get_type(gpi) == PURPLE_PROXY_USE_ENVVAR))
+		return NULL;
+
+	username = purple_proxy_info_get_username(gpi);
+	password = purple_proxy_info_get_password(gpi);
+
+	if (username != NULL) {
+		char *tmp;
+		auth = g_strdup_printf("%s:%s", username, password ? password : "");
+		tmp = purple_base64_encode((const guchar *)auth, strlen(auth));
+		g_free(auth);
+		auth = g_strdup_printf("Proxy-Authorization: Basic %s\r\n", tmp);
+		g_free(tmp);
+	}
+
+	return auth;
+}
+
+static gboolean
+msn_httpconn_poll(gpointer data)
+{
+	MsnHttpConn *httpconn;
+	char *header;
+	char *auth;
+
+	httpconn = data;
+
+	g_return_val_if_fail(httpconn != NULL, FALSE);
+
+	if ((httpconn->host == NULL) || (httpconn->full_session_id == NULL))
+	{
+		/* There's no need to poll if the session is not fully established */
+		return TRUE;
+	}
+
+	if (httpconn->waiting_response)
+	{
+		/* There's no need to poll if we're already waiting for a response */
+		return TRUE;
+	}
+
+	auth = msn_httpconn_proxy_auth(httpconn);
+
+	header = g_strdup_printf(
+		"POST http://%s/gateway/gateway.dll?Action=poll&SessionID=%s HTTP/1.1\r\n"
+		"Accept: */*\r\n"
+		"Accept-Language: en-us\r\n"
+		"User-Agent: MSMSGS\r\n"
+		"Host: %s\r\n"
+		"Proxy-Connection: Keep-Alive\r\n"
+		"%s" /* Proxy auth */
+		"Connection: Keep-Alive\r\n"
+		"Pragma: no-cache\r\n"
+		"Content-Type: application/x-msn-messenger\r\n"
+		"Content-Length: 0\r\n\r\n",
+		httpconn->host,
+		httpconn->full_session_id,
+		httpconn->host,
+		auth ? auth : "");
+
+	g_free(auth);
+
+	if (write_raw(httpconn, header, strlen(header)))
+		httpconn->waiting_response = TRUE;
+
+	g_free(header);
+
+	return TRUE;
+}
+
+ssize_t
+msn_httpconn_write(MsnHttpConn *httpconn, const char *body, size_t body_len)
+{
+	char *params;
+	char *data;
+	int header_len;
+	char *auth;
+	const char *server_types[] = { "NS", "SB" };
+	const char *server_type;
+	char *host;
+	MsnServConn *servconn;
+
+	/* TODO: remove http data from servconn */
+
+	g_return_val_if_fail(httpconn != NULL, 0);
+	g_return_val_if_fail(body != NULL, 0);
+	g_return_val_if_fail(body_len > 0, 0);
+
+	servconn = httpconn->servconn;
+
+	if (httpconn->waiting_response)
+	{
+		MsnHttpQueueData *queue_data = g_new0(MsnHttpQueueData, 1);
+
+		queue_data->httpconn = httpconn;
+		queue_data->body     = g_memdup(body, body_len);
+		queue_data->body_len = body_len;
+
+		httpconn->queue = g_list_append(httpconn->queue, queue_data);
+
+		return body_len;
+	}
+
+	server_type = server_types[servconn->type];
+
+	if (httpconn->virgin)
+	{
+		host = "gateway.messenger.hotmail.com";
+
+		/* The first time servconn->host is the host we should connect to. */
+		params = g_strdup_printf("Action=open&Server=%s&IP=%s",
+								 server_type,
+								 servconn->host);
+		httpconn->virgin = FALSE;
+	}
+	else
+	{
+		/* The rest of the times servconn->host is the gateway host. */
+		host = httpconn->host;
+
+		if (host == NULL || httpconn->full_session_id == NULL)
+		{
+			purple_debug_warning("msn", "Attempted HTTP write before session is established\n");
+			return -1;
+		}
+
+		params = g_strdup_printf("SessionID=%s",
+			httpconn->full_session_id);
+	}
+
+	auth = msn_httpconn_proxy_auth(httpconn);
+
+	data = g_strdup_printf(
+		"POST http://%s/gateway/gateway.dll?%s HTTP/1.1\r\n"
+		"Accept: */*\r\n"
+		"Accept-Language: en-us\r\n"
+		"User-Agent: MSMSGS\r\n"
+		"Host: %s\r\n"
+		"Proxy-Connection: Keep-Alive\r\n"
+		"%s" /* Proxy auth */
+		"Connection: Keep-Alive\r\n"
+		"Pragma: no-cache\r\n"
+		"Content-Type: application/x-msn-messenger\r\n"
+		"Content-Length: %d\r\n\r\n",
+		host,
+		params,
+		host,
+		auth ? auth : "",
+		(int) body_len);
+
+	g_free(params);
+
+	g_free(auth);
+
+	header_len = strlen(data);
+	data = g_realloc(data, header_len + body_len);
+	memcpy(data + header_len, body, body_len);
+
+	if (write_raw(httpconn, data, header_len + body_len))
+		httpconn->waiting_response = TRUE;
+
+	g_free(data);
+
+	return body_len;
+}
+
+MsnHttpConn *
+msn_httpconn_new(MsnServConn *servconn)
+{
+	MsnHttpConn *httpconn;
+
+	g_return_val_if_fail(servconn != NULL, NULL);
+
+	httpconn = g_new0(MsnHttpConn, 1);
+
+	purple_debug_info("msn", "new httpconn (%p)\n", httpconn);
+
+	/* TODO: Remove this */
+	httpconn->session = servconn->session;
+
+	httpconn->servconn = servconn;
+
+	httpconn->tx_buf = purple_circ_buffer_new(MSN_BUF_LEN);
+	httpconn->tx_handler = 0;
+
+	return httpconn;
+}
+
+void
+msn_httpconn_destroy(MsnHttpConn *httpconn)
+{
+	g_return_if_fail(httpconn != NULL);
+
+	purple_debug_info("msn", "destroy httpconn (%p)\n", httpconn);
+
+	if (httpconn->connected)
+		msn_httpconn_disconnect(httpconn);
+
+	g_free(httpconn->full_session_id);
+
+	g_free(httpconn->session_id);
+
+	g_free(httpconn->host);
+
+	purple_circ_buffer_destroy(httpconn->tx_buf);
+	if (httpconn->tx_handler > 0)
+		purple_input_remove(httpconn->tx_handler);
+
+	g_free(httpconn);
+}
+
+static void
+connect_cb(gpointer data, gint source, const gchar *error_message)
+{
+	MsnHttpConn *httpconn;
+
+	httpconn = data;
+	httpconn->connect_data = NULL;
+	httpconn->fd = source;
+
+	if (source >= 0)
+	{
+		httpconn->inpa = purple_input_add(httpconn->fd, PURPLE_INPUT_READ,
+			read_cb, data);
+
+		httpconn->timer = purple_timeout_add(2000, msn_httpconn_poll, httpconn);
+
+		msn_httpconn_process_queue(httpconn);
+	}
+	else
+	{
+		purple_debug_error("msn", "HTTP: Connection error\n");
+		msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_CONNECT);
+	}
+}
+
+gboolean
+msn_httpconn_connect(MsnHttpConn *httpconn, const char *host, int port)
+{
+	g_return_val_if_fail(httpconn != NULL, FALSE);
+	g_return_val_if_fail(host     != NULL, FALSE);
+	g_return_val_if_fail(port      > 0,    FALSE);
+
+	if (httpconn->connected)
+		msn_httpconn_disconnect(httpconn);
+
+	httpconn->connect_data = purple_proxy_connect(NULL, httpconn->session->account,
+		host, 80, connect_cb, httpconn);
+
+	if (httpconn->connect_data != NULL)
+	{
+		httpconn->waiting_response = TRUE;
+		httpconn->connected = TRUE;
+	}
+
+	return httpconn->connected;
+}
+
+void
+msn_httpconn_disconnect(MsnHttpConn *httpconn)
+{
+	g_return_if_fail(httpconn != NULL);
+
+	if (!httpconn->connected)
+		return;
+
+	if (httpconn->connect_data != NULL)
+	{
+		purple_proxy_connect_cancel(httpconn->connect_data);
+		httpconn->connect_data = NULL;
+	}
+
+	if (httpconn->timer)
+	{
+		purple_timeout_remove(httpconn->timer);
+		httpconn->timer = 0;
+	}
+
+	if (httpconn->inpa > 0)
+	{
+		purple_input_remove(httpconn->inpa);
+		httpconn->inpa = 0;
+	}
+
+	close(httpconn->fd);
+	httpconn->fd = -1;
+
+	g_free(httpconn->rx_buf);
+	httpconn->rx_buf = NULL;
+	httpconn->rx_len = 0;
+
+	httpconn->connected = FALSE;
+
+	/* msn_servconn_disconnect(httpconn->servconn); */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/httpconn.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,111 @@
+/**
+ * @file httpconn.h HTTP connection
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_HTTPCONN_H_
+#define _MSN_HTTPCONN_H_
+
+typedef struct _MsnHttpConn MsnHttpConn;
+
+#include "circbuffer.h"
+#include "servconn.h"
+
+/**
+ * An HTTP Connection.
+ */
+struct _MsnHttpConn
+{
+	MsnSession *session; /**< The MSN Session. */
+	MsnServConn *servconn; /**< The connection object. */
+
+	PurpleProxyConnectData *connect_data;
+
+	char *full_session_id; /**< The full session id. */
+	char *session_id; /**< The trimmed session id. */
+
+	int timer; /**< The timer for polling. */
+
+	gboolean waiting_response; /**< The flag that states if we are waiting
+								 a response from the server. */
+	gboolean connected;        /**< The flag that states if the connection is on. */
+	gboolean virgin;           /**< The flag that states if this connection
+								 should specify the host (not gateway) to
+								 connect to. */
+
+	char *host; /**< The HTTP gateway host. */
+	GList *queue; /**< The queue of data chunks to write. */
+
+	int fd; /**< The connection's file descriptor. */
+	guint inpa; /**< The connection's input handler. */
+
+	char *rx_buf; /**< The receive buffer. */
+	int rx_len; /**< The receive buffer length. */
+
+	PurpleCircBuffer *tx_buf;
+	guint tx_handler;
+};
+
+/**
+ * Creates a new HTTP connection object.
+ *
+ * @param servconn The connection object.
+ *
+ * @return The new object.
+ */
+MsnHttpConn *msn_httpconn_new(MsnServConn *servconn);
+
+/**
+ * Destroys an HTTP connection object.
+ *
+ * @param httpconn The HTTP connection object.
+ */
+void msn_httpconn_destroy(MsnHttpConn *httpconn);
+
+/**
+ * Writes a chunk of data to the HTTP connection.
+ *
+ * @param servconn    The server connection.
+ * @param data        The data to write.
+ * @param data_len    The size of the data to write.
+ *
+ * @return The number of bytes written.
+ */
+ssize_t msn_httpconn_write(MsnHttpConn *httpconn, const char *data, size_t data_len);
+
+/**
+ * Connects the HTTP connection object to a host.
+ *
+ * @param httpconn The HTTP connection object.
+ * @param host The host to connect to.
+ * @param port The port to connect to.
+ */
+gboolean msn_httpconn_connect(MsnHttpConn *httpconn,
+							  const char *host, int port);
+
+/**
+ * Disconnects the HTTP connection object.
+ *
+ * @param httpconn The HTTP connection object.
+ */
+void msn_httpconn_disconnect(MsnHttpConn *httpconn);
+
+#endif /* _MSN_HTTPCONN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/msg.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,787 @@
+/**
+ * @file msg.c Message functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "msg.h"
+
+MsnMessage *
+msn_message_new(MsnMsgType type)
+{
+	MsnMessage *msg;
+
+	msg = g_new0(MsnMessage, 1);
+	msg->type = type;
+
+#ifdef MSN_DEBUG_MSG
+	purple_debug_info("msn", "message new (%p)(%d)\n", msg, type);
+#endif
+
+	msg->attr_table = g_hash_table_new_full(g_str_hash, g_str_equal,
+											g_free, g_free);
+
+	msn_message_ref(msg);
+
+	return msg;
+}
+
+void
+msn_message_destroy(MsnMessage *msg)
+{
+	g_return_if_fail(msg != NULL);
+
+	if (msg->ref_count > 0)
+	{
+		msn_message_unref(msg);
+
+		return;
+	}
+
+#ifdef MSN_DEBUG_MSG
+	purple_debug_info("msn", "message destroy (%p)\n", msg);
+#endif
+
+	if (msg->remote_user != NULL)
+		g_free(msg->remote_user);
+
+	if (msg->body != NULL)
+		g_free(msg->body);
+
+	if (msg->content_type != NULL)
+		g_free(msg->content_type);
+
+	if (msg->charset != NULL)
+		g_free(msg->charset);
+
+	g_hash_table_destroy(msg->attr_table);
+	g_list_free(msg->attr_list);
+
+	g_free(msg);
+}
+
+MsnMessage *
+msn_message_ref(MsnMessage *msg)
+{
+	g_return_val_if_fail(msg != NULL, NULL);
+
+	msg->ref_count++;
+
+#ifdef MSN_DEBUG_MSG
+	purple_debug_info("msn", "message ref (%p)[%d]\n", msg, msg->ref_count);
+#endif
+
+	return msg;
+}
+
+MsnMessage *
+msn_message_unref(MsnMessage *msg)
+{
+	g_return_val_if_fail(msg != NULL, NULL);
+	g_return_val_if_fail(msg->ref_count > 0, NULL);
+
+	msg->ref_count--;
+
+#ifdef MSN_DEBUG_MSG
+	purple_debug_info("msn", "message unref (%p)[%d]\n", msg, msg->ref_count);
+#endif
+
+	if (msg->ref_count == 0)
+	{
+		msn_message_destroy(msg);
+
+		return NULL;
+	}
+
+	return msg;
+}
+
+MsnMessage *
+msn_message_new_plain(const char *message)
+{
+	MsnMessage *msg;
+	char *message_cr;
+
+	msg = msn_message_new(MSN_MSG_TEXT);
+	msn_message_set_attr(msg, "User-Agent", PACKAGE_NAME "/" DISPLAY_VERSION);
+	msn_message_set_content_type(msg, "text/plain");
+	msn_message_set_charset(msg, "UTF-8");
+	msn_message_set_flag(msg, 'A');
+	msn_message_set_attr(msg, "X-MMS-IM-Format",
+						 "FN=MS%20Sans%20Serif; EF=; CO=0; PF=0");
+
+	message_cr = purple_str_add_cr(message);
+	msn_message_set_bin_data(msg, message_cr, strlen(message_cr));
+	g_free(message_cr);
+
+	return msg;
+}
+
+MsnMessage *
+msn_message_new_msnslp(void)
+{
+	MsnMessage *msg;
+
+	msg = msn_message_new(MSN_MSG_SLP);
+
+	msn_message_set_attr(msg, "User-Agent", NULL);
+
+	msg->msnslp_message = TRUE;
+
+	msn_message_set_flag(msg, 'D');
+	msn_message_set_content_type(msg, "application/x-msnmsgrp2p");
+
+	return msg;
+}
+
+MsnMessage *
+msn_message_new_nudge(void)
+{
+	MsnMessage *msg;
+
+	msg = msn_message_new(MSN_MSG_NUDGE);
+	msn_message_set_content_type(msg, "text/x-msnmsgr-datacast\r\n");
+	msn_message_set_flag(msg, 'N');
+	msn_message_set_attr(msg,"ID","1\r\n");
+
+	return msg;
+}
+
+void
+msn_message_parse_slp_body(MsnMessage *msg, const char *body, size_t len)
+{
+	MsnSlpHeader header;
+	const char *tmp;
+	int body_len;
+
+	tmp = body;
+
+	if (len < sizeof(header)) {
+		g_return_if_reached();
+	}
+
+	/* Import the header. */
+	memcpy(&header, tmp, sizeof(header));
+	tmp += sizeof(header);
+
+	msg->msnslp_header.session_id = GUINT32_FROM_LE(header.session_id);
+	msg->msnslp_header.id         = GUINT32_FROM_LE(header.id);
+	msg->msnslp_header.offset     = GUINT64_FROM_LE(header.offset);
+	msg->msnslp_header.total_size = GUINT64_FROM_LE(header.total_size);
+	msg->msnslp_header.length     = GUINT32_FROM_LE(header.length);
+	msg->msnslp_header.flags      = GUINT32_FROM_LE(header.flags);
+	msg->msnslp_header.ack_id     = GUINT32_FROM_LE(header.ack_id);
+	msg->msnslp_header.ack_sub_id = GUINT32_FROM_LE(header.ack_sub_id);
+	msg->msnslp_header.ack_size   = GUINT64_FROM_LE(header.ack_size);
+
+	/* Import the body. */
+	body_len = len - (tmp - body);
+	/* msg->body_len = msg->msnslp_header.length; */
+
+	if (body_len > 0) {
+		msg->body_len = len - (tmp - body);
+		msg->body = g_malloc0(msg->body_len + 1);
+		memcpy(msg->body, tmp, msg->body_len);
+		tmp += body_len;
+	}
+}
+
+void
+msn_message_parse_payload(MsnMessage *msg,
+						  const char *payload, size_t payload_len)
+{
+	char *tmp_base, *tmp;
+	const char *content_type;
+	char *end;
+	char **elems, **cur, **tokens;
+
+	g_return_if_fail(payload != NULL);
+
+	tmp_base = tmp = g_malloc0(payload_len + 1);
+	memcpy(tmp_base, payload, payload_len);
+
+	/* Parse the attributes. */
+	end = strstr(tmp, "\r\n\r\n");
+	/* TODO? some clients use \r delimiters instead of \r\n, the official client
+	 * doesn't send such messages, but does handle receiving them. We'll just
+	 * avoid crashing for now */
+	if (end == NULL) {
+		g_free(tmp_base);
+		g_return_if_reached();
+	}
+	*end = '\0';
+
+	elems = g_strsplit(tmp, "\r\n", 0);
+
+	for (cur = elems; *cur != NULL; cur++)
+	{
+		const char *key, *value;
+
+		tokens = g_strsplit(*cur, ": ", 2);
+
+		key = tokens[0];
+		value = tokens[1];
+
+		if (!strcmp(key, "MIME-Version"))
+		{
+			g_strfreev(tokens);
+			continue;
+		}
+
+		if (!strcmp(key, "Content-Type"))
+		{
+			char *charset, *c;
+
+			if ((c = strchr(value, ';')) != NULL)
+			{
+				if ((charset = strchr(c, '=')) != NULL)
+				{
+					charset++;
+					msn_message_set_charset(msg, charset);
+				}
+
+				*c = '\0';
+			}
+
+			msn_message_set_content_type(msg, value);
+		}
+		else
+		{
+			msn_message_set_attr(msg, key, value);
+		}
+
+		g_strfreev(tokens);
+	}
+
+	g_strfreev(elems);
+
+	/* Proceed to the end of the "\r\n\r\n" */
+	tmp = end + 4;
+
+	/* Now we *should* be at the body. */
+	content_type = msn_message_get_content_type(msg);
+
+	if (content_type != NULL &&
+		!strcmp(content_type, "application/x-msnmsgrp2p"))
+	{
+		MsnSlpHeader header;
+		MsnSlpFooter footer;
+		int body_len;
+
+		if (payload_len - (tmp - tmp_base) < sizeof(header)) {
+			g_free(tmp_base);
+			g_return_if_reached();
+		}
+
+		msg->msnslp_message = TRUE;
+
+		/* Import the header. */
+		memcpy(&header, tmp, sizeof(header));
+		tmp += sizeof(header);
+
+		msg->msnslp_header.session_id = GUINT32_FROM_LE(header.session_id);
+		msg->msnslp_header.id         = GUINT32_FROM_LE(header.id);
+		msg->msnslp_header.offset     = GUINT64_FROM_LE(header.offset);
+		msg->msnslp_header.total_size = GUINT64_FROM_LE(header.total_size);
+		msg->msnslp_header.length     = GUINT32_FROM_LE(header.length);
+		msg->msnslp_header.flags      = GUINT32_FROM_LE(header.flags);
+		msg->msnslp_header.ack_id     = GUINT32_FROM_LE(header.ack_id);
+		msg->msnslp_header.ack_sub_id = GUINT32_FROM_LE(header.ack_sub_id);
+		msg->msnslp_header.ack_size   = GUINT64_FROM_LE(header.ack_size);
+
+		body_len = payload_len - (tmp - tmp_base) - sizeof(footer);
+
+		/* Import the body. */
+		if (body_len > 0) {
+			msg->body_len = body_len;
+			msg->body = g_malloc0(msg->body_len + 1);
+			memcpy(msg->body, tmp, msg->body_len);
+			tmp += body_len;
+		}
+
+		/* Import the footer. */
+		if (body_len >= 0) {
+			memcpy(&footer, tmp, sizeof(footer));
+			tmp += sizeof(footer);
+			msg->msnslp_footer.value = GUINT32_FROM_BE(footer.value);
+		}
+	}
+	else
+	{
+		if (payload_len - (tmp - tmp_base) > 0) {
+			msg->body_len = payload_len - (tmp - tmp_base);
+			msg->body = g_malloc0(msg->body_len + 1);
+			memcpy(msg->body, tmp, msg->body_len);
+		}
+	}
+
+	g_free(tmp_base);
+}
+
+MsnMessage *
+msn_message_new_from_cmd(MsnSession *session, MsnCommand *cmd)
+{
+	MsnMessage *msg;
+
+	g_return_val_if_fail(cmd != NULL, NULL);
+
+	msg = msn_message_new(MSN_MSG_UNKNOWN);
+
+	msg->remote_user = g_strdup(cmd->params[0]);
+	/* msg->size = atoi(cmd->params[2]); */
+	msg->cmd = cmd;
+
+	return msg;
+}
+
+char *
+msn_message_gen_slp_body(MsnMessage *msg, size_t *ret_size)
+{
+	MsnSlpHeader header;
+
+	char *tmp, *base;
+	const void *body;
+	size_t len, body_len;
+
+	g_return_val_if_fail(msg != NULL, NULL);
+
+	len = MSN_BUF_LEN;
+
+	base = tmp = g_malloc(len + 1);
+
+	body = msn_message_get_bin_data(msg, &body_len);
+
+	header.session_id = GUINT32_TO_LE(msg->msnslp_header.session_id);
+	header.id         = GUINT32_TO_LE(msg->msnslp_header.id);
+	header.offset     = GUINT64_TO_LE(msg->msnslp_header.offset);
+	header.total_size = GUINT64_TO_LE(msg->msnslp_header.total_size);
+	header.length     = GUINT32_TO_LE(msg->msnslp_header.length);
+	header.flags      = GUINT32_TO_LE(msg->msnslp_header.flags);
+	header.ack_id     = GUINT32_TO_LE(msg->msnslp_header.ack_id);
+	header.ack_sub_id = GUINT32_TO_LE(msg->msnslp_header.ack_sub_id);
+	header.ack_size   = GUINT64_TO_LE(msg->msnslp_header.ack_size);
+
+	memcpy(tmp, &header, 48);
+	tmp += 48;
+
+	if (body != NULL)
+	{
+		memcpy(tmp, body, body_len);
+		tmp += body_len;
+	}
+
+	if (ret_size != NULL)
+		*ret_size = tmp - base;
+
+	return base;
+}
+
+char *
+msn_message_gen_payload(MsnMessage *msg, size_t *ret_size)
+{
+	GList *l;
+	char *n, *base, *end;
+	int len;
+	size_t body_len = 0;
+	const void *body;
+
+	g_return_val_if_fail(msg != NULL, NULL);
+
+	len = MSN_BUF_LEN;
+
+	base = n = end = g_malloc(len + 1);
+	end += len;
+
+	/* Standard header. */
+	if (msg->charset == NULL)
+	{
+		g_snprintf(n, len,
+				   "MIME-Version: 1.0\r\n"
+				   "Content-Type: %s\r\n",
+				   msg->content_type);
+	}
+	else
+	{
+		g_snprintf(n, len,
+				   "MIME-Version: 1.0\r\n"
+				   "Content-Type: %s; charset=%s\r\n",
+				   msg->content_type, msg->charset);
+	}
+
+	n += strlen(n);
+
+	for (l = msg->attr_list; l != NULL; l = l->next)
+	{
+		const char *key;
+		const char *value;
+
+		key = l->data;
+		value = msn_message_get_attr(msg, key);
+
+		g_snprintf(n, end - n, "%s: %s\r\n", key, value);
+		n += strlen(n);
+	}
+
+	n += g_strlcpy(n, "\r\n", end - n);
+
+	body = msn_message_get_bin_data(msg, &body_len);
+
+	if (msg->msnslp_message)
+	{
+		MsnSlpHeader header;
+		MsnSlpFooter footer;
+
+		header.session_id = GUINT32_TO_LE(msg->msnslp_header.session_id);
+		header.id         = GUINT32_TO_LE(msg->msnslp_header.id);
+		header.offset     = GUINT64_TO_LE(msg->msnslp_header.offset);
+		header.total_size = GUINT64_TO_LE(msg->msnslp_header.total_size);
+		header.length     = GUINT32_TO_LE(msg->msnslp_header.length);
+		header.flags      = GUINT32_TO_LE(msg->msnslp_header.flags);
+		header.ack_id     = GUINT32_TO_LE(msg->msnslp_header.ack_id);
+		header.ack_sub_id = GUINT32_TO_LE(msg->msnslp_header.ack_sub_id);
+		header.ack_size   = GUINT64_TO_LE(msg->msnslp_header.ack_size);
+
+		memcpy(n, &header, 48);
+		n += 48;
+
+		if (body != NULL)
+		{
+			memcpy(n, body, body_len);
+
+			n += body_len;
+		}
+
+		footer.value = GUINT32_TO_BE(msg->msnslp_footer.value);
+
+		memcpy(n, &footer, 4);
+		n += 4;
+	}
+	else
+	{
+		if (body != NULL)
+		{
+			memcpy(n, body, body_len);
+			n += body_len;
+		}
+	}
+
+	if (ret_size != NULL)
+	{
+		*ret_size = n - base;
+
+		if (*ret_size > 1664)
+			*ret_size = 1664;
+	}
+
+	return base;
+}
+
+void
+msn_message_set_flag(MsnMessage *msg, char flag)
+{
+	g_return_if_fail(msg != NULL);
+	g_return_if_fail(flag != 0);
+
+	msg->flag = flag;
+}
+
+char
+msn_message_get_flag(const MsnMessage *msg)
+{
+	g_return_val_if_fail(msg != NULL, 0);
+
+	return msg->flag;
+}
+
+void
+msn_message_set_bin_data(MsnMessage *msg, const void *data, size_t len)
+{
+	g_return_if_fail(msg != NULL);
+
+	/* There is no need to waste memory on data we cannot send anyway */
+	if (len > 1664)
+		len = 1664;
+
+	if (msg->body != NULL)
+		g_free(msg->body);
+
+	if (data != NULL && len > 0)
+	{
+		msg->body = g_malloc0(len + 1);
+		memcpy(msg->body, data, len);
+		msg->body_len = len;
+	}
+	else
+	{
+		msg->body = NULL;
+		msg->body_len = 0;
+	}
+}
+
+const void *
+msn_message_get_bin_data(const MsnMessage *msg, size_t *len)
+{
+	g_return_val_if_fail(msg != NULL, NULL);
+
+	if (len)
+		*len = msg->body_len;
+
+	return msg->body;
+}
+
+void
+msn_message_set_content_type(MsnMessage *msg, const char *type)
+{
+	g_return_if_fail(msg != NULL);
+
+	if (msg->content_type != NULL)
+		g_free(msg->content_type);
+
+	msg->content_type = (type != NULL) ? g_strdup(type) : NULL;
+}
+
+const char *
+msn_message_get_content_type(const MsnMessage *msg)
+{
+	g_return_val_if_fail(msg != NULL, NULL);
+
+	return msg->content_type;
+}
+
+void
+msn_message_set_charset(MsnMessage *msg, const char *charset)
+{
+	g_return_if_fail(msg != NULL);
+
+	if (msg->charset != NULL)
+		g_free(msg->charset);
+
+	msg->charset = (charset != NULL) ? g_strdup(charset) : NULL;
+}
+
+const char *
+msn_message_get_charset(const MsnMessage *msg)
+{
+	g_return_val_if_fail(msg != NULL, NULL);
+
+	return msg->charset;
+}
+
+void
+msn_message_set_attr(MsnMessage *msg, const char *attr, const char *value)
+{
+	const char *temp;
+	char *new_attr;
+
+	g_return_if_fail(msg != NULL);
+	g_return_if_fail(attr != NULL);
+
+	temp = msn_message_get_attr(msg, attr);
+
+	if (value == NULL)
+	{
+		if (temp != NULL)
+		{
+			GList *l;
+
+			for (l = msg->attr_list; l != NULL; l = l->next)
+			{
+				if (!g_ascii_strcasecmp(l->data, attr))
+				{
+					msg->attr_list = g_list_remove(msg->attr_list, l->data);
+
+					break;
+				}
+			}
+
+			g_hash_table_remove(msg->attr_table, attr);
+		}
+
+		return;
+	}
+
+	new_attr = g_strdup(attr);
+
+	g_hash_table_insert(msg->attr_table, new_attr, g_strdup(value));
+
+	if (temp == NULL)
+		msg->attr_list = g_list_append(msg->attr_list, new_attr);
+}
+
+const char *
+msn_message_get_attr(const MsnMessage *msg, const char *attr)
+{
+	g_return_val_if_fail(msg != NULL, NULL);
+	g_return_val_if_fail(attr != NULL, NULL);
+
+	return g_hash_table_lookup(msg->attr_table, attr);
+}
+
+GHashTable *
+msn_message_get_hashtable_from_body(const MsnMessage *msg)
+{
+	GHashTable *table;
+	size_t body_len;
+	const char *body;
+	char **elems, **cur, **tokens, *body_str;
+
+	g_return_val_if_fail(msg != NULL, NULL);
+
+	table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+
+	body = msn_message_get_bin_data(msg, &body_len);
+
+	g_return_val_if_fail(body != NULL, NULL);
+
+	body_str = g_strndup(body, body_len);
+	elems = g_strsplit(body_str, "\r\n", 0);
+	g_free(body_str);
+
+	for (cur = elems; *cur != NULL; cur++)
+	{
+		if (**cur == '\0')
+			break;
+
+		tokens = g_strsplit(*cur, ": ", 2);
+
+		if (tokens[0] != NULL && tokens[1] != NULL)
+			g_hash_table_insert(table, tokens[0], tokens[1]);
+
+		g_free(tokens);
+	}
+
+	g_strfreev(elems);
+
+	return table;
+}
+
+char *
+msn_message_to_string(MsnMessage *msg)
+{
+	size_t body_len;
+	const char *body;
+
+	g_return_val_if_fail(msg != NULL, NULL);
+	g_return_val_if_fail(msg->type == MSN_MSG_TEXT, NULL);
+
+	body = msn_message_get_bin_data(msg, &body_len);
+
+	return g_strndup(body, body_len);
+}
+
+void
+msn_message_show_readable(MsnMessage *msg, const char *info,
+						  gboolean text_body)
+{
+	GString *str;
+	size_t body_len;
+	const char *body;
+	GList *l;
+
+	g_return_if_fail(msg != NULL);
+
+	str = g_string_new(NULL);
+
+	/* Standard header. */
+	if (msg->charset == NULL)
+	{
+		g_string_append_printf(str,
+				   "MIME-Version: 1.0\r\n"
+				   "Content-Type: %s\r\n",
+				   msg->content_type);
+	}
+	else
+	{
+		g_string_append_printf(str,
+				   "MIME-Version: 1.0\r\n"
+				   "Content-Type: %s; charset=%s\r\n",
+				   msg->content_type, msg->charset);
+	}
+
+	for (l = msg->attr_list; l; l = l->next)
+	{
+		char *key;
+		const char *value;
+
+		key = l->data;
+		value = msn_message_get_attr(msg, key);
+
+		g_string_append_printf(str, "%s: %s\r\n", key, value);
+	}
+
+	g_string_append(str, "\r\n");
+
+	body = msn_message_get_bin_data(msg, &body_len);
+
+	if (msg->msnslp_message)
+	{
+		g_string_append_printf(str, "Session ID: %u\r\n", msg->msnslp_header.session_id);
+		g_string_append_printf(str, "ID:         %u\r\n", msg->msnslp_header.id);
+		g_string_append_printf(str, "Offset:     %" G_GUINT64_FORMAT "\r\n", msg->msnslp_header.offset);
+		g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", msg->msnslp_header.total_size);
+		g_string_append_printf(str, "Length:     %u\r\n", msg->msnslp_header.length);
+		g_string_append_printf(str, "Flags:      0x%x\r\n", msg->msnslp_header.flags);
+		g_string_append_printf(str, "ACK ID:     %u\r\n", msg->msnslp_header.ack_id);
+		g_string_append_printf(str, "SUB ID:     %u\r\n", msg->msnslp_header.ack_sub_id);
+		g_string_append_printf(str, "ACK Size:   %" G_GUINT64_FORMAT "\r\n", msg->msnslp_header.ack_size);
+
+#ifdef MSN_DEBUG_SLP_VERBOSE
+		if (body != NULL)
+		{
+			if (text_body)
+			{
+				g_string_append_len(str, body, body_len);
+				if (body[body_len - 1] == '\0')
+				{
+					str->len--;
+					g_string_append(str, " 0x00");
+				}
+				g_string_append(str, "\r\n");
+			}
+			else
+			{
+				int i;
+				for (i = 0; i < msg->body_len; i++)
+				{
+					g_string_append_printf(str, "%.2hhX ", body[i]);
+					if ((i % 16) == 15)
+						g_string_append(str, "\r\n");
+				}
+				g_string_append(str, "\r\n");
+			}
+		}
+#endif
+
+		g_string_append_printf(str, "Footer:     %u\r\n", msg->msnslp_footer.value);
+	}
+	else
+	{
+		if (body != NULL)
+		{
+			g_string_append_len(str, body, body_len);
+			g_string_append(str, "\r\n");
+		}
+	}
+
+	purple_debug_info("msn", "Message %s:\n{%s}\n", info, str->str);
+
+	g_string_free(str, TRUE);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/msg.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,349 @@
+/**
+ * @file msg.h Message functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_MSG_H_
+#define _MSN_MSG_H_
+
+typedef struct _MsnMessage MsnMessage;
+
+#include "session.h"
+#include "user.h"
+
+#include "command.h"
+#include "transaction.h"
+
+typedef void (*MsnMsgCb)(MsnMessage *, void *data);
+
+/*
+typedef enum
+{
+	MSN_MSG_NORMAL,
+	MSN_MSG_SLP_SB,
+	MSN_MSG_SLP_DC
+
+} MsnMsgType;
+*/
+
+typedef enum
+{
+	MSN_MSG_UNKNOWN,
+	MSN_MSG_TEXT,
+	MSN_MSG_TYPING,
+	MSN_MSG_CAPS,
+	MSN_MSG_SLP,
+	MSN_MSG_NUDGE
+
+} MsnMsgType;
+
+typedef enum
+{
+	MSN_MSG_ERROR_NONE, /**< No error. */
+	MSN_MSG_ERROR_TIMEOUT, /**< The message timedout. */
+	MSN_MSG_ERROR_NAK, /**< The message could not be sent. */
+	MSN_MSG_ERROR_SB, /**< The error comes from the switchboard. */
+	MSN_MSG_ERROR_UNKNOWN /**< An unknown error occurred. */
+
+} MsnMsgErrorType;
+
+typedef struct
+{
+	guint32 session_id;
+	guint32 id;
+	guint64 offset;
+	guint64 total_size;
+	guint32 length;
+	guint32 flags;
+	guint32 ack_id;
+	guint32 ack_sub_id;
+	guint64 ack_size;
+
+} MsnSlpHeader;
+
+typedef struct
+{
+	guint32 value;
+
+} MsnSlpFooter;
+
+/**
+ * A message.
+ */
+struct _MsnMessage
+{
+	size_t ref_count;           /**< The reference count.       */
+
+	MsnMsgType type;
+
+	gboolean msnslp_message;
+
+	char *remote_user;
+	char flag;
+
+	char *content_type;
+	char *charset;
+	char *body;
+	gsize body_len;
+
+	MsnSlpHeader msnslp_header;
+	MsnSlpFooter msnslp_footer;
+
+	GHashTable *attr_table;
+	GList *attr_list;
+
+	gboolean ack_ref;           /**< A flag that states if this message has
+								  been ref'ed for using it in a callback. */
+
+	MsnCommand *cmd;
+	MsnTransaction *trans;
+
+	MsnMsgCb ack_cb; /**< The callback to call when we receive an ACK of this
+					   message. */
+	MsnMsgCb nak_cb; /**< The callback to call when we receive a NAK of this
+					   message. */
+	void *ack_data; /**< The data used by callbacks. */
+
+	MsnMsgErrorType error; /**< The error of the message. */
+};
+
+/**
+ * Creates a new, empty message.
+ *
+ * @return A new message.
+ */
+MsnMessage *msn_message_new(MsnMsgType type);
+
+/**
+ * Creates a new, empty MSNSLP message.
+ *
+ * @return A new MSNSLP message.
+ */
+MsnMessage *msn_message_new_msnslp(void);
+
+/**
+ * Creates a new nudge message.
+ *
+ * @return A new nudge message.
+ */
+MsnMessage *msn_message_new_nudge(void);
+
+/**
+ * Creates a new plain message.
+ *
+ * @return A new plain message.
+ */
+MsnMessage *msn_message_new_plain(const char *message);
+
+/**
+ * Creates a MSNSLP ack message.
+ *
+ * @param acked_msg The message to acknowledge.
+ *
+ * @return A new MSNSLP ack message.
+ */
+MsnMessage *msn_message_new_msnslp_ack(MsnMessage *acked_msg);
+
+/**
+ * Creates a new message based off a command.
+ *
+ * @param session The MSN session.
+ * @param cmd     The command.
+ *
+ * @return The new message.
+ */
+MsnMessage *msn_message_new_from_cmd(MsnSession *session, MsnCommand *cmd);
+
+/**
+ * Parses the payload of a message.
+ *
+ * @param msg         The message.
+ * @param payload     The payload.
+ * @param payload_len The length of the payload.
+ */
+void msn_message_parse_payload(MsnMessage *msg, const char *payload,
+							   size_t payload_len);
+
+/**
+ * Destroys a message.
+ *
+ * @param msg The message to destroy.
+ */
+void msn_message_destroy(MsnMessage *msg);
+
+/**
+ * Increments the reference count on a message.
+ *
+ * @param msg The message.
+ *
+ * @return @a msg
+ */
+MsnMessage *msn_message_ref(MsnMessage *msg);
+
+/**
+ * Decrements the reference count on a message.
+ *
+ * This will destroy the structure if the count hits 0.
+ *
+ * @param msg The message.
+ *
+ * @return @a msg, or @c NULL if the new count is 0.
+ */
+MsnMessage *msn_message_unref(MsnMessage *msg);
+
+/**
+ * Generates the payload data of a message.
+ *
+ * @param msg      The message.
+ * @param ret_size The returned size of the payload.
+ *
+ * @return The payload data of the message.
+ */
+char *msn_message_gen_payload(MsnMessage *msg, size_t *ret_size);
+
+/**
+ * Sets the flag for an outgoing message.
+ *
+ * @param msg  The message.
+ * @param flag The flag.
+ */
+void msn_message_set_flag(MsnMessage *msg, char flag);
+
+/**
+ * Returns the flag for an outgoing message.
+ *
+ * @param msg The message.
+ *
+ * @return The flag.
+ */
+char msn_message_get_flag(const MsnMessage *msg);
+
+#if 0
+/**
+ * Sets the body of a message.
+ *
+ * @param msg  The message.
+ * @param body The body of the message.
+ */
+void msn_message_set_body(MsnMessage *msg, const char *body);
+
+/**
+ * Returns the body of the message.
+ *
+ * @param msg The message.
+ *
+ * @return The body of the message.
+ */
+const char *msn_message_get_body(const MsnMessage *msg);
+#endif
+/**
+ * Sets the binary content of the message.
+ *
+ * @param msg  The message.
+ * @param data The binary data.
+ * @param len  The length of the data.
+ */
+void msn_message_set_bin_data(MsnMessage *msg, const void *data, size_t len);
+
+/**
+ * Returns the binary content of the message.
+ *
+ * @param msg The message.
+ * @param len The returned length of the data.
+ *
+ * @return The binary data.
+ */
+const void *msn_message_get_bin_data(const MsnMessage *msg, size_t *len);
+
+/**
+ * Sets the content type in a message.
+ *
+ * @param msg  The message.
+ * @param type The content-type.
+ */
+void msn_message_set_content_type(MsnMessage *msg, const char *type);
+
+/**
+ * Returns the content type in a message.
+ *
+ * @param msg The message.
+ *
+ * @return The content-type.
+ */
+const char *msn_message_get_content_type(const MsnMessage *msg);
+
+/**
+ * Sets the charset in a message.
+ *
+ * @param msg     The message.
+ * @param charset The charset.
+ */
+void msn_message_set_charset(MsnMessage *msg, const char *charset);
+
+/**
+ * Returns the charset in a message.
+ *
+ * @param msg The message.
+ *
+ * @return The charset.
+ */
+const char *msn_message_get_charset(const MsnMessage *msg);
+
+/**
+ * Sets an attribute in a message.
+ *
+ * @param msg   The message.
+ * @param attr  The attribute name.
+ * @param value The attribute value.
+ */
+void msn_message_set_attr(MsnMessage *msg, const char *attr,
+						  const char *value);
+
+/**
+ * Returns an attribute from a message.
+ *
+ * @param msg  The message.
+ * @param attr The attribute.
+ *
+ * @return The value, or @c NULL if not found.
+ */
+const char *msn_message_get_attr(const MsnMessage *msg, const char *attr);
+
+/**
+ * Parses the body and returns it in the form of a hashtable.
+ *
+ * @param msg The message.
+ *
+ * @return The resulting hashtable.
+ */
+GHashTable *msn_message_get_hashtable_from_body(const MsnMessage *msg);
+
+void msn_message_show_readable(MsnMessage *msg, const char *info,
+							   gboolean text_body);
+
+void msn_message_parse_slp_body(MsnMessage *msg, const char *body,
+								size_t len);
+
+char *msn_message_gen_slp_body(MsnMessage *msg, size_t *ret_size);
+
+char *msn_message_to_string(MsnMessage *msg);
+
+#endif /* _MSN_MSG_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/msn-utils.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,440 @@
+/**
+ * @file msn-utils.c Utility functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "msn-utils.h"
+
+void
+msn_parse_format(const char *mime, char **pre_ret, char **post_ret)
+{
+	char *cur;
+	GString *pre  = g_string_new(NULL);
+	GString *post = g_string_new(NULL);
+	unsigned int colors[3];
+
+	if (pre_ret  != NULL) *pre_ret  = NULL;
+	if (post_ret != NULL) *post_ret = NULL;
+
+	cur = strstr(mime, "FN=");
+
+	if (cur && (*(cur = cur + 3) != ';'))
+	{
+		pre = g_string_append(pre, "<FONT FACE=\"");
+
+		while (*cur && *cur != ';')
+		{
+			pre = g_string_append_c(pre, *cur);
+			cur++;
+		}
+
+		pre = g_string_append(pre, "\">");
+		post = g_string_prepend(post, "</FONT>");
+	}
+
+	cur = strstr(mime, "EF=");
+
+	if (cur && (*(cur = cur + 3) != ';'))
+	{
+		while (*cur && *cur != ';')
+		{
+			pre = g_string_append_c(pre, '<');
+			pre = g_string_append_c(pre, *cur);
+			pre = g_string_append_c(pre, '>');
+			post = g_string_prepend_c(post, '>');
+			post = g_string_prepend_c(post, *cur);
+			post = g_string_prepend_c(post, '/');
+			post = g_string_prepend_c(post, '<');
+			cur++;
+		}
+	}
+
+	cur = strstr(mime, "CO=");
+
+	if (cur && (*(cur = cur + 3) != ';'))
+	{
+		int i;
+
+		i = sscanf(cur, "%02x%02x%02x;", &colors[0], &colors[1], &colors[2]);
+
+		if (i > 0)
+		{
+			char tag[64];
+
+			if (i == 1)
+			{
+				colors[1] = 0;
+				colors[2] = 0;
+			}
+			else if (i == 2)
+			{
+				unsigned int temp = colors[0];
+
+				colors[0] = colors[1];
+				colors[1] = temp;
+				colors[2] = 0;
+			}
+			else if (i == 3)
+			{
+				unsigned int temp = colors[2];
+
+				colors[2] = colors[0];
+				colors[0] = temp;
+			}
+
+			g_snprintf(tag, sizeof(tag),
+					   "<FONT COLOR=\"#%02hhx%02hhx%02hhx\">",
+					   colors[0], colors[1], colors[2]);
+
+			pre = g_string_append(pre, tag);
+			post = g_string_prepend(post, "</FONT>");
+		}
+	}
+
+	cur = strstr(mime, "RL=");
+
+	if (cur && (*(cur = cur + 3) != ';'))
+	{
+		if (*cur == '1')
+		{
+			/* RTL text was received */
+			pre = g_string_append(pre, "<SPAN style=\"direction:rtl;text-align:right;\">");
+			post = g_string_prepend(post, "</SPAN>");
+		}
+	}
+
+	cur = g_strdup(purple_url_decode(pre->str));
+	g_string_free(pre, TRUE);
+
+	if (pre_ret != NULL)
+		*pre_ret = cur;
+	else
+		g_free(cur);
+
+	cur = g_strdup(purple_url_decode(post->str));
+	g_string_free(post, TRUE);
+
+	if (post_ret != NULL)
+		*post_ret = cur;
+	else
+		g_free(cur);
+}
+
+/*
+ * We need this because we're only supposed to encode spaces in the font
+ * names. purple_url_encode() isn't acceptable.
+ */
+static const char *
+encode_spaces(const char *str)
+{
+	static char buf[BUF_LEN];
+	const char *c;
+	char *d;
+
+	g_return_val_if_fail(str != NULL, NULL);
+
+	for (c = str, d = buf; *c != '\0'; c++)
+	{
+		if (*c == ' ')
+		{
+			*d++ = '%';
+			*d++ = '2';
+			*d++ = '0';
+		}
+		else
+			*d++ = *c;
+	}
+
+	return buf;
+}
+
+/*
+ * Taken from the zephyr plugin.
+ * This parses HTML formatting (put out by one of the gtkimhtml widgets
+ * and converts it to msn formatting. It doesn't deal with the tag closing,
+ * but gtkimhtml widgets give valid html.
+ * It currently deals properly with <b>, <u>, <i>, <font face=...>,
+ * <font color=...>, <span dir=...>, <span style="direction: ...">.
+ * It ignores <font back=...> and <font size=...>
+ */
+void
+msn_import_html(const char *html, char **attributes, char **message)
+{
+	int len, retcount = 0;
+	const char *c;
+	char *msg;
+	char *fontface = NULL;
+	char fonteffect[4];
+	char fontcolor[7];
+	char direction = '0';
+
+	gboolean has_bold = FALSE;
+	gboolean has_italic = FALSE;
+	gboolean has_underline = FALSE;
+	gboolean has_strikethrough = FALSE;
+
+	g_return_if_fail(html       != NULL);
+	g_return_if_fail(attributes != NULL);
+	g_return_if_fail(message    != NULL);
+
+	len = strlen(html);
+	msg = g_malloc0(len + 1);
+
+	memset(fontcolor, 0, sizeof(fontcolor));
+	strcat(fontcolor, "0");
+	memset(fonteffect, 0, sizeof(fonteffect));
+
+	for (c = html; *c != '\0';)
+	{
+		if (*c == '<')
+		{
+			if (!g_ascii_strncasecmp(c + 1, "br>", 3))
+			{
+				msg[retcount++] = '\r';
+				msg[retcount++] = '\n';
+				c += 4;
+			}
+			else if (!g_ascii_strncasecmp(c + 1, "i>", 2))
+			{
+				if (!has_italic)
+				{
+					strcat(fonteffect, "I");
+					has_italic = TRUE;
+				}
+				c += 3;
+			}
+			else if (!g_ascii_strncasecmp(c + 1, "b>", 2))
+			{
+				if (!has_bold)
+				{
+					strcat(fonteffect, "B");
+					has_bold = TRUE;
+				}
+				c += 3;
+			}
+			else if (!g_ascii_strncasecmp(c + 1, "u>", 2))
+			{
+				if (!has_underline)
+				{
+					strcat(fonteffect, "U");
+					has_underline = TRUE;
+				}
+				c += 3;
+			}
+			else if (!g_ascii_strncasecmp(c + 1, "s>", 2))
+			{
+				if (!has_strikethrough)
+				{
+					strcat(fonteffect, "S");
+					has_strikethrough = TRUE;
+				}
+				c += 3;
+			}
+			else if (!g_ascii_strncasecmp(c + 1, "a href=\"", 8))
+			{
+				c += 9;
+
+				if (!g_ascii_strncasecmp(c, "mailto:", 7))
+					c += 7;
+
+				while ((*c != '\0') && g_ascii_strncasecmp(c, "\">", 2))
+					msg[retcount++] = *c++;
+
+				if (*c != '\0')
+					c += 2;
+
+				/* ignore descriptive string */
+				while ((*c != '\0') && g_ascii_strncasecmp(c, "</a>", 4))
+					c++;
+
+				if (*c != '\0')
+					c += 4;
+			}
+			else if (!g_ascii_strncasecmp(c + 1, "span", 4))
+			{
+				/* Bi-directional text support using CSS properties in span tags */
+				c += 5;
+
+				while (*c != '\0' && *c != '>')
+				{
+					while (*c == ' ')
+						c++;
+					if (!g_ascii_strncasecmp(c, "dir=\"rtl\"", 9))
+					{
+						c += 9;
+						direction = '1';
+					}
+					else if (!g_ascii_strncasecmp(c, "style=\"", 7))
+					{
+						/* Parse inline CSS attributes */
+						char *attributes;
+						int attr_len = 0;
+						c += 7;
+						while (*(c + attr_len) != '\0' && *(c + attr_len) != '"')
+							attr_len++;
+						if (*(c + attr_len) == '"')
+						{
+							char *attr_dir;
+							attributes = g_strndup(c, attr_len);
+							attr_dir = purple_markup_get_css_property(attributes, "direction");
+							if (attr_dir && (!g_ascii_strncasecmp(attr_dir, "RTL", 3)))
+								direction = '1';
+							g_free(attr_dir);
+							g_free(attributes);
+						}
+
+					}
+					else
+					{
+						c++;
+					}
+				}
+				if (*c == '>')
+					c++;
+			}
+			else if (!g_ascii_strncasecmp(c + 1, "font", 4))
+			{
+				c += 5;
+
+				while ((*c != '\0') && !g_ascii_strncasecmp(c, " ", 1))
+					c++;
+
+				if (!g_ascii_strncasecmp(c, "color=\"#", 7))
+				{
+					c += 8;
+
+					fontcolor[0] = *(c + 4);
+					fontcolor[1] = *(c + 5);
+					fontcolor[2] = *(c + 2);
+					fontcolor[3] = *(c + 3);
+					fontcolor[4] = *c;
+					fontcolor[5] = *(c + 1);
+
+					c += 8;
+				}
+				else if (!g_ascii_strncasecmp(c, "face=\"", 6))
+				{
+					const char *end = NULL;
+					const char *comma = NULL;
+					unsigned int namelen = 0;
+
+					c += 6;
+					end = strchr(c, '\"');
+					comma = strchr(c, ',');
+
+					if (comma == NULL || comma > end)
+						namelen = (unsigned int)(end - c);
+					else
+						namelen = (unsigned int)(comma - c);
+
+					fontface = g_strndup(c, namelen);
+					c = end + 2;
+				}
+				else
+				{
+					/* Drop all unrecognized/misparsed font tags */
+					while ((*c != '\0') && g_ascii_strncasecmp(c, "\">", 2))
+						c++;
+
+					if (*c != '\0')
+						c += 2;
+				}
+			}
+			else
+			{
+				while ((*c != '\0') && (*c != '>'))
+					c++;
+				if (*c != '\0')
+					c++;
+			}
+		}
+		else if (*c == '&')
+		{
+			if (!g_ascii_strncasecmp(c, "&lt;", 4))
+			{
+				msg[retcount++] = '<';
+				c += 4;
+			}
+			else if (!g_ascii_strncasecmp(c, "&gt;", 4))
+			{
+				msg[retcount++] = '>';
+				c += 4;
+			}
+			else if (!g_ascii_strncasecmp(c, "&nbsp;", 6))
+			{
+				msg[retcount++] = ' ';
+				c += 6;
+			}
+			else if (!g_ascii_strncasecmp(c, "&quot;", 6))
+			{
+				msg[retcount++] = '"';
+				c += 6;
+			}
+			else if (!g_ascii_strncasecmp(c, "&amp;", 5))
+			{
+				msg[retcount++] = '&';
+				c += 5;
+			}
+			else if (!g_ascii_strncasecmp(c, "&apos;", 6))
+			{
+				msg[retcount++] = '\'';
+				c += 6;
+			}
+			else
+				msg[retcount++] = *c++;
+		}
+		else
+			msg[retcount++] = *c++;
+	}
+
+	if (fontface == NULL)
+		fontface = g_strdup("MS Sans Serif");
+
+	*attributes = g_strdup_printf("FN=%s; EF=%s; CO=%s; PF=0; RL=%c",
+								  encode_spaces(fontface),
+								  fonteffect, fontcolor, direction);
+	*message = g_strdup(msg);
+
+	g_free(fontface);
+	g_free(msg);
+}
+
+void
+msn_parse_socket(const char *str, char **ret_host, int *ret_port)
+{
+	char *host;
+	char *c;
+	int port;
+
+	host = g_strdup(str);
+
+	if ((c = strchr(host, ':')) != NULL)
+	{
+		*c = '\0';
+		port = atoi(c + 1);
+	}
+	else
+		port = 1863;
+
+	*ret_host = host;
+	*ret_port = port;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/msn-utils.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,51 @@
+/**
+ * @file msn-utils.h Utility functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_UTILS_H_
+#define _MSN_UTILS_H_
+
+/**
+ * Parses the MSN message formatting into a format compatible with Purple.
+ *
+ * @param mime     The mime header with the formatting.
+ * @param pre_ret  The returned prefix string.
+ * @param post_ret The returned postfix string.
+ *
+ * @return The new message.
+ */
+void msn_parse_format(const char *mime, char **pre_ret, char **post_ret);
+
+/**
+ * Parses the Purple message formatting (html) into the MSN format.
+ *
+ * @param html			The html message to format.
+ * @param attributes	The returned attributes string.
+ * @param message		The returned message string.
+ *
+ * @return The new message.
+ */
+void msn_import_html(const char *html, char **attributes, char **message);
+
+void msn_parse_socket(const char *str, char **ret_host, int *ret_port);
+
+#endif /* _MSN_UTILS_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/msn.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,2221 @@
+/**
+ * @file msn.c The MSN protocol plugin
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#define PHOTO_SUPPORT 1
+
+#include <glib.h>
+
+#include "msn.h"
+#include "accountopt.h"
+#include "msg.h"
+#include "page.h"
+#include "pluginpref.h"
+#include "prefs.h"
+#include "session.h"
+#include "state.h"
+#include "util.h"
+#include "cmds.h"
+#include "core.h"
+#include "prpl.h"
+#include "msn-utils.h"
+#include "version.h"
+
+#include "switchboard.h"
+#include "notification.h"
+#include "sync.h"
+#include "slplink.h"
+
+#if PHOTO_SUPPORT
+#include "imgstore.h"
+#endif
+
+typedef struct
+{
+	PurpleConnection *gc;
+	const char *passport;
+
+} MsnMobileData;
+
+typedef struct
+{
+	PurpleConnection *gc;
+	char *name;
+
+} MsnGetInfoData;
+
+typedef struct
+{
+	MsnGetInfoData *info_data;
+	char *stripped;
+	char *url_buffer;
+	PurpleNotifyUserInfo *user_info;
+	char *photo_url_text;
+
+} MsnGetInfoStepTwoData;
+
+typedef struct
+{
+	PurpleConnection *gc;
+	const char *who;
+	char *msg;
+	PurpleMessageFlags flags;
+	time_t when;
+} MsnIMData;
+
+static const char *
+msn_normalize(const PurpleAccount *account, const char *str)
+{
+	static char buf[BUF_LEN];
+	char *tmp;
+
+	g_return_val_if_fail(str != NULL, NULL);
+
+	g_snprintf(buf, sizeof(buf), "%s%s", str,
+			   (strchr(str, '@') ? "" : "@hotmail.com"));
+
+	tmp = g_utf8_strdown(buf, -1);
+	strncpy(buf, tmp, sizeof(buf));
+	g_free(tmp);
+
+	return buf;
+}
+
+static gboolean
+msn_send_attention(PurpleConnection *gc, const char *username, guint type)
+{
+	MsnMessage *msg;
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+
+	msg = msn_message_new_nudge();
+	session = gc->proto_data;
+	swboard = msn_session_get_swboard(session, username, MSN_SB_FLAG_IM);
+
+	if (swboard == NULL)
+		return FALSE;
+
+	msn_switchboard_send_msg(swboard, msg, TRUE);
+
+	return TRUE;
+}
+
+static GList *
+msn_attention_types(PurpleAccount *account)
+{
+	PurpleAttentionType *attn;
+	static GList *list = NULL;
+
+	if (!list) {
+		attn = g_new0(PurpleAttentionType, 1);
+		attn->name = _("Nudge");
+		attn->incoming_description = _("%s has nudged you!");
+		attn->outgoing_description = _("Nudging %s...");
+		list = g_list_append(list, attn);
+	}
+
+	return list;
+}
+
+
+static PurpleCmdRet
+msn_cmd_nudge(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data)
+{
+	PurpleAccount *account = purple_conversation_get_account(conv);
+	PurpleConnection *gc = purple_account_get_connection(account);
+	const gchar *username;
+
+	username = purple_conversation_get_name(conv);
+
+	serv_send_attention(gc, username, MSN_NUDGE);
+
+	return PURPLE_CMD_RET_OK;
+}
+
+static void
+msn_act_id(PurpleConnection *gc, const char *entry)
+{
+	MsnCmdProc *cmdproc;
+	MsnSession *session;
+	PurpleAccount *account;
+	const char *alias;
+
+	session = gc->proto_data;
+	cmdproc = session->notification->cmdproc;
+	account = purple_connection_get_account(gc);
+
+	if(entry && strlen(entry))
+		alias = purple_url_encode(entry);
+	else
+		alias = "";
+
+	if (strlen(alias) > BUDDY_ALIAS_MAXLEN)
+	{
+		purple_notify_error(gc, NULL,
+						  _("Your new MSN friendly name is too long."), NULL);
+		return;
+	}
+
+	msn_cmdproc_send(cmdproc, "REA", "%s %s",
+					 purple_account_get_username(account),
+					 alias);
+}
+
+static void
+msn_set_prp(PurpleConnection *gc, const char *type, const char *entry)
+{
+	MsnCmdProc *cmdproc;
+	MsnSession *session;
+
+	session = gc->proto_data;
+	cmdproc = session->notification->cmdproc;
+
+	if (entry == NULL || *entry == '\0')
+	{
+		msn_cmdproc_send(cmdproc, "PRP", "%s", type);
+	}
+	else
+	{
+		msn_cmdproc_send(cmdproc, "PRP", "%s %s", type,
+						 purple_url_encode(entry));
+	}
+}
+
+static void
+msn_set_home_phone_cb(PurpleConnection *gc, const char *entry)
+{
+	msn_set_prp(gc, "PHH", entry);
+}
+
+static void
+msn_set_work_phone_cb(PurpleConnection *gc, const char *entry)
+{
+	msn_set_prp(gc, "PHW", entry);
+}
+
+static void
+msn_set_mobile_phone_cb(PurpleConnection *gc, const char *entry)
+{
+	msn_set_prp(gc, "PHM", entry);
+}
+
+static void
+enable_msn_pages_cb(PurpleConnection *gc)
+{
+	msn_set_prp(gc, "MOB", "Y");
+}
+
+static void
+disable_msn_pages_cb(PurpleConnection *gc)
+{
+	msn_set_prp(gc, "MOB", "N");
+}
+
+static void
+send_to_mobile(PurpleConnection *gc, const char *who, const char *entry)
+{
+	MsnTransaction *trans;
+	MsnSession *session;
+	MsnCmdProc *cmdproc;
+	MsnPage *page;
+	char *payload;
+	size_t payload_len;
+
+	session = gc->proto_data;
+	cmdproc = session->notification->cmdproc;
+
+	page = msn_page_new();
+	msn_page_set_body(page, entry);
+
+	payload = msn_page_gen_payload(page, &payload_len);
+
+	trans = msn_transaction_new(cmdproc, "PGD", "%s 1 %d", who, payload_len);
+
+	msn_transaction_set_payload(trans, payload, payload_len);
+
+	msn_page_destroy(page);
+
+	msn_cmdproc_send_trans(cmdproc, trans);
+}
+
+static void
+send_to_mobile_cb(MsnMobileData *data, const char *entry)
+{
+	send_to_mobile(data->gc, data->passport, entry);
+	g_free(data);
+}
+
+static void
+close_mobile_page_cb(MsnMobileData *data, const char *entry)
+{
+	g_free(data);
+}
+
+/* -- */
+
+static void
+msn_show_set_friendly_name(PurplePluginAction *action)
+{
+	PurpleConnection *gc;
+
+	gc = (PurpleConnection *) action->context;
+
+	purple_request_input(gc, NULL, _("Set your friendly name."),
+					   _("This is the name that other MSN buddies will "
+						 "see you as."),
+					   purple_connection_get_display_name(gc), FALSE, FALSE, NULL,
+					   _("OK"), G_CALLBACK(msn_act_id),
+					   _("Cancel"), NULL,
+					   purple_connection_get_account(gc), NULL, NULL,
+					   gc);
+}
+
+static void
+msn_show_set_home_phone(PurplePluginAction *action)
+{
+	PurpleConnection *gc;
+	MsnSession *session;
+
+	gc = (PurpleConnection *) action->context;
+	session = gc->proto_data;
+
+	purple_request_input(gc, NULL, _("Set your home phone number."), NULL,
+					   msn_user_get_home_phone(session->user), FALSE, FALSE, NULL,
+					   _("OK"), G_CALLBACK(msn_set_home_phone_cb),
+					   _("Cancel"), NULL,
+					   purple_connection_get_account(gc), NULL, NULL,
+					   gc);
+}
+
+static void
+msn_show_set_work_phone(PurplePluginAction *action)
+{
+	PurpleConnection *gc;
+	MsnSession *session;
+
+	gc = (PurpleConnection *) action->context;
+	session = gc->proto_data;
+
+	purple_request_input(gc, NULL, _("Set your work phone number."), NULL,
+					   msn_user_get_work_phone(session->user), FALSE, FALSE, NULL,
+					   _("OK"), G_CALLBACK(msn_set_work_phone_cb),
+					   _("Cancel"), NULL,
+					   purple_connection_get_account(gc), NULL, NULL,
+					   gc);
+}
+
+static void
+msn_show_set_mobile_phone(PurplePluginAction *action)
+{
+	PurpleConnection *gc;
+	MsnSession *session;
+
+	gc = (PurpleConnection *) action->context;
+	session = gc->proto_data;
+
+	purple_request_input(gc, NULL, _("Set your mobile phone number."), NULL,
+					   msn_user_get_mobile_phone(session->user), FALSE, FALSE, NULL,
+					   _("OK"), G_CALLBACK(msn_set_mobile_phone_cb),
+					   _("Cancel"), NULL,
+					   purple_connection_get_account(gc), NULL, NULL,
+					   gc);
+}
+
+static void
+msn_show_set_mobile_pages(PurplePluginAction *action)
+{
+	PurpleConnection *gc;
+
+	gc = (PurpleConnection *) action->context;
+
+	purple_request_action(gc, NULL, _("Allow MSN Mobile pages?"),
+						_("Do you want to allow or disallow people on "
+						  "your buddy list to send you MSN Mobile pages "
+						  "to your cell phone or other mobile device?"),
+						-1,
+						purple_connection_get_account(gc), NULL, NULL,
+						gc, 3,
+						_("Allow"), G_CALLBACK(enable_msn_pages_cb),
+						_("Disallow"), G_CALLBACK(disable_msn_pages_cb),
+						_("Cancel"), NULL);
+}
+
+static void
+msn_show_hotmail_inbox(PurplePluginAction *action)
+{
+	PurpleConnection *gc;
+	MsnSession *session;
+
+	gc = (PurpleConnection *) action->context;
+	session = gc->proto_data;
+
+	if (session->passport_info.file == NULL)
+	{
+		purple_notify_error(gc, NULL,
+						  _("This Hotmail account may not be active."), NULL);
+		return;
+	}
+
+	purple_notify_uri(gc, session->passport_info.file);
+}
+
+static void
+show_send_to_mobile_cb(PurpleBlistNode *node, gpointer ignored)
+{
+	PurpleBuddy *buddy;
+	PurpleConnection *gc;
+	MsnSession *session;
+	MsnMobileData *data;
+
+	g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
+
+	buddy = (PurpleBuddy *) node;
+	gc = purple_account_get_connection(buddy->account);
+
+	session = gc->proto_data;
+
+	data = g_new0(MsnMobileData, 1);
+	data->gc = gc;
+	data->passport = buddy->name;
+
+	purple_request_input(gc, NULL, _("Send a mobile message."), NULL,
+					   NULL, TRUE, FALSE, NULL,
+					   _("Page"), G_CALLBACK(send_to_mobile_cb),
+					   _("Close"), G_CALLBACK(close_mobile_page_cb),
+					   purple_connection_get_account(gc), purple_buddy_get_name(buddy), NULL,
+					   data);
+}
+
+static gboolean
+msn_offline_message(const PurpleBuddy *buddy) {
+	MsnUser *user;
+	if (buddy == NULL)
+		return FALSE;
+	user = buddy->proto_data;
+	return user && user->mobile;
+}
+
+static void
+initiate_chat_cb(PurpleBlistNode *node, gpointer data)
+{
+	PurpleBuddy *buddy;
+	PurpleConnection *gc;
+
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+
+	g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
+
+	buddy = (PurpleBuddy *) node;
+	gc = purple_account_get_connection(buddy->account);
+
+	session = gc->proto_data;
+
+	swboard = msn_switchboard_new(session);
+	msn_switchboard_request(swboard);
+	msn_switchboard_request_add_user(swboard, buddy->name);
+
+	/* TODO: This might move somewhere else, after USR might be */
+	swboard->chat_id = session->conv_seq++;
+	swboard->conv = serv_got_joined_chat(gc, swboard->chat_id, "MSN Chat");
+	swboard->flag = MSN_SB_FLAG_IM;
+
+	purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv),
+							purple_account_get_username(buddy->account), NULL, PURPLE_CBFLAGS_NONE, TRUE);
+}
+
+static void
+t_msn_xfer_init(PurpleXfer *xfer)
+{
+	MsnSlpLink *slplink = xfer->data;
+	msn_slplink_request_ft(slplink, xfer);
+}
+
+static PurpleXfer*
+msn_new_xfer(PurpleConnection *gc, const char *who)
+{
+	MsnSession *session;
+	MsnSlpLink *slplink;
+	PurpleXfer *xfer;
+
+	session = gc->proto_data;
+
+	xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who);
+	if (xfer)
+	{
+		slplink = msn_session_get_slplink(session, who);
+
+		xfer->data = slplink;
+
+		purple_xfer_set_init_fnc(xfer, t_msn_xfer_init);
+	}
+
+	return xfer;
+}
+
+static void
+msn_send_file(PurpleConnection *gc, const char *who, const char *file)
+{
+	PurpleXfer *xfer = msn_new_xfer(gc, who);
+
+	if (file)
+		purple_xfer_request_accepted(xfer, file);
+	else
+		purple_xfer_request(xfer);
+}
+
+static gboolean
+msn_can_receive_file(PurpleConnection *gc, const char *who)
+{
+	PurpleAccount *account;
+	char *normal;
+	gboolean ret;
+
+	account = purple_connection_get_account(gc);
+
+	normal = g_strdup(msn_normalize(account, purple_account_get_username(account)));
+
+	ret = strcmp(normal, msn_normalize(account, who));
+
+	g_free(normal);
+
+	return ret;
+}
+
+/**************************************************************************
+ * Protocol Plugin ops
+ **************************************************************************/
+
+static const char *
+msn_list_icon(PurpleAccount *a, PurpleBuddy *b)
+{
+	return "msn";
+}
+
+static char *
+msn_status_text(PurpleBuddy *buddy)
+{
+	PurplePresence *presence;
+	PurpleStatus *status;
+
+	presence = purple_buddy_get_presence(buddy);
+	status = purple_presence_get_active_status(presence);
+
+	if (!purple_presence_is_available(presence) && !purple_presence_is_idle(presence))
+	{
+		return g_strdup(purple_status_get_name(status));
+	}
+
+	return NULL;
+}
+
+static void
+msn_tooltip_text(PurpleBuddy *buddy, PurpleNotifyUserInfo *user_info, gboolean full)
+{
+	MsnUser *user;
+	PurplePresence *presence = purple_buddy_get_presence(buddy);
+	PurpleStatus *status = purple_presence_get_active_status(presence);
+
+	user = buddy->proto_data;
+
+
+	if (purple_presence_is_online(presence))
+	{
+		purple_notify_user_info_add_pair(user_info, _("Status"),
+									   (purple_presence_is_idle(presence) ? _("Idle") : purple_status_get_name(status)));
+	}
+
+	if (full && user)
+	{
+		purple_notify_user_info_add_pair(user_info, _("Has you"),
+									   ((user->list_op & (1 << MSN_LIST_RL)) ? _("Yes") : _("No")));
+	}
+
+	/* XXX: This is being shown in non-full tooltips because the
+	 * XXX: blocked icon overlay isn't always accurate for MSN.
+	 * XXX: This can die as soon as purple_privacy_check() knows that
+	 * XXX: this prpl always honors both the allow and deny lists. */
+	/* While the above comment may be strictly correct (the privacy API needs
+	 * rewriteing), purple_privacy_check() is going to be more accurate at
+	 * indicating whether a particular buddy is going to be able to message
+	 * you, which is the important information that this is trying to convey. */
+	if (full && user)
+	{
+		purple_notify_user_info_add_pair(user_info, _("Blocked"),
+									   ((user->list_op & (1 << MSN_LIST_BL)) ? _("Yes") : _("No")));
+	}
+}
+
+static GList *
+msn_status_types(PurpleAccount *account)
+{
+	PurpleStatusType *status;
+	GList *types = NULL;
+
+	status = purple_status_type_new_full(PURPLE_STATUS_AVAILABLE,
+			NULL, NULL, FALSE, TRUE, FALSE);
+	types = g_list_append(types, status);
+
+	status = purple_status_type_new_full(PURPLE_STATUS_AWAY,
+			NULL, NULL, FALSE, TRUE, FALSE);
+	types = g_list_append(types, status);
+
+	status = purple_status_type_new_full(PURPLE_STATUS_AWAY,
+			"brb", _("Be Right Back"), FALSE, TRUE, FALSE);
+	types = g_list_append(types, status);
+
+	status = purple_status_type_new_full(PURPLE_STATUS_UNAVAILABLE,
+			"busy", _("Busy"), FALSE, TRUE, FALSE);
+	types = g_list_append(types, status);
+
+	status = purple_status_type_new_full(PURPLE_STATUS_UNAVAILABLE,
+			"phone", _("On the Phone"), FALSE, TRUE, FALSE);
+	types = g_list_append(types, status);
+
+	status = purple_status_type_new_full(PURPLE_STATUS_AWAY,
+			"lunch", _("Out to Lunch"), FALSE, TRUE, FALSE);
+	types = g_list_append(types, status);
+
+	status = purple_status_type_new_full(PURPLE_STATUS_INVISIBLE,
+			NULL, NULL, FALSE, TRUE, FALSE);
+	types = g_list_append(types, status);
+
+	status = purple_status_type_new_full(PURPLE_STATUS_OFFLINE,
+			NULL, NULL, FALSE, TRUE, FALSE);
+	types = g_list_append(types, status);
+
+	status = purple_status_type_new_full(PURPLE_STATUS_MOBILE,
+			"mobile", NULL, FALSE, FALSE, TRUE);
+	types = g_list_append(types, status);
+
+	return types;
+}
+
+static GList *
+msn_actions(PurplePlugin *plugin, gpointer context)
+{
+	PurpleConnection *gc = (PurpleConnection *)context;
+	PurpleAccount *account;
+	const char *user;
+
+	GList *m = NULL;
+	PurplePluginAction *act;
+
+	act = purple_plugin_action_new(_("Set Friendly Name..."),
+								 msn_show_set_friendly_name);
+	m = g_list_append(m, act);
+	m = g_list_append(m, NULL);
+
+	act = purple_plugin_action_new(_("Set Home Phone Number..."),
+								 msn_show_set_home_phone);
+	m = g_list_append(m, act);
+
+	act = purple_plugin_action_new(_("Set Work Phone Number..."),
+			msn_show_set_work_phone);
+	m = g_list_append(m, act);
+
+	act = purple_plugin_action_new(_("Set Mobile Phone Number..."),
+			msn_show_set_mobile_phone);
+	m = g_list_append(m, act);
+	m = g_list_append(m, NULL);
+
+#if 0
+	act = purple_plugin_action_new(_("Enable/Disable Mobile Devices..."),
+			msn_show_set_mobile_support);
+	m = g_list_append(m, act);
+#endif
+
+	act = purple_plugin_action_new(_("Allow/Disallow Mobile Pages..."),
+			msn_show_set_mobile_pages);
+	m = g_list_append(m, act);
+
+	account = purple_connection_get_account(gc);
+	user = msn_normalize(account, purple_account_get_username(account));
+
+	if ((strstr(user, "@hotmail.") != NULL) ||
+		(strstr(user, "@msn.com") != NULL))
+	{
+		m = g_list_append(m, NULL);
+		act = purple_plugin_action_new(_("Open Hotmail Inbox"),
+				msn_show_hotmail_inbox);
+		m = g_list_append(m, act);
+	}
+
+	return m;
+}
+
+static GList *
+msn_buddy_menu(PurpleBuddy *buddy)
+{
+	MsnUser *user;
+
+	GList *m = NULL;
+	PurpleMenuAction *act;
+
+	g_return_val_if_fail(buddy != NULL, NULL);
+
+	user = buddy->proto_data;
+
+	if (user != NULL)
+	{
+		if (user->mobile)
+		{
+			act = purple_menu_action_new(_("Send to Mobile"),
+			                           PURPLE_CALLBACK(show_send_to_mobile_cb),
+			                           NULL, NULL);
+			m = g_list_append(m, act);
+		}
+	}
+
+	if (g_ascii_strcasecmp(buddy->name,
+	                       purple_account_get_username(buddy->account)))
+	{
+		act = purple_menu_action_new(_("Initiate _Chat"),
+		                           PURPLE_CALLBACK(initiate_chat_cb),
+		                           NULL, NULL);
+		m = g_list_append(m, act);
+	}
+
+	return m;
+}
+
+static GList *
+msn_blist_node_menu(PurpleBlistNode *node)
+{
+	if(PURPLE_BLIST_NODE_IS_BUDDY(node))
+	{
+		return msn_buddy_menu((PurpleBuddy *) node);
+	}
+	else
+	{
+		return NULL;
+	}
+}
+
+static void
+msn_login(PurpleAccount *account)
+{
+	PurpleConnection *gc;
+	MsnSession *session;
+	const char *username;
+	const char *host;
+	gboolean http_method = FALSE;
+	int port;
+
+	gc = purple_account_get_connection(account);
+
+	if (!purple_ssl_is_supported())
+	{
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
+
+			_("SSL support is needed for MSN. Please install a supported "
+			  "SSL library."));
+		return;
+	}
+
+	http_method = purple_account_get_bool(account, "http_method", FALSE);
+
+	if (http_method)
+		host = purple_account_get_string(account, "http_method_server", MSN_HTTPCONN_SERVER);
+	else
+		host = purple_account_get_string(account, "server", MSN_SERVER);
+	port = purple_account_get_int(account, "port", MSN_PORT);
+
+	session = msn_session_new(account);
+
+	gc->proto_data = session;
+	gc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_FORMATTING_WBFO | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_FONTSIZE | PURPLE_CONNECTION_NO_URLDESC;
+
+	msn_session_set_login_step(session, MSN_LOGIN_STEP_START);
+
+	/* Hmm, I don't like this. */
+	/* XXX shx: Me neither */
+	username = msn_normalize(account, purple_account_get_username(account));
+
+	if (strcmp(username, purple_account_get_username(account)))
+		purple_account_set_username(account, username);
+
+	if (!msn_session_connect(session, host, port, http_method))
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Failed to connect to server."));
+}
+
+static void
+msn_close(PurpleConnection *gc)
+{
+	MsnSession *session;
+
+	session = gc->proto_data;
+
+	g_return_if_fail(session != NULL);
+
+	msn_session_destroy(session);
+
+	gc->proto_data = NULL;
+}
+
+static gboolean
+msn_send_me_im(gpointer data)
+{
+	MsnIMData *imdata = data;
+	serv_got_im(imdata->gc, imdata->who, imdata->msg, imdata->flags, imdata->when);
+	g_free(imdata->msg);
+	g_free(imdata);
+	return FALSE;
+}
+
+static int
+msn_send_im(PurpleConnection *gc, const char *who, const char *message,
+			PurpleMessageFlags flags)
+{
+	PurpleAccount *account;
+	PurpleBuddy *buddy = purple_find_buddy(gc->account, who);
+	MsnMessage *msg;
+	char *msgformat;
+	char *msgtext;
+
+	account = purple_connection_get_account(gc);
+
+	if (buddy) {
+		PurplePresence *p = purple_buddy_get_presence(buddy);
+		if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_MOBILE)) {
+			char *text = purple_markup_strip_html(message);
+			send_to_mobile(gc, who, text);
+			g_free(text);
+			return 1;
+		}
+	}
+
+	msn_import_html(message, &msgformat, &msgtext);
+
+	if (strlen(msgtext) + strlen(msgformat) + strlen(DISPLAY_VERSION) > 1564)
+	{
+		g_free(msgformat);
+		g_free(msgtext);
+
+		return -E2BIG;
+	}
+
+	msg = msn_message_new_plain(msgtext);
+	msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat);
+
+	g_free(msgformat);
+	g_free(msgtext);
+
+	if (g_ascii_strcasecmp(who, purple_account_get_username(account)))
+	{
+		MsnSession *session;
+		MsnSwitchBoard *swboard;
+
+		session = gc->proto_data;
+		swboard = msn_session_get_swboard(session, who, MSN_SB_FLAG_IM);
+
+		msn_switchboard_send_msg(swboard, msg, TRUE);
+	}
+	else
+	{
+		char *body_str, *body_enc, *pre, *post;
+		const char *format;
+		MsnIMData *imdata = g_new0(MsnIMData, 1);
+		/*
+		 * In MSN, you can't send messages to yourself, so
+		 * we'll fake like we received it ;)
+		 */
+		body_str = msn_message_to_string(msg);
+		body_enc = g_markup_escape_text(body_str, -1);
+		g_free(body_str);
+
+		format = msn_message_get_attr(msg, "X-MMS-IM-Format");
+		msn_parse_format(format, &pre, &post);
+		body_str = g_strdup_printf("%s%s%s", pre ? pre :  "",
+								   body_enc ? body_enc : "", post ? post : "");
+		g_free(body_enc);
+		g_free(pre);
+		g_free(post);
+
+		serv_got_typing_stopped(gc, who);
+		imdata->gc = gc;
+		imdata->who = who;
+		imdata->msg = body_str;
+		imdata->flags = flags;
+		imdata->when = time(NULL);
+		g_idle_add(msn_send_me_im, imdata);
+	}
+
+	msn_message_destroy(msg);
+
+	return 1;
+}
+
+static unsigned int
+msn_send_typing(PurpleConnection *gc, const char *who, PurpleTypingState state)
+{
+	PurpleAccount *account;
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+	MsnMessage *msg;
+
+	account = purple_connection_get_account(gc);
+	session = gc->proto_data;
+
+	/*
+	 * TODO: I feel like this should be "if (state != PURPLE_TYPING)"
+	 *       but this is how it was before, and I don't want to break
+	 *       anything. --KingAnt
+	 */
+	if (state == PURPLE_NOT_TYPING)
+		return 0;
+
+	if (!g_ascii_strcasecmp(who, purple_account_get_username(account)))
+	{
+		/* We'll just fake it, since we're sending to ourself. */
+		serv_got_typing(gc, who, MSN_TYPING_RECV_TIMEOUT, PURPLE_TYPING);
+
+		return MSN_TYPING_SEND_TIMEOUT;
+	}
+
+	swboard = msn_session_find_swboard(session, who);
+
+	if (swboard == NULL || !msn_switchboard_can_send(swboard))
+		return 0;
+
+	swboard->flag |= MSN_SB_FLAG_IM;
+
+	msg = msn_message_new(MSN_MSG_TYPING);
+	msn_message_set_content_type(msg, "text/x-msmsgscontrol");
+	msn_message_set_flag(msg, 'U');
+	msn_message_set_attr(msg, "TypingUser",
+						 purple_account_get_username(account));
+	msn_message_set_bin_data(msg, "\r\n", 2);
+
+	msn_switchboard_send_msg(swboard, msg, FALSE);
+
+	msn_message_destroy(msg);
+
+	return MSN_TYPING_SEND_TIMEOUT;
+}
+
+static void
+msn_set_status(PurpleAccount *account, PurpleStatus *status)
+{
+	PurpleConnection *gc;
+	MsnSession *session;
+
+	gc = purple_account_get_connection(account);
+
+	if (gc != NULL)
+	{
+		session = gc->proto_data;
+		msn_change_status(session);
+	}
+}
+
+static void
+msn_set_idle(PurpleConnection *gc, int idle)
+{
+	MsnSession *session;
+
+	session = gc->proto_data;
+
+	msn_change_status(session);
+}
+
+#if 0
+static void
+fake_userlist_add_buddy(MsnUserList *userlist,
+					   const char *who, int list_id,
+					   const char *group_name)
+{
+	MsnUser *user;
+	static int group_id_c = 1;
+	int group_id;
+
+	group_id = -1;
+
+	if (group_name != NULL)
+	{
+		MsnGroup *group;
+		group = msn_group_new(userlist, group_id_c, group_name);
+		group_id = group_id_c++;
+	}
+
+	user = msn_userlist_find_user(userlist, who);
+
+	if (user == NULL)
+	{
+		user = msn_user_new(userlist, who, NULL);
+		msn_userlist_add_user(userlist, user);
+	}
+	else
+		if (user->list_op & (1 << list_id))
+		{
+			if (list_id == MSN_LIST_FL)
+			{
+				if (group_id >= 0)
+					if (g_list_find(user->group_ids,
+									GINT_TO_POINTER(group_id)))
+						return;
+			}
+			else
+				return;
+		}
+
+	if (group_id >= 0)
+	{
+		user->group_ids = g_list_append(user->group_ids,
+										GINT_TO_POINTER(group_id));
+	}
+
+	user->list_op |= (1 << list_id);
+}
+#endif
+
+static void
+msn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
+{
+	MsnSession *session;
+	MsnUserList *userlist;
+	const char *who;
+
+	session = gc->proto_data;
+	userlist = session->userlist;
+	who = msn_normalize(gc->account, buddy->name);
+
+	if (!session->logged_in)
+	{
+#if 0
+		fake_userlist_add_buddy(session->sync_userlist, who, MSN_LIST_FL,
+								group ? group->name : NULL);
+#else
+		purple_debug_error("msn", "msn_add_buddy called before connected\n");
+#endif
+
+		return;
+	}
+
+#if 0
+	if (group != NULL && group->name != NULL)
+		purple_debug_info("msn", "msn_add_buddy: %s, %s\n", who, group->name);
+	else
+		purple_debug_info("msn", "msn_add_buddy: %s\n", who);
+#endif
+
+#if 0
+	/* Which is the max? */
+	if (session->fl_users_count >= 150)
+	{
+		purple_debug_info("msn", "Too many buddies\n");
+		/* Buddy list full */
+		/* TODO: purple should be notified of this */
+		return;
+	}
+#endif
+
+	/* XXX - Would group ever be NULL here?  I don't think so...
+	 * shx: Yes it should; MSN handles non-grouped buddies, and this is only
+	 * internal. */
+	msn_userlist_add_buddy(userlist, who, MSN_LIST_FL,
+						   group ? group->name : NULL);
+}
+
+static void
+msn_rem_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
+{
+	MsnSession *session;
+	MsnUserList *userlist;
+
+	session = gc->proto_data;
+	userlist = session->userlist;
+
+	if (!session->logged_in)
+		return;
+
+	/* XXX - Does buddy->name need to be msn_normalize'd here?  --KingAnt */
+	msn_userlist_rem_buddy(userlist, buddy->name, MSN_LIST_FL, group->name);
+}
+
+static void
+msn_add_permit(PurpleConnection *gc, const char *who)
+{
+	MsnSession *session;
+	MsnUserList *userlist;
+	MsnUser *user;
+
+	session = gc->proto_data;
+	userlist = session->userlist;
+	user = msn_userlist_find_user(userlist, who);
+
+	if (!session->logged_in)
+		return;
+
+	if (user != NULL && user->list_op & MSN_LIST_BL_OP)
+		msn_userlist_rem_buddy(userlist, who, MSN_LIST_BL, NULL);
+
+	msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL);
+}
+
+static void
+msn_add_deny(PurpleConnection *gc, const char *who)
+{
+	MsnSession *session;
+	MsnUserList *userlist;
+	MsnUser *user;
+
+	session = gc->proto_data;
+	userlist = session->userlist;
+	user = msn_userlist_find_user(userlist, who);
+
+	if (!session->logged_in)
+		return;
+
+	if (user != NULL && user->list_op & MSN_LIST_AL_OP)
+		msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL);
+
+	msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL);
+}
+
+static void
+msn_rem_permit(PurpleConnection *gc, const char *who)
+{
+	MsnSession *session;
+	MsnUserList *userlist;
+	MsnUser *user;
+
+	session = gc->proto_data;
+	userlist = session->userlist;
+
+	if (!session->logged_in)
+		return;
+
+	user = msn_userlist_find_user(userlist, who);
+
+	msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL);
+
+	if (user != NULL && user->list_op & MSN_LIST_RL_OP)
+		msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL);
+}
+
+static void
+msn_rem_deny(PurpleConnection *gc, const char *who)
+{
+	MsnSession *session;
+	MsnUserList *userlist;
+	MsnUser *user;
+
+	session = gc->proto_data;
+	userlist = session->userlist;
+
+	if (!session->logged_in)
+		return;
+
+	user = msn_userlist_find_user(userlist, who);
+
+	msn_userlist_rem_buddy(userlist, who, MSN_LIST_BL, NULL);
+
+	if (user != NULL && user->list_op & MSN_LIST_RL_OP)
+		msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL);
+}
+
+static void
+msn_set_permit_deny(PurpleConnection *gc)
+{
+	PurpleAccount *account;
+	MsnSession *session;
+	MsnCmdProc *cmdproc;
+
+	account = purple_connection_get_account(gc);
+	session = gc->proto_data;
+	cmdproc = session->notification->cmdproc;
+
+	if (account->perm_deny == PURPLE_PRIVACY_ALLOW_ALL ||
+		account->perm_deny == PURPLE_PRIVACY_DENY_USERS)
+	{
+		msn_cmdproc_send(cmdproc, "BLP", "%s", "AL");
+	}
+	else
+	{
+		msn_cmdproc_send(cmdproc, "BLP", "%s", "BL");
+	}
+}
+
+static void
+msn_chat_invite(PurpleConnection *gc, int id, const char *msg,
+				const char *who)
+{
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+
+	session = gc->proto_data;
+
+	swboard = msn_session_find_swboard_with_id(session, id);
+
+	if (swboard == NULL)
+	{
+		/* if we have no switchboard, everyone else left the chat already */
+		swboard = msn_switchboard_new(session);
+		msn_switchboard_request(swboard);
+		swboard->chat_id = id;
+		swboard->conv = purple_find_chat(gc, id);
+	}
+
+	swboard->flag |= MSN_SB_FLAG_IM;
+
+	msn_switchboard_request_add_user(swboard, who);
+}
+
+static void
+msn_chat_leave(PurpleConnection *gc, int id)
+{
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+	PurpleConversation *conv;
+
+	session = gc->proto_data;
+
+	swboard = msn_session_find_swboard_with_id(session, id);
+
+	/* if swboard is NULL we were the only person left anyway */
+	if (swboard == NULL)
+		return;
+
+	conv = swboard->conv;
+
+	msn_switchboard_release(swboard, MSN_SB_FLAG_IM);
+
+	/* If other switchboards managed to associate themselves with this
+	 * conv, make sure they know it's gone! */
+	if (conv != NULL)
+	{
+		while ((swboard = msn_session_find_swboard_with_conv(session, conv)) != NULL)
+			swboard->conv = NULL;
+	}
+}
+
+static int
+msn_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags)
+{
+	PurpleAccount *account;
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+	MsnMessage *msg;
+	char *msgformat;
+	char *msgtext;
+
+	account = purple_connection_get_account(gc);
+	session = gc->proto_data;
+	swboard = msn_session_find_swboard_with_id(session, id);
+
+	if (swboard == NULL)
+		return -EINVAL;
+
+	if (!swboard->ready)
+		return 0;
+
+	swboard->flag |= MSN_SB_FLAG_IM;
+
+	msn_import_html(message, &msgformat, &msgtext);
+
+	if (strlen(msgtext) + strlen(msgformat) + strlen(DISPLAY_VERSION) > 1564)
+	{
+		g_free(msgformat);
+		g_free(msgtext);
+
+		return -E2BIG;
+	}
+
+	msg = msn_message_new_plain(msgtext);
+	msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat);
+	msn_switchboard_send_msg(swboard, msg, FALSE);
+	msn_message_destroy(msg);
+
+	g_free(msgformat);
+	g_free(msgtext);
+
+	serv_got_chat_in(gc, id, purple_account_get_username(account), 0,
+					 message, time(NULL));
+
+	return 0;
+}
+
+static void
+msn_keepalive(PurpleConnection *gc)
+{
+	MsnSession *session;
+
+	session = gc->proto_data;
+
+	if (!session->http_method)
+	{
+		MsnCmdProc *cmdproc;
+
+		cmdproc = session->notification->cmdproc;
+
+		msn_cmdproc_send_quick(cmdproc, "PNG", NULL, NULL);
+	}
+}
+
+static void
+msn_group_buddy(PurpleConnection *gc, const char *who,
+				const char *old_group_name, const char *new_group_name)
+{
+	MsnSession *session;
+	MsnUserList *userlist;
+
+	session = gc->proto_data;
+	userlist = session->userlist;
+
+	msn_userlist_move_buddy(userlist, who, old_group_name, new_group_name);
+}
+
+static void
+msn_rename_group(PurpleConnection *gc, const char *old_name,
+				 PurpleGroup *group, GList *moved_buddies)
+{
+	MsnSession *session;
+	MsnCmdProc *cmdproc;
+	int old_gid;
+	const char *enc_new_group_name;
+
+	session = gc->proto_data;
+	cmdproc = session->notification->cmdproc;
+	enc_new_group_name = purple_url_encode(group->name);
+
+	old_gid = msn_userlist_find_group_id(session->userlist, old_name);
+
+	if (old_gid >= 0)
+	{
+		msn_cmdproc_send(cmdproc, "REG", "%d %s 0", old_gid,
+						 enc_new_group_name);
+	}
+	else
+	{
+		msn_cmdproc_send(cmdproc, "ADG", "%s 0", enc_new_group_name);
+	}
+}
+
+static void
+msn_convo_closed(PurpleConnection *gc, const char *who)
+{
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+	PurpleConversation *conv;
+
+	session = gc->proto_data;
+
+	swboard = msn_session_find_swboard(session, who);
+
+	/*
+	 * Don't perform an assertion here. If swboard is NULL, then the
+	 * switchboard was either closed by the other party, or the person
+	 * is talking to himself.
+	 */
+	if (swboard == NULL)
+		return;
+
+	conv = swboard->conv;
+
+	/* If we release the switchboard here, it may still have messages
+	   pending ACK which would result in incorrect unsent message errors.
+	   Just let it timeout... This is *so* going to screw with people who
+	   use dumb clients that report "User has closed the conversation window" */
+	/* msn_switchboard_release(swboard, MSN_SB_FLAG_IM); */
+	swboard->conv = NULL;
+
+	/* If other switchboards managed to associate themselves with this
+	 * conv, make sure they know it's gone! */
+	if (conv != NULL)
+	{
+		while ((swboard = msn_session_find_swboard_with_conv(session, conv)) != NULL)
+			swboard->conv = NULL;
+	}
+}
+
+static void
+msn_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img)
+{
+	MsnSession *session;
+	MsnUser *user;
+
+	session = gc->proto_data;
+	user = session->user;
+
+	msn_user_set_buddy_icon(user, img);
+
+	msn_change_status(session);
+}
+
+static void
+msn_remove_group(PurpleConnection *gc, PurpleGroup *group)
+{
+	MsnSession *session;
+	MsnCmdProc *cmdproc;
+	int group_id;
+
+	session = gc->proto_data;
+	cmdproc = session->notification->cmdproc;
+
+	if ((group_id = msn_userlist_find_group_id(session->userlist, group->name)) >= 0)
+	{
+		msn_cmdproc_send(cmdproc, "RMG", "%d", group_id);
+	}
+}
+
+/**
+ * Extract info text from info_data and add it to user_info
+ */
+static gboolean
+msn_tooltip_extract_info_text(PurpleNotifyUserInfo *user_info, MsnGetInfoData *info_data)
+{
+	PurpleBuddy *b;
+
+	b = purple_find_buddy(purple_connection_get_account(info_data->gc),
+						info_data->name);
+
+	if (b)
+	{
+		char *tmp;
+
+		if (b->alias && b->alias[0])
+		{
+			char *aliastext = g_markup_escape_text(b->alias, -1);
+			purple_notify_user_info_add_pair(user_info, _("Alias"), aliastext);
+			g_free(aliastext);
+		}
+
+		if (b->server_alias)
+		{
+			char *nicktext = g_markup_escape_text(b->server_alias, -1);
+			tmp = g_strdup_printf("<font sml=\"msn\">%s</font><br>", nicktext);
+			purple_notify_user_info_add_pair(user_info, _("Nickname"), tmp);
+			g_free(tmp);
+			g_free(nicktext);
+		}
+
+		/* Add the tooltip information */
+		msn_tooltip_text(b, user_info, TRUE);
+
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+#if PHOTO_SUPPORT
+
+static char *
+msn_get_photo_url(const char *url_text)
+{
+	char *p, *q;
+
+	if ((p = strstr(url_text, " contactparams:photopreauthurl=\"")) != NULL)
+	{
+		p += strlen(" contactparams:photopreauthurl=\"");
+	}
+
+	if (p && (strncmp(p, "http://", 8) == 0) && ((q = strchr(p, '"')) != NULL))
+			return g_strndup(p, q - p);
+
+	return NULL;
+}
+
+static void msn_got_photo(PurpleUtilFetchUrlData *url_data, gpointer data,
+		const gchar *url_text, size_t len, const gchar *error_message);
+
+#endif
+
+#if 0
+static char *msn_info_date_reformat(const char *field, size_t len)
+{
+	char *tmp = g_strndup(field, len);
+	time_t t = purple_str_to_time(tmp, FALSE, NULL, NULL, NULL);
+
+	g_free(tmp);
+	return g_strdup(purple_date_format_short(localtime(&t)));
+}
+#endif
+
+#define MSN_GOT_INFO_GET_FIELD(a, b) \
+	found = purple_markup_extract_info_field(stripped, stripped_len, user_info, \
+			"\n" a ":", 0, "\n", 0, "Undisclosed", b, 0, NULL, NULL); \
+	if (found) \
+		sect_info = TRUE;
+
+#define MSN_GOT_INFO_GET_FIELD_NO_SEARCH(a, b) \
+	found = purple_markup_extract_info_field(stripped, stripped_len, user_info, \
+			"\n" a ":", 0, "\n", 0, "Undisclosed", b, 0, NULL, msn_info_strip_search_link); \
+	if (found) \
+		sect_info = TRUE;
+
+static char *
+msn_info_strip_search_link(const char *field, size_t len)
+{
+	const char *c;
+	if ((c = strstr(field, " (http://spaces.live.com/default.aspx?page=searchresults")) == NULL &&
+		(c = strstr(field, " (http://spaces.msn.com/default.aspx?page=searchresults")) == NULL)
+		return g_strndup(field, len);
+	return g_strndup(field, c - field);
+}
+
+static void
+msn_got_info(PurpleUtilFetchUrlData *url_data, gpointer data,
+		const gchar *url_text, size_t len, const gchar *error_message)
+{
+	MsnGetInfoData *info_data = (MsnGetInfoData *)data;
+	PurpleNotifyUserInfo *user_info;
+	char *stripped, *p, *q, *tmp;
+	char *user_url = NULL;
+	gboolean found;
+	gboolean has_tooltip_text = FALSE;
+	gboolean has_info = FALSE;
+	gboolean sect_info = FALSE;
+	gboolean has_contact_info = FALSE;
+	char *url_buffer;
+	int stripped_len;
+#if PHOTO_SUPPORT
+	char *photo_url_text = NULL;
+	MsnGetInfoStepTwoData *info2_data = NULL;
+#endif
+
+	purple_debug_info("msn", "In msn_got_info\n");
+
+	/* Make sure the connection is still valid */
+	if (g_list_find(purple_connections_get_all(), info_data->gc) == NULL)
+	{
+		purple_debug_warning("msn", "invalid connection. ignoring buddy info.\n");
+		g_free(info_data->name);
+		g_free(info_data);
+		return;
+	}
+
+	user_info = purple_notify_user_info_new();
+	has_tooltip_text = msn_tooltip_extract_info_text(user_info, info_data);
+
+	if (error_message != NULL || url_text == NULL || strcmp(url_text, "") == 0)
+	{
+		tmp = g_strdup_printf("<b>%s</b>", _("Error retrieving profile"));
+		purple_notify_user_info_add_pair(user_info, NULL, tmp);
+		g_free(tmp);
+
+		purple_notify_userinfo(info_data->gc, info_data->name, user_info, NULL, NULL);
+		purple_notify_user_info_destroy(user_info);
+
+		g_free(info_data->name);
+		g_free(info_data);
+		return;
+	}
+
+	url_buffer = g_strdup(url_text);
+
+	/* If they have a homepage link, MSN masks it such that we need to
+	 * fetch the url out before purple_markup_strip_html() nukes it */
+	/* I don't think this works with the new spaces profiles - Stu 3/2/06 */
+	if ((p = strstr(url_text,
+			"Take a look at my </font><A class=viewDesc title=\"")) != NULL)
+	{
+		p += 50;
+
+		if ((q = strchr(p, '"')) != NULL)
+			user_url = g_strndup(p, q - p);
+	}
+
+	/*
+	 * purple_markup_strip_html() doesn't strip out character entities like &nbsp;
+	 * and &#183;
+	 */
+	while ((p = strstr(url_buffer, "&nbsp;")) != NULL)
+	{
+		*p = ' '; /* Turn &nbsp;'s into ordinary blanks */
+		p += 1;
+		memmove(p, p + 5, strlen(p + 5));
+		url_buffer[strlen(url_buffer) - 5] = '\0';
+	}
+
+	while ((p = strstr(url_buffer, "&#183;")) != NULL)
+	{
+		memmove(p, p + 6, strlen(p + 6));
+		url_buffer[strlen(url_buffer) - 6] = '\0';
+	}
+
+	/* Nuke the nasty \r's that just get in the way */
+	purple_str_strip_char(url_buffer, '\r');
+
+	/* MSN always puts in &#39; for apostrophes...replace them */
+	while ((p = strstr(url_buffer, "&#39;")) != NULL)
+	{
+		*p = '\'';
+		memmove(p + 1, p + 5, strlen(p + 5));
+		url_buffer[strlen(url_buffer) - 4] = '\0';
+	}
+
+	/* Nuke the html, it's easier than trying to parse the horrid stuff */
+	stripped = purple_markup_strip_html(url_buffer);
+	stripped_len = strlen(stripped);
+
+	purple_debug_misc("msn", "stripped = %p\n", stripped);
+	purple_debug_misc("msn", "url_buffer = %p\n", url_buffer);
+
+	/* General section header */
+	if (has_tooltip_text)
+		purple_notify_user_info_add_section_break(user_info);
+
+	purple_notify_user_info_add_section_header(user_info, _("General"));
+
+	/* Extract their Name and put it in */
+	MSN_GOT_INFO_GET_FIELD("Name", _("Name"));
+
+	/* General */
+	MSN_GOT_INFO_GET_FIELD("Nickname", _("Nickname"));
+	MSN_GOT_INFO_GET_FIELD_NO_SEARCH("Age", _("Age"));
+	MSN_GOT_INFO_GET_FIELD_NO_SEARCH("Gender", _("Gender"));
+	MSN_GOT_INFO_GET_FIELD_NO_SEARCH("Occupation", _("Occupation"));
+	MSN_GOT_INFO_GET_FIELD_NO_SEARCH("Location", _("Location"));
+
+	/* Extract their Interests and put it in */
+	found = purple_markup_extract_info_field(stripped, stripped_len, user_info,
+			"\nInterests\t", 0, " (/default.aspx?page=searchresults", 0,
+			"Undisclosed", _("Hobbies and Interests") /* _("Interests") */,
+			0, NULL, NULL);
+
+	if (found)
+		sect_info = TRUE;
+
+	MSN_GOT_INFO_GET_FIELD("More about me", _("A Little About Me"));
+
+	if (sect_info)
+	{
+		has_info = TRUE;
+		sect_info = FALSE;
+	}
+    else
+    {
+		/* Remove the section header */
+		purple_notify_user_info_remove_last_item(user_info);
+		if (has_tooltip_text)
+			purple_notify_user_info_remove_last_item(user_info);
+	}
+
+	/* Social */
+	purple_notify_user_info_add_section_break(user_info);
+	purple_notify_user_info_add_section_header(user_info, _("Social"));
+
+	MSN_GOT_INFO_GET_FIELD("Marital status", _("Marital Status"));
+	MSN_GOT_INFO_GET_FIELD("Interested in", _("Interests"));
+	MSN_GOT_INFO_GET_FIELD("Pets", _("Pets"));
+	MSN_GOT_INFO_GET_FIELD("Hometown", _("Hometown"));
+	MSN_GOT_INFO_GET_FIELD("Places lived", _("Places Lived"));
+	MSN_GOT_INFO_GET_FIELD("Fashion", _("Fashion"));
+	MSN_GOT_INFO_GET_FIELD("Humor", _("Humor"));
+	MSN_GOT_INFO_GET_FIELD("Music", _("Music"));
+	MSN_GOT_INFO_GET_FIELD("Favorite quote", _("Favorite Quote"));
+
+	if (sect_info)
+	{
+		has_info = TRUE;
+		sect_info = FALSE;
+	}
+    else
+    {
+		/* Remove the section header */
+		purple_notify_user_info_remove_last_item(user_info);
+		purple_notify_user_info_remove_last_item(user_info);
+	}
+
+	/* Contact Info */
+	/* Personal */
+	purple_notify_user_info_add_section_break(user_info);
+	purple_notify_user_info_add_section_header(user_info, _("Contact Info"));
+	purple_notify_user_info_add_section_header(user_info, _("Personal"));
+
+	MSN_GOT_INFO_GET_FIELD("Name", _("Name"));
+	MSN_GOT_INFO_GET_FIELD("Significant other", _("Significant Other"));
+	MSN_GOT_INFO_GET_FIELD("Home phone", _("Home Phone"));
+	MSN_GOT_INFO_GET_FIELD("Home phone 2", _("Home Phone 2"));
+	MSN_GOT_INFO_GET_FIELD("Home address", _("Home Address"));
+	MSN_GOT_INFO_GET_FIELD("Personal Mobile", _("Personal Mobile"));
+	MSN_GOT_INFO_GET_FIELD("Home fax", _("Home Fax"));
+	MSN_GOT_INFO_GET_FIELD("Personal e-mail", _("Personal E-Mail"));
+	MSN_GOT_INFO_GET_FIELD("Personal IM", _("Personal IM"));
+	MSN_GOT_INFO_GET_FIELD("Birthday", _("Birthday"));
+	MSN_GOT_INFO_GET_FIELD("Anniversary", _("Anniversary"));
+	MSN_GOT_INFO_GET_FIELD("Notes", _("Notes"));
+
+	if (sect_info)
+	{
+		has_info = TRUE;
+		sect_info = FALSE;
+		has_contact_info = TRUE;
+	}
+    else
+    {
+		/* Remove the section header */
+		purple_notify_user_info_remove_last_item(user_info);
+	}
+
+	/* Business */
+	purple_notify_user_info_add_section_header(user_info, _("Work"));
+	MSN_GOT_INFO_GET_FIELD("Name", _("Name"));
+	MSN_GOT_INFO_GET_FIELD("Job title", _("Job Title"));
+	MSN_GOT_INFO_GET_FIELD("Company", _("Company"));
+	MSN_GOT_INFO_GET_FIELD("Department", _("Department"));
+	MSN_GOT_INFO_GET_FIELD("Profession", _("Profession"));
+	MSN_GOT_INFO_GET_FIELD("Work phone 1", _("Work Phone"));
+	MSN_GOT_INFO_GET_FIELD("Work phone 2", _("Work Phone 2"));
+	MSN_GOT_INFO_GET_FIELD("Work address", _("Work Address"));
+	MSN_GOT_INFO_GET_FIELD("Work mobile", _("Work Mobile"));
+	MSN_GOT_INFO_GET_FIELD("Work pager", _("Work Pager"));
+	MSN_GOT_INFO_GET_FIELD("Work fax", _("Work Fax"));
+	MSN_GOT_INFO_GET_FIELD("Work e-mail", _("Work E-Mail"));
+	MSN_GOT_INFO_GET_FIELD("Work IM", _("Work IM"));
+	MSN_GOT_INFO_GET_FIELD("Start date", _("Start Date"));
+	MSN_GOT_INFO_GET_FIELD("Notes", _("Notes"));
+
+	if (sect_info)
+	{
+		has_info = TRUE;
+		sect_info = FALSE;
+		has_contact_info = TRUE;
+	}
+    else
+    {
+		/* Remove the section header */
+		purple_notify_user_info_remove_last_item(user_info);
+	}
+
+	if (!has_contact_info)
+	{
+		/* Remove the Contact Info section header */
+		purple_notify_user_info_remove_last_item(user_info);
+	}
+
+#if 0 /* these probably don't show up any more */
+	/*
+	 * The fields, 'A Little About Me', 'Favorite Things', 'Hobbies
+	 * and Interests', 'Favorite Quote', and 'My Homepage' may or may
+	 * not appear, in any combination. However, they do appear in
+	 * certain order, so we can successively search to pin down the
+	 * distinct values.
+	 */
+
+	/* Check if they have A Little About Me */
+	found = purple_markup_extract_info_field(stripped, stripped_len, s,
+			" A Little About Me \n\n", 0, "Favorite Things", '\n', NULL,
+			_("A Little About Me"), 0, NULL, NULL);
+
+	if (!found)
+	{
+		found = purple_markup_extract_info_field(stripped, stripped_len, s,
+				" A Little About Me \n\n", 0, "Hobbies and Interests", '\n',
+				NULL, _("A Little About Me"), 0, NULL, NULL);
+	}
+
+	if (!found)
+	{
+		found = purple_markup_extract_info_field(stripped, stripped_len, s,
+				" A Little About Me \n\n", 0, "Favorite Quote", '\n', NULL,
+				_("A Little About Me"), 0, NULL, NULL);
+	}
+
+	if (!found)
+	{
+		found = purple_markup_extract_info_field(stripped, stripped_len, s,
+				" A Little About Me \n\n", 0, "My Homepage \n\nTake a look",
+				'\n',
+				NULL, _("A Little About Me"), 0, NULL, NULL);
+	}
+
+	if (!found)
+	{
+		purple_markup_extract_info_field(stripped, stripped_len, s,
+				" A Little About Me \n\n", 0, "last updated", '\n', NULL,
+				_("A Little About Me"), 0, NULL, NULL);
+	}
+
+	if (found)
+		has_info = TRUE;
+
+	/* Check if they have Favorite Things */
+	found = purple_markup_extract_info_field(stripped, stripped_len, s,
+			" Favorite Things \n\n", 0, "Hobbies and Interests", '\n', NULL,
+			_("Favorite Things"), 0, NULL, NULL);
+
+	if (!found)
+	{
+		found = purple_markup_extract_info_field(stripped, stripped_len, s,
+				" Favorite Things \n\n", 0, "Favorite Quote", '\n', NULL,
+				_("Favorite Things"), 0, NULL, NULL);
+	}
+
+	if (!found)
+	{
+		found = purple_markup_extract_info_field(stripped, stripped_len, s,
+				" Favorite Things \n\n", 0, "My Homepage \n\nTake a look", '\n',
+				NULL, _("Favorite Things"), 0, NULL, NULL);
+	}
+
+	if (!found)
+	{
+		purple_markup_extract_info_field(stripped, stripped_len, s,
+				" Favorite Things \n\n", 0, "last updated", '\n', NULL,
+				_("Favorite Things"), 0, NULL, NULL);
+	}
+
+	if (found)
+		has_info = TRUE;
+
+	/* Check if they have Hobbies and Interests */
+	found = purple_markup_extract_info_field(stripped, stripped_len, s,
+			" Hobbies and Interests \n\n", 0, "Favorite Quote", '\n', NULL,
+			_("Hobbies and Interests"), 0, NULL, NULL);
+
+	if (!found)
+	{
+		found = purple_markup_extract_info_field(stripped, stripped_len, s,
+				" Hobbies and Interests \n\n", 0, "My Homepage \n\nTake a look",
+				'\n', NULL, _("Hobbies and Interests"), 0, NULL, NULL);
+	}
+
+	if (!found)
+	{
+		purple_markup_extract_info_field(stripped, stripped_len, s,
+				" Hobbies and Interests \n\n", 0, "last updated", '\n', NULL,
+				_("Hobbies and Interests"), 0, NULL, NULL);
+	}
+
+	if (found)
+		has_info = TRUE;
+
+	/* Check if they have Favorite Quote */
+	found = purple_markup_extract_info_field(stripped, stripped_len, s,
+			"Favorite Quote \n\n", 0, "My Homepage \n\nTake a look", '\n', NULL,
+			_("Favorite Quote"), 0, NULL, NULL);
+
+	if (!found)
+	{
+		purple_markup_extract_info_field(stripped, stripped_len, s,
+				"Favorite Quote \n\n", 0, "last updated", '\n', NULL,
+				_("Favorite Quote"), 0, NULL, NULL);
+	}
+
+	if (found)
+		has_info = TRUE;
+
+	/* Extract the last updated date and put it in */
+	found = purple_markup_extract_info_field(stripped, stripped_len, s,
+			" last updated:", 1, "\n", 0, NULL, _("Last Updated"), 0,
+			NULL, msn_info_date_reformat);
+
+	if (found)
+		has_info = TRUE;
+#endif
+
+	/* If we were able to fetch a homepage url earlier, stick it in there */
+	if (user_url != NULL)
+	{
+		tmp = g_strdup_printf("<a href=\"%s\">%s</a>", user_url, user_url);
+		purple_notify_user_info_add_pair(user_info, _("Homepage"), tmp);
+		g_free(tmp);
+		g_free(user_url);
+
+		has_info = TRUE;
+	}
+
+	if (!has_info)
+	{
+		/* MSN doesn't actually distinguish between "unknown member" and
+		 * a known member with an empty profile. Try to explain this fact.
+		 * Note that if we have a nonempty tooltip_text, we know the user
+		 * exists.
+		 */
+		/* This doesn't work with the new spaces profiles - Stu 3/2/06
+		char *p = strstr(url_buffer, "Unknown Member </TITLE>");
+		 * This might not work for long either ... */
+		/* Nope, it failed some time before 5/2/07 :(
+		char *p = strstr(url_buffer, "form id=\"SpacesSearch\" name=\"SpacesSearch\"");
+		 * Let's see how long this one holds out for ... */
+		char *p = strstr(url_buffer, "<form id=\"profile_form\" name=\"profile_form\" action=\"http&#58;&#47;&#47;spaces.live.com&#47;profile.aspx&#63;cid&#61;0\"");
+		PurpleBuddy *b = purple_find_buddy
+				(purple_connection_get_account(info_data->gc), info_data->name);
+		purple_notify_user_info_add_pair(user_info, _("Error retrieving profile"),
+									   ((p && b) ? _("The user has not created a public profile.") :
+										(p ? _("MSN reported not being able to find the user's profile. "
+											   "This either means that the user does not exist, "
+											   "or that the user exists "
+											   "but has not created a public profile.") :
+										 _("Could not find "	/* This should never happen */
+										   "any information in the user's profile. "
+										   "The user most likely does not exist."))));
+	}
+
+	/* put a link to the actual profile URL */
+	tmp = g_strdup_printf("<a href=\"%s%s\">%s%s</a>",
+					PROFILE_URL, info_data->name, PROFILE_URL, info_data->name);
+	purple_notify_user_info_add_pair(user_info, _("Profile URL"), tmp);
+	g_free(tmp);
+
+#if PHOTO_SUPPORT
+	/* Find the URL to the photo; must be before the marshalling [Bug 994207] */
+	photo_url_text = msn_get_photo_url(url_text);
+
+	/* Marshall the existing state */
+	info2_data = g_malloc0(sizeof(MsnGetInfoStepTwoData));
+	info2_data->info_data = info_data;
+	info2_data->stripped = stripped;
+	info2_data->url_buffer = url_buffer;
+	info2_data->user_info = user_info;
+	info2_data->photo_url_text = photo_url_text;
+
+	/* Try to put the photo in there too, if there's one */
+	if (photo_url_text)
+	{
+		purple_util_fetch_url(photo_url_text, FALSE, NULL, FALSE, msn_got_photo,
+					   info2_data);
+	}
+	else
+	{
+		/* Emulate a callback */
+		/* TODO: Huh? */
+		msn_got_photo(NULL, info2_data, NULL, 0, NULL);
+	}
+}
+
+static void
+msn_got_photo(PurpleUtilFetchUrlData *url_data, gpointer user_data,
+		const gchar *url_text, size_t len, const gchar *error_message)
+{
+	MsnGetInfoStepTwoData *info2_data = (MsnGetInfoStepTwoData *)user_data;
+	int id = -1;
+
+	/* Unmarshall the saved state */
+	MsnGetInfoData *info_data = info2_data->info_data;
+	char *stripped = info2_data->stripped;
+	char *url_buffer = info2_data->url_buffer;
+	PurpleNotifyUserInfo *user_info = info2_data->user_info;
+	char *photo_url_text = info2_data->photo_url_text;
+
+	/* Make sure the connection is still valid if we got here by fetching a photo url */
+	if (url_text && (error_message != NULL ||
+					 g_list_find(purple_connections_get_all(), info_data->gc) == NULL))
+	{
+		purple_debug_warning("msn", "invalid connection. ignoring buddy photo info.\n");
+		g_free(stripped);
+		g_free(url_buffer);
+		g_free(user_info);
+		g_free(info_data->name);
+		g_free(info_data);
+		g_free(photo_url_text);
+		g_free(info2_data);
+
+		return;
+	}
+
+	/* Try to put the photo in there too, if there's one and is readable */
+	if (user_data && url_text && len != 0)
+	{
+		if (strstr(url_text, "400 Bad Request")
+			|| strstr(url_text, "403 Forbidden")
+			|| strstr(url_text, "404 Not Found"))
+		{
+
+			purple_debug_info("msn", "Error getting %s: %s\n",
+					photo_url_text, url_text);
+		}
+		else
+		{
+			char buf[1024];
+			purple_debug_info("msn", "%s is %d bytes\n", photo_url_text, len);
+			id = purple_imgstore_add_with_id(g_memdup(url_text, len), len, NULL);
+			g_snprintf(buf, sizeof(buf), "<img id=\"%d\"><br>", id);
+			purple_notify_user_info_prepend_pair(user_info, NULL, buf);
+		}
+	}
+
+	/* We continue here from msn_got_info, as if nothing has happened */
+#endif
+	purple_notify_userinfo(info_data->gc, info_data->name, user_info, NULL, NULL);
+
+	g_free(stripped);
+	g_free(url_buffer);
+	purple_notify_user_info_destroy(user_info);
+	g_free(info_data->name);
+	g_free(info_data);
+#if PHOTO_SUPPORT
+	g_free(photo_url_text);
+	g_free(info2_data);
+	if (id != -1)
+		purple_imgstore_unref_by_id(id);
+#endif
+}
+
+static void
+msn_get_info(PurpleConnection *gc, const char *name)
+{
+	MsnGetInfoData *data;
+	char *url;
+
+	data       = g_new0(MsnGetInfoData, 1);
+	data->gc   = gc;
+	data->name = g_strdup(name);
+
+	url = g_strdup_printf("%s%s", PROFILE_URL, name);
+
+	purple_util_fetch_url(url, FALSE,
+				   "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
+				   TRUE, msn_got_info, data);
+
+	g_free(url);
+}
+
+static gboolean msn_load(PurplePlugin *plugin)
+{
+	msn_notification_init();
+	msn_switchboard_init();
+	msn_sync_init();
+
+	return TRUE;
+}
+
+static gboolean msn_unload(PurplePlugin *plugin)
+{
+	msn_notification_end();
+	msn_switchboard_end();
+	msn_sync_end();
+
+	return TRUE;
+}
+
+static PurpleAccount *find_acct(const char *prpl, const char *acct_id)
+{
+	PurpleAccount *acct = NULL;
+
+	/* If we have a specific acct, use it */
+	if (acct_id) {
+		acct = purple_accounts_find(acct_id, prpl);
+		if (acct && !purple_account_is_connected(acct))
+			acct = NULL;
+	} else { /* Otherwise find an active account for the protocol */
+		GList *l = purple_accounts_get_all();
+		while (l) {
+			if (!strcmp(prpl, purple_account_get_protocol_id(l->data))
+					&& purple_account_is_connected(l->data)) {
+				acct = l->data;
+				break;
+			}
+			l = l->next;
+		}
+	}
+
+	return acct;
+}
+
+static gboolean msn_uri_handler(const char *proto, const char *cmd, GHashTable *params)
+{
+	char *acct_id = g_hash_table_lookup(params, "account");
+	PurpleAccount *acct;
+
+	if (g_ascii_strcasecmp(proto, "msnim"))
+		return FALSE;
+
+	acct = find_acct("prpl-msn", acct_id);
+
+	if (!acct)
+		return FALSE;
+
+	/* msnim:chat?contact=user@domain.tld */
+	if (!g_ascii_strcasecmp(cmd, "Chat")) {
+		char *sname = g_hash_table_lookup(params, "contact");
+		if (sname) {
+			PurpleConversation *conv = purple_find_conversation_with_account(
+				PURPLE_CONV_TYPE_IM, sname, acct);
+			if (conv == NULL)
+				conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, sname);
+			purple_conversation_present(conv);
+		}
+		/*else
+			**If pidgindialogs_im() was in the core, we could use it here.
+			 * It is all purple_request_* based, but I'm not sure it really belongs in the core
+			pidgindialogs_im();*/
+
+		return TRUE;
+	}
+	/* msnim:add?contact=user@domain.tld */
+	else if (!g_ascii_strcasecmp(cmd, "Add")) {
+		char *name = g_hash_table_lookup(params, "contact");
+		purple_blist_request_add_buddy(acct, name, NULL, NULL);
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+
+static PurplePluginProtocolInfo prpl_info =
+{
+	OPT_PROTO_MAIL_CHECK,
+	NULL,					/* user_splits */
+	NULL,					/* protocol_options */
+	{"png", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND},	/* icon_spec */
+	msn_list_icon,			/* list_icon */
+	NULL,				/* list_emblems */
+	msn_status_text,		/* status_text */
+	msn_tooltip_text,		/* tooltip_text */
+	msn_status_types,		/* away_states */
+	msn_blist_node_menu,		/* blist_node_menu */
+	NULL,					/* chat_info */
+	NULL,					/* chat_info_defaults */
+	msn_login,			/* login */
+	msn_close,			/* close */
+	msn_send_im,			/* send_im */
+	NULL,					/* set_info */
+	msn_send_typing,		/* send_typing */
+	msn_get_info,			/* get_info */
+	msn_set_status,			/* set_away */
+	msn_set_idle,			/* set_idle */
+	NULL,					/* change_passwd */
+	msn_add_buddy,			/* add_buddy */
+	NULL,					/* add_buddies */
+	msn_rem_buddy,			/* remove_buddy */
+	NULL,					/* remove_buddies */
+	msn_add_permit,			/* add_permit */
+	msn_add_deny,			/* add_deny */
+	msn_rem_permit,			/* rem_permit */
+	msn_rem_deny,			/* rem_deny */
+	msn_set_permit_deny,		/* set_permit_deny */
+	NULL,					/* join_chat */
+	NULL,					/* reject chat invite */
+	NULL,					/* get_chat_name */
+	msn_chat_invite,		/* chat_invite */
+	msn_chat_leave,			/* chat_leave */
+	NULL,					/* chat_whisper */
+	msn_chat_send,			/* chat_send */
+	msn_keepalive,			/* keepalive */
+	NULL,					/* register_user */
+	NULL,					/* get_cb_info */
+	NULL,					/* get_cb_away */
+	NULL,					/* alias_buddy */
+	msn_group_buddy,		/* group_buddy */
+	msn_rename_group,		/* rename_group */
+	NULL,					/* buddy_free */
+	msn_convo_closed,		/* convo_closed */
+	msn_normalize,			/* normalize */
+	msn_set_buddy_icon,		/* set_buddy_icon */
+	msn_remove_group,		/* remove_group */
+	NULL,					/* get_cb_real_name */
+	NULL,					/* set_chat_topic */
+	NULL,					/* find_blist_chat */
+	NULL,					/* roomlist_get_list */
+	NULL,					/* roomlist_cancel */
+	NULL,					/* roomlist_expand_category */
+	msn_can_receive_file,	/* can_receive_file */
+	msn_send_file,			/* send_file */
+	msn_new_xfer,			/* new_xfer */
+	msn_offline_message,			/* offline_message */
+	NULL,					/* whiteboard_prpl_ops */
+	NULL,					/* send_raw */
+	NULL,					/* roomlist_room_serialize */
+	NULL,					/* unregister_user */
+	msn_send_attention,                     /* send_attention */
+	msn_attention_types,                    /* attention_types */
+
+	/* padding */
+	NULL
+};
+
+static PurplePluginInfo info =
+{
+	PURPLE_PLUGIN_MAGIC,
+	PURPLE_MAJOR_VERSION,
+	PURPLE_MINOR_VERSION,
+	PURPLE_PLUGIN_PROTOCOL,                             /**< type           */
+	NULL,                                             /**< ui_requirement */
+	0,                                                /**< flags          */
+	NULL,                                             /**< dependencies   */
+	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */
+
+	"prpl-msn",                                       /**< id             */
+	"MSN",                                            /**< name           */
+	DISPLAY_VERSION,                                  /**< version        */
+	                                                  /**  summary        */
+	N_("MSN Protocol Plugin"),
+	                                                  /**  description    */
+	N_("MSN Protocol Plugin"),
+	"Christian Hammond <chipx86@gnupdate.org>",       /**< author         */
+	PURPLE_WEBSITE,                                     /**< homepage       */
+
+	msn_load,                                         /**< load           */
+	msn_unload,                                       /**< unload         */
+	NULL,                                             /**< destroy        */
+
+	NULL,                                             /**< ui_info        */
+	&prpl_info,                                       /**< extra_info     */
+	NULL,                                             /**< prefs_info     */
+	msn_actions,
+
+	/* padding */
+	NULL,
+	NULL,
+	NULL,
+	NULL
+};
+
+static void
+init_plugin(PurplePlugin *plugin)
+{
+	PurpleAccountOption *option;
+
+	option = purple_account_option_string_new(_("Server"), "server",
+											MSN_SERVER);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
+											   option);
+
+	option = purple_account_option_int_new(_("Port"), "port", 1863);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
+											   option);
+
+	option = purple_account_option_bool_new(_("Use HTTP Method"),
+										  "http_method", FALSE);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
+											   option);
+
+	option = purple_account_option_string_new(_("HTTP Method Server"),
+										  "http_method_server", MSN_HTTPCONN_SERVER);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
+											   option);
+
+	option = purple_account_option_bool_new(_("Show custom smileys"),
+										  "custom_smileys", TRUE);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
+											   option);
+
+	purple_cmd_register("nudge", "", PURPLE_CMD_P_PRPL,
+	                  PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY,
+	                 "prpl-msn", msn_cmd_nudge,
+	                  _("nudge: nudge a user to get their attention"), NULL);
+
+	purple_prefs_remove("/plugins/prpl/msn");
+
+	purple_signal_connect(purple_get_core(), "uri-handler", plugin,
+		PURPLE_CALLBACK(msn_uri_handler), NULL);
+}
+
+PURPLE_INIT_PLUGIN(msn, init_plugin, info);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/msn.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,134 @@
+/**
+ * @file msn.h The MSN protocol plugin
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_H_
+#define _MSN_H_
+
+/* #define MSN_DEBUG_MSG 1 */
+/* #define MSN_DEBUG_SLPMSG 1 */
+/* #define MSN_DEBUG_HTTP 1 */
+
+/* #define MSN_DEBUG_SLP 1 */
+/* #define MSN_DEBUG_SLP_VERBOSE 1 */
+/* #define MSN_DEBUG_SLP_FILES 1 */
+
+/* #define MSN_DEBUG_NS 1 */
+/* #define MSN_DEBUG_SB 1 */
+
+#include "internal.h"
+
+#include "account.h"
+#include "accountopt.h"
+#include "blist.h"
+#include "connection.h"
+#include "conversation.h"
+#include "debug.h"
+#include "cipher.h"
+#include "notify.h"
+#include "privacy.h"
+#include "proxy.h"
+#include "prpl.h"
+#include "request.h"
+#include "servconn.h"
+#include "sslconn.h"
+#include "util.h"
+
+#include "ft.h"
+
+#define MSN_BUF_LEN 8192
+
+#define USEROPT_MSNSERVER 3
+#define MSN_SERVER "messenger.hotmail.com"
+#define MSN_HTTPCONN_SERVER "gateway.messenger.hotmail.com"
+#define USEROPT_MSNPORT 4
+#define MSN_PORT 1863
+
+#define MSN_TYPING_RECV_TIMEOUT 6
+#define MSN_TYPING_SEND_TIMEOUT	4
+
+#define HOTMAIL_URL "http://www.hotmail.com/cgi-bin/folders"
+#define PASSPORT_URL "http://lc1.law13.hotmail.passport.com/cgi-bin/dologin?login="
+#define PROFILE_URL "http://spaces.live.com/profile.aspx?mem="
+
+#define USEROPT_HOTMAIL 0
+
+#define BUDDY_ALIAS_MAXLEN 387
+
+#define MSN_FT_GUID "{5D3E02AB-6190-11d3-BBBB-00C04F795683}"
+
+#define MSN_CLIENTINFO \
+	"Client-Name: Purple/" VERSION "\r\n" \
+	"Chat-Logging: Y\r\n"
+
+/* Index into attention_types */
+#define MSN_NUDGE 0
+
+typedef enum
+{
+	MSN_LIST_FL_OP = 0x01,
+	MSN_LIST_AL_OP = 0x02,
+	MSN_LIST_BL_OP = 0x04,
+	MSN_LIST_RL_OP = 0x08
+
+} MsnListOp;
+
+typedef enum
+{
+	MSN_CLIENT_CAP_WIN_MOBILE = 0x00001,
+	MSN_CLIENT_CAP_UNKNOWN_1  = 0x00002,
+	MSN_CLIENT_CAP_INK_GIF    = 0x00004,
+	MSN_CLIENT_CAP_INK_ISF    = 0x00008,
+	MSN_CLIENT_CAP_VIDEO_CHAT = 0x00010,
+	MSN_CLIENT_CAP_BASE       = 0x00020,
+	MSN_CLIENT_CAP_MSNMOBILE  = 0x00040,
+	MSN_CLIENT_CAP_MSNDIRECT  = 0x00080,
+	MSN_CLIENT_CAP_WEBMSGR    = 0x00100,
+	MSN_CLIENT_CAP_DIRECTIM   = 0x04000,
+	MSN_CLIENT_CAP_WINKS      = 0x08000,
+	MSN_CLIENT_CAP_SEARCH     = 0x10000
+
+} MsnClientCaps;
+
+typedef enum
+{
+	MSN_CLIENT_VER_5_0 = 0x00,
+	MSN_CLIENT_VER_6_0 = 0x10,	/* MSNC1 */
+	MSN_CLIENT_VER_6_1 = 0x20,	/* MSNC2 */
+	MSN_CLIENT_VER_6_2 = 0x30,	/* MSNC3 */
+	MSN_CLIENT_VER_7_0 = 0x40,	/* MSNC4 */
+	MSN_CLIENT_VER_7_5 = 0x50	/* MSNC5 */
+
+} MsnClientVerId;
+
+#define MSN_CLIENT_ID_VERSION      MSN_CLIENT_VER_7_0
+#define MSN_CLIENT_ID_RESERVED_1   0x00
+#define MSN_CLIENT_ID_RESERVED_2   0x00
+#define MSN_CLIENT_ID_CAPABILITIES MSN_CLIENT_CAP_BASE
+
+#define MSN_CLIENT_ID \
+	((MSN_CLIENT_ID_VERSION    << 24) | \
+	 (MSN_CLIENT_ID_RESERVED_1 << 16) | \
+	 (MSN_CLIENT_ID_RESERVED_2 <<  8) | \
+	 (MSN_CLIENT_ID_CAPABILITIES))
+
+#endif /* _MSN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/nexus.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,511 @@
+/**
+ * @file nexus.c MSN Nexus functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "nexus.h"
+#include "notification.h"
+
+/**************************************************************************
+ * Main
+ **************************************************************************/
+
+MsnNexus *
+msn_nexus_new(MsnSession *session)
+{
+	MsnNexus *nexus;
+
+	nexus = g_new0(MsnNexus, 1);
+	nexus->session = session;
+	nexus->challenge_data = g_hash_table_new_full(g_str_hash,
+		g_str_equal, g_free, g_free);
+
+	return nexus;
+}
+
+void
+msn_nexus_destroy(MsnNexus *nexus)
+{
+	if (nexus->gsc)
+		purple_ssl_close(nexus->gsc);
+
+	g_free(nexus->login_host);
+
+	g_free(nexus->login_path);
+
+	if (nexus->challenge_data != NULL)
+		g_hash_table_destroy(nexus->challenge_data);
+
+	if (nexus->input_handler > 0)
+		purple_input_remove(nexus->input_handler);
+	g_free(nexus->write_buf);
+	g_free(nexus->read_buf);
+
+	g_free(nexus);
+}
+
+/**************************************************************************
+ * Util
+ **************************************************************************/
+
+static gssize
+msn_ssl_read(MsnNexus *nexus)
+{
+	gssize len;
+	char temp_buf[4096];
+
+	if ((len = purple_ssl_read(nexus->gsc, temp_buf,
+			sizeof(temp_buf))) > 0)
+	{
+		nexus->read_buf = g_realloc(nexus->read_buf,
+			nexus->read_len + len + 1);
+		strncpy(nexus->read_buf + nexus->read_len, temp_buf, len);
+		nexus->read_len += len;
+		nexus->read_buf[nexus->read_len] = '\0';
+	}
+
+	return len;
+}
+
+static void
+nexus_write_cb(gpointer data, gint source, PurpleInputCondition cond)
+{
+	MsnNexus *nexus = data;
+	int len, total_len;
+
+	total_len = strlen(nexus->write_buf);
+
+	len = purple_ssl_write(nexus->gsc,
+		nexus->write_buf + nexus->written_len,
+		total_len - nexus->written_len);
+
+	if (len < 0 && errno == EAGAIN)
+		return;
+	else if (len <= 0) {
+		purple_input_remove(nexus->input_handler);
+		nexus->input_handler = 0;
+		/* TODO: notify of the error */
+		return;
+	}
+	nexus->written_len += len;
+
+	if (nexus->written_len < total_len)
+		return;
+
+	purple_input_remove(nexus->input_handler);
+	nexus->input_handler = 0;
+
+	g_free(nexus->write_buf);
+	nexus->write_buf = NULL;
+	nexus->written_len = 0;
+
+	nexus->written_cb(nexus, source, 0);
+}
+
+/**************************************************************************
+ * Login
+ **************************************************************************/
+
+static void
+login_connect_cb(gpointer data, PurpleSslConnection *gsc,
+				 PurpleInputCondition cond);
+
+static void
+login_error_cb(PurpleSslConnection *gsc, PurpleSslErrorType error, void *data)
+{
+	MsnNexus *nexus;
+	MsnSession *session;
+
+	nexus = data;
+	g_return_if_fail(nexus != NULL);
+
+	nexus->gsc = NULL;
+
+	session = nexus->session;
+	g_return_if_fail(session != NULL);
+
+	msn_session_set_error(session, MSN_ERROR_AUTH, _("Unable to connect"));
+	/* the above line will result in nexus being destroyed, so we don't want
+	 * to destroy it here, or we'd crash */
+}
+
+static void
+nexus_login_written_cb(gpointer data, gint source, PurpleInputCondition cond)
+{
+	MsnNexus *nexus = data;
+	MsnSession *session;
+	int len;
+
+	session = nexus->session;
+	g_return_if_fail(session != NULL);
+
+	if (nexus->input_handler == 0)
+		/* TODO: Use purple_ssl_input_add()? */
+		nexus->input_handler = purple_input_add(nexus->gsc->fd,
+			PURPLE_INPUT_READ, nexus_login_written_cb, nexus);
+
+
+	len = msn_ssl_read(nexus);
+
+	if (len < 0 && errno == EAGAIN)
+		return;
+	else if (len < 0) {
+		purple_input_remove(nexus->input_handler);
+		nexus->input_handler = 0;
+		g_free(nexus->read_buf);
+		nexus->read_buf = NULL;
+		nexus->read_len = 0;
+		/* TODO: error handling */
+		return;
+	}
+
+	if (g_strstr_len(nexus->read_buf, nexus->read_len,
+			"\r\n\r\n") == NULL)
+		return;
+
+	purple_input_remove(nexus->input_handler);
+	nexus->input_handler = 0;
+
+	purple_ssl_close(nexus->gsc);
+	nexus->gsc = NULL;
+
+	purple_debug_misc("msn", "ssl buffer: {%s}\n", nexus->read_buf);
+
+	if (strstr(nexus->read_buf, "HTTP/1.1 302") != NULL)
+	{
+		/* Redirect. */
+		char *location, *c;
+
+		location = strstr(nexus->read_buf, "Location: ");
+		if (location == NULL)
+		{
+			g_free(nexus->read_buf);
+			nexus->read_buf = NULL;
+			nexus->read_len = 0;
+
+			return;
+		}
+		location = strchr(location, ' ') + 1;
+
+		if ((c = strchr(location, '\r')) != NULL)
+			*c = '\0';
+
+		/* Skip the http:// */
+		if ((c = strchr(location, '/')) != NULL)
+			location = c + 2;
+
+		if ((c = strchr(location, '/')) != NULL)
+		{
+			g_free(nexus->login_path);
+			nexus->login_path = g_strdup(c);
+
+			*c = '\0';
+		}
+
+		g_free(nexus->login_host);
+		nexus->login_host = g_strdup(location);
+
+		nexus->gsc = purple_ssl_connect(session->account,
+				nexus->login_host, PURPLE_SSL_DEFAULT_PORT,
+				login_connect_cb, login_error_cb, nexus);
+	}
+	else if (strstr(nexus->read_buf, "HTTP/1.1 401 Unauthorized") != NULL)
+	{
+		const char *error;
+
+		if ((error = strstr(nexus->read_buf, "WWW-Authenticate")) != NULL)
+		{
+			if ((error = strstr(error, "cbtxt=")) != NULL)
+			{
+				const char *c;
+				char *temp;
+
+				error += strlen("cbtxt=");
+
+				if ((c = strchr(error, '\n')) == NULL)
+					c = error + strlen(error);
+
+				temp = g_strndup(error, c - error);
+				error = purple_url_decode(temp);
+				g_free(temp);
+				if ((temp = strstr(error, " Do one of the following or try again:")) != NULL)
+					*temp = '\0';
+			}
+		}
+
+		msn_session_set_error(session, MSN_ERROR_AUTH, error);
+	}
+	else if (strstr(nexus->read_buf, "HTTP/1.1 503 Service Unavailable"))
+	{
+		msn_session_set_error(session, MSN_ERROR_SERV_UNAVAILABLE, NULL);
+	}
+	else if (strstr(nexus->read_buf, "HTTP/1.1 200 OK"))
+	{
+		char *base, *c;
+		char *login_params;
+
+#if 0
+		/* All your base are belong to us. */
+		base = buffer;
+
+		/* For great cookie! */
+		while ((base = strstr(base, "Set-Cookie: ")) != NULL)
+		{
+			base += strlen("Set-Cookie: ");
+
+			c = strchr(base, ';');
+
+			session->login_cookies =
+				g_list_append(session->login_cookies,
+							  g_strndup(base, c - base));
+		}
+#endif
+
+		base  = strstr(nexus->read_buf, "Authentication-Info: ");
+
+		g_return_if_fail(base != NULL);
+
+		base  = strstr(base, "from-PP='");
+		base += strlen("from-PP='");
+		c     = strchr(base, '\'');
+
+		login_params = g_strndup(base, c - base);
+
+		msn_got_login_params(session, login_params);
+
+		g_free(login_params);
+
+		msn_nexus_destroy(nexus);
+		session->nexus = NULL;
+		return;
+	}
+
+	g_free(nexus->read_buf);
+	nexus->read_buf = NULL;
+	nexus->read_len = 0;
+
+}
+
+/* this guards against missing hash entries */
+static char *
+nexus_challenge_data_lookup(GHashTable *challenge_data, const char *key)
+{
+	char *entry;
+
+	return (entry = (char *)g_hash_table_lookup(challenge_data, key)) ?
+		entry : "(null)";
+}
+
+void
+login_connect_cb(gpointer data, PurpleSslConnection *gsc,
+				 PurpleInputCondition cond)
+{
+	MsnNexus *nexus;
+	MsnSession *session;
+	char *username, *password;
+	char *request_str, *head, *tail;
+	char *buffer = NULL;
+	guint32 ctint;
+
+	nexus = data;
+	g_return_if_fail(nexus != NULL);
+
+	session = nexus->session;
+	g_return_if_fail(session != NULL);
+
+	msn_session_set_login_step(session, MSN_LOGIN_STEP_GET_COOKIE);
+
+	username =
+		g_strdup(purple_url_encode(purple_account_get_username(session->account)));
+
+	password =
+		g_strndup(purple_url_encode(purple_connection_get_password(session->account->gc)), 16);
+
+	ctint = strtoul((char *)g_hash_table_lookup(nexus->challenge_data, "ct"), NULL, 10) + 200;
+
+	head = g_strdup_printf(
+		"GET %s HTTP/1.1\r\n"
+		"Authorization: Passport1.4 OrgVerb=GET,OrgURL=%s,sign-in=%s",
+		nexus->login_path,
+		(char *)g_hash_table_lookup(nexus->challenge_data, "ru"),
+		username);
+
+	tail = g_strdup_printf(
+		"lc=%s,id=%s,tw=%s,fs=%s,ru=%s,ct=%" G_GUINT32_FORMAT ",kpp=%s,kv=%s,ver=%s,tpf=%s\r\n"
+		"User-Agent: MSMSGS\r\n"
+		"Host: %s\r\n"
+		"Connection: Keep-Alive\r\n"
+		"Cache-Control: no-cache\r\n",
+		nexus_challenge_data_lookup(nexus->challenge_data, "lc"),
+		nexus_challenge_data_lookup(nexus->challenge_data, "id"),
+		nexus_challenge_data_lookup(nexus->challenge_data, "tw"),
+		nexus_challenge_data_lookup(nexus->challenge_data, "fs"),
+		nexus_challenge_data_lookup(nexus->challenge_data, "ru"),
+		ctint,
+		nexus_challenge_data_lookup(nexus->challenge_data, "kpp"),
+		nexus_challenge_data_lookup(nexus->challenge_data, "kv"),
+		nexus_challenge_data_lookup(nexus->challenge_data, "ver"),
+		nexus_challenge_data_lookup(nexus->challenge_data, "tpf"),
+		nexus->login_host);
+
+	buffer = g_strdup_printf("%s,pwd=XXXXXXXX,%s\r\n", head, tail);
+	request_str = g_strdup_printf("%s,pwd=%s,%s\r\n", head, password, tail);
+
+	purple_debug_misc("msn", "Sending: {%s}\n", buffer);
+
+	g_free(buffer);
+	g_free(head);
+	g_free(tail);
+	g_free(username);
+	g_free(password);
+
+	nexus->write_buf = request_str;
+	nexus->written_len = 0;
+
+	nexus->read_len = 0;
+
+	nexus->written_cb = nexus_login_written_cb;
+
+	nexus->input_handler = purple_input_add(gsc->fd, PURPLE_INPUT_WRITE,
+		nexus_write_cb, nexus);
+
+	nexus_write_cb(nexus, gsc->fd, PURPLE_INPUT_WRITE);
+
+	return;
+
+
+}
+
+static void
+nexus_connect_written_cb(gpointer data, gint source, PurpleInputCondition cond)
+{
+	MsnNexus *nexus = data;
+	int len;
+	char *da_login;
+	char *base, *c;
+
+	if (nexus->input_handler == 0)
+		/* TODO: Use purple_ssl_input_add()? */
+		nexus->input_handler = purple_input_add(nexus->gsc->fd,
+			PURPLE_INPUT_READ, nexus_connect_written_cb, nexus);
+
+	/* Get the PassportURLs line. */
+	len = msn_ssl_read(nexus);
+
+	if (len < 0 && errno == EAGAIN)
+		return;
+	else if (len < 0) {
+		purple_input_remove(nexus->input_handler);
+		nexus->input_handler = 0;
+		g_free(nexus->read_buf);
+		nexus->read_buf = NULL;
+		nexus->read_len = 0;
+		/* TODO: error handling */
+		return;
+	}
+
+	if (g_strstr_len(nexus->read_buf, nexus->read_len,
+			"\r\n\r\n") == NULL)
+		return;
+
+	purple_input_remove(nexus->input_handler);
+	nexus->input_handler = 0;
+
+	base = strstr(nexus->read_buf, "PassportURLs");
+
+	if (base == NULL)
+	{
+		g_free(nexus->read_buf);
+		nexus->read_buf = NULL;
+		nexus->read_len = 0;
+		return;
+	}
+
+	if ((da_login = strstr(base, "DALogin=")) != NULL)
+	{
+		/* skip over "DALogin=" */
+		da_login += 8;
+
+		if ((c = strchr(da_login, ',')) != NULL)
+			*c = '\0';
+
+		if ((c = strchr(da_login, '/')) != NULL)
+		{
+			nexus->login_path = g_strdup(c);
+			*c = '\0';
+		}
+
+		nexus->login_host = g_strdup(da_login);
+	}
+
+	g_free(nexus->read_buf);
+	nexus->read_buf = NULL;
+	nexus->read_len = 0;
+
+	purple_ssl_close(nexus->gsc);
+
+	/* Now begin the connection to the login server. */
+	nexus->gsc = purple_ssl_connect(nexus->session->account,
+			nexus->login_host, PURPLE_SSL_DEFAULT_PORT,
+			login_connect_cb, login_error_cb, nexus);
+}
+
+
+/**************************************************************************
+ * Connect
+ **************************************************************************/
+
+static void
+nexus_connect_cb(gpointer data, PurpleSslConnection *gsc,
+				 PurpleInputCondition cond)
+{
+	MsnNexus *nexus;
+	MsnSession *session;
+
+	nexus = data;
+	g_return_if_fail(nexus != NULL);
+
+	session = nexus->session;
+	g_return_if_fail(session != NULL);
+
+	msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH);
+
+	nexus->write_buf = g_strdup("GET /rdr/pprdr.asp\r\n\r\n");
+	nexus->written_len = 0;
+
+	nexus->read_len = 0;
+
+	nexus->written_cb = nexus_connect_written_cb;
+
+	nexus->input_handler = purple_input_add(gsc->fd, PURPLE_INPUT_WRITE,
+		nexus_write_cb, nexus);
+
+	nexus_write_cb(nexus, gsc->fd, PURPLE_INPUT_WRITE);
+}
+
+void
+msn_nexus_connect(MsnNexus *nexus)
+{
+	nexus->gsc = purple_ssl_connect(nexus->session->account,
+			"nexus.passport.com", PURPLE_SSL_DEFAULT_PORT,
+			nexus_connect_cb, login_error_cb, nexus);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/nexus.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,52 @@
+/**
+ * @file nexus.h MSN Nexus functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_NEXUS_H_
+#define _MSN_NEXUS_H_
+
+typedef struct _MsnNexus MsnNexus;
+
+struct _MsnNexus
+{
+	MsnSession *session;
+
+	char *login_host;
+	char *login_path;
+	GHashTable *challenge_data;
+	PurpleSslConnection *gsc;
+
+	guint input_handler;
+
+	char *write_buf;
+	gsize written_len;
+	PurpleInputFunction written_cb;
+
+	char *read_buf;
+	gsize read_len;
+};
+
+void msn_nexus_connect(MsnNexus *nexus);
+MsnNexus *msn_nexus_new(MsnSession *session);
+void msn_nexus_destroy(MsnNexus *nexus);
+
+#endif /* _MSN_NEXUS_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/notification.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,1464 @@
+/**
+ * @file notification.c Notification server functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "notification.h"
+#include "state.h"
+#include "error.h"
+#include "msn-utils.h"
+#include "page.h"
+
+#include "userlist.h"
+#include "sync.h"
+#include "slplink.h"
+
+static MsnTable *cbs_table;
+
+/**************************************************************************
+ * Main
+ **************************************************************************/
+
+static void
+destroy_cb(MsnServConn *servconn)
+{
+	MsnNotification *notification;
+
+	notification = servconn->cmdproc->data;
+	g_return_if_fail(notification != NULL);
+
+	msn_notification_destroy(notification);
+}
+
+MsnNotification *
+msn_notification_new(MsnSession *session)
+{
+	MsnNotification *notification;
+	MsnServConn *servconn;
+
+	g_return_val_if_fail(session != NULL, NULL);
+
+	notification = g_new0(MsnNotification, 1);
+
+	notification->session = session;
+	notification->servconn = servconn = msn_servconn_new(session, MSN_SERVCONN_NS);
+	msn_servconn_set_destroy_cb(servconn, destroy_cb);
+
+	notification->cmdproc = servconn->cmdproc;
+	notification->cmdproc->data = notification;
+	notification->cmdproc->cbs_table = cbs_table;
+
+	return notification;
+}
+
+void
+msn_notification_destroy(MsnNotification *notification)
+{
+	notification->cmdproc->data = NULL;
+
+	msn_servconn_set_destroy_cb(notification->servconn, NULL);
+
+	msn_servconn_destroy(notification->servconn);
+
+	g_free(notification);
+}
+
+/**************************************************************************
+ * Connect
+ **************************************************************************/
+
+static void
+connect_cb(MsnServConn *servconn)
+{
+	MsnCmdProc *cmdproc;
+	MsnSession *session;
+	PurpleAccount *account;
+	char **a, **c, *vers;
+	int i;
+
+	g_return_if_fail(servconn != NULL);
+
+	cmdproc = servconn->cmdproc;
+	session = servconn->session;
+	account = session->account;
+
+	/* Allocate an array for CVR0, NULL, and all the versions */
+	a = c = g_new0(char *, session->protocol_ver - 8 + 3);
+
+	for (i = session->protocol_ver; i >= 8; i--)
+		*c++ = g_strdup_printf("MSNP%d", i);
+
+	*c++ = g_strdup("CVR0");
+
+	vers = g_strjoinv(" ", a);
+
+	if (session->login_step == MSN_LOGIN_STEP_START)
+		msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE);
+	else
+		msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE2);
+
+	msn_cmdproc_send(cmdproc, "VER", "%s", vers);
+
+	g_strfreev(a);
+	g_free(vers);
+}
+
+gboolean
+msn_notification_connect(MsnNotification *notification, const char *host, int port)
+{
+	MsnServConn *servconn;
+
+	g_return_val_if_fail(notification != NULL, FALSE);
+
+	servconn = notification->servconn;
+
+	msn_servconn_set_connect_cb(servconn, connect_cb);
+	notification->in_use = msn_servconn_connect(servconn, host, port);
+
+	return notification->in_use;
+}
+
+void
+msn_notification_disconnect(MsnNotification *notification)
+{
+	g_return_if_fail(notification != NULL);
+	g_return_if_fail(notification->in_use);
+
+	msn_servconn_disconnect(notification->servconn);
+
+	notification->in_use = FALSE;
+}
+
+/**************************************************************************
+ * Util
+ **************************************************************************/
+
+static void
+group_error_helper(MsnSession *session, const char *msg, int group_id, int error)
+{
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	char *reason = NULL;
+	char *title = NULL;
+
+	account = session->account;
+	gc = purple_account_get_connection(account);
+
+	if (error == 224)
+	{
+		if (group_id == 0)
+		{
+			return;
+		}
+		else
+		{
+			const char *group_name;
+			group_name =
+				msn_userlist_find_group_name(session->userlist,
+											 group_id);
+			reason = g_strdup_printf(_("%s is not a valid group."),
+									 group_name);
+		}
+	}
+	else
+	{
+		reason = g_strdup(_("Unknown error."));
+	}
+
+	title = g_strdup_printf(_("%s on %s (%s)"), msg,
+						  purple_account_get_username(account),
+						  purple_account_get_protocol_name(account));
+	purple_notify_error(gc, NULL, title, reason);
+	g_free(title);
+	g_free(reason);
+}
+
+/**************************************************************************
+ * Login
+ **************************************************************************/
+
+void
+msn_got_login_params(MsnSession *session, const char *login_params)
+{
+	MsnCmdProc *cmdproc;
+
+	cmdproc = session->notification->cmdproc;
+
+	msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_END);
+
+	msn_cmdproc_send(cmdproc, "USR", "TWN S %s", login_params);
+}
+
+static void
+cvr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	PurpleAccount *account;
+
+	account = cmdproc->session->account;
+
+	msn_cmdproc_send(cmdproc, "USR", "TWN I %s",
+					 purple_account_get_username(account));
+}
+
+static void
+usr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	PurpleAccount *account;
+	PurpleConnection *gc;
+
+	session = cmdproc->session;
+	account = session->account;
+	gc = purple_account_get_connection(account);
+
+	if (!g_ascii_strcasecmp(cmd->params[1], "OK"))
+	{
+		/* OK */
+		const char *friendly = purple_url_decode(cmd->params[3]);
+
+		purple_connection_set_display_name(gc, friendly);
+
+		msn_session_set_login_step(session, MSN_LOGIN_STEP_SYN);
+
+		msn_cmdproc_send(cmdproc, "SYN", "%s", "0");
+	}
+	else if (!g_ascii_strcasecmp(cmd->params[1], "TWN"))
+	{
+		/* Passport authentication */
+		char **elems, **cur, **tokens;
+
+		session->nexus = msn_nexus_new(session);
+
+		/* Parse the challenge data. */
+
+		elems = g_strsplit(cmd->params[3], ",", 0);
+
+		for (cur = elems; *cur != NULL; cur++)
+		{
+				tokens = g_strsplit(*cur, "=", 2);
+				g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]);
+				/* Don't free each of the tokens, only the array. */
+				g_free(tokens);
+		}
+
+		g_strfreev(elems);
+
+		msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_START);
+
+		msn_nexus_connect(session->nexus);
+	}
+}
+
+static void
+usr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
+{
+	MsnErrorType msnerr = 0;
+
+	switch (error)
+	{
+		case 500:
+		case 601:
+		case 910:
+		case 921:
+			msnerr = MSN_ERROR_SERV_UNAVAILABLE;
+			break;
+		case 911:
+			msnerr = MSN_ERROR_AUTH;
+			break;
+		default:
+			return;
+			break;
+	}
+
+	msn_session_set_error(cmdproc->session, msnerr, NULL);
+}
+
+static void
+ver_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	PurpleAccount *account;
+	gboolean protocol_supported = FALSE;
+	char proto_str[8];
+	size_t i;
+
+	session = cmdproc->session;
+	account = session->account;
+
+	g_snprintf(proto_str, sizeof(proto_str), "MSNP%d", session->protocol_ver);
+
+	for (i = 1; i < cmd->param_count; i++)
+	{
+		if (!strcmp(cmd->params[i], proto_str))
+		{
+			protocol_supported = TRUE;
+			break;
+		}
+	}
+
+	if (!protocol_supported)
+	{
+		msn_session_set_error(session, MSN_ERROR_UNSUPPORTED_PROTOCOL,
+							  NULL);
+		return;
+	}
+
+	msn_cmdproc_send(cmdproc, "CVR",
+					 "0x0409 winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS %s",
+					 purple_account_get_username(account));
+}
+
+/**************************************************************************
+ * Log out
+ **************************************************************************/
+
+static void
+out_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	if (!g_ascii_strcasecmp(cmd->params[0], "OTH"))
+		msn_session_set_error(cmdproc->session, MSN_ERROR_SIGN_OTHER,
+							  NULL);
+	else if (!g_ascii_strcasecmp(cmd->params[0], "SSD"))
+		msn_session_set_error(cmdproc->session, MSN_ERROR_SERV_DOWN, NULL);
+}
+
+void
+msn_notification_close(MsnNotification *notification)
+{
+	g_return_if_fail(notification != NULL);
+
+	if (!notification->in_use)
+		return;
+
+	msn_cmdproc_send_quick(notification->cmdproc, "OUT", NULL, NULL);
+
+	msn_notification_disconnect(notification);
+}
+
+/**************************************************************************
+ * Messages
+ **************************************************************************/
+
+static void
+msg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
+			 size_t len)
+{
+	MsnMessage *msg;
+
+	msg = msn_message_new_from_cmd(cmdproc->session, cmd);
+
+	msn_message_parse_payload(msg, payload, len);
+#ifdef MSN_DEBUG_NS
+	msn_message_show_readable(msg, "Notification", TRUE);
+#endif
+
+	msn_cmdproc_process_msg(cmdproc, msg);
+
+	msn_message_destroy(msg);
+}
+
+static void
+msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	/* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued
+	 * command and we are processing it */
+
+	if (cmd->payload == NULL)
+	{
+		cmdproc->last_cmd->payload_cb  = msg_cmd_post;
+		cmdproc->servconn->payload_len = atoi(cmd->params[2]);
+	}
+	else
+	{
+		g_return_if_fail(cmd->payload_cb != NULL);
+
+		cmd->payload_cb(cmdproc, cmd, cmd->payload, cmd->payload_len);
+	}
+}
+
+/**************************************************************************
+ * Challenges
+ **************************************************************************/
+
+static void
+chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnTransaction *trans;
+	char buf[33];
+	const char *challenge_resp;
+	PurpleCipher *cipher;
+	PurpleCipherContext *context;
+	guchar digest[16];
+	int i;
+
+	cipher = purple_ciphers_find_cipher("md5");
+	context = purple_cipher_context_new(cipher, NULL);
+
+	purple_cipher_context_append(context, (const guchar *)cmd->params[1],
+							   strlen(cmd->params[1]));
+
+	challenge_resp = "VT6PX?UQTM4WM%YR";
+
+	purple_cipher_context_append(context, (const guchar *)challenge_resp,
+							   strlen(challenge_resp));
+	purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
+	purple_cipher_context_destroy(context);
+
+	for (i = 0; i < 16; i++)
+		g_snprintf(buf + (i*2), 3, "%02x", digest[i]);
+
+	trans = msn_transaction_new(cmdproc, "QRY", "%s 32", "PROD0038W!61ZTF9");
+
+	msn_transaction_set_payload(trans, buf, 32);
+
+	msn_cmdproc_send_trans(cmdproc, trans);
+}
+
+/**************************************************************************
+ * Buddy Lists
+ **************************************************************************/
+
+static void
+add_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	MsnUser *user;
+	const char *list;
+	const char *passport;
+	const char *friendly;
+	MsnListId list_id;
+	int group_id;
+
+	list     = cmd->params[1];
+	passport = cmd->params[3];
+	friendly = purple_url_decode(cmd->params[4]);
+
+	session = cmdproc->session;
+
+	user = msn_userlist_find_user(session->userlist, passport);
+
+	if (user == NULL)
+	{
+		user = msn_user_new(session->userlist, passport, friendly);
+		msn_userlist_add_user(session->userlist, user);
+	}
+	else
+		msn_user_set_friendly_name(user, friendly);
+
+	list_id = msn_get_list_id(list);
+
+	if (cmd->param_count >= 6)
+		group_id = atoi(cmd->params[5]);
+	else
+		group_id = -1;
+
+	msn_got_add_user(session, user, list_id, group_id);
+	msn_user_update(user);
+}
+
+static void
+add_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
+{
+	MsnSession *session;
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	const char *list, *passport;
+	char *reason = NULL;
+	char *msg = NULL;
+	char **params;
+
+	session = cmdproc->session;
+	account = session->account;
+	gc = purple_account_get_connection(account);
+	params = g_strsplit(trans->params, " ", 0);
+
+	list     = params[0];
+	passport = params[1];
+
+	if (!strcmp(list, "FL"))
+		msg = g_strdup_printf(_("Unable to add user on %s (%s)"),
+							  purple_account_get_username(account),
+							  purple_account_get_protocol_name(account));
+	else if (!strcmp(list, "BL"))
+		msg = g_strdup_printf(_("Unable to block user on %s (%s)"),
+							  purple_account_get_username(account),
+							  purple_account_get_protocol_name(account));
+	else if (!strcmp(list, "AL"))
+		msg = g_strdup_printf(_("Unable to permit user on %s (%s)"),
+							  purple_account_get_username(account),
+							  purple_account_get_protocol_name(account));
+
+	if (!strcmp(list, "FL"))
+	{
+		if (error == 210)
+		{
+			reason = g_strdup_printf(_("%s could not be added because "
+									   "your buddy list is full."), passport);
+		}
+	}
+
+	if (reason == NULL)
+	{
+		if (error == 208)
+		{
+			reason = g_strdup_printf(_("%s is not a valid passport account."),
+									 passport);
+		}
+		else if (error == 500)
+		{
+			reason = g_strdup(_("Service Temporarily Unavailable."));
+		}
+		else
+		{
+			reason = g_strdup(_("Unknown error."));
+		}
+	}
+
+	if (msg != NULL)
+	{
+		purple_notify_error(gc, NULL, msg, reason);
+		g_free(msg);
+	}
+
+	if (!strcmp(list, "FL"))
+	{
+		PurpleBuddy *buddy;
+
+		buddy = purple_find_buddy(account, passport);
+
+		if (buddy != NULL)
+			purple_blist_remove_buddy(buddy);
+	}
+
+	g_free(reason);
+
+	g_strfreev(params);
+}
+
+static void
+adg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	gint group_id;
+	const char *group_name;
+
+	session = cmdproc->session;
+
+	group_id = atoi(cmd->params[3]);
+
+	group_name = purple_url_decode(cmd->params[2]);
+
+	msn_group_new(session->userlist, group_id, group_name);
+
+	/* There is a user that must me moved to this group */
+	if (cmd->trans->data)
+	{
+		/* msn_userlist_move_buddy(); */
+		MsnUserList *userlist = cmdproc->session->userlist;
+		MsnMoveBuddy *data = cmd->trans->data;
+
+		if (data->old_group_name != NULL)
+		{
+			msn_userlist_rem_buddy(userlist, data->who, MSN_LIST_FL, data->old_group_name);
+			g_free(data->old_group_name);
+		}
+
+		msn_userlist_add_buddy(userlist, data->who, MSN_LIST_FL, group_name);
+		g_free(data->who);
+
+	}
+}
+
+static void
+qng_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	static int count = 0;
+	const char *passport;
+	PurpleAccount *account;
+
+	session = cmdproc->session;
+	account = session->account;
+
+	if (session->passport_info.file == NULL)
+		return;
+
+	passport = purple_normalize(account, purple_account_get_username(account));
+
+	if ((strstr(passport, "@hotmail.") != NULL) ||
+		(strstr(passport, "@msn.com") != NULL))
+		return;
+
+	if (count++ < 26)
+		return;
+
+	count = 0;
+	msn_cmdproc_send(cmdproc, "URL", "%s", "INBOX");
+}
+
+
+static void
+fln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSlpLink *slplink;
+	MsnUser *user;
+
+	user = msn_userlist_find_user(cmdproc->session->userlist, cmd->params[0]);
+
+	user->status = "offline";
+	msn_user_update(user);
+
+	slplink = msn_session_find_slplink(cmdproc->session, cmd->params[0]);
+
+	if (slplink != NULL)
+		msn_slplink_destroy(slplink);
+
+}
+
+static void
+iln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	MsnUser *user;
+	MsnObject *msnobj;
+	const char *state, *passport, *friendly;
+
+	session = cmdproc->session;
+	account = session->account;
+	gc = purple_account_get_connection(account);
+
+	state    = cmd->params[1];
+	passport = cmd->params[2];
+	friendly = purple_url_decode(cmd->params[3]);
+
+	user = msn_userlist_find_user(session->userlist, passport);
+
+	serv_got_alias(gc, passport, friendly);
+
+	msn_user_set_friendly_name(user, friendly);
+
+	if (session->protocol_ver >= 9 && cmd->param_count == 6)
+	{
+		msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[5]));
+		msn_user_set_object(user, msnobj);
+	}
+
+	msn_user_set_state(user, state);
+	msn_user_update(user);
+}
+
+static void
+ipg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len)
+{
+#if 0
+	purple_debug_misc("msn", "Incoming Page: {%s}\n", payload);
+#endif
+}
+
+static void
+ipg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	cmdproc->servconn->payload_len = atoi(cmd->params[0]);
+	cmdproc->last_cmd->payload_cb = ipg_cmd_post;
+}
+
+static void
+nln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	MsnUser *user;
+	MsnObject *msnobj;
+	int clientid;
+	const char *state, *passport, *friendly, *old_friendly;
+
+	session = cmdproc->session;
+	account = session->account;
+	gc = purple_account_get_connection(account);
+
+	state    = cmd->params[0];
+	passport = cmd->params[1];
+	friendly = purple_url_decode(cmd->params[2]);
+
+	user = msn_userlist_find_user(session->userlist, passport);
+
+	old_friendly = msn_user_get_friendly_name(user);
+	if (!old_friendly || (old_friendly && (!friendly || strcmp(old_friendly, friendly))))
+	{
+		serv_got_alias(gc, passport, friendly);
+		msn_user_set_friendly_name(user, friendly);
+	}
+
+	if (session->protocol_ver >= 9)
+	{
+		if (cmd->param_count == 5)
+		{
+			msnobj =
+				msn_object_new_from_string(purple_url_decode(cmd->params[4]));
+			msn_user_set_object(user, msnobj);
+		}
+		else
+		{
+			msn_user_set_object(user, NULL);
+		}
+	}
+
+	clientid = atoi(cmd->params[3]);
+	user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE);
+
+	msn_user_set_state(user, state);
+	msn_user_update(user);
+}
+
+#if 0
+static void
+chg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	char *state = cmd->params[1];
+	int state_id = 0;
+
+	if (!strcmp(state, "NLN"))
+		state_id = MSN_ONLINE;
+	else if (!strcmp(state, "BSY"))
+		state_id = MSN_BUSY;
+	else if (!strcmp(state, "IDL"))
+		state_id = MSN_IDLE;
+	else if (!strcmp(state, "BRB"))
+		state_id = MSN_BRB;
+	else if (!strcmp(state, "AWY"))
+		state_id = MSN_AWAY;
+	else if (!strcmp(state, "PHN"))
+		state_id = MSN_PHONE;
+	else if (!strcmp(state, "LUN"))
+		state_id = MSN_LUNCH;
+	else if (!strcmp(state, "HDN"))
+		state_id = MSN_HIDDEN;
+
+	cmdproc->session->state = state_id;
+}
+#endif
+
+
+static void
+not_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len)
+{
+#if 0
+	MSN_SET_PARAMS("NOT %d\r\n%s", cmdproc->servconn->payload, payload);
+	purple_debug_misc("msn", "Notification: {%s}\n", payload);
+#endif
+}
+
+static void
+not_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	cmdproc->servconn->payload_len = atoi(cmd->params[0]);
+	cmdproc->last_cmd->payload_cb = not_cmd_post;
+}
+
+static void
+rea_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	/* TODO: This might be for us too */
+
+	MsnSession *session;
+	PurpleConnection *gc;
+	const char *friendly;
+
+	session = cmdproc->session;
+	gc = session->account->gc;
+	friendly = purple_url_decode(cmd->params[3]);
+
+	purple_connection_set_display_name(gc, friendly);
+}
+
+static void
+prp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session = cmdproc->session;
+	const char *type, *value;
+
+	g_return_if_fail(cmd->param_count >= 3);
+
+	type  = cmd->params[2];
+
+	if (cmd->param_count == 4)
+	{
+		value = cmd->params[3];
+		if (!strcmp(type, "PHH"))
+			msn_user_set_home_phone(session->user, purple_url_decode(value));
+		else if (!strcmp(type, "PHW"))
+			msn_user_set_work_phone(session->user, purple_url_decode(value));
+		else if (!strcmp(type, "PHM"))
+			msn_user_set_mobile_phone(session->user, purple_url_decode(value));
+	}
+	else
+	{
+		if (!strcmp(type, "PHH"))
+			msn_user_set_home_phone(session->user, NULL);
+		else if (!strcmp(type, "PHW"))
+			msn_user_set_work_phone(session->user, NULL);
+		else if (!strcmp(type, "PHM"))
+			msn_user_set_mobile_phone(session->user, NULL);
+	}
+}
+
+static void
+reg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	int group_id;
+	const char *group_name;
+
+	session = cmdproc->session;
+	group_id = atoi(cmd->params[2]);
+	group_name = purple_url_decode(cmd->params[3]);
+
+	msn_userlist_rename_group_id(session->userlist, group_id, group_name);
+}
+
+static void
+reg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
+{
+	int group_id;
+	char **params;
+
+	params = g_strsplit(trans->params, " ", 0);
+
+	group_id = atoi(params[0]);
+
+	group_error_helper(cmdproc->session, _("Unable to rename group"), group_id, error);
+
+	g_strfreev(params);
+}
+
+static void
+rem_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	MsnUser *user;
+	const char *list;
+	const char *passport;
+	MsnListId list_id;
+	int group_id;
+
+	session = cmdproc->session;
+	list = cmd->params[1];
+	passport = cmd->params[3];
+	user = msn_userlist_find_user(session->userlist, passport);
+
+	g_return_if_fail(user != NULL);
+
+	list_id = msn_get_list_id(list);
+
+	if (cmd->param_count == 5)
+		group_id = atoi(cmd->params[4]);
+	else
+		group_id = -1;
+
+	msn_got_rem_user(session, user, list_id, group_id);
+	msn_user_update(user);
+}
+
+static void
+rmg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	int group_id;
+
+	session = cmdproc->session;
+	group_id = atoi(cmd->params[2]);
+
+	msn_userlist_remove_group_id(session->userlist, group_id);
+}
+
+static void
+rmg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
+{
+	int group_id;
+	char **params;
+
+	params = g_strsplit(trans->params, " ", 0);
+
+	group_id = atoi(params[0]);
+
+	group_error_helper(cmdproc->session, _("Unable to delete group"), group_id, error);
+
+	g_strfreev(params);
+}
+
+static void
+syn_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	MsnSync *sync;
+	int total_users;
+
+	session = cmdproc->session;
+
+	if (cmd->param_count == 2)
+	{
+		/*
+		 * This can happen if we sent a SYN with an up-to-date
+		 * buddy list revision, but we send 0 to get a full list.
+		 * So, error out.
+		 */
+
+		msn_session_set_error(cmdproc->session, MSN_ERROR_BAD_BLIST, NULL);
+		return;
+	}
+
+	total_users  = atoi(cmd->params[2]);
+
+	sync = msn_sync_new(session);
+	sync->total_users = total_users;
+	sync->old_cbs_table = cmdproc->cbs_table;
+
+	session->sync = sync;
+	cmdproc->cbs_table = sync->cbs_table;
+}
+
+/**************************************************************************
+ * Misc commands
+ **************************************************************************/
+
+static void
+url_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	PurpleAccount *account;
+	const char *rru;
+	const char *url;
+	PurpleCipher *cipher;
+	PurpleCipherContext *context;
+	guchar digest[16];
+	FILE *fd;
+	char *buf;
+	char buf2[3];
+	char sendbuf[64];
+	int i;
+
+	session = cmdproc->session;
+	account = session->account;
+
+	rru = cmd->params[1];
+	url = cmd->params[2];
+
+	buf = g_strdup_printf("%s%lu%s",
+			   session->passport_info.mspauth ? session->passport_info.mspauth : "BOGUS",
+			   time(NULL) - session->passport_info.sl,
+			   purple_connection_get_password(account->gc));
+
+	cipher = purple_ciphers_find_cipher("md5");
+	context = purple_cipher_context_new(cipher, NULL);
+
+	purple_cipher_context_append(context, (const guchar *)buf, strlen(buf));
+	purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
+	purple_cipher_context_destroy(context);
+
+	g_free(buf);
+
+	memset(sendbuf, 0, sizeof(sendbuf));
+
+	for (i = 0; i < 16; i++)
+	{
+		g_snprintf(buf2, sizeof(buf2), "%02x", digest[i]);
+		strcat(sendbuf, buf2);
+	}
+
+	if (session->passport_info.file != NULL)
+	{
+		g_unlink(session->passport_info.file);
+		g_free(session->passport_info.file);
+	}
+
+	if ((fd = purple_mkstemp(&session->passport_info.file, FALSE)) == NULL)
+	{
+		purple_debug_error("msn",
+						 "Error opening temp passport file: %s\n",
+						 strerror(errno));
+	}
+	else
+	{
+#ifdef _WIN32
+		fputs("<!-- saved from url=(0013)about:internet -->\n", fd);
+#endif
+		fputs("<html>\n"
+			  "<head>\n"
+			  "<noscript>\n"
+			  "<meta http-equiv=\"Refresh\" content=\"0; "
+			  "url=http://www.hotmail.com\">\n"
+			  "</noscript>\n"
+			  "</head>\n\n",
+			  fd);
+
+		fprintf(fd, "<body onload=\"document.pform.submit(); \">\n");
+		fprintf(fd, "<form name=\"pform\" action=\"%s\" method=\"POST\">\n\n",
+				url);
+		fprintf(fd, "<input type=\"hidden\" name=\"mode\" value=\"ttl\">\n");
+		fprintf(fd, "<input type=\"hidden\" name=\"login\" value=\"%s\">\n",
+				purple_account_get_username(account));
+		fprintf(fd, "<input type=\"hidden\" name=\"username\" value=\"%s\">\n",
+				purple_account_get_username(account));
+		if (session->passport_info.sid != NULL)
+			fprintf(fd, "<input type=\"hidden\" name=\"sid\" value=\"%s\">\n",
+					session->passport_info.sid);
+		if (session->passport_info.kv != NULL)
+			fprintf(fd, "<input type=\"hidden\" name=\"kv\" value=\"%s\">\n",
+					session->passport_info.kv);
+		fprintf(fd, "<input type=\"hidden\" name=\"id\" value=\"2\">\n");
+		fprintf(fd, "<input type=\"hidden\" name=\"sl\" value=\"%ld\">\n",
+				time(NULL) - session->passport_info.sl);
+		fprintf(fd, "<input type=\"hidden\" name=\"rru\" value=\"%s\">\n",
+				rru);
+		if (session->passport_info.mspauth != NULL)
+			fprintf(fd, "<input type=\"hidden\" name=\"auth\" value=\"%s\">\n",
+					session->passport_info.mspauth);
+		fprintf(fd, "<input type=\"hidden\" name=\"creds\" value=\"%s\">\n",
+				sendbuf); /* TODO Digest me (huh? -- ChipX86) */
+		fprintf(fd, "<input type=\"hidden\" name=\"svc\" value=\"mail\">\n");
+		fprintf(fd, "<input type=\"hidden\" name=\"js\" value=\"yes\">\n");
+		fprintf(fd, "</form></body>\n");
+		fprintf(fd, "</html>\n");
+
+		if (fclose(fd))
+		{
+			purple_debug_error("msn",
+							 "Error closing temp passport file: %s\n",
+							 strerror(errno));
+
+			g_unlink(session->passport_info.file);
+			g_free(session->passport_info.file);
+			session->passport_info.file = NULL;
+		}
+#ifdef _WIN32
+		else
+		{
+			/*
+			 * Renaming file with .html extension, so that the
+			 * win32 open_url will work.
+			 */
+			char *tmp;
+
+			if ((tmp =
+				g_strdup_printf("%s.html",
+					session->passport_info.file)) != NULL)
+			{
+				if (g_rename(session->passport_info.file,
+							tmp) == 0)
+				{
+					g_free(session->passport_info.file);
+					session->passport_info.file = tmp;
+				}
+				else
+					g_free(tmp);
+			}
+		}
+#endif
+	}
+}
+/**************************************************************************
+ * Switchboards
+ **************************************************************************/
+
+static void
+rng_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+	const char *session_id;
+	char *host;
+	int port;
+
+	session = cmdproc->session;
+	session_id = cmd->params[0];
+
+	msn_parse_socket(cmd->params[1], &host, &port);
+
+	if (session->http_method)
+		port = 80;
+
+	swboard = msn_switchboard_new(session);
+
+	msn_switchboard_set_invited(swboard, TRUE);
+	msn_switchboard_set_session_id(swboard, cmd->params[0]);
+	msn_switchboard_set_auth_key(swboard, cmd->params[3]);
+	swboard->im_user = g_strdup(cmd->params[4]);
+	/* msn_switchboard_add_user(swboard, cmd->params[4]); */
+
+	if (!msn_switchboard_connect(swboard, host, port))
+		msn_switchboard_destroy(swboard);
+
+	g_free(host);
+}
+
+static void
+xfr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	char *host;
+	int port;
+
+	if (strcmp(cmd->params[1], "SB") && strcmp(cmd->params[1], "NS"))
+	{
+		/* Maybe we can have a generic bad command error. */
+		purple_debug_error("msn", "Bad XFR command (%s)\n", cmd->params[1]);
+		return;
+	}
+
+	msn_parse_socket(cmd->params[2], &host, &port);
+
+	if (!strcmp(cmd->params[1], "SB"))
+	{
+		purple_debug_error("msn", "This shouldn't be handled here.\n");
+	}
+	else if (!strcmp(cmd->params[1], "NS"))
+	{
+		MsnSession *session;
+
+		session = cmdproc->session;
+
+		msn_session_set_login_step(session, MSN_LOGIN_STEP_TRANSFER);
+
+		msn_notification_connect(session->notification, host, port);
+	}
+
+	g_free(host);
+}
+
+/**************************************************************************
+ * Message Types
+ **************************************************************************/
+
+static void
+profile_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	MsnSession *session;
+	const char *value;
+
+	session = cmdproc->session;
+
+	if (strcmp(msg->remote_user, "Hotmail"))
+		/* This isn't an official message. */
+		return;
+
+	if ((value = msn_message_get_attr(msg, "kv")) != NULL)
+	{
+		g_free(session->passport_info.kv);
+		session->passport_info.kv = g_strdup(value);
+	}
+
+	if ((value = msn_message_get_attr(msg, "sid")) != NULL)
+	{
+		g_free(session->passport_info.sid);
+		session->passport_info.sid = g_strdup(value);
+	}
+
+	if ((value = msn_message_get_attr(msg, "MSPAuth")) != NULL)
+	{
+		g_free(session->passport_info.mspauth);
+		session->passport_info.mspauth = g_strdup(value);
+	}
+
+	if ((value = msn_message_get_attr(msg, "ClientIP")) != NULL)
+	{
+		g_free(session->passport_info.client_ip);
+		session->passport_info.client_ip = g_strdup(value);
+	}
+
+	if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL)
+		session->passport_info.client_port = ntohs(atoi(value));
+
+	if ((value = msn_message_get_attr(msg, "LoginTime")) != NULL)
+		session->passport_info.sl = atol(value);
+}
+
+static void
+initial_email_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	MsnSession *session;
+	PurpleConnection *gc;
+	GHashTable *table;
+	const char *unread;
+
+	session = cmdproc->session;
+	gc = session->account->gc;
+
+	if (strcmp(msg->remote_user, "Hotmail"))
+		/* This isn't an official message. */
+		return;
+
+	if (session->passport_info.file == NULL)
+	{
+		MsnTransaction *trans;
+		trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX");
+		msn_transaction_queue_cmd(trans, msg->cmd);
+
+		msn_cmdproc_send_trans(cmdproc, trans);
+
+		return;
+	}
+
+	if (!purple_account_get_check_mail(session->account))
+		return;
+
+	table = msn_message_get_hashtable_from_body(msg);
+
+	unread = g_hash_table_lookup(table, "Inbox-Unread");
+
+	if (unread != NULL)
+	{
+		int count = atoi(unread);
+
+		if (count > 0)
+		{
+			const char *passport;
+			const char *url;
+
+			passport = msn_user_get_passport(session->user);
+			url = session->passport_info.file;
+
+			purple_notify_emails(gc, atoi(unread), FALSE, NULL, NULL,
+							   &passport, &url, NULL, NULL);
+		}
+	}
+
+	g_hash_table_destroy(table);
+}
+
+static void
+email_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	MsnSession *session;
+	PurpleConnection *gc;
+	GHashTable *table;
+	char *from, *subject, *tmp;
+
+	session = cmdproc->session;
+	gc = session->account->gc;
+
+	if (strcmp(msg->remote_user, "Hotmail"))
+		/* This isn't an official message. */
+		return;
+
+	if (session->passport_info.file == NULL)
+	{
+		MsnTransaction *trans;
+		trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX");
+		msn_transaction_queue_cmd(trans, msg->cmd);
+
+		msn_cmdproc_send_trans(cmdproc, trans);
+
+		return;
+	}
+
+	if (!purple_account_get_check_mail(session->account))
+		return;
+
+	table = msn_message_get_hashtable_from_body(msg);
+
+	from = subject = NULL;
+
+	tmp = g_hash_table_lookup(table, "From");
+	if (tmp != NULL)
+		from = purple_mime_decode_field(tmp);
+
+	tmp = g_hash_table_lookup(table, "Subject");
+	if (tmp != NULL)
+		subject = purple_mime_decode_field(tmp);
+
+	purple_notify_email(gc,
+					  (subject != NULL ? subject : ""),
+					  (from != NULL ?  from : ""),
+					  msn_user_get_passport(session->user),
+					  session->passport_info.file, NULL, NULL);
+
+	g_free(from);
+	g_free(subject);
+
+	g_hash_table_destroy(table);
+}
+
+static void
+system_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	GHashTable *table;
+	const char *type_s;
+
+	if (strcmp(msg->remote_user, "Hotmail"))
+		/* This isn't an official message. */
+		return;
+
+	table = msn_message_get_hashtable_from_body(msg);
+
+	if ((type_s = g_hash_table_lookup(table, "Type")) != NULL)
+	{
+		int type = atoi(type_s);
+		char buf[MSN_BUF_LEN];
+		int minutes;
+
+		switch (type)
+		{
+			case 1:
+				minutes = atoi(g_hash_table_lookup(table, "Arg1"));
+				g_snprintf(buf, sizeof(buf), dngettext(PACKAGE, 
+							"The MSN server will shut down for maintenance "
+							"in %d minute. You will automatically be "
+							"signed out at that time.  Please finish any "
+							"conversations in progress.\n\nAfter the "
+							"maintenance has been completed, you will be "
+							"able to successfully sign in.",
+							"The MSN server will shut down for maintenance "
+							"in %d minutes. You will automatically be "
+							"signed out at that time.  Please finish any "
+							"conversations in progress.\n\nAfter the "
+							"maintenance has been completed, you will be "
+							"able to successfully sign in.", minutes),
+						minutes);
+			default:
+				break;
+		}
+
+		if (*buf != '\0')
+			purple_notify_info(cmdproc->session->account->gc, NULL, buf, NULL);
+	}
+
+	g_hash_table_destroy(table);
+}
+
+void
+msn_notification_add_buddy(MsnNotification *notification, const char *list,
+						   const char *who, const char *store_name,
+						   int group_id)
+{
+	MsnCmdProc *cmdproc;
+	cmdproc = notification->servconn->cmdproc;
+
+	if (group_id < 0 && !strcmp(list, "FL"))
+		group_id = 0;
+
+	if (group_id >= 0)
+	{
+		msn_cmdproc_send(cmdproc, "ADD", "%s %s %s %d",
+						 list, who, store_name, group_id);
+	}
+	else
+	{
+		msn_cmdproc_send(cmdproc, "ADD", "%s %s %s", list, who, store_name);
+	}
+}
+
+void
+msn_notification_rem_buddy(MsnNotification *notification, const char *list,
+						   const char *who, int group_id)
+{
+	MsnCmdProc *cmdproc;
+	cmdproc = notification->servconn->cmdproc;
+
+	if (group_id >= 0)
+	{
+		msn_cmdproc_send(cmdproc, "REM", "%s %s %d", list, who, group_id);
+	}
+	else
+	{
+		msn_cmdproc_send(cmdproc, "REM", "%s %s", list, who);
+	}
+}
+
+/**************************************************************************
+ * Init
+ **************************************************************************/
+
+void
+msn_notification_init(void)
+{
+	/* TODO: check prp, blp */
+
+	cbs_table = msn_table_new();
+
+	/* Synchronous */
+	msn_table_add_cmd(cbs_table, "CHG", "CHG", NULL);
+	msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd);
+	msn_table_add_cmd(cbs_table, "ADD", "ADD", add_cmd);
+	msn_table_add_cmd(cbs_table, "ADD", "ILN", iln_cmd);
+	msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd);
+	msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd);
+	msn_table_add_cmd(cbs_table, "USR", "XFR", xfr_cmd);
+	msn_table_add_cmd(cbs_table, "SYN", "SYN", syn_cmd);
+	msn_table_add_cmd(cbs_table, "CVR", "CVR", cvr_cmd);
+	msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd);
+	msn_table_add_cmd(cbs_table, "REA", "REA", rea_cmd);
+	msn_table_add_cmd(cbs_table, "PRP", "PRP", prp_cmd);
+	/* msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd); */
+	msn_table_add_cmd(cbs_table, "BLP", "BLP", NULL);
+	msn_table_add_cmd(cbs_table, "REG", "REG", reg_cmd);
+	msn_table_add_cmd(cbs_table, "ADG", "ADG", adg_cmd);
+	msn_table_add_cmd(cbs_table, "RMG", "RMG", rmg_cmd);
+	msn_table_add_cmd(cbs_table, "XFR", "XFR", xfr_cmd);
+
+	/* Asynchronous */
+	msn_table_add_cmd(cbs_table, NULL, "IPG", ipg_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd);
+
+	msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "REM", rem_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "ADD", add_cmd);
+
+	msn_table_add_cmd(cbs_table, NULL, "QRY", NULL);
+	msn_table_add_cmd(cbs_table, NULL, "QNG", qng_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "FLN", fln_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "NLN", nln_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "ILN", iln_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "RNG", rng_cmd);
+
+	msn_table_add_cmd(cbs_table, NULL, "URL", url_cmd);
+
+	msn_table_add_cmd(cbs_table, "fallback", "XFR", xfr_cmd);
+
+	msn_table_add_error(cbs_table, "ADD", add_error);
+	msn_table_add_error(cbs_table, "REG", reg_error);
+	msn_table_add_error(cbs_table, "RMG", rmg_error);
+	/* msn_table_add_error(cbs_table, "REA", rea_error); */
+	msn_table_add_error(cbs_table, "USR", usr_error);
+
+	msn_table_add_msg_type(cbs_table,
+						   "text/x-msmsgsprofile",
+						   profile_msg);
+	msn_table_add_msg_type(cbs_table,
+						   "text/x-msmsgsinitialemailnotification",
+						   initial_email_msg);
+	msn_table_add_msg_type(cbs_table,
+						   "text/x-msmsgsemailnotification",
+						   email_msg);
+	msn_table_add_msg_type(cbs_table,
+						   "application/x-msmsgssystemmessage",
+						   system_msg);
+}
+
+void
+msn_notification_end(void)
+{
+	msn_table_destroy(cbs_table);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/notification.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,70 @@
+/**
+ * @file notification.h Notification server functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_NOTIFICATION_H_
+#define _MSN_NOTIFICATION_H_
+
+typedef struct _MsnNotification MsnNotification;
+
+#include "session.h"
+#include "servconn.h"
+#include "cmdproc.h"
+
+struct _MsnNotification
+{
+	MsnSession *session;
+	MsnCmdProc *cmdproc;
+	MsnServConn *servconn;
+
+	gboolean in_use;
+};
+
+#include "state.h"
+
+void msn_notification_end(void);
+void msn_notification_init(void);
+
+void msn_notification_add_buddy(MsnNotification *notification,
+								const char *list, const char *who,
+								const char *store_name, int group_id);
+void msn_notification_rem_buddy(MsnNotification *notification,
+								const char *list, const char *who,
+								int group_id);
+MsnNotification *msn_notification_new(MsnSession *session);
+void msn_notification_destroy(MsnNotification *notification);
+gboolean msn_notification_connect(MsnNotification *notification,
+							  const char *host, int port);
+void msn_notification_disconnect(MsnNotification *notification);
+
+/**
+ * Closes a notification.
+ *
+ * It's first closed, and then disconnected.
+ * 
+ * @param notification The notification object to close.
+ */
+void msn_notification_close(MsnNotification *notification);
+
+void msn_got_login_params(MsnSession *session, const char *login_params);
+
+#endif /* _MSN_NOTIFICATION_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/object.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,345 @@
+/**
+ * @file object.c MSNObject API
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "object.h"
+#include "debug.h"
+
+#define GET_STRING_TAG(field, id) \
+	if ((tag = strstr(str, id "=\"")) != NULL) \
+	{ \
+		tag += strlen(id "=\""); \
+		c = strchr(tag, '"'); \
+		if (c != NULL) \
+		{ \
+			if (obj->field != NULL) \
+				g_free(obj->field); \
+			obj->field = g_strndup(tag, c - tag); \
+		} \
+	}
+
+#define GET_INT_TAG(field, id) \
+	if ((tag = strstr(str, id "=\"")) != NULL) \
+	{ \
+		char buf[16]; \
+		size_t offset; \
+		tag += strlen(id "=\""); \
+		c = strchr(tag, '"'); \
+		if (c != NULL) \
+		{ \
+			memset(buf, 0, sizeof(buf)); \
+			offset = c - tag; \
+			if (offset >= sizeof(buf)) \
+				offset = sizeof(buf) - 1; \
+			strncpy(buf, tag, offset); \
+			obj->field = atoi(buf); \
+		} \
+	}
+
+static GList *local_objs;
+
+MsnObject *
+msn_object_new(void)
+{
+	MsnObject *obj;
+
+	obj = g_new0(MsnObject, 1);
+
+	msn_object_set_type(obj, MSN_OBJECT_UNKNOWN);
+	msn_object_set_friendly(obj, "AAA=");
+
+	return obj;
+}
+
+MsnObject *
+msn_object_new_from_string(const char *str)
+{
+	MsnObject *obj;
+	char *tag, *c;
+
+	g_return_val_if_fail(str != NULL, NULL);
+
+	if (strncmp(str, "<msnobj ", 8))
+		return NULL;
+
+	obj = msn_object_new();
+
+	GET_STRING_TAG(creator,  "Creator");
+	GET_INT_TAG(size,        "Size");
+	GET_INT_TAG(type,        "Type");
+	GET_STRING_TAG(location, "Location");
+	GET_STRING_TAG(friendly, "Friendly");
+	GET_STRING_TAG(sha1d,    "SHA1D");
+	GET_STRING_TAG(sha1c,    "SHA1C");
+
+	/* If we are missing any of the required elements then discard the object */
+	/* SHA1C is not always sent anymore */
+	if (obj->creator == NULL || obj->size == 0 || obj->type == 0
+			|| obj->location == NULL || obj->friendly == NULL
+			|| obj->sha1d == NULL /*|| obj->sha1c == NULL*/) {
+		purple_debug_error("msn", "Discarding invalid msnobj: '%s'\n", str);
+		msn_object_destroy(obj);
+		obj = NULL;
+	}
+
+	return obj;
+}
+
+void
+msn_object_destroy(MsnObject *obj)
+{
+	g_return_if_fail(obj != NULL);
+
+	g_free(obj->creator);
+	g_free(obj->location);
+	g_free(obj->friendly);
+	g_free(obj->sha1d);
+	g_free(obj->sha1c);
+
+	purple_imgstore_unref(obj->img);
+
+	if (obj->local)
+		local_objs = g_list_remove(local_objs, obj);
+
+	g_free(obj);
+}
+
+char *
+msn_object_to_string(const MsnObject *obj)
+{
+	char *str;
+	const char *sha1c;
+
+	g_return_val_if_fail(obj != NULL, NULL);
+
+	sha1c = msn_object_get_sha1c(obj);
+
+	str = g_strdup_printf("<msnobj Creator=\"%s\" Size=\"%d\" Type=\"%d\" "
+						  "Location=\"%s\" Friendly=\"%s\" SHA1D=\"%s\""
+						  "%s%s%s/>",
+						  msn_object_get_creator(obj),
+						  msn_object_get_size(obj),
+						  msn_object_get_type(obj),
+						  msn_object_get_location(obj),
+						  msn_object_get_friendly(obj),
+						  msn_object_get_sha1d(obj),
+						  sha1c ? " SHA1C=\"" : "",
+						  sha1c ? sha1c : "",
+						  sha1c ? "\"" : "");
+
+	return str;
+}
+
+void
+msn_object_set_creator(MsnObject *obj, const char *creator)
+{
+	g_return_if_fail(obj != NULL);
+
+	if (obj->creator != NULL)
+		g_free(obj->creator);
+
+	obj->creator = (creator == NULL ? NULL : g_strdup(creator));
+}
+
+void
+msn_object_set_size(MsnObject *obj, int size)
+{
+	g_return_if_fail(obj != NULL);
+
+	obj->size = size;
+}
+
+void
+msn_object_set_type(MsnObject *obj, MsnObjectType type)
+{
+	g_return_if_fail(obj != NULL);
+
+	obj->type = type;
+}
+
+void
+msn_object_set_location(MsnObject *obj, const char *location)
+{
+	g_return_if_fail(obj != NULL);
+
+	if (obj->location != NULL)
+		g_free(obj->location);
+
+	obj->location = (location == NULL ? NULL : g_strdup(location));
+}
+
+void
+msn_object_set_friendly(MsnObject *obj, const char *friendly)
+{
+	g_return_if_fail(obj != NULL);
+
+	if (obj->friendly != NULL)
+		g_free(obj->friendly);
+
+	obj->friendly = (friendly == NULL ? NULL : g_strdup(friendly));
+}
+
+void
+msn_object_set_sha1d(MsnObject *obj, const char *sha1d)
+{
+	g_return_if_fail(obj != NULL);
+
+	if (obj->sha1d != NULL)
+		g_free(obj->sha1d);
+
+	obj->sha1d = (sha1d == NULL ? NULL : g_strdup(sha1d));
+}
+
+void
+msn_object_set_sha1c(MsnObject *obj, const char *sha1c)
+{
+	g_return_if_fail(obj != NULL);
+
+	if (obj->sha1c != NULL)
+		g_free(obj->sha1c);
+
+	obj->sha1c = (sha1c == NULL ? NULL : g_strdup(sha1c));
+}
+
+const char *
+msn_object_get_creator(const MsnObject *obj)
+{
+	g_return_val_if_fail(obj != NULL, NULL);
+
+	return obj->creator;
+}
+
+int
+msn_object_get_size(const MsnObject *obj)
+{
+	g_return_val_if_fail(obj != NULL, 0);
+
+	return obj->size;
+}
+
+MsnObjectType
+msn_object_get_type(const MsnObject *obj)
+{
+	g_return_val_if_fail(obj != NULL, MSN_OBJECT_UNKNOWN);
+
+	return obj->type;
+}
+
+const char *
+msn_object_get_location(const MsnObject *obj)
+{
+	g_return_val_if_fail(obj != NULL, NULL);
+
+	return obj->location;
+}
+
+const char *
+msn_object_get_friendly(const MsnObject *obj)
+{
+	g_return_val_if_fail(obj != NULL, NULL);
+
+	return obj->friendly;
+}
+
+const char *
+msn_object_get_sha1d(const MsnObject *obj)
+{
+	g_return_val_if_fail(obj != NULL, NULL);
+
+	return obj->sha1d;
+}
+
+const char *
+msn_object_get_sha1c(const MsnObject *obj)
+{
+	g_return_val_if_fail(obj != NULL, NULL);
+
+	return obj->sha1c;
+}
+
+const char *
+msn_object_get_sha1(const MsnObject *obj)
+{
+	g_return_val_if_fail(obj != NULL, NULL);
+
+	if(obj->sha1c != NULL) {
+		return obj->sha1c;
+	} else {
+		return obj->sha1d;
+	}
+}
+
+static MsnObject *
+msn_object_find_local(const char *sha1)
+{
+	GList *l;
+
+	g_return_val_if_fail(sha1 != NULL, NULL);
+
+	for (l = local_objs; l != NULL; l = l->next)
+	{
+		MsnObject *local_obj = l->data;
+
+		if (!strcmp(msn_object_get_sha1(local_obj), sha1))
+			return local_obj;
+	}
+
+	return NULL;
+
+}
+
+void
+msn_object_set_local(MsnObject *obj)
+{
+	g_return_if_fail(obj != NULL);
+
+	obj->local = TRUE;
+
+	local_objs = g_list_append(local_objs, obj);
+}
+
+void
+msn_object_set_image(MsnObject *obj, PurpleStoredImage *img)
+{
+	g_return_if_fail(obj != NULL);
+	g_return_if_fail(img != NULL);
+
+	/* obj->local = TRUE; */
+
+	purple_imgstore_unref(obj->img);
+	obj->img = purple_imgstore_ref(img);
+}
+
+PurpleStoredImage *
+msn_object_get_image(const MsnObject *obj)
+{
+	MsnObject *local_obj;
+
+	g_return_val_if_fail(obj != NULL, NULL);
+
+	local_obj = msn_object_find_local(msn_object_get_sha1(obj));
+
+	if (local_obj != NULL)
+		return local_obj->img;
+
+	return NULL;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/object.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,229 @@
+/**
+ * @file object.h MSNObject API
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_OBJECT_H_
+#define _MSN_OBJECT_H_
+
+#include "imgstore.h"
+
+#include "internal.h"
+
+typedef enum
+{
+	MSN_OBJECT_UNKNOWN    = -1, /**< Unknown object        */
+	MSN_OBJECT_RESERVED1  =  1, /**< Reserved              */
+	MSN_OBJECT_EMOTICON   =  2, /**< Custom Emoticon       */
+	MSN_OBJECT_USERTILE   =  3, /**< UserTile (buddy icon) */
+	MSN_OBJECT_RESERVED2  =  4, /**< Reserved              */
+	MSN_OBJECT_BACKGROUND =  5  /**< Background            */
+
+} MsnObjectType;
+
+typedef struct
+{
+	gboolean local;
+
+	char *creator;
+	int size;
+	MsnObjectType type;
+	PurpleStoredImage *img;
+	char *location;
+	char *friendly;
+	char *sha1d;
+	char *sha1c;
+
+} MsnObject;
+
+/**
+ * Creates a MsnObject structure.
+ *
+ * @return A new MsnObject structure.
+ */
+MsnObject *msn_object_new(void);
+
+/**
+ * Creates a MsnObject structure from a string.
+ *
+ * @param str The string.
+ *
+ * @return The new MsnObject structure.
+ */
+MsnObject *msn_object_new_from_string(const char *str);
+
+/**
+ * Destroys an MsnObject structure.
+ *
+ * @param obj The object structure.
+ */
+void msn_object_destroy(MsnObject *obj);
+
+/**
+ * Outputs a string representation of an MsnObject.
+ *
+ * @param obj The object.
+ *
+ * @return The string representation. This must be freed.
+ */
+char *msn_object_to_string(const MsnObject *obj);
+
+/**
+ * Sets the creator field in a MsnObject.
+ *
+ * @param creator The creator value.
+ */
+void msn_object_set_creator(MsnObject *obj, const char *creator);
+
+/**
+ * Sets the size field in a MsnObject.
+ *
+ * @param size The size value.
+ */
+void msn_object_set_size(MsnObject *obj, int size);
+
+/**
+ * Sets the type field in a MsnObject.
+ *
+ * @param type The type value.
+ */
+void msn_object_set_type(MsnObject *obj, MsnObjectType type);
+
+/**
+ * Sets the location field in a MsnObject.
+ *
+ * @param location The location value.
+ */
+void msn_object_set_location(MsnObject *obj, const char *location);
+
+/**
+ * Sets the friendly name field in a MsnObject.
+ *
+ * @param friendly The friendly name value.
+ */
+void msn_object_set_friendly(MsnObject *obj, const char *friendly);
+
+/**
+ * Sets the SHA1D field in a MsnObject.
+ *
+ * @param sha1d The sha1d value.
+ */
+void msn_object_set_sha1d(MsnObject *obj, const char *sha1d);
+
+/**
+ * Sets the SHA1C field in a MsnObject.
+ *
+ * @param sha1c The sha1c value.
+ */
+void msn_object_set_sha1c(MsnObject *obj, const char *sha1c);
+
+/**
+ * Associates an image with a MsnObject.
+ *
+ * @param obj The object.
+ * @param img The image to associate.
+ */
+void msn_object_set_image(MsnObject *obj, PurpleStoredImage *img);
+
+/**
+ * Returns a MsnObject's creator value.
+ *
+ * @param obj The object.
+ *
+ * @return The creator value.
+ */
+const char *msn_object_get_creator(const MsnObject *obj);
+
+/**
+ * Returns a MsnObject's size value.
+ *
+ * @param obj The object.
+ *
+ * @return The size value.
+ */
+int msn_object_get_size(const MsnObject *obj);
+
+/**
+ * Returns a MsnObject's type.
+ *
+ * @param obj The object.
+ *
+ * @return The object type.
+ */
+MsnObjectType msn_object_get_type(const MsnObject *obj);
+
+/**
+ * Returns a MsnObject's location value.
+ *
+ * @param obj The object.
+ *
+ * @return The location value.
+ */
+const char *msn_object_get_location(const MsnObject *obj);
+
+/**
+ * Returns a MsnObject's friendly name value.
+ *
+ * @param obj The object.
+ *
+ * @return The friendly name value.
+ */
+const char *msn_object_get_friendly(const MsnObject *obj);
+
+/**
+ * Returns a MsnObject's SHA1D value.
+ *
+ * @param obj The object.
+ *
+ * @return The SHA1D value.
+ */
+const char *msn_object_get_sha1d(const MsnObject *obj);
+
+/**
+ * Returns a MsnObject's SHA1C value.
+ *
+ * @param obj The object.
+ *
+ * @return The SHA1C value.
+ */
+const char *msn_object_get_sha1c(const MsnObject *obj);
+
+/**
+ * Returns a MsnObject's SHA1C value if it exists, otherwise SHA1D.
+ *
+ * @param obj The object.
+ *
+ * @return The SHA1C value.
+ */
+const char *msn_object_get_sha1(const MsnObject *obj);
+
+/**
+ * Returns the image associated with the MsnObject.
+ *
+ * @param obj The object.
+ *
+ * @return The associated image.
+ */
+PurpleStoredImage *msn_object_get_image(const MsnObject *obj);
+
+void msn_object_set_local(MsnObject *obj);
+
+#endif /* _MSN_OBJECT_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/page.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,89 @@
+/**
+ * @file page.c Paging functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "page.h"
+
+MsnPage *
+msn_page_new(void)
+{
+	MsnPage *page;
+
+	page = g_new0(MsnPage, 1);
+
+	return page;
+}
+
+void
+msn_page_destroy(MsnPage *page)
+{
+	g_return_if_fail(page != NULL);
+
+	if (page->body != NULL)
+		g_free(page->body);
+
+	if (page->from_location != NULL)
+		g_free(page->from_location);
+
+	if (page->from_phone != NULL)
+		g_free(page->from_phone);
+
+	g_free(page);
+}
+
+char *
+msn_page_gen_payload(const MsnPage *page, size_t *ret_size)
+{
+	char *str;
+
+	g_return_val_if_fail(page != NULL, NULL);
+
+	str =
+		g_strdup_printf("<TEXT xml:space=\"preserve\" enc=\"utf-8\">%s</TEXT>",
+						msn_page_get_body(page));
+
+	if (ret_size != NULL)
+		*ret_size = strlen(str);
+
+	return str;
+}
+
+void
+msn_page_set_body(MsnPage *page, const char *body)
+{
+	g_return_if_fail(page != NULL);
+	g_return_if_fail(body != NULL);
+
+	if (page->body != NULL)
+		g_free(page->body);
+
+	page->body = g_strdup(body);
+}
+
+const char *
+msn_page_get_body(const MsnPage *page)
+{
+	g_return_val_if_fail(page != NULL, NULL);
+
+	return page->body;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/page.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,81 @@
+/**
+ * @file page.h Paging functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_PAGE_H_
+#define _MSN_PAGE_H_
+
+typedef struct _MsnPage MsnPage;
+
+#include "session.h"
+
+/**
+ * A page.
+ */
+struct _MsnPage
+{
+	char *from_location;
+	char *from_phone;
+
+	char *body;
+};
+
+/**
+ * Creates a new, empty page.
+ *
+ * @return A new page.
+ */
+MsnPage *msn_page_new(void);
+
+/**
+ * Destroys a page.
+ */
+void msn_page_destroy(MsnPage *page);
+
+/**
+ * Generates the payload data of a page.
+ *
+ * @param page     The page.
+ * @param ret_size The returned size of the payload.
+ *
+ * @return The payload data of a page.
+ */
+char *msn_page_gen_payload(const MsnPage *page, size_t *ret_size);
+
+/**
+ * Sets the body of a page.
+ *
+ * @param page  The page.
+ * @param body The body of the page.
+ */
+void msn_page_set_body(MsnPage *page, const char *body);
+
+/**
+ * Returns the body of the page.
+ *
+ * @param page The page.
+ *
+ * @return The body of the page.
+ */
+const char *msn_page_get_body(const MsnPage *page);
+
+#endif /* _MSN_PAGE_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/servconn.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,550 @@
+/**
+ * @file servconn.c Server connection functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "servconn.h"
+#include "error.h"
+
+static void read_cb(gpointer data, gint source, PurpleInputCondition cond);
+
+/**************************************************************************
+ * Main
+ **************************************************************************/
+
+MsnServConn *
+msn_servconn_new(MsnSession *session, MsnServConnType type)
+{
+	MsnServConn *servconn;
+
+	g_return_val_if_fail(session != NULL, NULL);
+
+	servconn = g_new0(MsnServConn, 1);
+
+	servconn->type = type;
+
+	servconn->session = session;
+	servconn->cmdproc = msn_cmdproc_new(session);
+	servconn->cmdproc->servconn = servconn;
+
+	servconn->httpconn = msn_httpconn_new(servconn);
+
+	servconn->num = session->servconns_count++;
+
+	servconn->tx_buf = purple_circ_buffer_new(MSN_BUF_LEN);
+	servconn->tx_handler = 0;
+
+	return servconn;
+}
+
+void
+msn_servconn_destroy(MsnServConn *servconn)
+{
+	g_return_if_fail(servconn != NULL);
+
+	if (servconn->processing)
+	{
+		servconn->wasted = TRUE;
+		return;
+	}
+
+	if (servconn->connected)
+		msn_servconn_disconnect(servconn);
+
+	if (servconn->destroy_cb)
+		servconn->destroy_cb(servconn);
+
+	if (servconn->httpconn != NULL)
+		msn_httpconn_destroy(servconn->httpconn);
+
+	g_free(servconn->host);
+
+	purple_circ_buffer_destroy(servconn->tx_buf);
+	if (servconn->tx_handler > 0)
+		purple_input_remove(servconn->tx_handler);
+
+	msn_cmdproc_destroy(servconn->cmdproc);
+	g_free(servconn);
+}
+
+void
+msn_servconn_set_connect_cb(MsnServConn *servconn,
+							void (*connect_cb)(MsnServConn *))
+{
+	g_return_if_fail(servconn != NULL);
+	servconn->connect_cb = connect_cb;
+}
+
+void
+msn_servconn_set_disconnect_cb(MsnServConn *servconn,
+							   void (*disconnect_cb)(MsnServConn *))
+{
+	g_return_if_fail(servconn != NULL);
+
+	servconn->disconnect_cb = disconnect_cb;
+}
+
+void
+msn_servconn_set_destroy_cb(MsnServConn *servconn,
+							void (*destroy_cb)(MsnServConn *))
+{
+	g_return_if_fail(servconn != NULL);
+
+	servconn->destroy_cb = destroy_cb;
+}
+
+/**************************************************************************
+ * Utility
+ **************************************************************************/
+
+void
+msn_servconn_got_error(MsnServConn *servconn, MsnServConnError error)
+{
+	char *tmp;
+	const char *reason;
+
+	const char *names[] = { "Notification", "Switchboard" };
+	const char *name;
+
+	name = names[servconn->type];
+
+	switch (error)
+	{
+		case MSN_SERVCONN_ERROR_CONNECT:
+			reason = _("Unable to connect"); break;
+		case MSN_SERVCONN_ERROR_WRITE:
+			reason = _("Writing error"); break;
+		case MSN_SERVCONN_ERROR_READ:
+			reason = _("Reading error"); break;
+		default:
+			reason = _("Unknown error"); break;
+	}
+
+	purple_debug_error("msn", "Connection error from %s server (%s): %s\n",
+					 name, servconn->host, reason);
+	tmp = g_strdup_printf(_("Connection error from %s server:\n%s"),
+						  name, reason);
+
+	if (servconn->type == MSN_SERVCONN_NS)
+	{
+		msn_session_set_error(servconn->session, MSN_ERROR_SERVCONN, tmp);
+	}
+	else if (servconn->type == MSN_SERVCONN_SB)
+	{
+		MsnSwitchBoard *swboard;
+		swboard = servconn->cmdproc->data;
+		if (swboard != NULL)
+			swboard->error = MSN_SB_ERROR_CONNECTION;
+	}
+
+	msn_servconn_disconnect(servconn);
+
+	g_free(tmp);
+}
+
+/**************************************************************************
+ * Connect
+ **************************************************************************/
+
+static void
+connect_cb(gpointer data, gint source, const gchar *error_message)
+{
+	MsnServConn *servconn;
+
+	servconn = data;
+	servconn->connect_data = NULL;
+	servconn->processing = FALSE;
+
+	if (servconn->wasted)
+	{
+		if (source >= 0)
+			close(source);
+		msn_servconn_destroy(servconn);
+		return;
+	}
+
+	servconn->fd = source;
+
+	if (source >= 0)
+	{
+		servconn->connected = TRUE;
+
+		/* Someone wants to know we connected. */
+		servconn->connect_cb(servconn);
+		servconn->inpa = purple_input_add(servconn->fd, PURPLE_INPUT_READ,
+			read_cb, data);
+	}
+	else
+	{
+		purple_debug_error("msn", "Connection error: %s\n", error_message);
+		msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_CONNECT);
+	}
+}
+
+gboolean
+msn_servconn_connect(MsnServConn *servconn, const char *host, int port)
+{
+	MsnSession *session;
+
+	g_return_val_if_fail(servconn != NULL, FALSE);
+	g_return_val_if_fail(host     != NULL, FALSE);
+	g_return_val_if_fail(port      > 0,    FALSE);
+
+	session = servconn->session;
+
+	if (servconn->connected)
+		msn_servconn_disconnect(servconn);
+
+	g_free(servconn->host);
+	servconn->host = g_strdup(host);
+
+	if (session->http_method)
+	{
+		/* HTTP Connection. */
+
+		if (!servconn->httpconn->connected)
+			if (!msn_httpconn_connect(servconn->httpconn, host, port))
+				return FALSE;
+
+		servconn->connected = TRUE;
+		servconn->httpconn->virgin = TRUE;
+
+		/* Someone wants to know we connected. */
+		servconn->connect_cb(servconn);
+
+		return TRUE;
+	}
+
+	servconn->connect_data = purple_proxy_connect(NULL, session->account,
+			host, port, connect_cb, servconn);
+
+	if (servconn->connect_data != NULL)
+	{
+		servconn->processing = TRUE;
+		return TRUE;
+	}
+	else
+		return FALSE;
+}
+
+void
+msn_servconn_disconnect(MsnServConn *servconn)
+{
+	g_return_if_fail(servconn != NULL);
+
+	if (!servconn->connected)
+	{
+		/* We could not connect. */
+		if (servconn->disconnect_cb != NULL)
+			servconn->disconnect_cb(servconn);
+
+		return;
+	}
+
+	if (servconn->session->http_method)
+	{
+		/* Fake disconnection. */
+		if (servconn->disconnect_cb != NULL)
+			servconn->disconnect_cb(servconn);
+
+		return;
+	}
+
+	if (servconn->connect_data != NULL)
+	{
+		purple_proxy_connect_cancel(servconn->connect_data);
+		servconn->connect_data = NULL;
+	}
+
+	if (servconn->inpa > 0)
+	{
+		purple_input_remove(servconn->inpa);
+		servconn->inpa = 0;
+	}
+
+	close(servconn->fd);
+
+	servconn->rx_buf = NULL;
+	servconn->rx_len = 0;
+	servconn->payload_len = 0;
+
+	servconn->connected = FALSE;
+
+	if (servconn->disconnect_cb != NULL)
+		servconn->disconnect_cb(servconn);
+}
+
+static void
+servconn_write_cb(gpointer data, gint source, PurpleInputCondition cond)
+{
+	MsnServConn *servconn = data;
+	int ret, writelen;
+
+	writelen = purple_circ_buffer_get_max_read(servconn->tx_buf);
+
+	if (writelen == 0) {
+		purple_input_remove(servconn->tx_handler);
+		servconn->tx_handler = 0;
+		return;
+	}
+
+	ret = write(servconn->fd, servconn->tx_buf->outptr, writelen);
+
+	if (ret < 0 && errno == EAGAIN)
+		return;
+	else if (ret <= 0) {
+		msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_WRITE);
+		return;
+	}
+
+	purple_circ_buffer_mark_read(servconn->tx_buf, ret);
+}
+
+ssize_t
+msn_servconn_write(MsnServConn *servconn, const char *buf, size_t len)
+{
+	ssize_t ret = 0;
+
+	g_return_val_if_fail(servconn != NULL, 0);
+
+	if (!servconn->session->http_method)
+	{
+		if (servconn->tx_handler == 0) {
+			switch (servconn->type)
+			{
+				case MSN_SERVCONN_NS:
+				case MSN_SERVCONN_SB:
+					ret = write(servconn->fd, buf, len);
+					break;
+#if 0
+				case MSN_SERVCONN_DC:
+					ret = write(servconn->fd, &buf, sizeof(len));
+					ret = write(servconn->fd, buf, len);
+					break;
+#endif
+				default:
+					ret = write(servconn->fd, buf, len);
+					break;
+			}
+		} else {
+			ret = -1;
+			errno = EAGAIN;
+		}
+
+		if (ret < 0 && errno == EAGAIN)
+			ret = 0;
+		if (ret >= 0 && ret < len) {
+			if (servconn->tx_handler == 0)
+				servconn->tx_handler = purple_input_add(
+					servconn->fd, PURPLE_INPUT_WRITE,
+					servconn_write_cb, servconn);
+			purple_circ_buffer_append(servconn->tx_buf, buf + ret,
+				len - ret);
+		}
+	}
+	else
+	{
+		ret = msn_httpconn_write(servconn->httpconn, buf, len);
+	}
+
+	if (ret == -1)
+	{
+		msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_WRITE);
+	}
+
+	return ret;
+}
+
+static void
+read_cb(gpointer data, gint source, PurpleInputCondition cond)
+{
+	MsnServConn *servconn;
+	MsnSession *session;
+	char buf[MSN_BUF_LEN];
+	char *cur, *end, *old_rx_buf;
+	int len, cur_len;
+
+	servconn = data;
+	session = servconn->session;
+
+	len = read(servconn->fd, buf, sizeof(buf) - 1);
+
+	if (len < 0 && errno == EAGAIN)
+		return;
+	else if (len <= 0)
+	{
+		purple_debug_error("msn", "servconn read error, len: %d error: %s\n", len, strerror(errno));
+		msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_READ);
+
+		return;
+	}
+
+	buf[len] = '\0';
+
+	servconn->rx_buf = g_realloc(servconn->rx_buf, len + servconn->rx_len + 1);
+	memcpy(servconn->rx_buf + servconn->rx_len, buf, len + 1);
+	servconn->rx_len += len;
+
+	end = old_rx_buf = servconn->rx_buf;
+
+	servconn->processing = TRUE;
+
+	do
+	{
+		cur = end;
+
+		if (servconn->payload_len)
+		{
+			if (servconn->payload_len > servconn->rx_len)
+				/* The payload is still not complete. */
+				break;
+
+			cur_len = servconn->payload_len;
+			end += cur_len;
+		}
+		else
+		{
+			end = strstr(cur, "\r\n");
+
+			if (end == NULL)
+				/* The command is still not complete. */
+				break;
+
+			*end = '\0';
+			end += 2;
+			cur_len = end - cur;
+		}
+
+		servconn->rx_len -= cur_len;
+
+		if (servconn->payload_len)
+		{
+			msn_cmdproc_process_payload(servconn->cmdproc, cur, cur_len);
+			servconn->payload_len = 0;
+		}
+		else
+		{
+			msn_cmdproc_process_cmd_text(servconn->cmdproc, cur);
+		}
+	} while (servconn->connected && !servconn->wasted && servconn->rx_len > 0);
+
+	if (servconn->connected && !servconn->wasted)
+	{
+		if (servconn->rx_len > 0)
+			servconn->rx_buf = g_memdup(cur, servconn->rx_len);
+		else
+			servconn->rx_buf = NULL;
+	}
+
+	servconn->processing = FALSE;
+
+	if (servconn->wasted)
+		msn_servconn_destroy(servconn);
+
+	g_free(old_rx_buf);
+}
+
+#if 0
+static int
+create_listener(int port)
+{
+	int fd;
+	const int on = 1;
+
+#if 0
+	struct addrinfo hints;
+	struct addrinfo *c, *res;
+	char port_str[5];
+
+	snprintf(port_str, sizeof(port_str), "%d", port);
+
+	memset(&hints, 0, sizeof(hints));
+
+	hints.ai_flags = AI_PASSIVE;
+	hints.ai_family = AF_UNSPEC;
+	hints.ai_socktype = SOCK_STREAM;
+
+	if (getaddrinfo(NULL, port_str, &hints, &res) != 0)
+	{
+		purple_debug_error("msn", "Could not get address info: %s.\n",
+						 port_str);
+		return -1;
+	}
+
+	for (c = res; c != NULL; c = c->ai_next)
+	{
+		fd = socket(c->ai_family, c->ai_socktype, c->ai_protocol);
+
+		if (fd < 0)
+			continue;
+
+		setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+
+		if (bind(fd, c->ai_addr, c->ai_addrlen) == 0)
+			break;
+
+		close(fd);
+	}
+
+	if (c == NULL)
+	{
+		purple_debug_error("msn", "Could not find socket: %s.\n", port_str);
+		return -1;
+	}
+
+	freeaddrinfo(res);
+#else
+	struct sockaddr_in sockin;
+
+	fd = socket(AF_INET, SOCK_STREAM, 0);
+
+	if (fd < 0)
+		return -1;
+
+	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0)
+	{
+		close(fd);
+		return -1;
+	}
+
+	memset(&sockin, 0, sizeof(struct sockaddr_in));
+	sockin.sin_family = AF_INET;
+	sockin.sin_port = htons(port);
+
+	if (bind(fd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0)
+	{
+		close(fd);
+		return -1;
+	}
+#endif
+
+	if (listen (fd, 4) != 0)
+	{
+		close (fd);
+		return -1;
+	}
+
+	fcntl(fd, F_SETFL, O_NONBLOCK);
+
+	return fd;
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/servconn.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,171 @@
+/**
+ * @file servconn.h Server connection functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_SERVCONN_H_
+#define _MSN_SERVCONN_H_
+
+typedef struct _MsnServConn MsnServConn;
+
+#include "session.h"
+#include "cmdproc.h"
+
+#include "proxy.h"
+#include "httpconn.h"
+
+/**
+ * Connection error types.
+ */
+typedef enum
+{
+	MSN_SERVCONN_ERROR_NONE,
+	MSN_SERVCONN_ERROR_CONNECT,
+	MSN_SERVCONN_ERROR_WRITE,
+	MSN_SERVCONN_ERROR_READ,
+
+} MsnServConnError;
+
+/**
+ * Connection types.
+ */
+typedef enum
+{
+	MSN_SERVCONN_NS,
+	MSN_SERVCONN_SB
+
+} MsnServConnType;
+
+/**
+ * A Connection.
+ */
+struct _MsnServConn
+{
+	MsnServConnType type; /**< The type of this connection. */
+	MsnSession *session;  /**< The MSN session of this connection. */
+	MsnCmdProc *cmdproc;  /**< The command processor of this connection. */
+
+	PurpleProxyConnectData *connect_data;
+
+	gboolean connected;   /**< A flag that states if it's connected. */
+	gboolean processing;  /**< A flag that states if something is working
+							with this connection. */
+	gboolean wasted;      /**< A flag that states if it should be destroyed. */
+
+	char *host; /**< The host this connection is connected or should be
+				  connected to. */
+	int num; /**< A number id of this connection. */
+
+	MsnHttpConn *httpconn; /**< The HTTP connection this connection should use. */
+
+	int fd; /**< The connection's file descriptor. */
+	int inpa; /**< The connection's input handler. */
+
+	char *rx_buf; /**< The receive buffer. */
+	int rx_len; /**< The receive buffer lenght. */
+
+	size_t payload_len; /**< The length of the payload.
+						  It's only set when we've received a command that
+						  has a payload. */
+
+	PurpleCircBuffer *tx_buf;
+	guint tx_handler;
+
+	void (*connect_cb)(MsnServConn *); /**< The callback to call when connecting. */
+	void (*disconnect_cb)(MsnServConn *); /**< The callback to call when disconnecting. */
+	void (*destroy_cb)(MsnServConn *); /**< The callback to call when destroying. */
+};
+
+/**
+ * Creates a new connection object.
+ *
+ * @param session The session.
+ * @param type The type of the connection.
+ */
+MsnServConn *msn_servconn_new(MsnSession *session, MsnServConnType type);
+
+/**
+ * Destroys a connection object.
+ *
+ * @param servconn The connection.
+ */
+void msn_servconn_destroy(MsnServConn *servconn);
+
+/**
+ * Connects to a host.
+ *
+ * @param servconn The connection.
+ * @param host The host.
+ * @param port The port.
+ */
+gboolean msn_servconn_connect(MsnServConn *servconn, const char *host, int port);
+
+/**
+ * Disconnects.
+ *
+ * @param servconn The connection.
+ */
+void msn_servconn_disconnect(MsnServConn *servconn);
+
+/**
+ * Sets the connect callback.
+ *
+ * @param servconn The servconn.
+ * @param connect_cb The connect callback.
+ */
+void msn_servconn_set_connect_cb(MsnServConn *servconn,
+								 void (*connect_cb)(MsnServConn *));
+/**
+ * Sets the disconnect callback.
+ *
+ * @param servconn The servconn.
+ * @param disconnect_cb The disconnect callback.
+ */
+void msn_servconn_set_disconnect_cb(MsnServConn *servconn,
+									void (*disconnect_cb)(MsnServConn *));
+/**
+ * Sets the destroy callback.
+ *
+ * @param servconn The servconn that's being destroyed.
+ * @param destroy_cb The destroy callback.
+ */
+void msn_servconn_set_destroy_cb(MsnServConn *servconn,
+								 void (*destroy_cb)(MsnServConn *));
+
+/**
+ * Writes a chunck of data to the servconn.
+ *
+ * @param servconn The servconn.
+ * @param buf The data to write.
+ * @param size The size of the data.
+ */
+ssize_t msn_servconn_write(MsnServConn *servconn, const char *buf,
+						  size_t size);
+
+/**
+ * Function to call whenever an error related to a switchboard occurs.
+ *
+ * @param servconn The servconn.
+ * @param error The error that happened.
+ */
+void msn_servconn_got_error(MsnServConn *servconn, MsnServConnError error);
+
+#endif /* _MSN_SERVCONN_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/session.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,431 @@
+/**
+ * @file session.c MSN session functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "session.h"
+#include "notification.h"
+
+#include "dialog.h"
+
+MsnSession *
+msn_session_new(PurpleAccount *account)
+{
+	MsnSession *session;
+
+	g_return_val_if_fail(account != NULL, NULL);
+
+	session = g_new0(MsnSession, 1);
+
+	session->account = account;
+	session->notification = msn_notification_new(session);
+	session->userlist = msn_userlist_new(session);
+
+	session->user = msn_user_new(session->userlist,
+								 purple_account_get_username(account), NULL);
+
+	session->protocol_ver = 9;
+	session->conv_seq = 1;
+
+	return session;
+}
+
+void
+msn_session_destroy(MsnSession *session)
+{
+	g_return_if_fail(session != NULL);
+
+	session->destroying = TRUE;
+
+	if (session->connected)
+		msn_session_disconnect(session);
+
+	if (session->notification != NULL)
+		msn_notification_destroy(session->notification);
+
+	while (session->switches != NULL)
+		msn_switchboard_destroy(session->switches->data);
+
+	while (session->slplinks != NULL)
+		msn_slplink_destroy(session->slplinks->data);
+
+	msn_userlist_destroy(session->userlist);
+
+	g_free(session->passport_info.kv);
+	g_free(session->passport_info.sid);
+	g_free(session->passport_info.mspauth);
+	g_free(session->passport_info.client_ip);
+
+	if (session->passport_info.file != NULL)
+	{
+		g_unlink(session->passport_info.file);
+		g_free(session->passport_info.file);
+	}
+
+	if (session->sync != NULL)
+		msn_sync_destroy(session->sync);
+
+	if (session->nexus != NULL)
+		msn_nexus_destroy(session->nexus);
+
+	if (session->user != NULL)
+		msn_user_destroy(session->user);
+
+	g_free(session);
+}
+
+gboolean
+msn_session_connect(MsnSession *session, const char *host, int port,
+					gboolean http_method)
+{
+	g_return_val_if_fail(session != NULL, FALSE);
+	g_return_val_if_fail(!session->connected, TRUE);
+
+	session->connected = TRUE;
+	session->http_method = http_method;
+
+	if (session->notification == NULL)
+	{
+		purple_debug_error("msn", "This shouldn't happen\n");
+		g_return_val_if_reached(FALSE);
+	}
+
+	if (msn_notification_connect(session->notification, host, port))
+	{
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+void
+msn_session_disconnect(MsnSession *session)
+{
+	g_return_if_fail(session != NULL);
+	g_return_if_fail(session->connected);
+
+	session->connected = FALSE;
+
+	while (session->switches != NULL)
+		msn_switchboard_close(session->switches->data);
+
+	if (session->notification != NULL)
+		msn_notification_close(session->notification);
+}
+
+/* TODO: This must go away when conversation is redesigned */
+MsnSwitchBoard *
+msn_session_find_swboard(MsnSession *session, const char *username)
+{
+	GList *l;
+
+	g_return_val_if_fail(session  != NULL, NULL);
+	g_return_val_if_fail(username != NULL, NULL);
+
+	for (l = session->switches; l != NULL; l = l->next)
+	{
+		MsnSwitchBoard *swboard;
+
+		swboard = l->data;
+
+		if ((swboard->im_user != NULL) && !strcmp(username, swboard->im_user))
+			return swboard;
+	}
+
+	return NULL;
+}
+
+MsnSwitchBoard *
+msn_session_find_swboard_with_conv(MsnSession *session, PurpleConversation *conv)
+{
+	GList *l;
+
+	g_return_val_if_fail(session  != NULL, NULL);
+	g_return_val_if_fail(conv != NULL, NULL);
+
+	for (l = session->switches; l != NULL; l = l->next)
+	{
+		MsnSwitchBoard *swboard;
+
+		swboard = l->data;
+
+		if (swboard->conv == conv)
+			return swboard;
+	}
+
+	return NULL;
+}
+
+MsnSwitchBoard *
+msn_session_find_swboard_with_id(const MsnSession *session, int chat_id)
+{
+	GList *l;
+
+	g_return_val_if_fail(session != NULL, NULL);
+	g_return_val_if_fail(chat_id >= 0,    NULL);
+
+	for (l = session->switches; l != NULL; l = l->next)
+	{
+		MsnSwitchBoard *swboard;
+
+		swboard = l->data;
+
+		if (swboard->chat_id == chat_id)
+			return swboard;
+	}
+
+	return NULL;
+}
+
+MsnSwitchBoard *
+msn_session_get_swboard(MsnSession *session, const char *username,
+						MsnSBFlag flag)
+{
+	MsnSwitchBoard *swboard;
+
+	g_return_val_if_fail(session != NULL, NULL);
+
+	swboard = msn_session_find_swboard(session, username);
+
+	if (swboard == NULL)
+	{
+		swboard = msn_switchboard_new(session);
+		swboard->im_user = g_strdup(username);
+		msn_switchboard_request(swboard);
+		msn_switchboard_request_add_user(swboard, username);
+	}
+
+	swboard->flag |= flag;
+
+	return swboard;
+}
+
+static void
+msn_session_sync_users(MsnSession *session)
+{
+	PurpleBlistNode *gnode, *cnode, *bnode;
+	PurpleConnection *gc = purple_account_get_connection(session->account);
+
+	g_return_if_fail(gc != NULL);
+
+	/* The core used to use msn_add_buddy to add all buddies before
+	 * being logged in. This no longer happens, so we manually iterate
+	 * over the whole buddy list to identify sync issues. */
+
+	for (gnode = purple_blist_get_root(); gnode; gnode = gnode->next) {
+		PurpleGroup *group = (PurpleGroup *)gnode;
+		const char *group_name = group->name;
+		if(!PURPLE_BLIST_NODE_IS_GROUP(gnode))
+			continue;
+		for(cnode = gnode->child; cnode; cnode = cnode->next) {
+			if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
+				continue;
+			for(bnode = cnode->child; bnode; bnode = bnode->next) {
+				PurpleBuddy *b;
+				if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
+					continue;
+				b = (PurpleBuddy *)bnode;
+				if(purple_buddy_get_account(b) == purple_connection_get_account(gc)) {
+					MsnUser *remote_user;
+					gboolean found = FALSE;
+
+					remote_user = msn_userlist_find_user(session->userlist, purple_buddy_get_name(b));
+
+					if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP))
+					{
+						int group_id;
+						GList *l;
+
+						group_id = msn_userlist_find_group_id(remote_user->userlist,
+								group_name);
+
+						for (l = remote_user->group_ids; l != NULL; l = l->next)
+						{
+							if (group_id == GPOINTER_TO_INT(l->data))
+							{
+								found = TRUE;
+								break;
+							}
+						}
+
+					}
+
+					if (!found)
+					{
+						/* The user was not on the server list or not in that group
+						 * on the server list */
+						msn_show_sync_issue(session, purple_buddy_get_name(b), group_name);
+					}
+				}
+			}
+		}
+	}
+}
+
+void
+msn_session_set_error(MsnSession *session, MsnErrorType error,
+					  const char *info)
+{
+	PurpleConnection *gc;
+	PurpleConnectionError reason;
+	char *msg;
+
+	gc = purple_account_get_connection(session->account);
+
+	switch (error)
+	{
+		case MSN_ERROR_SERVCONN:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+			msg = g_strdup(info);
+			break;
+		case MSN_ERROR_UNSUPPORTED_PROTOCOL:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+			msg = g_strdup(_("Our protocol is not supported by the "
+							 "server."));
+			break;
+		case MSN_ERROR_HTTP_MALFORMED:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+			msg = g_strdup(_("Error parsing HTTP."));
+			break;
+		case MSN_ERROR_SIGN_OTHER:
+			reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE;
+			msg = g_strdup(_("You have signed on from another location."));
+			if (!purple_account_get_remember_password(session->account))
+				purple_account_set_password(session->account, NULL);
+			break;
+		case MSN_ERROR_SERV_UNAVAILABLE:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+			msg = g_strdup(_("The MSN servers are temporarily "
+							 "unavailable. Please wait and try "
+							 "again."));
+			break;
+		case MSN_ERROR_SERV_DOWN:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+			msg = g_strdup(_("The MSN servers are going down "
+							 "temporarily."));
+			break;
+		case MSN_ERROR_AUTH:
+			reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
+			msg = g_strdup_printf(_("Unable to authenticate: %s"),
+								  (info == NULL ) ?
+								  _("Unknown error") : info);
+			break;
+		case MSN_ERROR_BAD_BLIST:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+			msg = g_strdup(_("Your MSN buddy list is temporarily "
+							 "unavailable. Please wait and try "
+							 "again."));
+			break;
+		default:
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+			msg = g_strdup(_("Unknown error."));
+			break;
+	}
+
+	msn_session_disconnect(session);
+
+	purple_connection_error_reason (gc, reason, msg);
+
+	g_free(msg);
+}
+
+static const char *
+get_login_step_text(MsnSession *session)
+{
+	const char *steps_text[] = {
+		_("Connecting"),
+		_("Handshaking"),
+		_("Transferring"),
+		_("Handshaking"),
+		_("Starting authentication"),
+		_("Getting cookie"),
+		_("Authenticating"),
+		_("Sending cookie"),
+		_("Retrieving buddy list")
+	};
+
+	return steps_text[session->login_step];
+}
+
+void
+msn_session_set_login_step(MsnSession *session, MsnLoginStep step)
+{
+	PurpleConnection *gc;
+
+	/* Prevent the connection progress going backwards, eg. if we get
+	 * transferred several times during login */
+	if (session->login_step > step)
+		return;
+
+	/* If we're already logged in, we're probably here because of a
+	 * mid-session XFR from the notification server, so we don't want to
+	 * popup the connection progress dialog */
+	if (session->logged_in)
+		return;
+
+	gc = session->account->gc;
+
+	session->login_step = step;
+
+	purple_connection_update_progress(gc, get_login_step_text(session), step,
+									MSN_LOGIN_STEPS);
+}
+
+void
+msn_session_finish_login(MsnSession *session)
+{
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	PurpleStoredImage *img;
+	const char *passport;
+
+	if (session->logged_in)
+		return;
+
+	account = session->account;
+	gc = purple_account_get_connection(account);
+
+	img = purple_buddy_icons_find_account_icon(session->account);
+	msn_user_set_buddy_icon(session->user, img);
+	purple_imgstore_unref(img);
+
+	session->logged_in = TRUE;
+
+	msn_change_status(session);
+
+	purple_connection_set_state(gc, PURPLE_CONNECTED);
+
+	/* Sync users */
+	msn_session_sync_users(session);
+	/* It seems that some accounts that haven't accessed hotmail for a while
+	 * and @msn.com accounts don't automatically get the initial email
+	 * notification so we always request it on login
+	 */
+
+	passport = purple_normalize(account, purple_account_get_username(account));
+
+	if ((strstr(passport, "@hotmail.") != NULL) ||
+		(strstr(passport, "@msn.com") != NULL))
+	{
+		msn_cmdproc_send(session->notification->cmdproc, "URL", "%s", "INBOX");
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/session.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,227 @@
+/**
+ * @file session.h MSN session functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_SESSION_H_
+#define _MSN_SESSION_H_
+
+typedef struct _MsnSession MsnSession;
+
+#include "sslconn.h"
+
+#include "user.h"
+#include "slpcall.h"
+
+#include "notification.h"
+#include "switchboard.h"
+#include "group.h"
+
+#include "cmdproc.h"
+#include "nexus.h"
+#include "httpconn.h"
+
+#include "userlist.h"
+#include "sync.h"
+
+/**
+ * Types of errors.
+ */
+typedef enum
+{
+	MSN_ERROR_SERVCONN,
+	MSN_ERROR_UNSUPPORTED_PROTOCOL,
+	MSN_ERROR_HTTP_MALFORMED,
+	MSN_ERROR_AUTH,
+	MSN_ERROR_BAD_BLIST,
+	MSN_ERROR_SIGN_OTHER,
+	MSN_ERROR_SERV_DOWN,
+	MSN_ERROR_SERV_UNAVAILABLE
+
+} MsnErrorType;
+
+/**
+ * Login steps.
+ */
+typedef enum
+{
+	MSN_LOGIN_STEP_START,
+	MSN_LOGIN_STEP_HANDSHAKE,
+	MSN_LOGIN_STEP_TRANSFER,
+	MSN_LOGIN_STEP_HANDSHAKE2,
+	MSN_LOGIN_STEP_AUTH_START,
+	MSN_LOGIN_STEP_AUTH,
+	MSN_LOGIN_STEP_GET_COOKIE,
+	MSN_LOGIN_STEP_AUTH_END,
+	MSN_LOGIN_STEP_SYN,
+	MSN_LOGIN_STEP_END
+
+} MsnLoginStep;
+
+#define MSN_LOGIN_STEPS MSN_LOGIN_STEP_END
+
+struct _MsnSession
+{
+	PurpleAccount *account;
+	MsnUser *user;
+
+	guint protocol_ver;
+
+	MsnLoginStep login_step; /**< The current step in the login process. */
+
+	gboolean connected;
+	gboolean logged_in; /**< A temporal flag to ignore local buddy list adds. */
+	gboolean destroying; /**< A flag that states if the session is being destroyed. */
+	gboolean http_method;
+
+	MsnNotification *notification;
+	MsnNexus *nexus;
+	MsnSync *sync;
+
+	MsnUserList *userlist;
+
+	int servconns_count; /**< The count of server connections. */
+	GList *switches; /**< The list of all the switchboards. */
+	GList *directconns; /**< The list of all the directconnections. */
+	GList *slplinks; /**< The list of all the slplinks. */
+
+	int conv_seq; /**< The current conversation sequence number. */
+
+	struct
+	{
+		char *kv;
+		char *sid;
+		char *mspauth;
+		unsigned long sl;
+		char *file;
+		char *client_ip;
+		int client_port;
+
+	} passport_info;
+};
+
+/**
+ * Creates an MSN session.
+ *
+ * @param account The account.
+ *
+ * @return The new MSN session.
+ */
+MsnSession *msn_session_new(PurpleAccount *account);
+
+/**
+ * Destroys an MSN session.
+ *
+ * @param session The MSN session to destroy.
+ */
+void msn_session_destroy(MsnSession *session);
+
+/**
+ * Connects to and initiates an MSN session.
+ *
+ * @param session     The MSN session.
+ * @param host        The dispatch server host.
+ * @param port        The dispatch server port.
+ * @param http_method Whether to use or not http_method.
+ *
+ * @return @c TRUE on success, @c FALSE on failure.
+ */
+gboolean msn_session_connect(MsnSession *session,
+							 const char *host, int port,
+							 gboolean http_method);
+
+/**
+ * Disconnects from an MSN session.
+ *
+ * @param session The MSN session.
+ */
+void msn_session_disconnect(MsnSession *session);
+
+ /**
+ * Finds a switchboard with the given username.
+ *
+ * @param session The MSN session.
+ * @param username The username to search for.
+ *
+ * @return The switchboard, if found.
+ */
+MsnSwitchBoard *msn_session_find_swboard(MsnSession *session,
+										 const char *username);
+
+ /**
+ * Finds a switchboard with the given conversation.
+ *
+ * @param session The MSN session.
+ * @param conv    The conversation to search for.
+ *
+ * @return The switchboard, if found.
+ */
+MsnSwitchBoard *msn_session_find_swboard_with_conv(MsnSession *session,
+												   PurpleConversation *conv);
+/**
+ * Finds a switchboard with the given chat ID.
+ *
+ * @param session The MSN session.
+ * @param chat_id The chat ID to search for.
+ *
+ * @return The switchboard, if found.
+ */
+MsnSwitchBoard *msn_session_find_swboard_with_id(const MsnSession *session,
+												 int chat_id);
+
+/**
+ * Returns a switchboard to communicate with certain username.
+ *
+ * @param session The MSN session.
+ * @param username The username to search for.
+ * @param flag The flag of the switchboard
+ *
+ * @return The switchboard.
+ */
+MsnSwitchBoard *msn_session_get_swboard(MsnSession *session,
+										const char *username, MsnSBFlag flag);
+
+/**
+ * Sets an error for the MSN session.
+ *
+ * @param session The MSN session.
+ * @param error The error.
+ * @param info Extra information.
+ */
+void msn_session_set_error(MsnSession *session, MsnErrorType error,
+						   const char *info);
+
+/**
+ * Sets the current step in the login proccess.
+ *
+ * @param session The MSN session.
+ * @param step The current step.
+ */
+void msn_session_set_login_step(MsnSession *session, MsnLoginStep step);
+
+/**
+ * Finish the login proccess.
+ *
+ * @param session The MSN session.
+ */
+void msn_session_finish_login(MsnSession *session);
+
+#endif /* _MSN_SESSION_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slp.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,1109 @@
+/**
+ * @file msnslp.c MSNSLP support
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "slp.h"
+#include "slpcall.h"
+#include "slpmsg.h"
+#include "slpsession.h"
+
+#include "object.h"
+#include "user.h"
+#include "switchboard.h"
+
+/* ms to delay between sending buddy icon requests to the server. */
+#define BUDDY_ICON_DELAY 20000
+
+static void send_ok(MsnSlpCall *slpcall, const char *branch,
+					const char *type, const char *content);
+
+static void send_decline(MsnSlpCall *slpcall, const char *branch,
+						 const char *type, const char *content);
+
+void msn_request_user_display(MsnUser *user);
+
+/**************************************************************************
+ * Util
+ **************************************************************************/
+
+static char *
+get_token(const char *str, const char *start, const char *end)
+{
+	const char *c, *c2;
+
+	if ((c = strstr(str, start)) == NULL)
+		return NULL;
+
+	c += strlen(start);
+
+	if (end != NULL)
+	{
+		if ((c2 = strstr(c, end)) == NULL)
+			return NULL;
+
+		return g_strndup(c, c2 - c);
+	}
+	else
+	{
+		/* This has to be changed */
+		return g_strdup(c);
+	}
+
+}
+
+/**************************************************************************
+ * Xfer
+ **************************************************************************/
+
+static void
+msn_xfer_init(PurpleXfer *xfer)
+{
+	MsnSlpCall *slpcall;
+	/* MsnSlpLink *slplink; */
+	char *content;
+
+	purple_debug_info("msn", "xfer_init\n");
+
+	slpcall = xfer->data;
+
+	/* Send Ok */
+	content = g_strdup_printf("SessionID: %lu\r\n\r\n",
+							  slpcall->session_id);
+
+	send_ok(slpcall, slpcall->branch, "application/x-msnmsgr-sessionreqbody",
+			content);
+
+	g_free(content);
+	msn_slplink_unleash(slpcall->slplink);
+}
+
+void
+msn_xfer_cancel(PurpleXfer *xfer)
+{
+	MsnSlpCall *slpcall;
+	char *content;
+
+	g_return_if_fail(xfer != NULL);
+	g_return_if_fail(xfer->data != NULL);
+
+	slpcall = xfer->data;
+
+	if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL)
+	{
+		if (slpcall->started)
+		{
+			msn_slp_call_close(slpcall);
+		}
+		else
+		{
+			content = g_strdup_printf("SessionID: %lu\r\n\r\n",
+									slpcall->session_id);
+
+			send_decline(slpcall, slpcall->branch, "application/x-msnmsgr-sessionreqbody",
+						content);
+
+			g_free(content);
+			msn_slplink_unleash(slpcall->slplink);
+
+			msn_slp_call_destroy(slpcall);
+		}
+	}
+}
+
+void
+msn_xfer_progress_cb(MsnSlpCall *slpcall, gsize total_length, gsize len, gsize offset)
+{
+	PurpleXfer *xfer;
+
+	xfer = slpcall->xfer;
+
+	xfer->bytes_sent = (offset + len);
+	xfer->bytes_remaining = total_length - (offset + len);
+
+	purple_xfer_update_progress(xfer);
+}
+
+void
+msn_xfer_end_cb(MsnSlpCall *slpcall, MsnSession *session)
+{
+	if ((purple_xfer_get_status(slpcall->xfer) != PURPLE_XFER_STATUS_DONE) &&
+		(purple_xfer_get_status(slpcall->xfer) != PURPLE_XFER_STATUS_CANCEL_REMOTE) &&
+		(purple_xfer_get_status(slpcall->xfer) != PURPLE_XFER_STATUS_CANCEL_LOCAL))
+	{
+		purple_xfer_cancel_remote(slpcall->xfer);
+	}
+}
+
+void
+msn_xfer_completed_cb(MsnSlpCall *slpcall, const guchar *body,
+					  gsize size)
+{
+	PurpleXfer *xfer = slpcall->xfer;
+	purple_xfer_set_completed(xfer, TRUE);
+	purple_xfer_end(xfer);
+}
+
+/**************************************************************************
+ * SLP Control
+ **************************************************************************/
+
+#if 0
+static void
+got_transresp(MsnSlpCall *slpcall, const char *nonce,
+			  const char *ips_str, int port)
+{
+	MsnDirectConn *directconn;
+	char **ip_addrs, **c;
+
+	directconn = msn_directconn_new(slpcall->slplink);
+
+	directconn->initial_call = slpcall;
+
+	/* msn_directconn_parse_nonce(directconn, nonce); */
+	directconn->nonce = g_strdup(nonce);
+
+	ip_addrs = g_strsplit(ips_str, " ", -1);
+
+	for (c = ip_addrs; *c != NULL; c++)
+	{
+		purple_debug_info("msn", "ip_addr = %s\n", *c);
+		if (msn_directconn_connect(directconn, *c, port))
+			break;
+	}
+
+	g_strfreev(ip_addrs);
+}
+#endif
+
+static void
+send_ok(MsnSlpCall *slpcall, const char *branch,
+		const char *type, const char *content)
+{
+	MsnSlpLink *slplink;
+	MsnSlpMessage *slpmsg;
+
+	slplink = slpcall->slplink;
+
+	/* 200 OK */
+	slpmsg = msn_slpmsg_sip_new(slpcall, 1,
+								"MSNSLP/1.0 200 OK",
+								branch, type, content);
+
+#ifdef MSN_DEBUG_SLP
+	slpmsg->info = "SLP 200 OK";
+	slpmsg->text_body = TRUE;
+#endif
+
+	msn_slplink_queue_slpmsg(slplink, slpmsg);
+
+	msn_slp_call_session_init(slpcall);
+}
+
+static void
+send_decline(MsnSlpCall *slpcall, const char *branch,
+			 const char *type, const char *content)
+{
+	MsnSlpLink *slplink;
+	MsnSlpMessage *slpmsg;
+
+	slplink = slpcall->slplink;
+
+	/* 603 Decline */
+	slpmsg = msn_slpmsg_sip_new(slpcall, 1,
+								"MSNSLP/1.0 603 Decline",
+								branch, type, content);
+
+#ifdef MSN_DEBUG_SLP
+	slpmsg->info = "SLP 603 Decline";
+	slpmsg->text_body = TRUE;
+#endif
+
+	msn_slplink_queue_slpmsg(slplink, slpmsg);
+}
+
+#define MAX_FILE_NAME_LEN 0x226
+
+static void
+got_sessionreq(MsnSlpCall *slpcall, const char *branch,
+			   const char *euf_guid, const char *context)
+{
+	if (!strcmp(euf_guid, "A4268EEC-FEC5-49E5-95C3-F126696BDBF6"))
+	{
+		/* Emoticon or UserDisplay */
+		char *content;
+		gsize len;
+		MsnSlpSession *slpsession;
+		MsnSlpLink *slplink;
+		MsnSlpMessage *slpmsg;
+		MsnObject *obj;
+		char *msnobj_data;
+		PurpleStoredImage *img;
+		int type;
+
+		/* Send Ok */
+		content = g_strdup_printf("SessionID: %lu\r\n\r\n",
+								  slpcall->session_id);
+
+		send_ok(slpcall, branch, "application/x-msnmsgr-sessionreqbody",
+				content);
+
+		g_free(content);
+
+		slplink = slpcall->slplink;
+
+		msnobj_data = (char *)purple_base64_decode(context, &len);
+		obj = msn_object_new_from_string(msnobj_data);
+		type = msn_object_get_type(obj);
+		g_free(msnobj_data);
+
+		if (!(type == MSN_OBJECT_USERTILE))
+		{
+			purple_debug_error("msn", "Wrong object?\n");
+			msn_object_destroy(obj);
+			g_return_if_reached();
+		}
+
+		img = msn_object_get_image(obj);
+		if (img == NULL)
+		{
+			purple_debug_error("msn", "Wrong object.\n");
+			msn_object_destroy(obj);
+			g_return_if_reached();
+		}
+
+		msn_object_destroy(obj);
+
+		slpsession = msn_slplink_find_slp_session(slplink,
+												  slpcall->session_id);
+
+		/* DATA PREP */
+		slpmsg = msn_slpmsg_new(slplink);
+		slpmsg->slpcall = slpcall;
+		slpmsg->slpsession = slpsession;
+		slpmsg->session_id = slpsession->id;
+		msn_slpmsg_set_body(slpmsg, NULL, 4);
+#ifdef MSN_DEBUG_SLP
+		slpmsg->info = "SLP DATA PREP";
+#endif
+		msn_slplink_queue_slpmsg(slplink, slpmsg);
+
+		/* DATA */
+		slpmsg = msn_slpmsg_new(slplink);
+		slpmsg->slpcall = slpcall;
+		slpmsg->slpsession = slpsession;
+		slpmsg->flags = 0x20;
+#ifdef MSN_DEBUG_SLP
+		slpmsg->info = "SLP DATA";
+#endif
+		msn_slpmsg_set_image(slpmsg, img);
+		msn_slplink_queue_slpmsg(slplink, slpmsg);
+	}
+	else if (!strcmp(euf_guid, "5D3E02AB-6190-11D3-BBBB-00C04F795683"))
+	{
+		/* File Transfer */
+		PurpleAccount *account;
+		PurpleXfer *xfer;
+		char *bin;
+		gsize bin_len;
+		guint32 file_size;
+		char *file_name;
+		gunichar2 *uni_name;
+
+		account = slpcall->slplink->session->account;
+
+		slpcall->cb = msn_xfer_completed_cb;
+		slpcall->end_cb = msn_xfer_end_cb;
+		slpcall->progress_cb = msn_xfer_progress_cb;
+		slpcall->branch = g_strdup(branch);
+
+		slpcall->pending = TRUE;
+
+		xfer = purple_xfer_new(account, PURPLE_XFER_RECEIVE,
+							 slpcall->slplink->remote_user);
+		if (xfer)
+		{
+			bin = (char *)purple_base64_decode(context, &bin_len);
+			file_size = GUINT32_FROM_LE(*(gsize *)(bin + 8));
+
+			uni_name = (gunichar2 *)(bin + 20);
+			while(*uni_name != 0 && ((char *)uni_name - (bin + 20)) < MAX_FILE_NAME_LEN) {
+				*uni_name = GUINT16_FROM_LE(*uni_name);
+				uni_name++;
+			}
+
+			file_name = g_utf16_to_utf8((const gunichar2 *)(bin + 20), -1,
+										NULL, NULL, NULL);
+
+			g_free(bin);
+
+			purple_xfer_set_filename(xfer, 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);
+			purple_xfer_set_cancel_recv_fnc(xfer, msn_xfer_cancel);
+
+			slpcall->xfer = xfer;
+			purple_xfer_ref(slpcall->xfer);
+
+			xfer->data = slpcall;
+
+			purple_xfer_request(xfer);
+		}
+	}
+}
+
+void
+send_bye(MsnSlpCall *slpcall, const char *type)
+{
+	MsnSlpLink *slplink;
+	MsnSlpMessage *slpmsg;
+	char *header;
+
+	slplink = slpcall->slplink;
+
+	g_return_if_fail(slplink != NULL);
+
+	header = g_strdup_printf("BYE MSNMSGR:%s MSNSLP/1.0",
+							 slplink->local_user);
+
+	slpmsg = msn_slpmsg_sip_new(slpcall, 0, header,
+								"A0D624A6-6C0C-4283-A9E0-BC97B4B46D32",
+								type,
+								"\r\n");
+	g_free(header);
+
+#ifdef MSN_DEBUG_SLP
+	slpmsg->info = "SLP BYE";
+	slpmsg->text_body = TRUE;
+#endif
+
+	msn_slplink_queue_slpmsg(slplink, slpmsg);
+}
+
+static void
+got_invite(MsnSlpCall *slpcall,
+		   const char *branch, const char *type, const char *content)
+{
+	MsnSlpLink *slplink;
+
+	slplink = slpcall->slplink;
+
+	if (!strcmp(type, "application/x-msnmsgr-sessionreqbody"))
+	{
+		char *euf_guid, *context;
+		char *temp;
+
+		euf_guid = get_token(content, "EUF-GUID: {", "}\r\n");
+
+		temp = get_token(content, "SessionID: ", "\r\n");
+		if (temp != NULL)
+			slpcall->session_id = atoi(temp);
+		g_free(temp);
+
+		temp = get_token(content, "AppID: ", "\r\n");
+		if (temp != NULL)
+			slpcall->app_id = atoi(temp);
+		g_free(temp);
+
+		context = get_token(content, "Context: ", "\r\n");
+
+		if (context != NULL)
+			got_sessionreq(slpcall, branch, euf_guid, context);
+
+		g_free(context);
+		g_free(euf_guid);
+	}
+	else if (!strcmp(type, "application/x-msnmsgr-transreqbody"))
+	{
+		/* A direct connection? */
+
+		char *listening, *nonce;
+		char *content;
+
+		if (FALSE)
+		{
+#if 0
+			MsnDirectConn *directconn;
+			/* const char *ip_addr; */
+			char *ip_port;
+			int port;
+
+			/* ip_addr = purple_prefs_get_string("/purple/ft/public_ip"); */
+			ip_port = "5190";
+			listening = "true";
+			nonce = rand_guid();
+
+			directconn = msn_directconn_new(slplink);
+
+			/* msn_directconn_parse_nonce(directconn, nonce); */
+			directconn->nonce = g_strdup(nonce);
+
+			msn_directconn_listen(directconn);
+
+			port = directconn->port;
+
+			content = g_strdup_printf(
+				"Bridge: TCPv1\r\n"
+				"Listening: %s\r\n"
+				"Nonce: {%s}\r\n"
+				"Ipv4Internal-Addrs: 192.168.0.82\r\n"
+				"Ipv4Internal-Port: %d\r\n"
+				"\r\n",
+				listening,
+				nonce,
+				port);
+#endif
+		}
+		else
+		{
+			listening = "false";
+			nonce = g_strdup("00000000-0000-0000-0000-000000000000");
+
+			content = g_strdup_printf(
+				"Bridge: TCPv1\r\n"
+				"Listening: %s\r\n"
+				"Nonce: {%s}\r\n"
+				"\r\n",
+				listening,
+				nonce);
+		}
+
+		send_ok(slpcall, branch,
+				"application/x-msnmsgr-transrespbody", content);
+
+		g_free(content);
+		g_free(nonce);
+	}
+	else if (!strcmp(type, "application/x-msnmsgr-transrespbody"))
+	{
+#if 0
+		char *ip_addrs;
+		char *temp;
+		char *nonce;
+		int port;
+
+		nonce = get_token(content, "Nonce: {", "}\r\n");
+		ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n");
+
+		temp = get_token(content, "IPv4Internal-Port: ", "\r\n");
+		if (temp != NULL)
+			port = atoi(temp);
+		else
+			port = -1;
+		g_free(temp);
+
+		if (ip_addrs == NULL)
+			return;
+
+		if (port > 0)
+			got_transresp(slpcall, nonce, ip_addrs, port);
+
+		g_free(nonce);
+		g_free(ip_addrs);
+#endif
+	}
+}
+
+static void
+got_ok(MsnSlpCall *slpcall,
+	   const char *type, const char *content)
+{
+	g_return_if_fail(slpcall != NULL);
+	g_return_if_fail(type    != NULL);
+
+	if (!strcmp(type, "application/x-msnmsgr-sessionreqbody"))
+	{
+#if 0
+		if (slpcall->type == MSN_SLPCALL_DC)
+		{
+			/* First let's try a DirectConnection. */
+
+			MsnSlpLink *slplink;
+			MsnSlpMessage *slpmsg;
+			char *header;
+			char *content;
+			char *branch;
+
+			slplink = slpcall->slplink;
+
+			branch = rand_guid();
+
+			content = g_strdup_printf(
+				"Bridges: TRUDPv1 TCPv1\r\n"
+				"NetID: 0\r\n"
+				"Conn-Type: Direct-Connect\r\n"
+				"UPnPNat: false\r\n"
+				"ICF: false\r\n"
+			);
+
+			header = g_strdup_printf("INVITE MSNMSGR:%s MSNSLP/1.0",
+									 slplink->remote_user);
+
+			slpmsg = msn_slp_sipmsg_new(slpcall, 0, header, branch,
+										"application/x-msnmsgr-transreqbody",
+										content);
+
+#ifdef MSN_DEBUG_SLP
+			slpmsg->info = "SLP INVITE";
+			slpmsg->text_body = TRUE;
+#endif
+			msn_slplink_send_slpmsg(slplink, slpmsg);
+
+			g_free(header);
+			g_free(content);
+
+			g_free(branch);
+		}
+		else
+		{
+			msn_slp_call_session_init(slpcall);
+		}
+#else
+		msn_slp_call_session_init(slpcall);
+#endif
+	}
+	else if (!strcmp(type, "application/x-msnmsgr-transreqbody"))
+	{
+		/* Do we get this? */
+		purple_debug_info("msn", "OK with transreqbody\n");
+	}
+	else if (!strcmp(type, "application/x-msnmsgr-transrespbody"))
+	{
+#if 0
+		char *ip_addrs;
+		char *temp;
+		char *nonce;
+		int port;
+
+		nonce = get_token(content, "Nonce: {", "}\r\n");
+		ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n");
+
+		temp = get_token(content, "IPv4Internal-Port: ", "\r\n");
+		if (temp != NULL)
+			port = atoi(temp);
+		else
+			port = -1;
+		g_free(temp);
+
+		if (ip_addrs == NULL)
+			return;
+
+		if (port > 0)
+			got_transresp(slpcall, nonce, ip_addrs, port);
+
+		g_free(nonce);
+		g_free(ip_addrs);
+#endif
+	}
+}
+
+MsnSlpCall *
+msn_slp_sip_recv(MsnSlpLink *slplink, const char *body)
+{
+	MsnSlpCall *slpcall;
+
+	if (body == NULL)
+	{
+		purple_debug_warning("msn", "received bogus message\n");
+		return NULL;
+	}
+
+	if (!strncmp(body, "INVITE", strlen("INVITE")))
+	{
+		char *branch;
+		char *content;
+		char *content_type;
+
+		slpcall = msn_slp_call_new(slplink);
+
+		/* From: <msnmsgr:buddy@hotmail.com> */
+#if 0
+		slpcall->remote_user = get_token(body, "From: <msnmsgr:", ">\r\n");
+#endif
+
+		branch = get_token(body, ";branch={", "}");
+
+		slpcall->id = get_token(body, "Call-ID: {", "}");
+
+#if 0
+		long content_len = -1;
+
+		temp = get_token(body, "Content-Length: ", "\r\n");
+		if (temp != NULL)
+			content_len = atoi(temp);
+		g_free(temp);
+#endif
+		content_type = get_token(body, "Content-Type: ", "\r\n");
+
+		content = get_token(body, "\r\n\r\n", NULL);
+
+		got_invite(slpcall, branch, content_type, content);
+
+		g_free(branch);
+		g_free(content_type);
+		g_free(content);
+	}
+	else if (!strncmp(body, "MSNSLP/1.0 ", strlen("MSNSLP/1.0 ")))
+	{
+		char *content;
+		char *content_type;
+		/* Make sure this is "OK" */
+		const char *status = body + strlen("MSNSLP/1.0 ");
+		char *call_id;
+
+		call_id = get_token(body, "Call-ID: {", "}");
+		slpcall = msn_slplink_find_slp_call(slplink, call_id);
+		g_free(call_id);
+
+		g_return_val_if_fail(slpcall != NULL, NULL);
+
+		if (strncmp(status, "200 OK", 6))
+		{
+			/* It's not valid. Kill this off. */
+			char temp[32];
+			const char *c;
+
+			/* Eww */
+			if ((c = strchr(status, '\r')) || (c = strchr(status, '\n')) ||
+				(c = strchr(status, '\0')))
+			{
+				size_t offset =  c - status;
+				if (offset >= sizeof(temp))
+					offset = sizeof(temp) - 1;
+
+				strncpy(temp, status, offset);
+				temp[offset] = '\0';
+			}
+
+			purple_debug_error("msn", "Received non-OK result: %s\n", temp);
+
+			slpcall->wasted = TRUE;
+
+			/* msn_slp_call_destroy(slpcall); */
+			return slpcall;
+		}
+
+		content_type = get_token(body, "Content-Type: ", "\r\n");
+
+		content = get_token(body, "\r\n\r\n", NULL);
+
+		got_ok(slpcall, content_type, content);
+
+		g_free(content_type);
+		g_free(content);
+	}
+	else if (!strncmp(body, "BYE", strlen("BYE")))
+	{
+		char *call_id;
+
+		call_id = get_token(body, "Call-ID: {", "}");
+		slpcall = msn_slplink_find_slp_call(slplink, call_id);
+		g_free(call_id);
+
+		if (slpcall != NULL)
+			slpcall->wasted = TRUE;
+
+		/* msn_slp_call_destroy(slpcall); */
+	}
+	else
+		slpcall = NULL;
+
+	return slpcall;
+}
+
+/**************************************************************************
+ * Msg Callbacks
+ **************************************************************************/
+
+void
+msn_p2p_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	MsnSession *session;
+	MsnSlpLink *slplink;
+
+	session = cmdproc->servconn->session;
+	slplink = msn_session_get_slplink(session, msg->remote_user);
+
+	if (slplink->swboard == NULL)
+	{
+		/* We will need this in order to change its flags. */
+		slplink->swboard = (MsnSwitchBoard *)cmdproc->data;
+		/* If swboard is NULL, something has probably gone wrong earlier on
+		 * I didn't want to do this, but MSN 7 is somehow causing us to crash
+		 * here, I couldn't reproduce it to debug more, and people are
+		 * reporting bugs. Hopefully this doesn't cause more crashes. Stu.
+		 */
+		if (slplink->swboard != NULL)
+			slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink);
+		else
+			purple_debug_error("msn", "msn_p2p_msg, swboard is NULL, ouch!\n");
+	}
+
+	msn_slplink_process_msg(slplink, msg);
+}
+
+static void
+got_emoticon(MsnSlpCall *slpcall,
+			 const guchar *data, gsize size)
+{
+
+	PurpleConversation *conv;
+	PurpleConnection *gc;
+	const char *who;
+
+	gc = slpcall->slplink->session->account->gc;
+	who = slpcall->slplink->remote_user;
+
+	if ((conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, who, gc->account))) {
+
+		/* FIXME: it would be better if we wrote the data as we received it
+		          instead of all at once, calling write multiple times and
+		          close once at the very end
+		*/
+		purple_conv_custom_smiley_write(conv, slpcall->data_info, data, size);
+		purple_conv_custom_smiley_close(conv, slpcall->data_info);
+	}
+#ifdef MSN_DEBUG_UD
+	purple_debug_info("msn", "Got smiley: %s\n", slpcall->data_info);
+#endif
+}
+
+void
+msn_emoticon_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	MsnSession *session;
+	MsnSlpLink *slplink;
+	MsnObject *obj;
+	char **tokens;
+	char *smile, *body_str;
+	const char *body, *who, *sha1;
+	guint tok;
+	size_t body_len;
+
+	PurpleConversation *conv;
+
+	session = cmdproc->servconn->session;
+
+	if (!purple_account_get_bool(session->account, "custom_smileys", TRUE))
+		return;
+
+	body = msn_message_get_bin_data(msg, &body_len);
+	body_str = g_strndup(body, body_len);
+
+	/* MSN Messenger 7 may send more than one MSNObject in a single message...
+	 * Maybe 10 tokens is a reasonable max value. */
+	tokens = g_strsplit(body_str, "\t", 10);
+
+	g_free(body_str);
+
+	for (tok = 0; tok < 9; tok += 2) {
+		if (tokens[tok] == NULL || tokens[tok + 1] == NULL) {
+			break;
+		}
+
+		smile = tokens[tok];
+		obj = msn_object_new_from_string(purple_url_decode(tokens[tok + 1]));
+
+		if (obj == NULL)
+			break;
+
+		who = msn_object_get_creator(obj);
+		sha1 = msn_object_get_sha1(obj);
+
+		slplink = msn_session_get_slplink(session, who);
+
+		conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, who,
+												   session->account);
+
+		/* If the conversation doesn't exist then this is a custom smiley
+		 * used in the first message in a MSN conversation: we need to create
+		 * the conversation now, otherwise the custom smiley won't be shown.
+		 * This happens because every GtkIMHtml has its own smiley tree: if
+		 * the conversation doesn't exist then we cannot associate the new
+		 * smiley with its GtkIMHtml widget. */
+		if (!conv) {
+			conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, session->account, who);
+		}
+
+		if (purple_conv_custom_smiley_add(conv, smile, "sha1", sha1, TRUE)) {
+			msn_slplink_request_object(slplink, smile, got_emoticon, NULL, obj);
+		}
+
+		msn_object_destroy(obj);
+		obj =   NULL;
+		who =   NULL;
+		sha1 = NULL;
+	}
+	g_strfreev(tokens);
+}
+
+static gboolean
+buddy_icon_cached(PurpleConnection *gc, MsnObject *obj)
+{
+	PurpleAccount *account;
+	PurpleBuddy *buddy;
+	const char *old;
+	const char *new;
+
+	g_return_val_if_fail(obj != NULL, FALSE);
+
+	account = purple_connection_get_account(gc);
+
+	buddy = purple_find_buddy(account, msn_object_get_creator(obj));
+	if (buddy == NULL)
+		return FALSE;
+
+	old = purple_buddy_icons_get_checksum_for_user(buddy);
+	new = msn_object_get_sha1(obj);
+
+	if (new == NULL)
+		return FALSE;
+
+	/* If the old and new checksums are the same, and the file actually exists,
+	 * then return TRUE */
+	if (old != NULL && !strcmp(old, new))
+		return TRUE;
+
+	return FALSE;
+}
+
+static void
+msn_release_buddy_icon_request(MsnUserList *userlist)
+{
+	MsnUser *user;
+
+	g_return_if_fail(userlist != NULL);
+
+#ifdef MSN_DEBUG_UD
+	purple_debug_info("msn", "Releasing buddy icon request\n");
+#endif
+
+	if (userlist->buddy_icon_window > 0)
+	{
+		GQueue *queue;
+		PurpleAccount *account;
+		const char *username;
+
+		queue = userlist->buddy_icon_requests;
+
+		if (g_queue_is_empty(userlist->buddy_icon_requests))
+			return;
+
+		user = g_queue_pop_head(queue);
+
+		account  = userlist->session->account;
+		username = user->passport;
+
+		userlist->buddy_icon_window--;
+		msn_request_user_display(user);
+
+#ifdef MSN_DEBUG_UD
+		purple_debug_info("msn", "msn_release_buddy_icon_request(): buddy_icon_window-- yields =%d\n",
+						userlist->buddy_icon_window);
+#endif
+	}
+}
+
+/*
+ * Called on a timeout from end_user_display(). Frees a buddy icon window slow and dequeues the next
+ * buddy icon request if there is one.
+ */
+static gboolean
+msn_release_buddy_icon_request_timeout(gpointer data)
+{
+	MsnUserList *userlist = (MsnUserList *)data;
+	
+	/* Free one window slot */
+	userlist->buddy_icon_window++;	
+	
+	/* Clear the tag for our former request timer */
+	userlist->buddy_icon_request_timer = 0;
+	
+	msn_release_buddy_icon_request(userlist);
+	
+	return FALSE;
+}
+
+void
+msn_queue_buddy_icon_request(MsnUser *user)
+{
+	PurpleAccount *account;
+	MsnObject *obj;
+	GQueue *queue;
+
+	g_return_if_fail(user != NULL);
+
+	account = user->userlist->session->account;
+
+	obj = msn_user_get_object(user);
+
+	if (obj == NULL)
+	{
+		purple_buddy_icons_set_for_user(account, user->passport, NULL, 0, NULL);
+		return;
+	}
+
+	if (!buddy_icon_cached(account->gc, obj))
+	{
+		MsnUserList *userlist;
+
+		userlist = user->userlist;
+		queue = userlist->buddy_icon_requests;
+
+#ifdef MSN_DEBUG_UD
+		purple_debug_info("msn", "Queueing buddy icon request for %s (buddy_icon_window = %i)\n",
+						user->passport, userlist->buddy_icon_window);
+#endif
+
+		g_queue_push_tail(queue, user);
+
+		if (userlist->buddy_icon_window > 0)
+			msn_release_buddy_icon_request(userlist);
+	}
+}
+
+static void
+got_user_display(MsnSlpCall *slpcall,
+				 const guchar *data, gsize size)
+{
+	MsnUserList *userlist;
+	const char *info;
+	PurpleAccount *account;
+
+	g_return_if_fail(slpcall != NULL);
+
+	info = slpcall->data_info;
+#ifdef MSN_DEBUG_UD
+	purple_debug_info("msn", "Got User Display: %s\n", slpcall->slplink->remote_user);
+#endif
+
+	userlist = slpcall->slplink->session->userlist;
+	account = slpcall->slplink->session->account;
+
+	purple_buddy_icons_set_for_user(account, slpcall->slplink->remote_user,
+								  g_memdup(data, size), size, info);
+
+#if 0
+	/* Free one window slot */
+	userlist->buddy_icon_window++;
+
+	purple_debug_info("msn", "got_user_display(): buddy_icon_window++ yields =%d\n",
+					userlist->buddy_icon_window);
+
+	msn_release_buddy_icon_request(userlist);
+#endif
+}
+
+static void
+end_user_display(MsnSlpCall *slpcall, MsnSession *session)
+{
+	MsnUserList *userlist;
+
+	g_return_if_fail(session != NULL);
+
+#ifdef MSN_DEBUG_UD
+	purple_debug_info("msn", "End User Display\n");
+#endif
+
+	userlist = session->userlist;
+
+	/* If the session is being destroyed we better stop doing anything. */
+	if (session->destroying)
+		return;
+
+	/* Delay before freeing a buddy icon window slot and requesting the next icon, if appropriate.
+	 * If we don't delay, we'll rapidly hit the MSN equivalent of AIM's rate limiting; the server will
+	 * send us an error 800 like so:
+	 *
+	 * C: NS 000: XFR 21 SB
+	 * S: NS 000: 800 21
+	 */
+	if (userlist->buddy_icon_request_timer) {
+		/* Free the window slot used by this previous request */
+		userlist->buddy_icon_window++;
+
+		/* Clear our pending timeout */
+		purple_timeout_remove(userlist->buddy_icon_request_timer);
+	}
+
+	/* Wait BUDDY_ICON_DELAY ms before freeing our window slot and requesting the next icon. */
+	userlist->buddy_icon_request_timer = purple_timeout_add(BUDDY_ICON_DELAY, 
+														  msn_release_buddy_icon_request_timeout, userlist);
+}
+
+void
+msn_request_user_display(MsnUser *user)
+{
+	PurpleAccount *account;
+	MsnSession *session;
+	MsnSlpLink *slplink;
+	MsnObject *obj;
+	const char *info;
+
+	session = user->userlist->session;
+	account = session->account;
+
+	slplink = msn_session_get_slplink(session, user->passport);
+
+	obj = msn_user_get_object(user);
+
+	info = msn_object_get_sha1(obj);
+
+	if (g_ascii_strcasecmp(user->passport,
+						   purple_account_get_username(account)))
+	{
+		msn_slplink_request_object(slplink, info, got_user_display,
+								   end_user_display, obj);
+	}
+	else
+	{
+		MsnObject *my_obj = NULL;
+		gconstpointer data = NULL;
+		size_t len = 0;
+
+#ifdef MSN_DEBUG_UD
+		purple_debug_info("msn", "Requesting our own user display\n");
+#endif
+
+		my_obj = msn_user_get_object(session->user);
+
+		if (my_obj != NULL)
+		{
+			PurpleStoredImage *img = msn_object_get_image(my_obj);
+			data = purple_imgstore_get_data(img);
+			len = purple_imgstore_get_size(img);
+		}
+
+		purple_buddy_icons_set_for_user(account, user->passport, g_memdup(data, len), len, info);
+
+		/* Free one window slot */
+		session->userlist->buddy_icon_window++;
+
+#ifdef MSN_DEBUG_UD
+		purple_debug_info("msn", "msn_request_user_display(): buddy_icon_window++ yields =%d\n",
+						session->userlist->buddy_icon_window);
+#endif
+
+		msn_release_buddy_icon_request(session->userlist);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slp.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,48 @@
+/**
+ * @file slp.h MSNSLP support
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_SLP_H_
+#define _MSN_SLP_H_
+
+#include "slpcall.h"
+#include "session.h"
+#include "internal.h"
+#include "ft.h"
+
+void msn_xfer_progress_cb(MsnSlpCall *slpcall, gsize total_length, gsize
+						  len, gsize offset);
+
+MsnSlpCall * msn_slp_sip_recv(MsnSlpLink *slplink,
+							  const char *body);
+
+void send_bye(MsnSlpCall *slpcall, const char *type);
+
+void msn_xfer_completed_cb(MsnSlpCall *slpcall,
+						   const guchar *body, gsize size);
+
+void msn_xfer_cancel(PurpleXfer *xfer);
+void msn_xfer_end_cb(MsnSlpCall *slpcall, MsnSession *session);
+
+void msn_queue_buddy_icon_request(MsnUser *user);
+
+#endif /* _MSN_SLP_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slpcall.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,270 @@
+/**
+ * @file slpcall.c SLP Call Functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "slpcall.h"
+#include "slpsession.h"
+
+#include "slp.h"
+
+/* #define MSN_DEBUG_SLPCALL */
+
+/**************************************************************************
+ * Util
+ **************************************************************************/
+
+static char *
+rand_guid()
+{
+	return g_strdup_printf("%4X%4X-%4X-%4X-%4X-%4X%4X%4X",
+			rand() % 0xAAFF + 0x1111,
+			rand() % 0xAAFF + 0x1111,
+			rand() % 0xAAFF + 0x1111,
+			rand() % 0xAAFF + 0x1111,
+			rand() % 0xAAFF + 0x1111,
+			rand() % 0xAAFF + 0x1111,
+			rand() % 0xAAFF + 0x1111,
+			rand() % 0xAAFF + 0x1111);
+}
+
+/**************************************************************************
+ * Main
+ **************************************************************************/
+
+MsnSlpCall *
+msn_slp_call_new(MsnSlpLink *slplink)
+{
+	MsnSlpCall *slpcall;
+
+	g_return_val_if_fail(slplink != NULL, NULL);
+
+	slpcall = g_new0(MsnSlpCall, 1);
+
+#ifdef MSN_DEBUG_SLPCALL
+	purple_debug_info("msn", "slpcall_new: slpcall(%p)\n", slpcall);
+#endif
+
+	slpcall->slplink = slplink;
+
+	msn_slplink_add_slpcall(slplink, slpcall);
+
+	slpcall->timer = purple_timeout_add(MSN_SLPCALL_TIMEOUT, msn_slp_call_timeout, slpcall);
+
+	return slpcall;
+}
+
+void
+msn_slp_call_destroy(MsnSlpCall *slpcall)
+{
+	GList *e;
+	MsnSession *session;
+
+#ifdef MSN_DEBUG_SLPCALL
+	purple_debug_info("msn", "slpcall_destroy: slpcall(%p)\n", slpcall);
+#endif
+
+	g_return_if_fail(slpcall != NULL);
+
+	if (slpcall->timer)
+		purple_timeout_remove(slpcall->timer);
+
+	if (slpcall->id != NULL)
+		g_free(slpcall->id);
+
+	if (slpcall->branch != NULL)
+		g_free(slpcall->branch);
+
+	if (slpcall->data_info != NULL)
+		g_free(slpcall->data_info);
+
+	for (e = slpcall->slplink->slp_msgs; e != NULL; )
+	{
+		MsnSlpMessage *slpmsg = e->data;
+		e = e->next;
+
+#ifdef MSN_DEBUG_SLPCALL_VERBOSE
+		purple_debug_info("msn", "slpcall_destroy: trying slpmsg(%p)\n",
+						slpmsg);
+#endif
+
+		if (slpmsg->slpcall == slpcall)
+		{
+			msn_slpmsg_destroy(slpmsg);
+		}
+	}
+
+	session = slpcall->slplink->session;
+
+	msn_slplink_remove_slpcall(slpcall->slplink, slpcall);
+
+	if (slpcall->end_cb != NULL)
+		slpcall->end_cb(slpcall, session);
+
+	if (slpcall->xfer != NULL)
+		purple_xfer_unref(slpcall->xfer);
+
+	g_free(slpcall);
+}
+
+void
+msn_slp_call_init(MsnSlpCall *slpcall, MsnSlpCallType type)
+{
+	slpcall->session_id = rand() % 0xFFFFFF00 + 4;
+	slpcall->id = rand_guid();
+	slpcall->type = type;
+}
+
+void
+msn_slp_call_session_init(MsnSlpCall *slpcall)
+{
+	MsnSlpSession *slpsession;
+
+	slpsession = msn_slp_session_new(slpcall);
+
+	if (slpcall->session_init_cb)
+		slpcall->session_init_cb(slpsession);
+
+	slpcall->started = TRUE;
+}
+
+void
+msn_slp_call_invite(MsnSlpCall *slpcall, const char *euf_guid,
+					int app_id, const char *context)
+{
+	MsnSlpLink *slplink;
+	MsnSlpMessage *slpmsg;
+	char *header;
+	char *content;
+
+	g_return_if_fail(slpcall != NULL);
+	g_return_if_fail(context != NULL);
+
+	slplink = slpcall->slplink;
+
+	slpcall->branch = rand_guid();
+
+	content = g_strdup_printf(
+		"EUF-GUID: {%s}\r\n"
+		"SessionID: %lu\r\n"
+		"AppID: %d\r\n"
+		"Context: %s\r\n\r\n",
+		euf_guid,
+		slpcall->session_id,
+		app_id,
+		context);
+
+	header = g_strdup_printf("INVITE MSNMSGR:%s MSNSLP/1.0",
+							 slplink->remote_user);
+
+	slpmsg = msn_slpmsg_sip_new(slpcall, 0, header, slpcall->branch,
+								"application/x-msnmsgr-sessionreqbody", content);
+
+#ifdef MSN_DEBUG_SLP
+	slpmsg->info = "SLP INVITE";
+	slpmsg->text_body = TRUE;
+#endif
+
+	msn_slplink_send_slpmsg(slplink, slpmsg);
+
+	g_free(header);
+	g_free(content);
+}
+
+void
+msn_slp_call_close(MsnSlpCall *slpcall)
+{
+	g_return_if_fail(slpcall != NULL);
+	g_return_if_fail(slpcall->slplink != NULL);
+
+	send_bye(slpcall, "application/x-msnmsgr-sessionclosebody");
+	msn_slplink_unleash(slpcall->slplink);
+	msn_slp_call_destroy(slpcall);
+}
+
+gboolean
+msn_slp_call_timeout(gpointer data)
+{
+	MsnSlpCall *slpcall;
+
+	slpcall = data;
+
+#ifdef MSN_DEBUG_SLPCALL
+	purple_debug_info("msn", "slpcall_timeout: slpcall(%p)\n", slpcall);
+#endif
+
+	if (!slpcall->pending && !slpcall->progress)
+	{
+		msn_slp_call_destroy(slpcall);
+		return FALSE;
+	}
+
+	slpcall->progress = FALSE;
+
+	return TRUE;
+}
+
+MsnSlpCall *
+msn_slp_process_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
+{
+	MsnSlpCall *slpcall;
+	const guchar *body;
+	gsize body_len;
+
+	slpcall = NULL;
+	body = slpmsg->buffer;
+	body_len = slpmsg->size;
+
+	if (slpmsg->flags == 0x0)
+	{
+		char *body_str;
+
+		body_str = g_strndup((const char *)body, body_len);
+		slpcall = msn_slp_sip_recv(slplink, body_str);
+		g_free(body_str);
+	}
+	else if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030)
+	{
+		slpcall = msn_slplink_find_slp_call_with_session_id(slplink, slpmsg->session_id);
+
+		if (slpcall != NULL)
+		{
+			if (slpcall->timer)
+				purple_timeout_remove(slpcall->timer);
+
+			slpcall->cb(slpcall, body, body_len);
+
+			slpcall->wasted = TRUE;
+		}
+	}
+#if 0
+	else if (slpmsg->flags == 0x100)
+	{
+		slpcall = slplink->directconn->initial_call;
+
+		if (slpcall != NULL)
+			msn_slp_call_session_init(slpcall);
+	}
+#endif
+
+	return slpcall;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slpcall.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,91 @@
+/**
+ * @file slpcall.h SLP Call functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_SLPCALL_H_
+#define _MSN_SLPCALL_H_
+
+#include "internal.h"
+
+typedef struct _MsnSlpCall MsnSlpCall;
+
+#include "slplink.h"
+#include "slpsession.h"
+
+/* The official client seems to timeout slp calls after 5 minutes */
+#define MSN_SLPCALL_TIMEOUT 300000
+
+typedef enum
+{
+	MSN_SLPCALL_ANY,
+	MSN_SLPCALL_DC,
+
+} MsnSlpCallType;
+
+struct _MsnSlpCall
+{
+	/* MsnSession *session; */
+	MsnSlpLink *slplink;
+
+	MsnSlpCallType type;
+
+	/* Call-ID */
+	char *id;
+	char *branch;
+
+	long session_id;
+	long app_id;
+
+	gboolean pending; /**< A flag that states if we should wait for this
+						slpcall to start and do not time out. */
+	gboolean progress; /**< A flag that states if there has been progress since
+						 the last time out. */
+	gboolean wasted; /**< A flag that states if this slpcall is going to be
+					   destroyed. */
+	gboolean started; /**< A flag that states if this slpcall's session has
+						been initiated. */
+
+	void (*progress_cb)(MsnSlpCall *slpcall,
+						gsize total_length, gsize len, gsize offset);
+	void (*session_init_cb)(MsnSlpSession *slpsession);
+
+	/* Can be checksum, or smile */
+	char *data_info;
+
+	void *xfer;
+
+	MsnSlpCb cb;
+	void (*end_cb)(MsnSlpCall *slpcall, MsnSession *session);
+
+	int timer;
+};
+
+MsnSlpCall *msn_slp_call_new(MsnSlpLink *slplink);
+void msn_slp_call_init(MsnSlpCall *slpcall, MsnSlpCallType type);
+void msn_slp_call_session_init(MsnSlpCall *slpcall);
+void msn_slp_call_destroy(MsnSlpCall *slpcall);
+void msn_slp_call_invite(MsnSlpCall *slpcall, const char *euf_guid,
+						 int app_id, const char *context);
+void msn_slp_call_close(MsnSlpCall *slpcall);
+gboolean msn_slp_call_timeout(gpointer data);
+
+#endif /* _MSN_SLPCALL_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slplink.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,811 @@
+/**
+ * @file slplink.c MSNSLP Link support
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "slplink.h"
+
+#include "switchboard.h"
+#include "slp.h"
+
+void msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg);
+
+#ifdef MSN_DEBUG_SLP_FILES
+static int m_sc = 0;
+static int m_rc = 0;
+
+static void
+debug_msg_to_file(MsnMessage *msg, gboolean send)
+{
+	char *tmp;
+	char *dir;
+	char *pload;
+	FILE *tf;
+	int c;
+	gsize pload_size;
+
+	dir = send ? "send" : "recv";
+	c = send ? m_sc++ : m_rc++;
+	tmp = g_strdup_printf("%s/msntest/%s/%03d", g_get_home_dir(), dir, c);
+	tf = g_fopen(tmp, "wb");
+	if (tf == NULL)
+	{
+		purple_debug_error("msn", "could not open debug file\n");
+		return;
+	}
+	pload = msn_message_gen_payload(msg, &pload_size);
+	fwrite(pload, 1, pload_size, tf);
+	fclose(tf);
+	g_free(tmp);
+}
+#endif
+
+/**************************************************************************
+ * Main
+ **************************************************************************/
+
+MsnSlpLink *
+msn_slplink_new(MsnSession *session, const char *username)
+{
+	MsnSlpLink *slplink;
+
+	g_return_val_if_fail(session != NULL, NULL);
+
+	slplink = g_new0(MsnSlpLink, 1);
+
+#ifdef MSN_DEBUG_SLPLINK
+	purple_debug_info("msn", "slplink_new: slplink(%p)\n", slplink);
+#endif
+
+	slplink->session = session;
+	slplink->slp_seq_id = rand() % 0xFFFFFF00 + 4;
+
+	slplink->local_user = g_strdup(msn_user_get_passport(session->user));
+	slplink->remote_user = g_strdup(username);
+
+	slplink->slp_msg_queue = g_queue_new();
+
+	session->slplinks =
+		g_list_append(session->slplinks, slplink);
+
+	return slplink;
+}
+
+void
+msn_slplink_destroy(MsnSlpLink *slplink)
+{
+	MsnSession *session;
+
+#ifdef MSN_DEBUG_SLPLINK
+	purple_debug_info("msn", "slplink_destroy: slplink(%p)\n", slplink);
+#endif
+
+	g_return_if_fail(slplink != NULL);
+
+	if (slplink->swboard != NULL)
+		slplink->swboard->slplinks = g_list_remove(slplink->swboard->slplinks, slplink);
+
+	session = slplink->session;
+
+	if (slplink->local_user != NULL)
+		g_free(slplink->local_user);
+
+	if (slplink->remote_user != NULL)
+		g_free(slplink->remote_user);
+
+	if (slplink->directconn != NULL)
+		msn_directconn_destroy(slplink->directconn);
+
+	while (slplink->slp_calls != NULL)
+		msn_slp_call_destroy(slplink->slp_calls->data);
+
+	session->slplinks =
+		g_list_remove(session->slplinks, slplink);
+
+	g_free(slplink);
+}
+
+MsnSlpLink *
+msn_session_find_slplink(MsnSession *session, const char *who)
+{
+	GList *l;
+
+	for (l = session->slplinks; l != NULL; l = l->next)
+	{
+		MsnSlpLink *slplink;
+
+		slplink = l->data;
+
+		if (!strcmp(slplink->remote_user, who))
+			return slplink;
+	}
+
+	return NULL;
+}
+
+MsnSlpLink *
+msn_session_get_slplink(MsnSession *session, const char *username)
+{
+	MsnSlpLink *slplink;
+
+	g_return_val_if_fail(session != NULL, NULL);
+	g_return_val_if_fail(username != NULL, NULL);
+
+	slplink = msn_session_find_slplink(session, username);
+
+	if (slplink == NULL)
+		slplink = msn_slplink_new(session, username);
+
+	return slplink;
+}
+
+MsnSlpSession *
+msn_slplink_find_slp_session(MsnSlpLink *slplink, long session_id)
+{
+	GList *l;
+	MsnSlpSession *slpsession;
+
+	for (l = slplink->slp_sessions; l != NULL; l = l->next)
+	{
+		slpsession = l->data;
+
+		if (slpsession->id == session_id)
+			return slpsession;
+	}
+
+	return NULL;
+}
+
+void
+msn_slplink_add_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall)
+{
+	if (slplink->swboard != NULL)
+		slplink->swboard->flag |= MSN_SB_FLAG_FT;
+
+	slplink->slp_calls = g_list_append(slplink->slp_calls, slpcall);
+}
+
+void
+msn_slplink_remove_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall)
+{
+	slplink->slp_calls = g_list_remove(slplink->slp_calls, slpcall);
+
+	/* The slplink has no slpcalls in it. If no one is using it, we might
+	 * destroy the switchboard, but we should be careful not to use the slplink
+	 * again. */
+	if (slplink->slp_calls == NULL)
+	{
+		if (slplink->swboard != NULL)
+		{
+			if (msn_switchboard_release(slplink->swboard, MSN_SB_FLAG_FT))
+				/* I'm not sure this is the best thing to do, but it's better
+				 * than nothing. */
+				slpcall->slplink = NULL;
+		}
+	}
+}
+
+MsnSlpCall *
+msn_slplink_find_slp_call(MsnSlpLink *slplink, const char *id)
+{
+	GList *l;
+	MsnSlpCall *slpcall;
+
+	if (!id)
+		return NULL;
+
+	for (l = slplink->slp_calls; l != NULL; l = l->next)
+	{
+		slpcall = l->data;
+
+		if (slpcall->id && !strcmp(slpcall->id, id))
+			return slpcall;
+	}
+
+	return NULL;
+}
+
+MsnSlpCall *
+msn_slplink_find_slp_call_with_session_id(MsnSlpLink *slplink, long id)
+{
+	GList *l;
+	MsnSlpCall *slpcall;
+
+	for (l = slplink->slp_calls; l != NULL; l = l->next)
+	{
+		slpcall = l->data;
+
+		if (slpcall->session_id == id)
+			return slpcall;
+	}
+
+	return NULL;
+}
+
+void
+msn_slplink_send_msg(MsnSlpLink *slplink, MsnMessage *msg)
+{
+	if (slplink->directconn != NULL)
+	{
+		msn_directconn_send_msg(slplink->directconn, msg);
+	}
+	else
+	{
+		if (slplink->swboard == NULL)
+		{
+			slplink->swboard = msn_session_get_swboard(slplink->session,
+													   slplink->remote_user, MSN_SB_FLAG_FT);
+
+			if (slplink->swboard == NULL)
+				return;
+
+			/* If swboard is destroyed we will be too */
+			slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink);
+		}
+
+		msn_switchboard_send_msg(slplink->swboard, msg, TRUE);
+	}
+}
+
+/* We have received the message ack */
+static void
+msg_ack(MsnMessage *msg, void *data)
+{
+	MsnSlpMessage *slpmsg;
+	long long real_size;
+
+	slpmsg = data;
+
+	real_size = (slpmsg->flags == 0x2) ? 0 : slpmsg->size;
+
+	slpmsg->offset += msg->msnslp_header.length;
+
+	if (slpmsg->offset < real_size)
+	{
+		msn_slplink_send_msgpart(slpmsg->slplink, slpmsg);
+	}
+	else
+	{
+		/* The whole message has been sent */
+		if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030)
+		{
+			if (slpmsg->slpcall != NULL)
+			{
+				if (slpmsg->slpcall->cb)
+					slpmsg->slpcall->cb(slpmsg->slpcall,
+						NULL, 0);
+			}
+		}
+	}
+
+	slpmsg->msgs = g_list_remove(slpmsg->msgs, msg);
+}
+
+/* We have received the message nak. */
+static void
+msg_nak(MsnMessage *msg, void *data)
+{
+	MsnSlpMessage *slpmsg;
+
+	slpmsg = data;
+
+	msn_slplink_send_msgpart(slpmsg->slplink, slpmsg);
+
+	slpmsg->msgs = g_list_remove(slpmsg->msgs, msg);
+}
+
+void
+msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
+{
+	MsnMessage *msg;
+	long long real_size;
+	size_t len = 0;
+
+	/* Maybe we will want to create a new msg for this slpmsg instead of
+	 * reusing the same one all the time. */
+	msg = slpmsg->msg;
+
+	real_size = (slpmsg->flags == 0x2) ? 0 : slpmsg->size;
+
+	if (slpmsg->offset < real_size)
+	{
+		if (slpmsg->fp)
+		{
+			char data[1202];
+			len = fread(data, 1, sizeof(data), slpmsg->fp);
+			msn_message_set_bin_data(msg, data, len);
+		}
+		else
+		{
+			len = slpmsg->size - slpmsg->offset;
+
+			if (len > 1202)
+				len = 1202;
+
+			msn_message_set_bin_data(msg, slpmsg->buffer + slpmsg->offset, len);
+		}
+
+		msg->msnslp_header.offset = slpmsg->offset;
+		msg->msnslp_header.length = len;
+	}
+
+#ifdef MSN_DEBUG_SLP
+	msn_message_show_readable(msg, slpmsg->info, slpmsg->text_body);
+#endif
+
+#ifdef MSN_DEBUG_SLP_FILES
+	debug_msg_to_file(msg, TRUE);
+#endif
+
+	slpmsg->msgs =
+		g_list_append(slpmsg->msgs, msg);
+	msn_slplink_send_msg(slplink, msg);
+
+	if ((slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) &&
+		(slpmsg->slpcall != NULL))
+	{
+		slpmsg->slpcall->progress = TRUE;
+
+		if (slpmsg->slpcall->progress_cb != NULL)
+		{
+			slpmsg->slpcall->progress_cb(slpmsg->slpcall, slpmsg->size,
+										 len, slpmsg->offset);
+		}
+	}
+
+	/* slpmsg->offset += len; */
+}
+
+void
+msn_slplink_release_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
+{
+	MsnMessage *msg;
+
+	slpmsg->msg = msg = msn_message_new_msnslp();
+
+	if (slpmsg->flags == 0x0)
+	{
+		msg->msnslp_header.session_id = slpmsg->session_id;
+		msg->msnslp_header.ack_id = rand() % 0xFFFFFF00;
+	}
+	else if (slpmsg->flags == 0x2)
+	{
+		msg->msnslp_header.session_id = slpmsg->session_id;
+		msg->msnslp_header.ack_id = slpmsg->ack_id;
+		msg->msnslp_header.ack_size = slpmsg->ack_size;
+		msg->msnslp_header.ack_sub_id = slpmsg->ack_sub_id;
+	}
+	else if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030)
+	{
+		MsnSlpSession *slpsession;
+		slpsession = slpmsg->slpsession;
+
+		g_return_if_fail(slpsession != NULL);
+		msg->msnslp_header.session_id = slpsession->id;
+		msg->msnslp_footer.value = slpsession->app_id;
+		msg->msnslp_header.ack_id = rand() % 0xFFFFFF00;
+	}
+	else if (slpmsg->flags == 0x100)
+	{
+		msg->msnslp_header.ack_id     = slpmsg->ack_id;
+		msg->msnslp_header.ack_sub_id = slpmsg->ack_sub_id;
+		msg->msnslp_header.ack_size   = slpmsg->ack_size;
+	}
+
+	msg->msnslp_header.id = slpmsg->id;
+	msg->msnslp_header.flags = slpmsg->flags;
+
+	msg->msnslp_header.total_size = slpmsg->size;
+
+	msn_message_set_attr(msg, "P2P-Dest", slplink->remote_user);
+
+	msg->ack_cb = msg_ack;
+	msg->nak_cb = msg_nak;
+	msg->ack_data = slpmsg;
+
+	msn_slplink_send_msgpart(slplink, slpmsg);
+
+	msn_message_destroy(msg);
+}
+
+void
+msn_slplink_queue_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
+{
+	slpmsg->id = slplink->slp_seq_id++;
+
+	g_queue_push_head(slplink->slp_msg_queue, slpmsg);
+}
+
+void
+msn_slplink_send_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
+{
+	slpmsg->id = slplink->slp_seq_id++;
+
+	msn_slplink_release_slpmsg(slplink, slpmsg);
+}
+
+void
+msn_slplink_unleash(MsnSlpLink *slplink)
+{
+	MsnSlpMessage *slpmsg;
+
+	/* Send the queued msgs in the order they came. */
+
+	while ((slpmsg = g_queue_pop_tail(slplink->slp_msg_queue)) != NULL)
+	{
+		msn_slplink_release_slpmsg(slplink, slpmsg);
+	}
+}
+
+void
+msn_slplink_send_ack(MsnSlpLink *slplink, MsnMessage *msg)
+{
+	MsnSlpMessage *slpmsg;
+
+	slpmsg = msn_slpmsg_new(slplink);
+
+	slpmsg->session_id = msg->msnslp_header.session_id;
+	slpmsg->size       = msg->msnslp_header.total_size;
+	slpmsg->flags      = 0x02;
+	slpmsg->ack_id     = msg->msnslp_header.id;
+	slpmsg->ack_sub_id = msg->msnslp_header.ack_id;
+	slpmsg->ack_size   = msg->msnslp_header.total_size;
+
+#ifdef MSN_DEBUG_SLP
+	slpmsg->info = "SLP ACK";
+#endif
+
+	msn_slplink_send_slpmsg(slplink, slpmsg);
+}
+
+static void
+send_file_cb(MsnSlpSession *slpsession)
+{
+	MsnSlpCall *slpcall;
+	MsnSlpMessage *slpmsg;
+	struct stat st;
+	PurpleXfer *xfer;
+
+	slpcall = slpsession->slpcall;
+	slpmsg = msn_slpmsg_new(slpcall->slplink);
+	slpmsg->slpcall = slpcall;
+	slpmsg->flags = 0x1000030;
+	slpmsg->slpsession = slpsession;
+#ifdef MSN_DEBUG_SLP
+	slpmsg->info = "SLP FILE";
+#endif
+	xfer = (PurpleXfer *)slpcall->xfer;
+	purple_xfer_start(slpcall->xfer, 0, NULL, 0);
+	slpmsg->fp = xfer->dest_fp;
+	if (g_stat(purple_xfer_get_local_filename(xfer), &st) == 0)
+		slpmsg->size = st.st_size;
+	xfer->dest_fp = NULL; /* Disable double fclose() */
+
+	msn_slplink_send_slpmsg(slpcall->slplink, slpmsg);
+}
+
+void
+msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg)
+{
+	MsnSlpMessage *slpmsg;
+	const char *data;
+	gsize offset;
+	gsize len;
+
+#ifdef MSN_DEBUG_SLP
+	msn_slpmsg_show(msg);
+#endif
+
+#ifdef MSN_DEBUG_SLP_FILES
+	debug_msg_to_file(msg, FALSE);
+#endif
+
+	if (msg->msnslp_header.total_size < msg->msnslp_header.length)
+	{
+		purple_debug_error("msn", "This can't be good\n");
+		g_return_if_reached();
+	}
+
+	slpmsg = NULL;
+	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)
+	{
+		slpmsg = msn_slpmsg_new(slplink);
+		slpmsg->id = msg->msnslp_header.id;
+		slpmsg->session_id = msg->msnslp_header.session_id;
+		slpmsg->size = msg->msnslp_header.total_size;
+		slpmsg->flags = msg->msnslp_header.flags;
+
+		if (slpmsg->session_id)
+		{
+			if (slpmsg->slpcall == NULL)
+				slpmsg->slpcall = msn_slplink_find_slp_call_with_session_id(slplink, slpmsg->session_id);
+
+			if (slpmsg->slpcall != NULL)
+			{
+				if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030)
+				{
+					PurpleXfer *xfer;
+
+					xfer = slpmsg->slpcall->xfer;
+
+					if (xfer != NULL)
+					{
+						purple_xfer_start(slpmsg->slpcall->xfer,
+							0, NULL, 0);
+						slpmsg->fp = ((PurpleXfer *)slpmsg->slpcall->xfer)->dest_fp;
+						xfer->dest_fp = NULL; /* Disable double fclose() */
+					}
+				}
+			}
+		}
+		if (!slpmsg->fp && slpmsg->size)
+		{
+			slpmsg->buffer = g_try_malloc(slpmsg->size);
+			if (slpmsg->buffer == NULL)
+			{
+				purple_debug_error("msn", "Failed to allocate buffer for slpmsg\n");
+				return;
+			}
+		}
+	}
+	else
+	{
+		slpmsg = msn_slplink_message_find(slplink, msg->msnslp_header.session_id, msg->msnslp_header.id);
+	}
+
+	if (slpmsg == NULL)
+	{
+		/* Probably the transfer was canceled */
+		purple_debug_error("msn", "Couldn't find slpmsg\n");
+		return;
+	}
+
+	if (slpmsg->fp)
+	{
+		/* fseek(slpmsg->fp, offset, SEEK_SET); */
+		len = fwrite(data, 1, len, slpmsg->fp);
+	}
+	else if (slpmsg->size)
+	{
+		if ((offset + len) > slpmsg->size)
+		{
+			purple_debug_error("msn", "Oversized slpmsg\n");
+			g_return_if_reached();
+		}
+		else
+			memcpy(slpmsg->buffer + offset, data, len);
+	}
+
+	if ((slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) &&
+		(slpmsg->slpcall != NULL))
+	{
+		slpmsg->slpcall->progress = TRUE;
+
+		if (slpmsg->slpcall->progress_cb != NULL)
+		{
+			slpmsg->slpcall->progress_cb(slpmsg->slpcall, slpmsg->size,
+										 len, offset);
+		}
+	}
+
+#if 0
+	if (slpmsg->buffer == NULL)
+		return;
+#endif
+
+	if (msg->msnslp_header.offset + msg->msnslp_header.length
+		>= msg->msnslp_header.total_size)
+	{
+		/* All the pieces of the slpmsg have been received */
+		MsnSlpCall *slpcall;
+
+		slpcall = msn_slp_process_msg(slplink, slpmsg);
+
+		if (slpmsg->flags == 0x100)
+		{
+			MsnDirectConn *directconn;
+
+			directconn = slplink->directconn;
+
+			if (!directconn->acked)
+				msn_directconn_send_handshake(directconn);
+		}
+		else if (slpmsg->flags == 0x0 || slpmsg->flags == 0x20 ||
+				 slpmsg->flags == 0x1000030)
+		{
+			/* Release all the messages and send the ACK */
+
+			msn_slplink_send_ack(slplink, msg);
+			msn_slplink_unleash(slplink);
+		}
+
+		msn_slpmsg_destroy(slpmsg);
+
+		if (slpcall != NULL && slpcall->wasted)
+			msn_slp_call_destroy(slpcall);
+	}
+}
+
+MsnSlpMessage *
+msn_slplink_message_find(MsnSlpLink *slplink, long session_id, long id)
+{
+	GList *e;
+
+	for (e = slplink->slp_msgs; e != NULL; e = e->next)
+	{
+		MsnSlpMessage *slpmsg = e->data;
+
+		if ((slpmsg->session_id == session_id) && (slpmsg->id == id))
+			return slpmsg;
+	}
+
+	return NULL;
+}
+
+typedef struct
+{
+	guint32 length;
+	guint32 unk1;
+	guint32 file_size;
+	guint32 unk2;
+	guint32 unk3;
+} MsnContextHeader;
+
+#define MAX_FILE_NAME_LEN 0x226
+
+static gchar *
+gen_context(const char *file_name, const char *file_path)
+{
+	struct stat st;
+	gsize size = 0;
+	MsnContextHeader header;
+	gchar *u8 = NULL;
+	guchar *base;
+	guchar *n;
+	gchar *ret;
+	gunichar2 *uni = NULL;
+	glong currentChar = 0;
+	glong uni_len = 0;
+	gsize len;
+
+	if (g_stat(file_path, &st) == 0)
+		size = st.st_size;
+
+	if(!file_name) {
+		u8 = purple_utf8_try_convert(g_basename(file_path));
+		file_name = u8;
+	}
+
+	uni = g_utf8_to_utf16(file_name, -1, NULL, &uni_len, NULL);
+
+	if(u8) {
+		g_free(u8);
+		file_name = NULL;
+		u8 = NULL;
+	}
+
+	len = sizeof(MsnContextHeader) + MAX_FILE_NAME_LEN + 4;
+
+	header.length = GUINT32_TO_LE(len);
+	header.unk1 = GUINT32_TO_LE(2);
+	header.file_size = GUINT32_TO_LE(size);
+	header.unk2 = GUINT32_TO_LE(0);
+	header.unk3 = GUINT32_TO_LE(0);
+
+	base = g_malloc(len + 1);
+	n = base;
+
+	memcpy(n, &header, sizeof(MsnContextHeader));
+	n += sizeof(MsnContextHeader);
+
+	memset(n, 0x00, MAX_FILE_NAME_LEN);
+	for(currentChar = 0; currentChar < uni_len; currentChar++) {
+		*((gunichar2 *)n + currentChar) = GUINT16_TO_LE(uni[currentChar]);
+	}
+	n += MAX_FILE_NAME_LEN;
+
+	memset(n, 0xFF, 4);
+	n += 4;
+
+	g_free(uni);
+	ret = purple_base64_encode(base, len);
+	g_free(base);
+	return ret;
+}
+
+void
+msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer)
+{
+	MsnSlpCall *slpcall;
+	char *context;
+	const char *fn;
+	const char *fp;
+
+	fn = purple_xfer_get_filename(xfer);
+	fp = purple_xfer_get_local_filename(xfer);
+
+	g_return_if_fail(slplink != NULL);
+	g_return_if_fail(fp != NULL);
+
+	slpcall = msn_slp_call_new(slplink);
+	msn_slp_call_init(slpcall, MSN_SLPCALL_DC);
+
+	slpcall->session_init_cb = send_file_cb;
+	slpcall->end_cb = msn_xfer_end_cb;
+	slpcall->progress_cb = msn_xfer_progress_cb;
+	slpcall->cb = msn_xfer_completed_cb;
+	slpcall->xfer = xfer;
+	purple_xfer_ref(slpcall->xfer);
+
+	slpcall->pending = TRUE;
+
+	purple_xfer_set_cancel_send_fnc(xfer, msn_xfer_cancel);
+
+	xfer->data = slpcall;
+
+	context = gen_context(fn, fp);
+
+	msn_slp_call_invite(slpcall, "5D3E02AB-6190-11D3-BBBB-00C04F795683", 2,
+						context);
+
+	g_free(context);
+}
+
+void
+msn_slplink_request_object(MsnSlpLink *slplink,
+						   const char *info,
+						   MsnSlpCb cb,
+						   MsnSlpEndCb end_cb,
+						   const MsnObject *obj)
+{
+	MsnSlpCall *slpcall;
+	char *msnobj_data;
+	char *msnobj_base64;
+
+	g_return_if_fail(slplink != NULL);
+	g_return_if_fail(obj     != NULL);
+
+	msnobj_data = msn_object_to_string(obj);
+	msnobj_base64 = purple_base64_encode((const guchar *)msnobj_data, strlen(msnobj_data));
+	g_free(msnobj_data);
+
+	slpcall = msn_slp_call_new(slplink);
+	msn_slp_call_init(slpcall, MSN_SLPCALL_ANY);
+
+	slpcall->data_info = g_strdup(info);
+	slpcall->cb = cb;
+	slpcall->end_cb = end_cb;
+
+	msn_slp_call_invite(slpcall, "A4268EEC-FEC5-49E5-95C3-F126696BDBF6", 1,
+						msnobj_base64);
+
+	g_free(msnobj_base64);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slplink.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,97 @@
+/**
+ * @file slplink.h MSNSLP Link support
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_SLPLINK_H_
+#define _MSN_SLPLINK_H_
+
+typedef struct _MsnSlpLink MsnSlpLink;
+
+#include "directconn.h"
+#include "slpcall.h"
+#include "slpmsg.h"
+
+#include "switchboard.h"
+
+#include "ft.h"
+
+#include "session.h"
+
+typedef void (*MsnSlpCb)(MsnSlpCall *slpcall,
+						 const guchar *data, gsize size);
+typedef void (*MsnSlpEndCb)(MsnSlpCall *slpcall, MsnSession *session);
+
+struct _MsnSlpLink
+{
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+
+	char *local_user;
+	char *remote_user;
+
+	int slp_seq_id;
+
+	MsnDirectConn *directconn;
+
+	GList *slp_calls;
+	GList *slp_sessions;
+	GList *slp_msgs;
+
+	GQueue *slp_msg_queue;
+};
+
+MsnSlpLink *msn_slplink_new(MsnSession *session, const char *username);
+void msn_slplink_destroy(MsnSlpLink *slplink);
+MsnSlpLink *msn_session_find_slplink(MsnSession *session,
+									 const char *who);
+MsnSlpLink *msn_session_get_slplink(MsnSession *session, const char *username);
+MsnSlpSession *msn_slplink_find_slp_session(MsnSlpLink *slplink,
+											long session_id);
+void msn_slplink_add_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall);
+void msn_slplink_remove_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall);
+MsnSlpCall *msn_slplink_find_slp_call(MsnSlpLink *slplink,
+									  const char *id);
+MsnSlpCall *msn_slplink_find_slp_call_with_session_id(MsnSlpLink *slplink, long id);
+void msn_slplink_send_msg(MsnSlpLink *slplink, MsnMessage *msg);
+void msn_slplink_release_slpmsg(MsnSlpLink *slplink,
+								MsnSlpMessage *slpmsg);
+void msn_slplink_queue_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg);
+void msn_slplink_send_slpmsg(MsnSlpLink *slplink,
+							 MsnSlpMessage *slpmsg);
+void msn_slplink_unleash(MsnSlpLink *slplink);
+void msn_slplink_send_ack(MsnSlpLink *slplink, MsnMessage *msg);
+void msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg);
+MsnSlpMessage *msn_slplink_message_find(MsnSlpLink *slplink, long session_id, long id);
+void msn_slplink_append_slp_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg);
+void msn_slplink_remove_slp_msg(MsnSlpLink *slplink,
+								MsnSlpMessage *slpmsg);
+void msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer);
+
+void msn_slplink_request_object(MsnSlpLink *slplink,
+								const char *info,
+								MsnSlpCb cb,
+								MsnSlpEndCb end_cb,
+								const MsnObject *obj);
+
+MsnSlpCall *msn_slp_process_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg);
+
+#endif /* _MSN_SLPLINK_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slpmsg.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,239 @@
+/**
+ * @file slpmsg.h SLP Message functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "slpmsg.h"
+#include "slplink.h"
+
+/**************************************************************************
+ * SLP Message
+ **************************************************************************/
+
+MsnSlpMessage *
+msn_slpmsg_new(MsnSlpLink *slplink)
+{
+	MsnSlpMessage *slpmsg;
+
+	slpmsg = g_new0(MsnSlpMessage, 1);
+
+#ifdef MSN_DEBUG_SLPMSG
+	purple_debug_info("msn", "slpmsg new (%p)\n", slpmsg);
+#endif
+
+	slpmsg->slplink = slplink;
+
+	slplink->slp_msgs =
+		g_list_append(slplink->slp_msgs, slpmsg);
+
+	return slpmsg;
+}
+
+void
+msn_slpmsg_destroy(MsnSlpMessage *slpmsg)
+{
+	MsnSlpLink *slplink;
+	GList *cur;
+
+	g_return_if_fail(slpmsg != NULL);
+
+#ifdef MSN_DEBUG_SLPMSG
+	purple_debug_info("msn", "slpmsg destroy (%p)\n", slpmsg);
+#endif
+
+	slplink = slpmsg->slplink;
+
+	if (slpmsg->fp != NULL)
+		fclose(slpmsg->fp);
+
+	purple_imgstore_unref(slpmsg->img);
+
+	/* We don't want to free the data of the PurpleStoredImage,
+	 * but to avoid code duplication, it's sharing buffer. */
+	if (slpmsg->img == NULL)
+		g_free(slpmsg->buffer);
+
+#ifdef MSN_DEBUG_SLP
+	/*
+	if (slpmsg->info != NULL)
+		g_free(slpmsg->info);
+	*/
+#endif
+
+	for (cur = slpmsg->msgs; cur != NULL; cur = cur->next)
+	{
+		/* Something is pointing to this slpmsg, so we should remove that
+		 * pointer to prevent a crash. */
+		/* Ex: a user goes offline and after that we receive an ACK */
+
+		MsnMessage *msg = cur->data;
+
+#ifdef MSN_DEBUG_SLPMSG
+		purple_debug_info("msn", "Unlink slpmsg callbacks.\n");
+#endif
+
+		msg->ack_cb = NULL;
+		msg->nak_cb = NULL;
+		msg->ack_data = NULL;
+	}
+
+	slplink->slp_msgs = g_list_remove(slplink->slp_msgs, slpmsg);
+
+	g_free(slpmsg);
+}
+
+void
+msn_slpmsg_set_body(MsnSlpMessage *slpmsg, const char *body,
+						 long long size)
+{
+	/* We can only have one data source at a time. */
+	g_return_if_fail(slpmsg->buffer == NULL);
+	g_return_if_fail(slpmsg->img == NULL);
+	g_return_if_fail(slpmsg->fp == NULL);
+
+	if (body != NULL)
+		slpmsg->buffer = g_memdup(body, size);
+	else
+		slpmsg->buffer = g_new0(guchar, size);
+
+	slpmsg->size = size;
+}
+
+void
+msn_slpmsg_set_image(MsnSlpMessage *slpmsg, PurpleStoredImage *img)
+{
+	/* We can only have one data source at a time. */
+	g_return_if_fail(slpmsg->buffer == NULL);
+	g_return_if_fail(slpmsg->img == NULL);
+	g_return_if_fail(slpmsg->fp == NULL);
+
+	slpmsg->img = purple_imgstore_ref(img);
+	slpmsg->buffer = (guchar *)purple_imgstore_get_data(img);
+	slpmsg->size = purple_imgstore_get_size(img);
+}
+
+void
+msn_slpmsg_open_file(MsnSlpMessage *slpmsg, const char *file_name)
+{
+	struct stat st;
+
+	/* We can only have one data source at a time. */
+	g_return_if_fail(slpmsg->buffer == NULL);
+	g_return_if_fail(slpmsg->img == NULL);
+	g_return_if_fail(slpmsg->fp == NULL);
+
+	slpmsg->fp = g_fopen(file_name, "rb");
+
+	if (g_stat(file_name, &st) == 0)
+		slpmsg->size = st.st_size;
+}
+
+#ifdef MSN_DEBUG_SLP
+void
+msn_slpmsg_show(MsnMessage *msg)
+{
+	const char *info;
+	gboolean text;
+	guint32 flags;
+
+	text = FALSE;
+
+	flags = GUINT32_TO_LE(msg->msnslp_header.flags);
+
+	switch (flags)
+	{
+		case 0x0:
+			info = "SLP CONTROL";
+			text = TRUE;
+			break;
+		case 0x2:
+			info = "SLP ACK"; break;
+		case 0x20:
+		case 0x1000030:
+			info = "SLP DATA"; break;
+		default:
+			info = "SLP UNKNOWN"; break;
+	}
+
+	msn_message_show_readable(msg, info, text);
+}
+#endif
+
+MsnSlpMessage *
+msn_slpmsg_sip_new(MsnSlpCall *slpcall, int cseq,
+				   const char *header, const char *branch,
+				   const char *content_type, const char *content)
+{
+	MsnSlpLink *slplink;
+	MsnSlpMessage *slpmsg;
+	char *body;
+	gsize body_len;
+	gsize content_len;
+
+	g_return_val_if_fail(slpcall != NULL, NULL);
+	g_return_val_if_fail(header  != NULL, NULL);
+
+	slplink = slpcall->slplink;
+
+	/* Let's remember that "content" should end with a 0x00 */
+
+	content_len = (content != NULL) ? strlen(content) + 1 : 0;
+
+	body = g_strdup_printf(
+		"%s\r\n"
+		"To: <msnmsgr:%s>\r\n"
+		"From: <msnmsgr:%s>\r\n"
+		"Via: MSNSLP/1.0/TLP ;branch={%s}\r\n"
+		"CSeq: %d\r\n"
+		"Call-ID: {%s}\r\n"
+		"Max-Forwards: 0\r\n"
+		"Content-Type: %s\r\n"
+		"Content-Length: %" G_GSIZE_FORMAT "\r\n"
+		"\r\n",
+		header,
+		slplink->remote_user,
+		slplink->local_user,
+		branch,
+		cseq,
+		slpcall->id,
+		content_type,
+		content_len);
+
+	body_len = strlen(body);
+
+	if (content_len > 0)
+	{
+		body_len += content_len;
+		body = g_realloc(body, body_len);
+		g_strlcat(body, content, body_len);
+	}
+
+	slpmsg = msn_slpmsg_new(slplink);
+	msn_slpmsg_set_body(slpmsg, body, body_len);
+
+	slpmsg->sip = TRUE;
+	slpmsg->slpcall = slpcall;
+
+	g_free(body);
+
+	return slpmsg;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slpmsg.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,109 @@
+/**
+ * @file slpmsg.h SLP Message functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_SLPMSG_H_
+#define _MSN_SLPMSG_H_
+
+typedef struct _MsnSlpMessage MsnSlpMessage;
+
+#include "imgstore.h"
+
+#include "slpsession.h"
+#include "slpcall.h"
+#include "slplink.h"
+#include "session.h"
+#include "msg.h"
+
+#include "slp.h"
+
+/**
+ * A SLP Message  This contains everything that we will need to send a SLP
+ * Message even if has to be sent in several parts.
+ */
+struct _MsnSlpMessage
+{
+	MsnSlpSession *slpsession;
+	MsnSlpCall *slpcall; /**< The slpcall to which this slp message belongs (if applicable). */
+	MsnSlpLink *slplink; /**< The slplink through which this slp message is being sent. */
+	MsnSession *session;
+
+	long session_id;
+	long id;
+	long ack_id;
+	long ack_sub_id;
+	long long ack_size;
+	long app_id;
+
+	gboolean sip; /**< A flag that states if this is a SIP slp message. */
+	int ref_count; /**< The reference count. */
+	long flags;
+
+	FILE *fp;
+	PurpleStoredImage *img;
+	guchar *buffer;
+	long long offset;
+	long long size;
+
+	GList *msgs; /**< The real messages. */
+
+#if 1
+	MsnMessage *msg; /**< The temporary real message that will be sent. */
+#endif
+
+#ifdef MSN_DEBUG_SLP
+	char *info;
+	gboolean text_body;
+#endif
+};
+
+/**
+ * Creates a new slp message
+ *
+ * @param slplink The slplink through which this slp message will be sent.
+ * @return The created slp message.
+ */
+MsnSlpMessage *msn_slpmsg_new(MsnSlpLink *slplink);
+
+/**
+ * Destroys a slp message
+ *
+ * @param slpmsg The slp message to destory.
+ */
+void msn_slpmsg_destroy(MsnSlpMessage *slpmsg);
+
+void msn_slpmsg_set_body(MsnSlpMessage *slpmsg, const char *body,
+						 long long size);
+void msn_slpmsg_set_image(MsnSlpMessage *slpmsg, PurpleStoredImage *img);
+void msn_slpmsg_open_file(MsnSlpMessage *slpmsg,
+						  const char *file_name);
+MsnSlpMessage * msn_slpmsg_sip_new(MsnSlpCall *slpcall, int cseq,
+								   const char *header,
+								   const char *branch,
+								   const char *content_type,
+								   const char *content);
+
+#ifdef MSN_DEBUG_SLP
+void msn_slpmsg_show(MsnMessage *msg);
+#endif
+
+#endif /* _MSN_SLPMSG_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slpsession.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,77 @@
+/**
+ * @file slpsession.h SLP Session functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "slpsession.h"
+
+/**************************************************************************
+ * SLP Session
+ **************************************************************************/
+
+MsnSlpSession *
+msn_slp_session_new(MsnSlpCall *slpcall)
+{
+	MsnSlpSession *slpsession;
+
+	g_return_val_if_fail(slpcall != NULL, NULL);
+
+	slpsession = g_new0(MsnSlpSession, 1);
+
+	slpsession->slpcall = slpcall;
+	slpsession->id = slpcall->session_id;
+	slpsession->call_id = slpcall->id;
+	slpsession->app_id = slpcall->app_id;
+
+	slpcall->slplink->slp_sessions =
+		g_list_append(slpcall->slplink->slp_sessions, slpsession);
+
+	return slpsession;
+}
+
+void
+msn_slp_session_destroy(MsnSlpSession *slpsession)
+{
+	g_return_if_fail(slpsession != NULL);
+
+	if (slpsession->call_id != NULL)
+		g_free(slpsession->call_id);
+
+	slpsession->slpcall->slplink->slp_sessions =
+		g_list_remove(slpsession->slpcall->slplink->slp_sessions, slpsession);
+
+	g_free(slpsession);
+}
+
+#if 0
+static void
+msn_slp_session_send_slpmsg(MsnSlpSession *slpsession, MsnSlpMessage *slpmsg)
+{
+	slpmsg->slpsession = slpsession;
+
+#if 0
+	slpmsg->session_id = slpsession->id;
+	slpmsg->app_id = slpsession->app_id;
+#endif
+
+	msn_slplink_send_slpmsg(slpsession->slpcall->slplink, slpmsg);
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/slpsession.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,48 @@
+/**
+ * @file slpsession.h SLP Session functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_SLPSESSION_H_
+#define _MSN_SLPSESSION_H_
+
+typedef struct _MsnSlpSession MsnSlpSession;
+
+#include "slpcall.h"
+#include "slpsession.h"
+#include "slpmsg.h"
+
+struct _MsnSlpSession
+{
+	/* MsnSlpLink *slplink; */
+	MsnSlpCall *slpcall;
+
+	long id;
+
+	long app_id;
+	char *call_id;
+};
+
+MsnSlpSession *msn_slp_session_new(MsnSlpCall *slpcall);
+void msn_slp_session_destroy(MsnSlpSession *slpsession);
+void msn_slpsession_send_slpmsg(MsnSlpSession *slpsession,
+								MsnSlpMessage *slpmsg);
+#endif /* _MSN_SLPSESSION_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/state.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,132 @@
+/**
+ * @file state.c State functions and definitions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "state.h"
+
+static const char *away_text[] =
+{
+	N_("Available"),
+	N_("Available"),
+	N_("Busy"),
+	N_("Idle"),
+	N_("Be Right Back"),
+	N_("Away From Computer"),
+	N_("On The Phone"),
+	N_("Out To Lunch"),
+	N_("Available"),
+	N_("Available")
+};
+
+void
+msn_change_status(MsnSession *session)
+{
+	PurpleAccount *account;
+	MsnCmdProc *cmdproc;
+	MsnUser *user;
+	MsnObject *msnobj;
+	const char *state_text;
+
+	g_return_if_fail(session != NULL);
+	g_return_if_fail(session->notification != NULL);
+
+	account = session->account;
+	cmdproc = session->notification->cmdproc;
+	user = session->user;
+	state_text = msn_state_get_text(msn_state_from_account(account));
+
+	/* If we're not logged in yet, don't send the status to the server,
+	 * it will be sent when login completes
+	 */
+	if (!session->logged_in)
+		return;
+
+	msnobj = msn_user_get_object(user);
+
+	if (msnobj == NULL)
+	{
+		msn_cmdproc_send(cmdproc, "CHG", "%s %d", state_text,
+						 MSN_CLIENT_ID);
+	}
+	else
+	{
+		char *msnobj_str;
+
+		msnobj_str = msn_object_to_string(msnobj);
+
+		msn_cmdproc_send(cmdproc, "CHG", "%s %d %s", state_text,
+						 MSN_CLIENT_ID, purple_url_encode(msnobj_str));
+
+		g_free(msnobj_str);
+	}
+}
+
+const char *
+msn_away_get_text(MsnAwayType type)
+{
+	g_return_val_if_fail(type <= MSN_HIDDEN, NULL);
+
+	return _(away_text[type]);
+}
+
+const char *
+msn_state_get_text(MsnAwayType state)
+{
+	static char *status_text[] =
+	{ "NLN", "NLN", "BSY", "IDL", "BRB", "AWY", "PHN", "LUN", "HDN", "HDN" };
+
+	return status_text[state];
+}
+
+MsnAwayType
+msn_state_from_account(PurpleAccount *account)
+{
+	MsnAwayType msnstatus;
+	PurplePresence *presence;
+	PurpleStatus *status;
+	const char *status_id;
+
+	presence = purple_account_get_presence(account);
+	status = purple_presence_get_active_status(presence);
+	status_id = purple_status_get_id(status);
+
+	if (!strcmp(status_id, "away"))
+		msnstatus = MSN_AWAY;
+	else if (!strcmp(status_id, "brb"))
+		msnstatus = MSN_BRB;
+	else if (!strcmp(status_id, "busy"))
+		msnstatus = MSN_BUSY;
+	else if (!strcmp(status_id, "phone"))
+		msnstatus = MSN_PHONE;
+	else if (!strcmp(status_id, "lunch"))
+		msnstatus = MSN_LUNCH;
+	else if (!strcmp(status_id, "invisible"))
+		msnstatus = MSN_HIDDEN;
+	else
+		msnstatus = MSN_ONLINE;
+
+	if ((msnstatus == MSN_ONLINE) && purple_presence_is_idle(presence))
+		msnstatus = MSN_IDLE;
+
+	return msnstatus;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/state.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,64 @@
+/**
+ * @file state.h State functions and definitions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_STATE_H_
+#define _MSN_STATE_H_
+
+/**
+ * Away types.
+ */
+typedef enum
+{
+	MSN_ONLINE  = 1,
+	MSN_BUSY    = 2,
+	MSN_IDLE    = 3,
+	MSN_BRB     = 4,
+	MSN_AWAY    = 5,
+	MSN_PHONE   = 6,
+	MSN_LUNCH   = 7,
+	MSN_OFFLINE = 8,
+	MSN_HIDDEN  = 9
+
+} MsnAwayType;
+
+/**
+ * Changes the status of the user.
+ *
+ * @param session The MSN session.
+ */
+void msn_change_status(MsnSession *session);
+
+/**
+ * Returns the string representation of an away type.
+ *
+ * @param type The away type.
+ *
+ * @return The string representation of the away type.
+ */
+const char *msn_away_get_text(MsnAwayType type);
+
+const char *msn_state_get_text(MsnAwayType state);
+
+MsnAwayType msn_state_from_account(PurpleAccount *account);
+
+#endif /* _MSN_STATE_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/switchboard.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,1294 @@
+/**
+ * @file switchboard.c MSN switchboard functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "prefs.h"
+#include "switchboard.h"
+#include "notification.h"
+#include "msn-utils.h"
+
+#include "error.h"
+
+static MsnTable *cbs_table;
+
+static void msg_error_helper(MsnCmdProc *cmdproc, MsnMessage *msg,
+							 MsnMsgErrorType error);
+
+/**************************************************************************
+ * Main
+ **************************************************************************/
+
+MsnSwitchBoard *
+msn_switchboard_new(MsnSession *session)
+{
+	MsnSwitchBoard *swboard;
+	MsnServConn *servconn;
+
+	g_return_val_if_fail(session != NULL, NULL);
+
+	swboard = g_new0(MsnSwitchBoard, 1);
+
+	swboard->session = session;
+	swboard->servconn = servconn = msn_servconn_new(session, MSN_SERVCONN_SB);
+	swboard->cmdproc = servconn->cmdproc;
+
+	swboard->msg_queue = g_queue_new();
+	swboard->empty = TRUE;
+
+	swboard->cmdproc->data = swboard;
+	swboard->cmdproc->cbs_table = cbs_table;
+
+	session->switches = g_list_append(session->switches, swboard);
+
+	return swboard;
+}
+
+void
+msn_switchboard_destroy(MsnSwitchBoard *swboard)
+{
+	MsnSession *session;
+	MsnMessage *msg;
+	GList *l;
+
+#ifdef MSN_DEBUG_SB
+	purple_debug_info("msn", "switchboard_destroy: swboard(%p)\n", swboard);
+#endif
+
+	g_return_if_fail(swboard != NULL);
+
+	if (swboard->destroying)
+		return;
+
+	swboard->destroying = TRUE;
+
+	/* If it linked us is because its looking for trouble */
+	while (swboard->slplinks != NULL)
+		msn_slplink_destroy(swboard->slplinks->data);
+
+	/* Destroy the message queue */
+	while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL)
+	{
+		if (swboard->error != MSN_SB_ERROR_NONE)
+		{
+			/* The messages could not be sent due to a switchboard error */
+			msg_error_helper(swboard->cmdproc, msg,
+							 MSN_MSG_ERROR_SB);
+		}
+		msn_message_unref(msg);
+	}
+
+	g_queue_free(swboard->msg_queue);
+
+	/* msg_error_helper will both remove the msg from ack_list and
+	   unref it, so we don't need to do either here */
+	while ((l = swboard->ack_list) != NULL)
+		msg_error_helper(swboard->cmdproc, l->data, MSN_MSG_ERROR_SB);
+
+	g_free(swboard->im_user);
+	g_free(swboard->auth_key);
+	g_free(swboard->session_id);
+
+	for (l = swboard->users; l != NULL; l = l->next)
+		g_free(l->data);
+
+	session = swboard->session;
+	session->switches = g_list_remove(session->switches, swboard);
+
+#if 0
+	/* This should never happen or we are in trouble. */
+	if (swboard->servconn != NULL)
+		msn_servconn_destroy(swboard->servconn);
+#endif
+
+	swboard->cmdproc->data = NULL;
+
+	msn_servconn_set_disconnect_cb(swboard->servconn, NULL);
+
+	msn_servconn_destroy(swboard->servconn);
+
+	g_free(swboard);
+}
+
+void
+msn_switchboard_set_auth_key(MsnSwitchBoard *swboard, const char *key)
+{
+	g_return_if_fail(swboard != NULL);
+	g_return_if_fail(key != NULL);
+
+	swboard->auth_key = g_strdup(key);
+}
+
+const char *
+msn_switchboard_get_auth_key(MsnSwitchBoard *swboard)
+{
+	g_return_val_if_fail(swboard != NULL, NULL);
+
+	return swboard->auth_key;
+}
+
+void
+msn_switchboard_set_session_id(MsnSwitchBoard *swboard, const char *id)
+{
+	g_return_if_fail(swboard != NULL);
+	g_return_if_fail(id != NULL);
+
+	if (swboard->session_id != NULL)
+		g_free(swboard->session_id);
+
+	swboard->session_id = g_strdup(id);
+}
+
+const char *
+msn_switchboard_get_session_id(MsnSwitchBoard *swboard)
+{
+	g_return_val_if_fail(swboard != NULL, NULL);
+
+	return swboard->session_id;
+}
+
+void
+msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited)
+{
+	g_return_if_fail(swboard != NULL);
+
+	swboard->invited = invited;
+}
+
+gboolean
+msn_switchboard_is_invited(MsnSwitchBoard *swboard)
+{
+	g_return_val_if_fail(swboard != NULL, FALSE);
+
+	return swboard->invited;
+}
+
+/**************************************************************************
+ * Utility
+ **************************************************************************/
+
+static void
+send_clientcaps(MsnSwitchBoard *swboard)
+{
+	MsnMessage *msg;
+
+	msg = msn_message_new(MSN_MSG_CAPS);
+	msn_message_set_content_type(msg, "text/x-clientcaps");
+	msn_message_set_flag(msg, 'U');
+	msn_message_set_bin_data(msg, MSN_CLIENTINFO, strlen(MSN_CLIENTINFO));
+
+	msn_switchboard_send_msg(swboard, msg, TRUE);
+
+	msn_message_destroy(msg);
+}
+
+static void
+msn_switchboard_add_user(MsnSwitchBoard *swboard, const char *user)
+{
+	MsnCmdProc *cmdproc;
+	PurpleAccount *account;
+
+	g_return_if_fail(swboard != NULL);
+
+	cmdproc = swboard->cmdproc;
+	account = cmdproc->session->account;
+
+	swboard->users = g_list_prepend(swboard->users, g_strdup(user));
+	swboard->current_users++;
+	swboard->empty = FALSE;
+
+#ifdef MSN_DEBUG_CHAT
+	purple_debug_info("msn", "user=[%s], total=%d\n", user,
+					swboard->current_users);
+#endif
+
+	if (!(swboard->flag & MSN_SB_FLAG_IM) && (swboard->conv != NULL))
+	{
+		/* This is a helper switchboard. */
+		purple_debug_error("msn", "switchboard_add_user: conv != NULL\n");
+		return;
+	}
+
+	if ((swboard->conv != NULL) &&
+		(purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT))
+	{
+		purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), user, NULL,
+								PURPLE_CBFLAGS_NONE, TRUE);
+	}
+	else if (swboard->current_users > 1 || swboard->total_users > 1)
+	{
+		if (swboard->conv == NULL ||
+			purple_conversation_get_type(swboard->conv) != PURPLE_CONV_TYPE_CHAT)
+		{
+			GList *l;
+
+#ifdef MSN_DEBUG_CHAT
+			purple_debug_info("msn", "[chat] Switching to chat.\n");
+#endif
+
+#if 0
+			/* this is bad - it causes msn_switchboard_close to be called on the
+			 * switchboard we're in the middle of using :( */
+			if (swboard->conv != NULL)
+				purple_conversation_destroy(swboard->conv);
+#endif
+
+			swboard->chat_id = cmdproc->session->conv_seq++;
+			swboard->flag |= MSN_SB_FLAG_IM;
+			swboard->conv = serv_got_joined_chat(account->gc,
+												 swboard->chat_id,
+												 "MSN Chat");
+
+			for (l = swboard->users; l != NULL; l = l->next)
+			{
+				const char *tmp_user;
+
+				tmp_user = l->data;
+
+#ifdef MSN_DEBUG_CHAT
+				purple_debug_info("msn", "[chat] Adding [%s].\n", tmp_user);
+#endif
+
+				purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv),
+										tmp_user, NULL, PURPLE_CBFLAGS_NONE, TRUE);
+			}
+
+#ifdef MSN_DEBUG_CHAT
+			purple_debug_info("msn", "[chat] We add ourselves.\n");
+#endif
+
+			purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv),
+									purple_account_get_username(account),
+									NULL, PURPLE_CBFLAGS_NONE, TRUE);
+
+			g_free(swboard->im_user);
+			swboard->im_user = NULL;
+		}
+	}
+	else if (swboard->conv == NULL)
+	{
+		swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
+															user, account);
+	}
+	else
+	{
+		purple_debug_warning("msn", "switchboard_add_user: This should not happen!\n");
+	}
+}
+
+static PurpleConversation *
+msn_switchboard_get_conv(MsnSwitchBoard *swboard)
+{
+	PurpleAccount *account;
+
+	g_return_val_if_fail(swboard != NULL, NULL);
+
+	if (swboard->conv != NULL)
+		return swboard->conv;
+
+	purple_debug_error("msn", "Switchboard with unassigned conversation\n");
+
+	account = swboard->session->account;
+
+	return (swboard->conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
+												  account, swboard->im_user));
+}
+
+static void
+msn_switchboard_report_user(MsnSwitchBoard *swboard, PurpleMessageFlags flags, const char *msg)
+{
+	PurpleConversation *conv;
+
+	g_return_if_fail(swboard != NULL);
+	g_return_if_fail(msg != NULL);
+
+	if ((conv = msn_switchboard_get_conv(swboard)) != NULL)
+	{
+		purple_conversation_write(conv, NULL, msg, flags, time(NULL));
+	}
+}
+
+static void
+swboard_error_helper(MsnSwitchBoard *swboard, int reason, const char *passport)
+{
+	g_return_if_fail(swboard != NULL);
+
+	purple_debug_warning("msg", "Error: Unable to call the user %s for reason %i\n",
+					   passport ? passport : "(null)", reason);
+
+	/* TODO: if current_users > 0, this is probably a chat and an invite failed,
+	 * we should report that in the chat or something */
+	if (swboard->current_users == 0)
+	{
+		swboard->error = reason;
+		msn_switchboard_close(swboard);
+	}
+}
+
+static void
+cal_error_helper(MsnTransaction *trans, int reason)
+{
+	MsnSwitchBoard *swboard;
+	const char *passport;
+	char **params;
+
+	params = g_strsplit(trans->params, " ", 0);
+
+	passport = params[0];
+
+	swboard = trans->data;
+
+	purple_debug_warning("msn", "cal_error_helper: command %s failed for reason %i\n",trans->command,reason);
+
+	swboard_error_helper(swboard, reason, passport);
+
+	g_strfreev(params);
+}
+
+static void
+msg_error_helper(MsnCmdProc *cmdproc, MsnMessage *msg, MsnMsgErrorType error)
+{
+	MsnSwitchBoard *swboard;
+
+	g_return_if_fail(cmdproc != NULL);
+	g_return_if_fail(msg     != NULL);
+
+	if ((error != MSN_MSG_ERROR_SB) && (msg->nak_cb != NULL))
+		msg->nak_cb(msg, msg->ack_data);
+
+	swboard = cmdproc->data;
+
+	/* This is not good, and should be fixed somewhere else. */
+	g_return_if_fail(swboard != NULL);
+
+	if (msg->type == MSN_MSG_TEXT)
+	{
+		const char *format, *str_reason;
+		char *body_str, *body_enc, *pre, *post;
+
+#if 0
+		if (swboard->conv == NULL)
+		{
+			if (msg->ack_ref)
+				msn_message_unref(msg);
+
+			return;
+		}
+#endif
+
+		if (error == MSN_MSG_ERROR_TIMEOUT)
+		{
+			str_reason = _("Message may have not been sent "
+						   "because a timeout occurred:");
+		}
+		else if (error == MSN_MSG_ERROR_SB)
+		{
+			switch (swboard->error)
+			{
+				case MSN_SB_ERROR_OFFLINE:
+					str_reason = _("Message could not be sent, "
+								   "not allowed while invisible:");
+					break;
+				case MSN_SB_ERROR_USER_OFFLINE:
+					str_reason = _("Message could not be sent "
+								   "because the user is offline:");
+					break;
+				case MSN_SB_ERROR_CONNECTION:
+					str_reason = _("Message could not be sent "
+								   "because a connection error occurred:");
+					break;
+				case MSN_SB_ERROR_TOO_FAST:
+					str_reason = _("Message could not be sent "
+								   "because we are sending too quickly:");
+					break;
+				case MSN_SB_ERROR_AUTHFAILED:
+					str_reason = _("Message could not be sent "
+								   "because we were unable to establish a "
+								   "session with the server. This is "
+								   "likely a server problem, try again in "
+								   "a few minutes:");
+					break;
+				default:
+					str_reason = _("Message could not be sent "
+								   "because an error with "
+								   "the switchboard occurred:");
+					break;
+			}
+		}
+		else
+		{
+			str_reason = _("Message may have not been sent "
+						   "because an unknown error occurred:");
+		}
+
+		body_str = msn_message_to_string(msg);
+		body_enc = g_markup_escape_text(body_str, -1);
+		g_free(body_str);
+
+		format = msn_message_get_attr(msg, "X-MMS-IM-Format");
+		msn_parse_format(format, &pre, &post);
+		body_str = g_strdup_printf("%s%s%s", pre ? pre : "",
+								   body_enc ? body_enc : "", post ? post : "");
+		g_free(body_enc);
+		g_free(pre);
+		g_free(post);
+
+		msn_switchboard_report_user(swboard, PURPLE_MESSAGE_ERROR,
+									str_reason);
+		msn_switchboard_report_user(swboard, PURPLE_MESSAGE_RAW,
+									body_str);
+
+		g_free(body_str);
+	}
+
+	/* If a timeout occures we will want the msg around just in case we
+	 * receive the ACK after the timeout. */
+	if (msg->ack_ref && error != MSN_MSG_ERROR_TIMEOUT)
+	{
+		swboard->ack_list = g_list_remove(swboard->ack_list, msg);
+		msn_message_unref(msg);
+	}
+}
+
+/**************************************************************************
+ * Message Stuff
+ **************************************************************************/
+
+/** Called when a message times out. */
+static void
+msg_timeout(MsnCmdProc *cmdproc, MsnTransaction *trans)
+{
+	MsnMessage *msg;
+
+	msg = trans->data;
+
+	msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_TIMEOUT);
+}
+
+/** Called when we receive an error of a message. */
+static void
+msg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
+{
+	msg_error_helper(cmdproc, trans->data, MSN_MSG_ERROR_UNKNOWN);
+}
+
+#if 0
+/** Called when we receive an ack of a special message. */
+static void
+msg_ack(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnMessage *msg;
+
+	msg = cmd->trans->data;
+
+	if (msg->ack_cb != NULL)
+		msg->ack_cb(msg->ack_data);
+
+	msn_message_unref(msg);
+}
+
+/** Called when we receive a nak of a special message. */
+static void
+msg_nak(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnMessage *msg;
+
+	msg = cmd->trans->data;
+
+	msn_message_unref(msg);
+}
+#endif
+
+static void
+release_msg(MsnSwitchBoard *swboard, MsnMessage *msg)
+{
+	MsnCmdProc *cmdproc;
+	MsnTransaction *trans;
+	char *payload;
+	gsize payload_len;
+
+	g_return_if_fail(swboard != NULL);
+	g_return_if_fail(msg     != NULL);
+
+	cmdproc = swboard->cmdproc;
+
+	payload = msn_message_gen_payload(msg, &payload_len);
+
+#ifdef MSN_DEBUG_SB
+	msn_message_show_readable(msg, "SB SEND", FALSE);
+#endif
+
+	trans = msn_transaction_new(cmdproc, "MSG", "%c %d",
+								msn_message_get_flag(msg), payload_len);
+
+	/* Data for callbacks */
+	msn_transaction_set_data(trans, msg);
+
+	if (msg->type == MSN_MSG_TEXT)
+	{
+		msg->ack_ref = TRUE;
+		msn_message_ref(msg);
+		swboard->ack_list = g_list_append(swboard->ack_list, msg);
+		msn_transaction_set_timeout_cb(trans, msg_timeout);
+	}
+	else if (msg->type == MSN_MSG_SLP)
+	{
+		msg->ack_ref = TRUE;
+		msn_message_ref(msg);
+		swboard->ack_list = g_list_append(swboard->ack_list, msg);
+		msn_transaction_set_timeout_cb(trans, msg_timeout);
+#if 0
+		if (msg->ack_cb != NULL)
+		{
+			msn_transaction_add_cb(trans, "ACK", msg_ack);
+			msn_transaction_add_cb(trans, "NAK", msg_nak);
+		}
+#endif
+	}
+
+	trans->payload = payload;
+	trans->payload_len = payload_len;
+
+	msg->trans = trans;
+
+	msn_cmdproc_send_trans(cmdproc, trans);
+}
+
+static void
+queue_msg(MsnSwitchBoard *swboard, MsnMessage *msg)
+{
+	g_return_if_fail(swboard != NULL);
+	g_return_if_fail(msg     != NULL);
+
+	purple_debug_info("msn", "Appending message to queue.\n");
+
+	g_queue_push_tail(swboard->msg_queue, msg);
+
+	msn_message_ref(msg);
+}
+
+static void
+process_queue(MsnSwitchBoard *swboard)
+{
+	MsnMessage *msg;
+
+	g_return_if_fail(swboard != NULL);
+
+	purple_debug_info("msn", "Processing queue\n");
+
+	while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL)
+	{
+		purple_debug_info("msn", "Sending message\n");
+		release_msg(swboard, msg);
+		msn_message_unref(msg);
+	}
+}
+
+gboolean
+msn_switchboard_can_send(MsnSwitchBoard *swboard)
+{
+	g_return_val_if_fail(swboard != NULL, FALSE);
+
+	if (swboard->empty || !g_queue_is_empty(swboard->msg_queue))
+		return FALSE;
+
+	return TRUE;
+}
+
+void
+msn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg,
+						 gboolean queue)
+{
+	g_return_if_fail(swboard != NULL);
+	g_return_if_fail(msg     != NULL);
+
+	if (msn_switchboard_can_send(swboard))
+		release_msg(swboard, msg);
+	else if (queue)
+		queue_msg(swboard, msg);
+}
+
+/**************************************************************************
+ * Switchboard Commands
+ **************************************************************************/
+
+static void
+ans_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSwitchBoard *swboard;
+
+	swboard = cmdproc->data;
+	swboard->ready = TRUE;
+}
+
+static void
+bye_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSwitchBoard *swboard;
+	const char *user;
+
+	swboard = cmdproc->data;
+	user = cmd->params[0];
+
+	/* cmdproc->data is set to NULL when the switchboard is destroyed;
+	 * we may get a bye shortly thereafter. */
+	g_return_if_fail(swboard != NULL);
+
+	if (!(swboard->flag & MSN_SB_FLAG_IM) && (swboard->conv != NULL))
+		purple_debug_error("msn_switchboard", "bye_cmd: helper bug\n");
+
+	if (swboard->conv == NULL)
+	{
+		/* This is a helper switchboard */
+		msn_switchboard_destroy(swboard);
+	}
+	else if ((swboard->current_users > 1) ||
+			 (purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT))
+	{
+		/* This is a switchboard used for a chat */
+		purple_conv_chat_remove_user(PURPLE_CONV_CHAT(swboard->conv), user, NULL);
+		swboard->current_users--;
+		if (swboard->current_users == 0)
+			msn_switchboard_destroy(swboard);
+	}
+	else
+	{
+		/* This is a switchboard used for a im session */
+		msn_switchboard_destroy(swboard);
+	}
+}
+
+static void
+iro_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	MsnSwitchBoard *swboard;
+
+	account = cmdproc->session->account;
+	gc = account->gc;
+	swboard = cmdproc->data;
+
+	swboard->total_users = atoi(cmd->params[2]);
+
+	msn_switchboard_add_user(swboard, cmd->params[3]);
+}
+
+static void
+joi_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session;
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	MsnSwitchBoard *swboard;
+	const char *passport;
+
+	passport = cmd->params[0];
+
+	session = cmdproc->session;
+	account = session->account;
+	gc = account->gc;
+	swboard = cmdproc->data;
+
+	msn_switchboard_add_user(swboard, passport);
+
+	process_queue(swboard);
+
+	if (!session->http_method)
+		send_clientcaps(swboard);
+
+	if (swboard->closed)
+		msn_switchboard_close(swboard);
+}
+
+static void
+msg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len)
+{
+	MsnMessage *msg;
+
+	msg = msn_message_new_from_cmd(cmdproc->session, cmd);
+
+	msn_message_parse_payload(msg, payload, len);
+#ifdef MSN_DEBUG_SB
+	msn_message_show_readable(msg, "SB RECV", FALSE);
+#endif
+
+	if (msg->remote_user != NULL)
+		g_free (msg->remote_user);
+
+	msg->remote_user = g_strdup(cmd->params[0]);
+	msn_cmdproc_process_msg(cmdproc, msg);
+
+	msn_message_destroy(msg);
+}
+
+static void
+msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	cmdproc->servconn->payload_len = atoi(cmd->params[2]);
+	cmdproc->last_cmd->payload_cb = msg_cmd_post;
+}
+
+static void
+nak_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnMessage *msg;
+
+	msg = cmd->trans->data;
+	g_return_if_fail(msg != NULL);
+
+	msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_NAK);
+}
+
+static void
+ack_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSwitchBoard *swboard;
+	MsnMessage *msg;
+
+	msg = cmd->trans->data;
+
+	if (msg->ack_cb != NULL)
+		msg->ack_cb(msg, msg->ack_data);
+
+	swboard = cmdproc->data;
+	if (swboard)
+		swboard->ack_list = g_list_remove(swboard->ack_list, msg);
+	msn_message_unref(msg);
+}
+
+static void
+out_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	PurpleConnection *gc;
+	MsnSwitchBoard *swboard;
+
+	gc = cmdproc->session->account->gc;
+	swboard = cmdproc->data;
+
+	if (swboard->current_users > 1)
+		serv_got_chat_left(gc, swboard->chat_id);
+
+	msn_switchboard_disconnect(swboard);
+}
+
+static void
+usr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSwitchBoard *swboard;
+
+	swboard = cmdproc->data;
+
+#if 0
+	GList *l;
+
+	for (l = swboard->users; l != NULL; l = l->next)
+	{
+		const char *user;
+		user = l->data;
+
+		msn_cmdproc_send(cmdproc, "CAL", "%s", user);
+	}
+#endif
+
+	swboard->ready = TRUE;
+	msn_cmdproc_process_queue(cmdproc);
+}
+
+/**************************************************************************
+ * Message Handlers
+ **************************************************************************/
+static void
+plain_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	PurpleConnection *gc;
+	MsnSwitchBoard *swboard;
+	const char *body;
+	char *body_str;
+	char *body_enc;
+	char *body_final;
+	size_t body_len;
+	const char *passport;
+	const char *value;
+
+	gc = cmdproc->session->account->gc;
+	swboard = cmdproc->data;
+
+	body = msn_message_get_bin_data(msg, &body_len);
+	body_str = g_strndup(body, body_len);
+	body_enc = g_markup_escape_text(body_str, -1);
+	g_free(body_str);
+
+	passport = msg->remote_user;
+
+	if (!strcmp(passport, "messenger@microsoft.com") &&
+		strstr(body, "immediate security update"))
+	{
+		return;
+	}
+
+#if 0
+	if ((value = msn_message_get_attr(msg, "User-Agent")) != NULL)
+	{
+		purple_debug_misc("msn", "User-Agent = '%s'\n", value);
+	}
+#endif
+
+	if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL)
+	{
+		char *pre, *post;
+
+		msn_parse_format(value, &pre, &post);
+
+		body_final = g_strdup_printf("%s%s%s", pre ? pre : "",
+									 body_enc ? body_enc : "", post ? post : "");
+
+		g_free(pre);
+		g_free(post);
+		g_free(body_enc);
+	}
+	else
+	{
+		body_final = body_enc;
+	}
+
+	swboard->flag |= MSN_SB_FLAG_IM;
+
+	if (swboard->current_users > 1 ||
+		((swboard->conv != NULL) &&
+		 purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT))
+	{
+		/* If current_users is always ok as it should then there is no need to
+		 * check if this is a chat. */
+		if (swboard->current_users <= 1)
+			purple_debug_misc("msn", "plain_msg: current_users(%d)\n",
+							swboard->current_users);
+
+		serv_got_chat_in(gc, swboard->chat_id, passport, 0, body_final,
+						 time(NULL));
+		if (swboard->conv == NULL)
+		{
+			swboard->conv = purple_find_chat(gc, swboard->chat_id);
+			swboard->flag |= MSN_SB_FLAG_IM;
+		}
+	}
+	else
+	{
+		serv_got_im(gc, passport, body_final, 0, time(NULL));
+		if (swboard->conv == NULL)
+		{
+			swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
+									passport, purple_connection_get_account(gc));
+			swboard->flag |= MSN_SB_FLAG_IM;
+		}
+	}
+
+	g_free(body_final);
+}
+
+static void
+control_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	PurpleConnection *gc;
+	MsnSwitchBoard *swboard;
+	char *passport;
+
+	gc = cmdproc->session->account->gc;
+	swboard = cmdproc->data;
+	passport = msg->remote_user;
+
+	if (swboard->current_users == 1 &&
+		msn_message_get_attr(msg, "TypingUser") != NULL)
+	{
+		serv_got_typing(gc, passport, MSN_TYPING_RECV_TIMEOUT,
+						PURPLE_TYPING);
+	}
+}
+
+static void
+clientcaps_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+#if 0
+	MsnSession *session;
+	MsnSwitchBoard *swboard;
+	MsnUser *user;
+	GHashTable *clientcaps;
+	const char *value;
+
+	char *passport = msg->sender;
+
+	session = cmdproc->session;
+	swboard = cmdproc->servconn->swboard;
+
+	clientcaps = msn_message_get_hashtable_from_body(msg);
+#endif
+}
+
+static void
+nudge_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
+{
+	MsnSwitchBoard *swboard;
+	PurpleAccount *account;
+	const char *user;
+
+	swboard = cmdproc->data;
+	account = cmdproc->session->account;
+	user = msg->remote_user;
+
+	serv_got_attention(account->gc, user, MSN_NUDGE);
+}
+
+/**************************************************************************
+ * Connect stuff
+ **************************************************************************/
+static void
+ans_usr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error);
+
+static void
+connect_cb(MsnServConn *servconn)
+{
+	MsnSwitchBoard *swboard;
+	MsnTransaction *trans;
+	MsnCmdProc *cmdproc;
+	PurpleAccount *account;
+
+	cmdproc = servconn->cmdproc;
+	g_return_if_fail(cmdproc != NULL);
+
+	account = cmdproc->session->account;
+	swboard = cmdproc->data;
+	g_return_if_fail(swboard != NULL);
+
+	if (msn_switchboard_is_invited(swboard))
+	{
+		swboard->empty = FALSE;
+
+		trans = msn_transaction_new(cmdproc, "ANS", "%s %s %s",
+									purple_account_get_username(account),
+									swboard->auth_key, swboard->session_id);
+	}
+	else
+	{
+		trans = msn_transaction_new(cmdproc, "USR", "%s %s",
+									purple_account_get_username(account),
+									swboard->auth_key);
+	}
+
+	msn_transaction_set_error_cb(trans, ans_usr_error);
+	msn_transaction_set_data(trans, swboard);
+	msn_cmdproc_send_trans(cmdproc, trans);
+}
+
+static void
+ans_usr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
+{
+	MsnSwitchBoard *swboard;
+	char **params;
+	char *passport;
+	int reason = MSN_SB_ERROR_UNKNOWN;
+
+	if (error == 911)
+	{
+		reason = MSN_SB_ERROR_AUTHFAILED;
+	}
+
+	purple_debug_warning("msn", "ans_usr_error: command %s gave error %i\n", trans->command, error);
+
+	params = g_strsplit(trans->params, " ", 0);
+	passport = params[0];
+	swboard = trans->data;
+
+	swboard_error_helper(swboard, reason, passport);
+
+	g_strfreev(params);
+}
+
+static void
+disconnect_cb(MsnServConn *servconn)
+{
+	MsnSwitchBoard *swboard;
+
+	swboard = servconn->cmdproc->data;
+	g_return_if_fail(swboard != NULL);
+
+	msn_servconn_set_disconnect_cb(swboard->servconn, NULL);
+
+	msn_switchboard_destroy(swboard);
+}
+
+gboolean
+msn_switchboard_connect(MsnSwitchBoard *swboard, const char *host, int port)
+{
+	g_return_val_if_fail(swboard != NULL, FALSE);
+
+	msn_servconn_set_connect_cb(swboard->servconn, connect_cb);
+	msn_servconn_set_disconnect_cb(swboard->servconn, disconnect_cb);
+
+	return msn_servconn_connect(swboard->servconn, host, port);
+}
+
+void
+msn_switchboard_disconnect(MsnSwitchBoard *swboard)
+{
+	g_return_if_fail(swboard != NULL);
+
+	msn_servconn_disconnect(swboard->servconn);
+}
+
+/**************************************************************************
+ * Call stuff
+ **************************************************************************/
+static void
+got_cal(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+#if 0
+	MsnSwitchBoard *swboard;
+	const char *user;
+
+	swboard = cmdproc->data;
+
+	user = cmd->params[0];
+
+	msn_switchboard_add_user(swboard, user);
+#endif
+}
+
+static void
+cal_timeout(MsnCmdProc *cmdproc, MsnTransaction *trans)
+{
+	purple_debug_warning("msn", "cal_timeout: command %s timed out\n", trans->command);
+
+	cal_error_helper(trans, MSN_SB_ERROR_UNKNOWN);
+}
+
+static void
+cal_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
+{
+	int reason = MSN_SB_ERROR_UNKNOWN;
+
+	if (error == 215)
+	{
+		purple_debug_info("msn", "Invited user already in switchboard\n");
+		return;
+	}
+	else if (error == 217)
+	{
+		reason = MSN_SB_ERROR_USER_OFFLINE;
+	}
+
+	purple_debug_warning("msn", "cal_error: command %s gave error %i\n", trans->command, error);
+
+	cal_error_helper(trans, reason);
+}
+
+void
+msn_switchboard_request_add_user(MsnSwitchBoard *swboard, const char *user)
+{
+	MsnTransaction *trans;
+	MsnCmdProc *cmdproc;
+
+	g_return_if_fail(swboard != NULL);
+
+	cmdproc = swboard->cmdproc;
+
+	trans = msn_transaction_new(cmdproc, "CAL", "%s", user);
+	/* this doesn't do anything, but users seem to think that
+	 * 'Unhandled command' is some kind of error, so we don't report it */
+	msn_transaction_add_cb(trans, "CAL", got_cal);
+
+	msn_transaction_set_data(trans, swboard);
+	msn_transaction_set_timeout_cb(trans, cal_timeout);
+
+	if (swboard->ready)
+		msn_cmdproc_send_trans(cmdproc, trans);
+	else
+		msn_cmdproc_queue_trans(cmdproc, trans);
+}
+
+/**************************************************************************
+ * Create & Transfer stuff
+ **************************************************************************/
+
+static void
+got_swboard(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSwitchBoard *swboard;
+	char *host;
+	int port;
+	swboard = cmd->trans->data;
+
+	if (g_list_find(cmdproc->session->switches, swboard) == NULL)
+		/* The conversation window was closed. */
+		return;
+
+	msn_switchboard_set_auth_key(swboard, cmd->params[4]);
+
+	msn_parse_socket(cmd->params[2], &host, &port);
+
+	if (!msn_switchboard_connect(swboard, host, port))
+		msn_switchboard_destroy(swboard);
+
+	g_free(host);
+}
+
+static void
+xfr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
+{
+	MsnSwitchBoard *swboard;
+	int reason = MSN_SB_ERROR_UNKNOWN;
+
+	if (error == 913)
+		reason = MSN_SB_ERROR_OFFLINE;
+	else if (error == 800)
+		reason = MSN_SB_ERROR_TOO_FAST;
+
+	swboard = trans->data;
+
+	purple_debug_info("msn", "xfr_error %i for %s: trans %x, command %s, reason %i\n",
+					error, (swboard->im_user ? swboard->im_user : "(null)"), trans,
+					(trans->command ? trans->command : "(null)"), reason);
+
+	swboard_error_helper(swboard, reason, swboard->im_user);
+}
+
+void
+msn_switchboard_request(MsnSwitchBoard *swboard)
+{
+	MsnCmdProc *cmdproc;
+	MsnTransaction *trans;
+
+	g_return_if_fail(swboard != NULL);
+
+	cmdproc = swboard->session->notification->cmdproc;
+
+	trans = msn_transaction_new(cmdproc, "XFR", "%s", "SB");
+	msn_transaction_add_cb(trans, "XFR", got_swboard);
+
+	msn_transaction_set_data(trans, swboard);
+	msn_transaction_set_error_cb(trans, xfr_error);
+
+	msn_cmdproc_send_trans(cmdproc, trans);
+}
+
+void
+msn_switchboard_close(MsnSwitchBoard *swboard)
+{
+	g_return_if_fail(swboard != NULL);
+
+	if (swboard->error != MSN_SB_ERROR_NONE)
+	{
+		msn_switchboard_destroy(swboard);
+	}
+	else if (g_queue_is_empty(swboard->msg_queue) ||
+			 !swboard->session->connected)
+	{
+		MsnCmdProc *cmdproc;
+		cmdproc = swboard->cmdproc;
+		msn_cmdproc_send_quick(cmdproc, "OUT", NULL, NULL);
+
+		msn_switchboard_destroy(swboard);
+	}
+	else
+	{
+		swboard->closed = TRUE;
+	}
+}
+
+gboolean
+msn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag)
+{
+	g_return_val_if_fail(swboard != NULL, FALSE);
+
+	swboard->flag &= ~flag;
+
+	if (flag == MSN_SB_FLAG_IM)
+		/* Forget any conversation that used to be associated with this
+		 * swboard. */
+		swboard->conv = NULL;
+
+	if (swboard->flag == 0)
+	{
+		msn_switchboard_close(swboard);
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+/**************************************************************************
+ * Init stuff
+ **************************************************************************/
+
+void
+msn_switchboard_init(void)
+{
+	cbs_table = msn_table_new();
+
+	msn_table_add_cmd(cbs_table, "ANS", "ANS", ans_cmd);
+	msn_table_add_cmd(cbs_table, "ANS", "IRO", iro_cmd);
+
+	msn_table_add_cmd(cbs_table, "MSG", "ACK", ack_cmd);
+	msn_table_add_cmd(cbs_table, "MSG", "NAK", nak_cmd);
+
+	msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd);
+
+	msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "JOI", joi_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "BYE", bye_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd);
+
+#if 0
+	/* They might skip the history */
+	msn_table_add_cmd(cbs_table, NULL, "ACK", NULL);
+#endif
+
+	msn_table_add_error(cbs_table, "MSG", msg_error);
+	msn_table_add_error(cbs_table, "CAL", cal_error);
+
+	/* Register the message type callbacks. */
+	msn_table_add_msg_type(cbs_table, "text/plain",
+						   plain_msg);
+	msn_table_add_msg_type(cbs_table, "text/x-msmsgscontrol",
+						   control_msg);
+	msn_table_add_msg_type(cbs_table, "text/x-clientcaps",
+						   clientcaps_msg);
+	msn_table_add_msg_type(cbs_table, "text/x-clientinfo",
+						   clientcaps_msg);
+	msn_table_add_msg_type(cbs_table, "application/x-msnmsgrp2p",
+						   msn_p2p_msg);
+	msn_table_add_msg_type(cbs_table, "text/x-mms-emoticon",
+						   msn_emoticon_msg);
+	msn_table_add_msg_type(cbs_table, "text/x-mms-animemoticon",
+	                                           msn_emoticon_msg);
+	msn_table_add_msg_type(cbs_table, "text/x-msnmsgr-datacast",
+						   nudge_msg);
+#if 0
+	msn_table_add_msg_type(cbs_table, "text/x-msmmsginvite",
+						   msn_invite_msg);
+#endif
+}
+
+void
+msn_switchboard_end(void)
+{
+	msn_table_destroy(cbs_table);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/switchboard.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,277 @@
+/**
+ * @file switchboard.h MSN switchboard functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_SWITCHBOARD_H_
+#define _MSN_SWITCHBOARD_H_
+
+typedef struct _MsnSwitchBoard MsnSwitchBoard;
+
+#include "conversation.h"
+
+#include "msg.h"
+#include "user.h"
+
+#include "servconn.h"
+
+#include "slplink.h"
+
+/**
+ * A switchboard error.
+ */
+typedef enum
+{
+	MSN_SB_ERROR_NONE, /**< No error. */
+	MSN_SB_ERROR_CAL, /**< The user could not join (answer the call). */
+	MSN_SB_ERROR_OFFLINE, /**< The account is offline. */
+	MSN_SB_ERROR_USER_OFFLINE, /**< The user to call is offline. */
+	MSN_SB_ERROR_CONNECTION, /**< There was a connection error. */
+	MSN_SB_ERROR_TOO_FAST, /**< We are sending too fast */
+	MSN_SB_ERROR_AUTHFAILED, /**< Authentication failed joining the switchboard session */
+	MSN_SB_ERROR_UNKNOWN /**< An unknown error occurred. */
+
+} MsnSBErrorType;
+
+/**
+ * A switchboard flag.
+ */
+typedef enum
+{
+	MSN_SB_FLAG_IM = 0x01, /**< This switchboard is being used for a conversation. */
+	MSN_SB_FLAG_FT = 0x02, /**< This switchboard is being used for file transfer. */
+
+} MsnSBFlag;
+
+/**
+ * A switchboard.
+ *
+ * A place where a bunch of users send messages to the rest of the users.
+ */
+struct _MsnSwitchBoard
+{
+	MsnSession *session;
+	MsnServConn *servconn;
+	MsnCmdProc *cmdproc;
+	char *im_user;
+
+	MsnSBFlag flag;
+	char *auth_key;
+	char *session_id;
+
+	PurpleConversation *conv; /**< The conversation that displays the
+							  messages of this switchboard, or @c NULL if
+							  this is a helper switchboard. */
+
+	gboolean empty;			/**< A flag that states if the swithcboard has no
+							  users in it. */
+	gboolean invited;		/**< A flag that states if we were invited to the
+							  switchboard. */
+	gboolean ready;			/**< A flag that states if this switchboard is
+							  ready to be used. */
+	gboolean closed;		/**< A flag that states if the switchboard has
+							  been closed by the user. */
+	gboolean destroying;	/**< A flag that states if the switchboard is
+							  alredy on the process of destruction. */
+
+	int current_users;
+	int total_users;
+	GList *users;
+
+	int chat_id;
+
+	GQueue *msg_queue; /**< Queue of messages to send. */
+	GList *ack_list; /**< List of messages waiting for an ack. */
+
+	MsnSBErrorType error; /**< The error that occurred in this switchboard
+							(if applicable). */
+	GList *slplinks; /**< The list of slplinks that are using this switchboard. */
+};
+
+/**
+ * Initialize the variables for switchboard creation.
+ */
+void msn_switchboard_init(void);
+
+/**
+ * Destroy the variables for switchboard creation.
+ */
+void msn_switchboard_end(void);
+
+/**
+ * Creates a new switchboard.
+ *
+ * @param session The MSN session.
+ *
+ * @return The new switchboard.
+ */
+MsnSwitchBoard *msn_switchboard_new(MsnSession *session);
+
+/**
+ * Destroys a switchboard.
+ *
+ * @param swboard The switchboard to destroy.
+ */
+void msn_switchboard_destroy(MsnSwitchBoard *swboard);
+
+/**
+ * Sets the auth key the switchboard must use when connecting.
+ *
+ * @param swboard The switchboard.
+ * @param key     The auth key.
+ */
+void msn_switchboard_set_auth_key(MsnSwitchBoard *swboard, const char *key);
+
+/**
+ * Returns the auth key the switchboard must use when connecting.
+ *
+ * @param swboard The switchboard.
+ *
+ * @return The auth key.
+ */
+const char *msn_switchboard_get_auth_key(MsnSwitchBoard *swboard);
+
+/**
+ * Sets the session ID the switchboard must use when connecting.
+ *
+ * @param swboard The switchboard.
+ * @param id      The session ID.
+ */
+void msn_switchboard_set_session_id(MsnSwitchBoard *swboard, const char *id);
+
+/**
+ * Returns the session ID the switchboard must use when connecting.
+ *
+ * @param swboard The switchboard.
+ *
+ * @return The session ID.
+ */
+const char *msn_switchboard_get_session_id(MsnSwitchBoard *swboard);
+
+/**
+ * Sets whether or not we were invited to this switchboard.
+ *
+ * @param swboard The switchboard.
+ * @param invite  @c TRUE if invited, @c FALSE otherwise.
+ */
+void msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited);
+
+/**
+ * Returns whether or not we were invited to this switchboard.
+ *
+ * @param swboard The switchboard.
+ *
+ * @return @c TRUE if invited, @c FALSE otherwise.
+ */
+gboolean msn_switchboard_is_invited(MsnSwitchBoard *swboard);
+
+/**
+ * Connects to a switchboard.
+ *
+ * @param swboard The switchboard.
+ * @param host    The switchboard server host.
+ * @param port    The switcbharod server port.
+ *
+ * @return @c TRUE if able to connect, or @c FALSE otherwise.
+ */
+gboolean msn_switchboard_connect(MsnSwitchBoard *swboard,
+								 const char *host, int port);
+
+/**
+ * Disconnects from a switchboard.
+ *
+ * @param swboard The switchboard to disconnect from.
+ */
+void msn_switchboard_disconnect(MsnSwitchBoard *swboard);
+
+/**
+ * Closes the switchboard.
+ *
+ * Called when a conversation is closed.
+ *
+ * @param swboard The switchboard to close.
+ */
+void msn_switchboard_close(MsnSwitchBoard *swboard);
+
+/**
+ * Release a switchboard from a certain function.
+ *
+ * @param swboard The switchboard to release.
+ * @param flag The flag that states the function.
+ *
+ * @return @c TRUE if the switchboard was closed, @c FALSE otherwise.
+ */
+gboolean msn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag);
+
+/**
+ * Returns whether or not we currently can send a message through this
+ * switchboard.
+ *
+ * @param swboard The switchboard.
+ *
+ * @return @c TRUE if a message can be sent, @c FALSE otherwise.
+ */
+gboolean msn_switchboard_can_send(MsnSwitchBoard *swboard);
+
+/**
+ * Sends a message through this switchboard.
+ *
+ * @param swboard The switchboard.
+ * @param msg The message.
+ * @param queue A flag that states if we want this message to be queued (in
+ * the case it cannot currently be sent).
+ *
+ * @return @c TRUE if a message can be sent, @c FALSE otherwise.
+ */
+void msn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg,
+							  gboolean queue);
+
+gboolean msn_switchboard_chat_leave(MsnSwitchBoard *swboard);
+gboolean msn_switchboard_chat_invite(MsnSwitchBoard *swboard, const char *who);
+
+void msn_switchboard_request(MsnSwitchBoard *swboard);
+void msn_switchboard_request_add_user(MsnSwitchBoard *swboard, const char *user);
+
+/**
+ * Processes peer to peer messages.
+ *
+ * @param cmdproc The command processor.
+ * @param msg     The message.
+ */
+void msn_p2p_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
+
+/**
+ * Processes emoticon messages.
+ *
+ * @param cmdproc The command processor.
+ * @param msg     The message.
+ */
+void msn_emoticon_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
+
+/**
+ * Processes INVITE messages.
+ *
+ * @param cmdproc The command processor.
+ * @param msg     The message.
+ */
+void msn_invite_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
+
+#endif /* _MSN_SWITCHBOARD_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/sync.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,258 @@
+/**
+ * @file sync.c MSN list synchronization functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "sync.h"
+#include "state.h"
+
+static MsnTable *cbs_table;
+
+static void
+blp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	PurpleConnection *gc = cmdproc->session->account->gc;
+	const char *list_name;
+
+	list_name = cmd->params[0];
+
+	if (!g_ascii_strcasecmp(list_name, "AL"))
+	{
+		/*
+		 * If the current setting is AL, messages from users who
+		 * are not in BL will be delivered.
+		 *
+		 * In other words, deny some.
+		 */
+		gc->account->perm_deny = PURPLE_PRIVACY_DENY_USERS;
+	}
+	else
+	{
+		/* If the current setting is BL, only messages from people
+		 * who are in the AL will be delivered.
+		 *
+		 * In other words, permit some.
+		 */
+		gc->account->perm_deny = PURPLE_PRIVACY_ALLOW_USERS;
+	}
+}
+
+static void
+prp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session = cmdproc->session;
+	const char *type, *value;
+
+	type  = cmd->params[0];
+	value = cmd->params[1];
+
+	if (cmd->param_count == 2)
+	{
+		if (!strcmp(type, "PHH"))
+			msn_user_set_home_phone(session->user, purple_url_decode(value));
+		else if (!strcmp(type, "PHW"))
+			msn_user_set_work_phone(session->user, purple_url_decode(value));
+		else if (!strcmp(type, "PHM"))
+			msn_user_set_mobile_phone(session->user, purple_url_decode(value));
+	}
+	else
+	{
+		if (!strcmp(type, "PHH"))
+			msn_user_set_home_phone(session->user, NULL);
+		else if (!strcmp(type, "PHW"))
+			msn_user_set_work_phone(session->user, NULL);
+		else if (!strcmp(type, "PHM"))
+			msn_user_set_mobile_phone(session->user, NULL);
+	}
+}
+
+static void
+lsg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session = cmdproc->session;
+	const char *name;
+	int group_id;
+
+	group_id = atoi(cmd->params[0]);
+	name = purple_url_decode(cmd->params[1]);
+
+	msn_group_new(session->userlist, group_id, name);
+
+	/* HACK */
+	if (group_id == 0)
+	{
+		/* Group of ungroupped buddies */
+		if (session->sync->total_users == 0)
+		{
+			cmdproc->cbs_table = session->sync->old_cbs_table;
+
+			msn_session_finish_login(session);
+
+			msn_sync_destroy(session->sync);
+			session->sync = NULL;
+		}
+		return;
+	}
+
+	if ((purple_find_group(name)) == NULL)
+	{
+		PurpleGroup *g = purple_group_new(name);
+		purple_blist_add_group(g, NULL);
+	}
+}
+
+static void
+lst_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSession *session = cmdproc->session;
+	char *passport = NULL;
+	const char *friend = NULL;
+	int list_op;
+	MsnUser *user;
+
+	passport = cmd->params[0];
+	friend   = purple_url_decode(cmd->params[1]);
+	list_op  = atoi(cmd->params[2]);
+
+	user = msn_user_new(session->userlist, passport, friend);
+
+	msn_userlist_add_user(session->userlist, user);
+
+	session->sync->last_user = user;
+
+	/* TODO: This can be improved */
+
+	if (list_op & MSN_LIST_FL_OP)
+	{
+		char **c;
+		char **tokens;
+		const char *group_nums;
+		GSList *group_ids;
+
+		group_nums = cmd->params[3];
+
+		group_ids = NULL;
+
+		tokens = g_strsplit(group_nums, ",", -1);
+
+		for (c = tokens; *c != NULL; c++)
+		{
+			int id;
+
+			id = atoi(*c);
+			group_ids = g_slist_append(group_ids, GINT_TO_POINTER(id));
+		}
+
+		g_strfreev(tokens);
+
+		msn_got_lst_user(session, user, list_op, group_ids);
+
+		g_slist_free(group_ids);
+	}
+	else
+	{
+		msn_got_lst_user(session, user, list_op, NULL);
+	}
+
+	session->sync->num_users++;
+
+	if (session->sync->num_users == session->sync->total_users)
+	{
+		cmdproc->cbs_table = session->sync->old_cbs_table;
+
+		msn_session_finish_login(session);
+
+		msn_sync_destroy(session->sync);
+		session->sync = NULL;
+	}
+}
+
+static void
+bpr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	MsnSync *sync = cmdproc->session->sync;
+	const char *type, *value;
+	MsnUser *user;
+
+	user = sync->last_user;
+
+	g_return_if_fail(user != NULL);
+
+	type     = cmd->params[0];
+	value    = cmd->params[1];
+
+	if (value)
+	{
+		if (!strcmp(type, "MOB"))
+		{
+			if (!strcmp(value, "Y"))
+				user->mobile = TRUE;
+		}
+		else if (!strcmp(type, "PHH"))
+			msn_user_set_home_phone(user, purple_url_decode(value));
+		else if (!strcmp(type, "PHW"))
+			msn_user_set_work_phone(user, purple_url_decode(value));
+		else if (!strcmp(type, "PHM"))
+			msn_user_set_mobile_phone(user, purple_url_decode(value));
+	}
+}
+
+void
+msn_sync_init(void)
+{
+	/* TODO: check prp, blp, bpr */
+
+	cbs_table = msn_table_new();
+
+	/* Syncing */
+	msn_table_add_cmd(cbs_table, NULL, "GTC", NULL);
+	msn_table_add_cmd(cbs_table, NULL, "BLP", blp_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "PRP", prp_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "LSG", lsg_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "LST", lst_cmd);
+	msn_table_add_cmd(cbs_table, NULL, "BPR", bpr_cmd);
+}
+
+void
+msn_sync_end(void)
+{
+	msn_table_destroy(cbs_table);
+}
+
+MsnSync *
+msn_sync_new(MsnSession *session)
+{
+	MsnSync *sync;
+
+	sync = g_new0(MsnSync, 1);
+
+	sync->session = session;
+	sync->cbs_table = cbs_table;
+
+	return sync;
+}
+
+void
+msn_sync_destroy(MsnSync *sync)
+{
+	g_free(sync);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/sync.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,52 @@
+/**
+ * @file sync.h MSN list synchronization functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_SYNC_H_
+#define _MSN_SYNC_H_
+
+typedef struct _MsnSync MsnSync;
+
+#include "session.h"
+#include "table.h"
+#include "user.h"
+
+struct _MsnSync
+{
+	MsnSession *session;
+	MsnTable *cbs_table;
+	MsnTable *old_cbs_table;
+
+	int num_users;
+	int total_users;
+	int num_groups;
+	int total_groups;
+	MsnUser *last_user;
+};
+
+void msn_sync_init(void);
+void msn_sync_end(void);
+
+MsnSync * msn_sync_new(MsnSession *session);
+void msn_sync_destroy(MsnSync *sync);
+
+#endif /* _MSN_SYNC_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/table.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,132 @@
+/**
+ * @file table.c MSN helper structure
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "table.h"
+
+static void
+null_cmd_cb(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+}
+
+static void
+null_error_cb(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
+{
+}
+
+MsnTable *
+msn_table_new()
+{
+	MsnTable *table;
+
+	table = g_new0(MsnTable, 1);
+
+	table->cmds = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)g_hash_table_destroy);
+	table->msgs = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
+	table->errors = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
+
+	table->async = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
+	table->fallback = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
+
+	return table;
+}
+
+void
+msn_table_destroy(MsnTable *table)
+{
+	g_return_if_fail(table != NULL);
+
+	g_hash_table_destroy(table->cmds);
+	g_hash_table_destroy(table->msgs);
+	g_hash_table_destroy(table->errors);
+
+	g_hash_table_destroy(table->async);
+	g_hash_table_destroy(table->fallback);
+
+	g_free(table);
+}
+
+void
+msn_table_add_cmd(MsnTable *table,
+				  char *command, char *answer, MsnTransCb cb)
+{
+	GHashTable *cbs;
+
+	g_return_if_fail(table  != NULL);
+	g_return_if_fail(answer != NULL);
+
+	cbs = NULL;
+
+	if (command == NULL)
+	{
+		cbs = table->async;
+	}
+	else if (strcmp(command, "fallback") == 0)
+	{
+		cbs = table->fallback;
+	}
+	else
+	{
+		cbs = g_hash_table_lookup(table->cmds, command);
+
+		if (cbs == NULL)
+		{
+			cbs = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
+			g_hash_table_insert(table->cmds, command, cbs);
+		}
+	}
+
+	if (cb == NULL)
+		cb = null_cmd_cb;
+
+	g_hash_table_insert(cbs, answer, cb);
+}
+
+void
+msn_table_add_error(MsnTable *table,
+					char *answer, MsnErrorCb cb)
+{
+	g_return_if_fail(table  != NULL);
+	g_return_if_fail(answer != NULL);
+
+	if (cb == NULL)
+		cb = null_error_cb;
+
+	g_hash_table_insert(table->errors, answer, cb);
+}
+
+void
+msn_table_add_msg_type(MsnTable *table,
+					   char *type, MsnMsgTypeCb cb)
+{
+	g_return_if_fail(table != NULL);
+	g_return_if_fail(type  != NULL);
+	g_return_if_fail(cb    != NULL);
+
+#if 0
+	if (cb == NULL)
+		cb = null_msg_cb;
+#endif
+
+	g_hash_table_insert(table->msgs, type, cb);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/table.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,53 @@
+/**
+ * @file table.h MSN helper structure
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_TABLE_H_
+#define _MSN_TABLE_H_
+
+typedef struct _MsnTable MsnTable;
+
+#include "cmdproc.h"
+#include "transaction.h"
+#include "msg.h"
+
+typedef void (*MsnMsgTypeCb)(MsnCmdProc *cmdproc, MsnMessage *msg);
+
+struct _MsnTable
+{
+	GHashTable *cmds;
+	GHashTable *msgs;
+	GHashTable *errors;
+
+	GHashTable *async;
+	GHashTable *fallback;
+};
+
+MsnTable *msn_table_new(void);
+void msn_table_destroy(MsnTable *table);
+
+void msn_table_add_cmd(MsnTable *table, char *command, char *answer,
+					   MsnTransCb cb);
+void msn_table_add_error(MsnTable *table, char *answer, MsnErrorCb cb);
+void msn_table_add_msg_type(MsnTable *table, char *type, MsnMsgTypeCb cb);
+
+#endif /* _MSN_TABLE_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/transaction.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,221 @@
+/**
+ * @file transaction.c MSN transaction functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "transaction.h"
+
+MsnTransaction *
+msn_transaction_new(MsnCmdProc *cmdproc, const char *command,
+					const char *format, ...)
+{
+	MsnTransaction *trans;
+	va_list arg;
+
+	g_return_val_if_fail(command != NULL, NULL);
+
+	trans = g_new0(MsnTransaction, 1);
+
+	trans->cmdproc = cmdproc;
+	trans->command = g_strdup(command);
+
+	if (format != NULL)
+	{
+		va_start(arg, format);
+		trans->params = g_strdup_vprintf(format, arg);
+		va_end(arg);
+	}
+
+	/* trans->queue = g_queue_new(); */
+
+	return trans;
+}
+
+void
+msn_transaction_destroy(MsnTransaction *trans)
+{
+	g_return_if_fail(trans != NULL);
+
+	g_free(trans->command);
+	g_free(trans->params);
+	g_free(trans->payload);
+
+#if 0
+	if (trans->pendent_cmd != NULL)
+		msn_message_unref(trans->pendent_msg);
+#endif
+
+#if 0
+	MsnTransaction *elem;
+	if (trans->queue != NULL)
+	{
+		while ((elem = g_queue_pop_head(trans->queue)) != NULL)
+			msn_transaction_destroy(elem);
+
+		g_queue_free(trans->queue);
+	}
+#endif
+
+	if (trans->callbacks != NULL && trans->has_custom_callbacks)
+		g_hash_table_destroy(trans->callbacks);
+
+	if (trans->timer)
+		purple_timeout_remove(trans->timer);
+
+	g_free(trans);
+}
+
+char *
+msn_transaction_to_string(MsnTransaction *trans)
+{
+	char *str;
+
+	g_return_val_if_fail(trans != NULL, FALSE);
+
+	if (trans->params != NULL)
+		str = g_strdup_printf("%s %u %s\r\n", trans->command, trans->trId, trans->params);
+	else
+		str = g_strdup_printf("%s %u\r\n", trans->command, trans->trId);
+
+	return str;
+}
+
+void
+msn_transaction_queue_cmd(MsnTransaction *trans, MsnCommand *cmd)
+{
+	purple_debug_info("msn", "queueing command.\n");
+	trans->pendent_cmd = cmd;
+	msn_command_ref(cmd);
+}
+
+void
+msn_transaction_unqueue_cmd(MsnTransaction *trans, MsnCmdProc *cmdproc)
+{
+	MsnCommand *cmd;
+
+	if (!cmdproc->servconn->connected)
+		return;
+
+	purple_debug_info("msn", "unqueueing command.\n");
+	cmd = trans->pendent_cmd;
+
+	g_return_if_fail(cmd != NULL);
+
+	msn_cmdproc_process_cmd(cmdproc, cmd);
+	msn_command_unref(cmd);
+
+	trans->pendent_cmd = NULL;
+}
+
+#if 0
+void
+msn_transaction_queue(MsnTransaction *trans, MsnTransaction *elem)
+{
+	if (trans->queue == NULL)
+		trans->queue = g_queue_new();
+
+	g_queue_push_tail(trans->queue, elem);
+}
+
+void
+msn_transaction_unqueue(MsnTransaction *trans, MsnCmdProc *cmdproc)
+{
+	MsnTransaction *elem;
+
+	while ((elem = g_queue_pop_head(trans->queue)) != NULL)
+		msn_cmdproc_send_trans(cmdproc, elem);
+}
+#endif
+
+void
+msn_transaction_set_payload(MsnTransaction *trans,
+							const char *payload, int payload_len)
+{
+	g_return_if_fail(trans   != NULL);
+	g_return_if_fail(payload != NULL);
+
+	trans->payload = g_strdup(payload);
+	trans->payload_len = payload_len ? payload_len : strlen(trans->payload);
+}
+
+void
+msn_transaction_set_data(MsnTransaction *trans, void *data)
+{
+	g_return_if_fail(trans != NULL);
+
+	trans->data = data;
+}
+
+void
+msn_transaction_add_cb(MsnTransaction *trans, char *answer,
+					   MsnTransCb cb)
+{
+	g_return_if_fail(trans  != NULL);
+	g_return_if_fail(answer != NULL);
+
+	if (trans->callbacks == NULL)
+	{
+		trans->has_custom_callbacks = TRUE;
+		trans->callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
+												 NULL);
+	}
+	else if (trans->has_custom_callbacks != TRUE)
+		g_return_if_reached ();
+
+	g_hash_table_insert(trans->callbacks, answer, cb);
+}
+
+static gboolean
+transaction_timeout(gpointer data)
+{
+	MsnTransaction *trans;
+
+	trans = data;
+	g_return_val_if_fail(trans != NULL, FALSE);
+
+#if 0
+	purple_debug_info("msn", "timed out: %s %d %s\n", trans->command, trans->trId, trans->params);
+#endif
+
+	if (trans->timeout_cb != NULL)
+		trans->timeout_cb(trans->cmdproc, trans);
+
+	return FALSE;
+}
+
+void
+msn_transaction_set_timeout_cb(MsnTransaction *trans, MsnTimeoutCb cb)
+{
+	if (trans->timer)
+	{
+		purple_debug_error("msn", "This shouldn't be happening\n");
+		purple_timeout_remove(trans->timer);
+	}
+	trans->timeout_cb = cb;
+	trans->timer = purple_timeout_add(60000, transaction_timeout, trans);
+}
+
+void
+msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb)
+{
+	trans->error_cb = cb;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/transaction.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,80 @@
+/**
+ * @file transaction.h MSN transaction functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_TRANSACTION_H
+#define _MSN_TRANSACTION_H
+
+typedef struct _MsnTransaction MsnTransaction;
+
+#include "command.h"
+#include "cmdproc.h"
+
+typedef void (*MsnTransCb)(MsnCmdProc *cmdproc, MsnCommand *cmd);
+typedef void (*MsnTimeoutCb)(MsnCmdProc *cmdproc, MsnTransaction *trans);
+typedef void (*MsnErrorCb)(MsnCmdProc *cmdproc, MsnTransaction *trans,
+						   int error);
+
+/**
+ * A transaction. A sending command that will initiate the transaction.
+ */
+struct _MsnTransaction
+{
+	MsnCmdProc *cmdproc;
+	unsigned int trId;
+
+	char *command;
+	char *params;
+
+	int timer;
+
+	void *data; /**< The data to be used on the different callbacks. */
+	GHashTable *callbacks;
+	gboolean has_custom_callbacks;
+	MsnErrorCb error_cb;
+	MsnTimeoutCb timeout_cb;
+
+	char *payload;
+	size_t payload_len;
+
+	GQueue *queue;
+	MsnCommand *pendent_cmd; /**< The command that is waiting for the result of
+							   this transaction. */
+};
+
+MsnTransaction *msn_transaction_new(MsnCmdProc *cmdproc,
+									const char *command,
+									const char *format, ...);
+void msn_transaction_destroy(MsnTransaction *trans);
+
+char *msn_transaction_to_string(MsnTransaction *trans);
+void msn_transaction_queue_cmd(MsnTransaction *trans, MsnCommand *cmd);
+void msn_transaction_unqueue_cmd(MsnTransaction *trans, MsnCmdProc *cmdproc);
+void msn_transaction_set_payload(MsnTransaction *trans,
+								 const char *payload, int payload_len);
+void msn_transaction_set_data(MsnTransaction *trans, void *data);
+void msn_transaction_add_cb(MsnTransaction *trans, char *answer,
+							MsnTransCb cb);
+void msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb);
+void msn_transaction_set_timeout_cb(MsnTransaction *trans, MsnTimeoutCb cb);
+
+#endif /* _MSN_TRANSACTION_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/user.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,392 @@
+/**
+ * @file user.c User functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "user.h"
+#include "slp.h"
+
+MsnUser *
+msn_user_new(MsnUserList *userlist, const char *passport,
+			 const char *store_name)
+{
+	MsnUser *user;
+
+	user = g_new0(MsnUser, 1);
+
+	user->userlist = userlist;
+
+	msn_user_set_passport(user, passport);
+	msn_user_set_store_name(user, store_name);
+
+	/*
+	 * XXX This seems to reset the friendly name from what it should be
+	 *     to the passport when moving users. So, screw it :)
+	 */
+#if 0
+	if (name != NULL)
+		msn_user_set_name(user, name);
+#endif
+
+	return user;
+}
+
+void
+msn_user_destroy(MsnUser *user)
+{
+	g_return_if_fail(user != NULL);
+
+	if (user->clientcaps != NULL)
+		g_hash_table_destroy(user->clientcaps);
+
+	if (user->group_ids != NULL)
+		g_list_free(user->group_ids);
+
+	if (user->msnobj != NULL)
+		msn_object_destroy(user->msnobj);
+
+	g_free(user->passport);
+	g_free(user->friendly_name);
+	g_free(user->store_name);
+	g_free(user->phone.home);
+	g_free(user->phone.work);
+	g_free(user->phone.mobile);
+
+	g_free(user);
+}
+
+void
+msn_user_update(MsnUser *user)
+{
+	PurpleAccount *account;
+
+	account = user->userlist->session->account;
+
+	if (user->status != NULL) {
+		if (!strcmp(user->status, "offline") && user->mobile) {
+			purple_prpl_got_user_status(account, user->passport, "offline", NULL);
+			purple_prpl_got_user_status(account, user->passport, "mobile", NULL);
+		} else {
+			purple_prpl_got_user_status(account, user->passport, user->status, NULL);
+			purple_prpl_got_user_status_deactive(account, user->passport, "mobile");
+		}
+	}
+
+	if (user->idle)
+		purple_prpl_got_user_idle(account, user->passport, TRUE, -1);
+	else
+		purple_prpl_got_user_idle(account, user->passport, FALSE, 0);
+}
+
+void
+msn_user_set_state(MsnUser *user, const char *state)
+{
+	const char *status;
+
+	if (!g_ascii_strcasecmp(state, "BSY"))
+		status = "busy";
+	else if (!g_ascii_strcasecmp(state, "BRB"))
+		status = "brb";
+	else if (!g_ascii_strcasecmp(state, "AWY"))
+		status = "away";
+	else if (!g_ascii_strcasecmp(state, "PHN"))
+		status = "phone";
+	else if (!g_ascii_strcasecmp(state, "LUN"))
+		status = "lunch";
+	else
+		status = "available";
+
+	if (!g_ascii_strcasecmp(state, "IDL"))
+		user->idle = TRUE;
+	else
+		user->idle = FALSE;
+
+	user->status = status;
+}
+
+void
+msn_user_set_passport(MsnUser *user, const char *passport)
+{
+	g_return_if_fail(user != NULL);
+
+	g_free(user->passport);
+	user->passport = g_strdup(passport);
+}
+
+void
+msn_user_set_friendly_name(MsnUser *user, const char *name)
+{
+	g_return_if_fail(user != NULL);
+
+	g_free(user->friendly_name);
+	user->friendly_name = g_strdup(name);
+}
+
+void
+msn_user_set_store_name(MsnUser *user, const char *name)
+{
+	g_return_if_fail(user != NULL);
+
+	g_free(user->store_name);
+	user->store_name = g_strdup(name);
+}
+
+void
+msn_user_set_buddy_icon(MsnUser *user, PurpleStoredImage *img)
+{
+	MsnObject *msnobj = msn_user_get_object(user);
+
+	g_return_if_fail(user != NULL);
+
+	if (img == NULL)
+		msn_user_set_object(user, NULL);
+	else
+	{
+		PurpleCipherContext *ctx;
+		char *buf;
+		gconstpointer data = purple_imgstore_get_data(img);
+		size_t size = purple_imgstore_get_size(img);
+		char *base64;
+		unsigned char digest[20];
+
+		if (msnobj == NULL)
+		{
+			msnobj = msn_object_new();
+			msn_object_set_local(msnobj);
+			msn_object_set_type(msnobj, MSN_OBJECT_USERTILE);
+			msn_object_set_location(msnobj, "TFR2C2.tmp");
+			msn_object_set_creator(msnobj, msn_user_get_passport(user));
+
+			msn_user_set_object(user, msnobj);
+		}
+
+		msn_object_set_image(msnobj, img);
+
+		/* Compute the SHA1D field. */
+		memset(digest, 0, sizeof(digest));
+
+		ctx = purple_cipher_context_new_by_name("sha1", NULL);
+		purple_cipher_context_append(ctx, data, size);
+		purple_cipher_context_digest(ctx, sizeof(digest), digest, NULL);
+
+		base64 = purple_base64_encode(digest, sizeof(digest));
+		msn_object_set_sha1d(msnobj, base64);
+		g_free(base64);
+
+		msn_object_set_size(msnobj, size);
+
+		/* Compute the SHA1C field. */
+		buf = g_strdup_printf(
+			"Creator%sSize%dType%dLocation%sFriendly%sSHA1D%s",
+			msn_object_get_creator(msnobj),
+			msn_object_get_size(msnobj),
+			msn_object_get_type(msnobj),
+			msn_object_get_location(msnobj),
+			msn_object_get_friendly(msnobj),
+			msn_object_get_sha1d(msnobj));
+
+		memset(digest, 0, sizeof(digest));
+
+		purple_cipher_context_reset(ctx, NULL);
+		purple_cipher_context_append(ctx, (const guchar *)buf, strlen(buf));
+		purple_cipher_context_digest(ctx, sizeof(digest), digest, NULL);
+		purple_cipher_context_destroy(ctx);
+		g_free(buf);
+
+		base64 = purple_base64_encode(digest, sizeof(digest));
+		msn_object_set_sha1c(msnobj, base64);
+		g_free(base64);
+	}
+}
+
+void
+msn_user_add_group_id(MsnUser *user, int id)
+{
+	MsnUserList *userlist;
+	PurpleAccount *account;
+	PurpleBuddy *b;
+	PurpleGroup *g;
+	const char *passport;
+	const char *group_name;
+
+	g_return_if_fail(user != NULL);
+	g_return_if_fail(id >= 0);
+
+	user->group_ids = g_list_append(user->group_ids, GINT_TO_POINTER(id));
+
+	userlist = user->userlist;
+	account = userlist->session->account;
+	passport = msn_user_get_passport(user);
+
+	group_name = msn_userlist_find_group_name(userlist, id);
+
+	g = purple_find_group(group_name);
+
+	if ((id == 0) && (g == NULL))
+	{
+		g = purple_group_new(group_name);
+		purple_blist_add_group(g, NULL);
+	}
+
+	b = purple_find_buddy_in_group(account, passport, g);
+
+	if (b == NULL)
+	{
+		b = purple_buddy_new(account, passport, NULL);
+
+		purple_blist_add_buddy(b, NULL, g, NULL);
+	}
+
+	b->proto_data = user;
+}
+
+void
+msn_user_remove_group_id(MsnUser *user, int id)
+{
+	g_return_if_fail(user != NULL);
+	g_return_if_fail(id >= 0);
+
+	user->group_ids = g_list_remove(user->group_ids, GINT_TO_POINTER(id));
+}
+
+void
+msn_user_set_home_phone(MsnUser *user, const char *number)
+{
+	g_return_if_fail(user != NULL);
+
+	if (user->phone.home != NULL)
+		g_free(user->phone.home);
+
+	user->phone.home = (number == NULL ? NULL : g_strdup(number));
+}
+
+void
+msn_user_set_work_phone(MsnUser *user, const char *number)
+{
+	g_return_if_fail(user != NULL);
+
+	if (user->phone.work != NULL)
+		g_free(user->phone.work);
+
+	user->phone.work = (number == NULL ? NULL : g_strdup(number));
+}
+
+void
+msn_user_set_mobile_phone(MsnUser *user, const char *number)
+{
+	g_return_if_fail(user != NULL);
+
+	if (user->phone.mobile != NULL)
+		g_free(user->phone.mobile);
+
+	user->phone.mobile = (number == NULL ? NULL : g_strdup(number));
+}
+
+void
+msn_user_set_object(MsnUser *user, MsnObject *obj)
+{
+	g_return_if_fail(user != NULL);
+
+	if (user->msnobj != NULL)
+		msn_object_destroy(user->msnobj);
+
+	user->msnobj = obj;
+
+	if (user->list_op & MSN_LIST_FL_OP)
+		msn_queue_buddy_icon_request(user);
+}
+
+void
+msn_user_set_client_caps(MsnUser *user, GHashTable *info)
+{
+	g_return_if_fail(user != NULL);
+	g_return_if_fail(info != NULL);
+
+	if (user->clientcaps != NULL)
+		g_hash_table_destroy(user->clientcaps);
+
+	user->clientcaps = info;
+}
+
+const char *
+msn_user_get_passport(const MsnUser *user)
+{
+	g_return_val_if_fail(user != NULL, NULL);
+
+	return user->passport;
+}
+
+const char *
+msn_user_get_friendly_name(const MsnUser *user)
+{
+	g_return_val_if_fail(user != NULL, NULL);
+
+	return user->friendly_name;
+}
+
+const char *
+msn_user_get_store_name(const MsnUser *user)
+{
+	g_return_val_if_fail(user != NULL, NULL);
+
+	return user->store_name;
+}
+
+const char *
+msn_user_get_home_phone(const MsnUser *user)
+{
+	g_return_val_if_fail(user != NULL, NULL);
+
+	return user->phone.home;
+}
+
+const char *
+msn_user_get_work_phone(const MsnUser *user)
+{
+	g_return_val_if_fail(user != NULL, NULL);
+
+	return user->phone.work;
+}
+
+const char *
+msn_user_get_mobile_phone(const MsnUser *user)
+{
+	g_return_val_if_fail(user != NULL, NULL);
+
+	return user->phone.mobile;
+}
+
+MsnObject *
+msn_user_get_object(const MsnUser *user)
+{
+	g_return_val_if_fail(user != NULL, NULL);
+
+	return user->msnobj;
+}
+
+GHashTable *
+msn_user_get_client_caps(const MsnUser *user)
+{
+	g_return_val_if_fail(user != NULL, NULL);
+
+	return user->clientcaps;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/user.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,284 @@
+/**
+ * @file user.h User functions
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_USER_H_
+#define _MSN_USER_H_
+
+typedef struct _MsnUser  MsnUser;
+
+#include "session.h"
+#include "object.h"
+
+#include "userlist.h"
+
+/**
+ * A user.
+ */
+struct _MsnUser
+{
+#if 0
+	MsnSession *session;    /**< The MSN session.               */
+#endif
+	MsnUserList *userlist;
+
+	char *passport;         /**< The passport account.          */
+	char *store_name;       /**< The name stored in the server. */
+	char *friendly_name;    /**< The friendly name.             */
+
+	const char *status;     /**< The state of the user.         */
+	gboolean idle;          /**< The idle state of the user.    */
+
+	struct
+	{
+		char *home;         /**< Home phone number.             */
+		char *work;         /**< Work phone number.             */
+		char *mobile;       /**< Mobile phone number.           */
+
+	} phone;
+
+	gboolean authorized;    /**< Authorized to add this user.   */
+	gboolean mobile;        /**< Signed up with MSN Mobile.     */
+
+	GList *group_ids;       /**< The group IDs.                 */
+
+	MsnObject *msnobj;      /**< The user's MSN Object.         */
+
+	GHashTable *clientcaps; /**< The client's capabilities.     */
+
+	int list_op;
+};
+
+/**************************************************************************/
+/** @name User API                                                        */
+/**************************************************************************/
+/*@{*/
+
+/**
+ * Creates a new user structure.
+ *
+ * @param session      The MSN session.
+ * @param passport     The initial passport.
+ * @param stored_name  The initial stored name.
+ *
+ * @return A new user structure.
+ */
+MsnUser *msn_user_new(MsnUserList *userlist, const char *passport,
+					  const char *store_name);
+
+/**
+ * Destroys a user structure.
+ *
+ * @param user The user to destroy.
+ */
+void msn_user_destroy(MsnUser *user);
+
+
+/**
+ * Updates the user.
+ *
+ * Communicates with the core to update the ui, etc.
+ *
+ * @param user The user to update.
+ */
+void msn_user_update(MsnUser *user);
+
+/**
+ * Sets the new state of user.
+ *
+ * @param user The user.
+ * @param state The state string.
+ */
+void msn_user_set_state(MsnUser *user, const char *state);
+
+/**
+ * Sets the passport account for a user.
+ *
+ * @param user     The user.
+ * @param passport The passport account.
+ */
+void msn_user_set_passport(MsnUser *user, const char *passport);
+
+/**
+ * Sets the friendly name for a user.
+ *
+ * @param user The user.
+ * @param name The friendly name.
+ */
+void msn_user_set_friendly_name(MsnUser *user, const char *name);
+
+/**
+ * Sets the store name for a user.
+ *
+ * @param user The user.
+ * @param name The store name.
+ */
+void msn_user_set_store_name(MsnUser *user, const char *name);
+
+/**
+ * Sets the buddy icon for a local user.
+ *
+ * @param user     The user.
+ * @param img      The buddy icon image
+ */
+void msn_user_set_buddy_icon(MsnUser *user, PurpleStoredImage *img);
+
+/**
+ * Sets the group ID list for a user.
+ *
+ * @param user The user.
+ * @param ids  The group ID list.
+ */
+void msn_user_set_group_ids(MsnUser *user, GList *ids);
+
+/**
+ * Adds the group ID for a user.
+ *
+ * @param user The user.
+ * @param id   The group ID.
+ */
+void msn_user_add_group_id(MsnUser *user, int id);
+
+/**
+ * Removes the group ID from a user.
+ *
+ * @param user The user.
+ * @param id   The group ID.
+ */
+void msn_user_remove_group_id(MsnUser *user, int id);
+
+/**
+ * Sets the home phone number for a user.
+ *
+ * @param user   The user.
+ * @param number The home phone number.
+ */
+void msn_user_set_home_phone(MsnUser *user, const char *number);
+
+/**
+ * Sets the work phone number for a user.
+ *
+ * @param user   The user.
+ * @param number The work phone number.
+ */
+void msn_user_set_work_phone(MsnUser *user, const char *number);
+
+/**
+ * Sets the mobile phone number for a user.
+ *
+ * @param user   The user.
+ * @param number The mobile phone number.
+ */
+void msn_user_set_mobile_phone(MsnUser *user, const char *number);
+
+/**
+ * Sets the MSNObject for a user.
+ *
+ * @param user The user.
+ * @param obj  The MSNObject.
+ */
+void msn_user_set_object(MsnUser *user, MsnObject *obj);
+
+/**
+ * Sets the client information for a user.
+ *
+ * @param user The user.
+ * @param info The client information.
+ */
+void msn_user_set_client_caps(MsnUser *user, GHashTable *info);
+
+
+/**
+ * Returns the passport account for a user.
+ *
+ * @param user The user.
+ *
+ * @return The passport account.
+ */
+const char *msn_user_get_passport(const MsnUser *user);
+
+/**
+ * Returns the friendly name for a user.
+ *
+ * @param user The user.
+ *
+ * @return The friendly name.
+ */
+const char *msn_user_get_friendly_name(const MsnUser *user);
+
+/**
+ * Returns the store name for a user.
+ *
+ * @param user The user.
+ *
+ * @return The store name.
+ */
+const char *msn_user_get_store_name(const MsnUser *user);
+
+/**
+ * Returns the home phone number for a user.
+ *
+ * @param user The user.
+ *
+ * @return The user's home phone number.
+ */
+const char *msn_user_get_home_phone(const MsnUser *user);
+
+/**
+ * Returns the work phone number for a user.
+ *
+ * @param user The user.
+ *
+ * @return The user's work phone number.
+ */
+const char *msn_user_get_work_phone(const MsnUser *user);
+
+/**
+ * Returns the mobile phone number for a user.
+ *
+ * @param user The user.
+ *
+ * @return The user's mobile phone number.
+ */
+const char *msn_user_get_mobile_phone(const MsnUser *user);
+
+/**
+ * Returns the MSNObject for a user.
+ *
+ * @param user The user.
+ *
+ * @return The MSNObject.
+ */
+MsnObject *msn_user_get_object(const MsnUser *user);
+
+/**
+ * Returns the client information for a user.
+ *
+ * @param user The user.
+ *
+ * @return The client information.
+ */
+GHashTable *msn_user_get_client_caps(const MsnUser *user);
+
+/*@}*/
+
+#endif /* _MSN_USER_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/userlist.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,699 @@
+/**
+ * @file userlist.c MSN user list support
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "msn.h"
+#include "userlist.h"
+
+const char *lists[] = { "FL", "AL", "BL", "RL" };
+
+typedef struct
+{
+	PurpleConnection *gc;
+	char *who;
+	char *friendly;
+
+} MsnPermitAdd;
+
+/**************************************************************************
+ * Callbacks
+ **************************************************************************/
+static void
+msn_accept_add_cb(gpointer data)
+{
+	MsnPermitAdd *pa = data;
+	MsnSession *session = pa->gc->proto_data;
+	MsnUserList *userlist = session->userlist;
+
+	msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_AL, NULL);
+
+	g_free(pa->who);
+	g_free(pa->friendly);
+	g_free(pa);
+}
+
+static void
+msn_cancel_add_cb(gpointer data)
+{
+	MsnPermitAdd *pa = data;
+	MsnSession *session = pa->gc->proto_data;
+	MsnUserList *userlist = session->userlist;
+
+	msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_BL, NULL);
+
+	g_free(pa->who);
+	g_free(pa->friendly);
+	g_free(pa);
+}
+
+static void
+got_new_entry(PurpleConnection *gc, const char *passport, const char *friendly)
+{
+	MsnPermitAdd *pa;
+
+	pa = g_new0(MsnPermitAdd, 1);
+	pa->who = g_strdup(passport);
+	pa->friendly = g_strdup(friendly);
+	pa->gc = gc;
+	
+	purple_account_request_authorization(purple_connection_get_account(gc), passport, NULL, friendly, NULL,
+					   purple_find_buddy(purple_connection_get_account(gc), passport) != NULL,
+					   msn_accept_add_cb, msn_cancel_add_cb, pa);
+}
+
+/**************************************************************************
+ * Utility functions
+ **************************************************************************/
+
+static gboolean
+user_is_in_group(MsnUser *user, int group_id)
+{
+	if (user == NULL)
+		return FALSE;
+
+	if (group_id < 0)
+		return FALSE;
+
+	if (g_list_find(user->group_ids, GINT_TO_POINTER(group_id)))
+		return TRUE;
+
+	return FALSE;
+}
+
+static gboolean
+user_is_there(MsnUser *user, int list_id, int group_id)
+{
+	int list_op;
+
+	if (user == NULL)
+		return FALSE;
+
+	list_op = 1 << list_id;
+
+	if (!(user->list_op & list_op))
+		return FALSE;
+
+	if (list_id == MSN_LIST_FL)
+	{
+		if (group_id >= 0)
+			return user_is_in_group(user, group_id);
+	}
+
+	return TRUE;
+}
+
+static const char*
+get_store_name(MsnUser *user)
+{
+	const char *store_name;
+
+	g_return_val_if_fail(user != NULL, NULL);
+
+	store_name = msn_user_get_store_name(user);
+
+	if (store_name != NULL)
+		store_name = purple_url_encode(store_name);
+	else
+		store_name = msn_user_get_passport(user);
+
+	/* this might be a bit of a hack, but it should prevent notification server
+	 * disconnections for people who have buddies with insane friendly names
+	 * who added you to their buddy list from being disconnected. Stu. */
+	/* Shx: What? Isn't the store_name obtained from the server, and hence it's
+	 * below the BUDDY_ALIAS_MAXLEN ? */
+	/* Stu: yeah, that's why it's a bit of a hack, as you pointed out, we're
+	 * probably decoding the incoming store_name wrong, or something. bleh. */
+
+	if (strlen(store_name) > BUDDY_ALIAS_MAXLEN)
+		store_name = msn_user_get_passport(user);
+
+	return store_name;
+}
+
+static void
+msn_request_add_group(MsnUserList *userlist, const char *who,
+					  const char *old_group_name, const char *new_group_name)
+{
+	MsnCmdProc *cmdproc;
+	MsnTransaction *trans;
+	MsnMoveBuddy *data;
+
+	cmdproc = userlist->session->notification->cmdproc;
+	data = g_new0(MsnMoveBuddy, 1);
+
+	data->who = g_strdup(who);
+
+	if (old_group_name)
+		data->old_group_name = g_strdup(old_group_name);
+
+	trans = msn_transaction_new(cmdproc, "ADG", "%s %d",
+								purple_url_encode(new_group_name),
+								0);
+
+	msn_transaction_set_data(trans, data);
+
+	msn_cmdproc_send_trans(cmdproc, trans);
+}
+
+/**************************************************************************
+ * Server functions
+ **************************************************************************/
+
+MsnListId
+msn_get_list_id(const char *list)
+{
+	if (list[0] == 'F')
+		return MSN_LIST_FL;
+	else if (list[0] == 'A')
+		return MSN_LIST_AL;
+	else if (list[0] == 'B')
+		return MSN_LIST_BL;
+	else if (list[0] == 'R')
+		return MSN_LIST_RL;
+
+	return -1;
+}
+
+void
+msn_got_add_user(MsnSession *session, MsnUser *user,
+				 MsnListId list_id, int group_id)
+{
+	PurpleAccount *account;
+	const char *passport;
+	const char *friendly;
+
+	account = session->account;
+
+	passport = msn_user_get_passport(user);
+	friendly = msn_user_get_friendly_name(user);
+
+	if (list_id == MSN_LIST_FL)
+	{
+		PurpleConnection *gc;
+
+		gc = purple_account_get_connection(account);
+
+		serv_got_alias(gc, passport, friendly);
+
+		if (group_id >= 0)
+		{
+			msn_user_add_group_id(user, group_id);
+		}
+		else
+		{
+			/* session->sync->fl_users_count++; */
+		}
+	}
+	else if (list_id == MSN_LIST_AL)
+	{
+		purple_privacy_permit_add(account, passport, TRUE);
+	}
+	else if (list_id == MSN_LIST_BL)
+	{
+		purple_privacy_deny_add(account, passport, TRUE);
+	}
+	else if (list_id == MSN_LIST_RL)
+	{
+		PurpleConnection *gc;
+		PurpleConversation *convo;
+
+		gc = purple_account_get_connection(account);
+
+		purple_debug_info("msn",
+						"%s has added you to his or her buddy list.\n",
+						passport);
+
+ 		convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, passport, account);
+ 		if (convo) {
+ 			PurpleBuddy *buddy;
+ 			char *msg;
+ 
+ 			buddy = purple_find_buddy(account, passport);
+ 			msg = g_strdup_printf(
+ 				_("%s has added you to his or her buddy list."),
+ 				buddy ? purple_buddy_get_contact_alias(buddy) : passport);
+ 			purple_conv_im_write(PURPLE_CONV_IM(convo), passport, msg,
+ 				PURPLE_MESSAGE_SYSTEM, time(NULL));
+ 			g_free(msg);
+ 		}
+ 
+		if (!(user->list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP)))
+		{
+			/*
+			 * TODO: The friendly name was NULL for me when I
+			 *       looked at this.  Maybe we should use the store
+			 *       name instead? --KingAnt
+			 */
+			got_new_entry(gc, passport, friendly);
+		}
+	}
+
+	user->list_op |= (1 << list_id);
+	/* purple_user_add_list_id (user, list_id); */
+}
+
+void
+msn_got_rem_user(MsnSession *session, MsnUser *user,
+				 MsnListId list_id, int group_id)
+{
+	PurpleAccount *account;
+	const char *passport;
+
+	account = session->account;
+
+	passport = msn_user_get_passport(user);
+
+	if (list_id == MSN_LIST_FL)
+	{
+		/* TODO: When is the user totally removed? */
+		if (group_id >= 0)
+		{
+			msn_user_remove_group_id(user, group_id);
+			return;
+		}
+		else
+		{
+			/* session->sync->fl_users_count--; */
+		}
+	}
+	else if (list_id == MSN_LIST_AL)
+	{
+		purple_privacy_permit_remove(account, passport, TRUE);
+	}
+	else if (list_id == MSN_LIST_BL)
+	{
+		purple_privacy_deny_remove(account, passport, TRUE);
+	}
+	else if (list_id == MSN_LIST_RL)
+	{
+		PurpleConversation *convo;
+
+		purple_debug_info("msn",
+						"%s has removed you from his or her buddy list.\n",
+						passport);
+
+		convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, passport, account);
+		if (convo) {
+			PurpleBuddy *buddy;
+			char *msg;
+
+			buddy = purple_find_buddy(account, passport);
+			msg = g_strdup_printf(
+				_("%s has removed you from his or her buddy list."),
+				buddy ? purple_buddy_get_contact_alias(buddy) : passport);
+			purple_conv_im_write(PURPLE_CONV_IM(convo), passport, msg,
+				PURPLE_MESSAGE_SYSTEM, time(NULL));
+			g_free(msg);
+		}
+	}
+
+	user->list_op &= ~(1 << list_id);
+	/* purple_user_remove_list_id (user, list_id); */
+
+	if (user->list_op == 0)
+	{
+		purple_debug_info("msn", "Buddy '%s' shall be deleted?.\n",
+						passport);
+
+	}
+}
+
+void
+msn_got_lst_user(MsnSession *session, MsnUser *user,
+				 int list_op, GSList *group_ids)
+{
+	PurpleConnection *gc;
+	PurpleAccount *account;
+	const char *passport;
+	const char *store;
+
+	account = session->account;
+	gc = purple_account_get_connection(account);
+
+	passport = msn_user_get_passport(user);
+	store = msn_user_get_store_name(user);
+
+	if (list_op & MSN_LIST_FL_OP)
+	{
+		GSList *c;
+		for (c = group_ids; c != NULL; c = g_slist_next(c))
+		{
+			int group_id;
+			group_id = GPOINTER_TO_INT(c->data);
+			msn_user_add_group_id(user, group_id);
+		}
+
+		/* FIXME: It might be a real alias */
+		/* Umm, what? This might fix bug #1385130 */
+		serv_got_alias(gc, passport, store);
+	}
+
+	if (list_op & MSN_LIST_AL_OP)
+	{
+		/* These are users who are allowed to see our status. */
+		purple_privacy_deny_remove(account, passport, TRUE);
+		purple_privacy_permit_add(account, passport, TRUE);
+	}
+
+	if (list_op & MSN_LIST_BL_OP)
+	{
+		/* These are users who are not allowed to see our status. */
+		purple_privacy_permit_remove(account, passport, TRUE);
+		purple_privacy_deny_add(account, passport, TRUE);
+	}
+
+	if (list_op & MSN_LIST_RL_OP)
+	{
+		/* These are users who have us on their buddy list. */
+		/*
+		 * TODO: What is store name set to when this happens?
+		 *       For one of my accounts "something@hotmail.com"
+		 *       the store name was "something."  Maybe we
+		 *       should use the friendly name, instead? --KingAnt
+		 */
+
+		if (!(list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP)))
+		{
+			got_new_entry(gc, passport, store);
+		}
+	}
+
+	user->list_op = list_op;
+}
+
+/**************************************************************************
+ * UserList functions
+ **************************************************************************/
+
+MsnUserList*
+msn_userlist_new(MsnSession *session)
+{
+	MsnUserList *userlist;
+
+	userlist = g_new0(MsnUserList, 1);
+
+	userlist->session = session;
+	userlist->buddy_icon_requests = g_queue_new();
+	
+	/* buddy_icon_window is the number of allowed simultaneous buddy icon requests.
+	 * XXX With smarter rate limiting code, we could allow more at once... 5 was the limit set when
+	 * we weren't retrieiving any more than 5 per MSN session. */
+	userlist->buddy_icon_window = 1;
+
+	return userlist;
+}
+
+void
+msn_userlist_destroy(MsnUserList *userlist)
+{
+	GList *l;
+
+	for (l = userlist->users; l != NULL; l = l->next)
+	{
+		msn_user_destroy(l->data);
+	}
+
+	g_list_free(userlist->users);
+
+	for (l = userlist->groups; l != NULL; l = l->next)
+	{
+		msn_group_destroy(l->data);
+	}
+
+	g_list_free(userlist->groups);
+
+	g_queue_free(userlist->buddy_icon_requests);
+
+	if (userlist->buddy_icon_request_timer)
+		purple_timeout_remove(userlist->buddy_icon_request_timer);
+
+	g_free(userlist);
+}
+
+void
+msn_userlist_add_user(MsnUserList *userlist, MsnUser *user)
+{
+	userlist->users = g_list_prepend(userlist->users, user);
+}
+
+void
+msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user)
+{
+	userlist->users = g_list_remove(userlist->users, user);
+}
+
+MsnUser *
+msn_userlist_find_user(MsnUserList *userlist, const char *passport)
+{
+	GList *l;
+
+	g_return_val_if_fail(passport != NULL, NULL);
+
+	for (l = userlist->users; l != NULL; l = l->next)
+	{
+		MsnUser *user = (MsnUser *)l->data;
+
+		g_return_val_if_fail(user->passport != NULL, NULL);
+
+		if (!strcmp(passport, user->passport))
+			return user;
+	}
+
+	return NULL;
+}
+
+void
+msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group)
+{
+	userlist->groups = g_list_append(userlist->groups, group);
+}
+
+void
+msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group)
+{
+	userlist->groups = g_list_remove(userlist->groups, group);
+}
+
+MsnGroup *
+msn_userlist_find_group_with_id(MsnUserList *userlist, int id)
+{
+	GList *l;
+
+	g_return_val_if_fail(userlist != NULL, NULL);
+	g_return_val_if_fail(id       >= 0,    NULL);
+
+	for (l = userlist->groups; l != NULL; l = l->next)
+	{
+		MsnGroup *group = l->data;
+
+		if (group->id == id)
+			return group;
+	}
+
+	return NULL;
+}
+
+MsnGroup *
+msn_userlist_find_group_with_name(MsnUserList *userlist, const char *name)
+{
+	GList *l;
+
+	g_return_val_if_fail(userlist != NULL, NULL);
+	g_return_val_if_fail(name     != NULL, NULL);
+
+	for (l = userlist->groups; l != NULL; l = l->next)
+	{
+		MsnGroup *group = l->data;
+
+		if ((group->name != NULL) && !g_ascii_strcasecmp(name, group->name))
+			return group;
+	}
+
+	return NULL;
+}
+
+int
+msn_userlist_find_group_id(MsnUserList *userlist, const char *group_name)
+{
+	MsnGroup *group;
+
+	group = msn_userlist_find_group_with_name(userlist, group_name);
+
+	if (group != NULL)
+		return msn_group_get_id(group);
+	else
+		return -1;
+}
+
+const char *
+msn_userlist_find_group_name(MsnUserList *userlist, int group_id)
+{
+	MsnGroup *group;
+
+	group = msn_userlist_find_group_with_id(userlist, group_id);
+
+	if (group != NULL)
+		return msn_group_get_name(group);
+	else
+		return NULL;
+}
+
+void
+msn_userlist_rename_group_id(MsnUserList *userlist, int group_id,
+							 const char *new_name)
+{
+	MsnGroup *group;
+
+	group = msn_userlist_find_group_with_id(userlist, group_id);
+
+	if (group != NULL)
+		msn_group_set_name(group, new_name);
+}
+
+void
+msn_userlist_remove_group_id(MsnUserList *userlist, int group_id)
+{
+	MsnGroup *group;
+
+	group = msn_userlist_find_group_with_id(userlist, group_id);
+
+	if (group != NULL)
+	{
+		msn_userlist_remove_group(userlist, group);
+		msn_group_destroy(group);
+	}
+}
+
+void
+msn_userlist_rem_buddy(MsnUserList *userlist,
+					   const char *who, int list_id, const char *group_name)
+{
+	MsnUser *user;
+	int group_id;
+	const char *list;
+
+	user = msn_userlist_find_user(userlist, who);
+	group_id = -1;
+
+	if (group_name != NULL)
+	{
+		group_id = msn_userlist_find_group_id(userlist, group_name);
+
+		if (group_id < 0)
+		{
+			/* Whoa, there is no such group. */
+			purple_debug_error("msn", "Group doesn't exist: %s\n", group_name);
+			return;
+		}
+	}
+
+	/* First we're going to check if not there. */
+	if (!(user_is_there(user, list_id, group_id)))
+	{
+		list = lists[list_id];
+		purple_debug_error("msn", "User '%s' is not there: %s\n",
+						 who, list);
+		return;
+	}
+
+	/* Then request the rem to the server. */
+	list = lists[list_id];
+
+	msn_notification_rem_buddy(userlist->session->notification, list, who, group_id);
+}
+
+void
+msn_userlist_add_buddy(MsnUserList *userlist,
+					   const char *who, int list_id,
+					   const char *group_name)
+{
+	MsnUser *user;
+	int group_id;
+	const char *list;
+	const char *store_name;
+
+	group_id = -1;
+
+	if (!purple_email_is_valid(who))
+	{
+		/* only notify the user about problems adding to the friends list
+		 * maybe we should do something else for other lists, but it probably
+		 * won't cause too many problems if we just ignore it */
+		if (list_id == MSN_LIST_FL)
+		{
+			char *str = g_strdup_printf(_("Unable to add \"%s\"."), who);
+			purple_notify_error(NULL, NULL, str,
+							  _("The screen name specified is invalid."));
+			g_free(str);
+		}
+
+		return;
+	}
+
+	if (group_name != NULL)
+	{
+		group_id = msn_userlist_find_group_id(userlist, group_name);
+
+		if (group_id < 0)
+		{
+			/* Whoa, we must add that group first. */
+			msn_request_add_group(userlist, who, NULL, group_name);
+			return;
+		}
+	}
+
+	user = msn_userlist_find_user(userlist, who);
+
+	/* First we're going to check if it's already there. */
+	if (user_is_there(user, list_id, group_id))
+	{
+		list = lists[list_id];
+		purple_debug_error("msn", "User '%s' is already there: %s\n", who, list);
+		return;
+	}
+
+	store_name = (user != NULL) ? get_store_name(user) : who;
+
+	/* Then request the add to the server. */
+	list = lists[list_id];
+
+	msn_notification_add_buddy(userlist->session->notification, list, who,
+							   store_name, group_id);
+}
+
+void
+msn_userlist_move_buddy(MsnUserList *userlist, const char *who,
+						const char *old_group_name, const char *new_group_name)
+{
+	int new_group_id;
+
+	new_group_id = msn_userlist_find_group_id(userlist, new_group_name);
+
+	if (new_group_id < 0)
+	{
+		msn_request_add_group(userlist, who, old_group_name, new_group_name);
+		return;
+	}
+
+	msn_userlist_add_buddy(userlist, who, MSN_LIST_FL, new_group_name);
+	msn_userlist_rem_buddy(userlist, who, MSN_LIST_FL, old_group_name);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/msnp9/userlist.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,103 @@
+/**
+ * @file userlist.h MSN user list support
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef _MSN_USERLIST_H_
+#define _MSN_USERLIST_H_
+
+typedef struct _MsnUserList MsnUserList;
+
+#include "cmdproc.h"
+#include "user.h"
+#include "group.h"
+
+typedef enum
+{
+	MSN_LIST_FL,
+	MSN_LIST_AL,
+	MSN_LIST_BL,
+	MSN_LIST_RL
+
+} MsnListId;
+
+typedef struct
+{
+	char *who;
+	char *old_group_name;
+
+} MsnMoveBuddy;
+
+struct _MsnUserList
+{
+	MsnSession *session;
+
+	/* MsnUsers *users; */
+	/* MsnGroups *groups; */
+
+	GList *users;
+	GList *groups;
+
+	GQueue *buddy_icon_requests;
+	int buddy_icon_window;
+	guint buddy_icon_request_timer;
+
+	int fl_users_count;
+
+};
+
+MsnListId msn_get_list_id(const char *list);
+
+void msn_got_add_user(MsnSession *session, MsnUser *user,
+					  MsnListId list_id, int group_id);
+void msn_got_rem_user(MsnSession *session, MsnUser *user,
+					  MsnListId list_id, int group_id);
+void msn_got_lst_user(MsnSession *session, MsnUser *user,
+					  int list_op, GSList *group_ids);
+
+MsnUserList *msn_userlist_new(MsnSession *session);
+void msn_userlist_destroy(MsnUserList *userlist);
+void msn_userlist_add_user(MsnUserList *userlist, MsnUser *user);
+void msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user);
+MsnUser *msn_userlist_find_user(MsnUserList *userlist,
+								const char *passport);
+void msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group);
+void msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group);
+MsnGroup *msn_userlist_find_group_with_id(MsnUserList *userlist, int id);
+MsnGroup *msn_userlist_find_group_with_name(MsnUserList *userlist,
+											const char *name);
+int msn_userlist_find_group_id(MsnUserList *userlist,
+							   const char *group_name);
+const char *msn_userlist_find_group_name(MsnUserList *userlist,
+										 int group_id);
+void msn_userlist_rename_group_id(MsnUserList *userlist, int group_id,
+								  const char *new_name);
+void msn_userlist_remove_group_id(MsnUserList *userlist, int group_id);
+
+void msn_userlist_rem_buddy(MsnUserList *userlist, const char *who,
+							int list_id, const char *group_name);
+void msn_userlist_add_buddy(MsnUserList *userlist, const char *who,
+							int list_id, const char *group_name);
+void msn_userlist_move_buddy(MsnUserList *userlist, const char *who,
+							 const char *old_group_name,
+							 const char *new_group_name);
+
+#endif /* _MSN_USERLIST_H_ */
--- a/libpurple/protocols/myspace/myspace.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/myspace/myspace.c	Mon Nov 12 16:53:54 2007 +0000
@@ -291,8 +291,8 @@
 		/* Notify an error message also, because this is important! */
 		purple_notify_error(acct, _("MySpaceIM Error"), str, NULL);
 
-		gc->wants_to_die = TRUE;
-		purple_connection_error(gc, str);
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, str);
 		g_free(str);
 		return;
 	}
@@ -315,7 +315,9 @@
 	if (!purple_proxy_connect(gc, acct, host, port, msim_connect_cb, gc)) {
 		/* TODO: try other ports if in auto mode, then save
 		 * working port and try that first next time. */
-		purple_connection_error(gc, _("Couldn't create socket"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Couldn't create socket"));
 		return;
 	}
 }
@@ -353,7 +355,9 @@
 
 	if (nc_len != MSIM_AUTH_CHALLENGE_LENGTH) {
 		purple_debug_info("msim", "bad nc length: %x != 0x%x\n", nc_len, MSIM_AUTH_CHALLENGE_LENGTH);
-		purple_connection_error(session->gc, _("Unexpected challenge length from server"));
+		purple_connection_error_reason (session->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Unexpected challenge length from server"));
 		return FALSE;
 	}
 
@@ -826,7 +830,6 @@
 	serv_got_typing_stopped(session->gc, username);
 
 	g_free(username);
-	g_free(text);
 
 	return TRUE;
 }
@@ -1294,7 +1297,8 @@
 
 		purple_debug_info("msim", "msim_check_alive: %s > interval of %d, presumed dead\n",
 				errmsg, MSIM_KEEPALIVE_INTERVAL);
-		purple_connection_error(session->gc, errmsg);
+		purple_connection_error_reason (session->gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, errmsg);
 
 		purple_notify_error(session->gc, NULL, errmsg, NULL);
 
@@ -1560,7 +1564,8 @@
 		purple_notify_error(session->account, 
 				_("No username set"),
 				_("Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile.username and choose a username and try to login again."), NULL);
-		purple_connection_error(session->gc, _("No username set"));
+		purple_connection_error_reason (session->gc,
+			PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("No username set"));
 		return FALSE;
 	}
 
@@ -1796,16 +1801,21 @@
 
 	/* Destroy session if fatal. */
 	if (msim_msg_get(msg, "fatal")) {
+		PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 		purple_debug_info("msim", "fatal error, closing\n");
 		switch (err) {
 			case 260: /* Incorrect password */
+				reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
+				if (!purple_account_get_remember_password(session->account))
+					purple_account_set_password(session->account, NULL);
+				break;
 			case 6: /* Logged in elsewhere */
-				session->gc->wants_to_die = TRUE;
+				reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE;
 				if (!purple_account_get_remember_password(session->account))
 					purple_account_set_password(session->account, NULL);
 				break;
 		}
-		purple_connection_error(session->gc, full_errmsg);
+		purple_connection_error_reason (session->gc, reason, full_errmsg);
 	} else {
 		purple_notify_error(session->account, _("MySpaceIM Error"), full_errmsg, NULL);
 	}
@@ -1875,7 +1885,6 @@
 		purple_blist_add_buddy(buddy, NULL, NULL, NULL);
 
 		user = msim_get_user_from_buddy(buddy);
-		/* TODO: free user. memory leak? */
 
 		/* All buddies on list should have 'uid' integer associated with them. */
 		purple_blist_node_set_int(&buddy->node, "UserID", msim_msg_get_integer(msg, "f"));
@@ -2317,7 +2326,9 @@
 	/* libpurple/eventloop.h only defines these two */
 	if (cond != PURPLE_INPUT_READ && cond != PURPLE_INPUT_WRITE) {
 		purple_debug_info("msim_input_cb", "unknown condition=%d\n", cond);
-		purple_connection_error(gc, _("Invalid input condition"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Invalid input condition"));
 		return;
 	}
 
@@ -2335,7 +2346,9 @@
 		purple_debug_error("msim", 
 				"msim_input_cb: %d-byte read buffer full! rxoff=%d\n",
 				MSIM_READ_BUF_SIZE, session->rxoff);
-		purple_connection_error(gc, _("Read buffer full"));
+		purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Read buffer full"));
 		return;
 	}
 
@@ -2354,11 +2367,15 @@
 		purple_debug_error("msim", "msim_input_cb: read error, ret=%d, "
 			"error=%s, source=%d, fd=%d (%X))\n", 
 			n, g_strerror(errno), source, session->fd, session->fd);
-		purple_connection_error(gc, _("Read error"));
+		purple_connection_error_reason (gc, 
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Read error"));
 		return;
 	} else if (n == 0) {
 		purple_debug_info("msim", "msim_input_cb: server disconnected\n");
-		purple_connection_error(gc, _("Server has disconnected"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Server has disconnected"));
 		return;
 	}
 
@@ -2366,7 +2383,9 @@
 		purple_debug_info("msim_input_cb", "received %d bytes, pushing rxoff to %d, over buffer size of %d\n",
 				n, n + session->rxoff, MSIM_READ_BUF_SIZE);
 		/* TODO: g_realloc like msn, yahoo, irc, jabber? */
-		purple_connection_error(gc, _("Read buffer full"));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Read buffer full"));
 	}
 
 	/* Null terminate */
@@ -2381,7 +2400,9 @@
 		purple_debug_info("msim", "msim_input_cb: strlen=%d, but read %d bytes"
 				"--null byte encountered?\n", 
 				strlen(session->rxbuf + session->rxoff), n);
-		//purple_connection_error(gc, "Invalid message - null byte on input");
+		/*purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				"Invalid message - null byte on input"); */
 		return;
 	}
 #endif
@@ -2404,7 +2425,9 @@
 		msg = msim_parse(g_strdup(session->rxbuf));
 		if (!msg) {
 			purple_debug_info("msim", "msim_input_cb: couldn't parse rxbuf\n");
-			purple_connection_error(gc, _("Unparseable message"));
+			purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Unparseable message"));
 		} else {
 			/* Process message and then free it (processing function should
 			 * clone message if it wants to keep it afterwards.) */
@@ -2471,9 +2494,9 @@
 	session = (MsimSession *)gc->proto_data;
 
 	if (source < 0) {
-		purple_connection_error(gc, _("Couldn't connect to host"));
-		purple_connection_error(gc, g_strdup_printf(
-					_("Couldn't connect to host: %s (%d)"), 
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			g_strdup_printf(_("Couldn't connect to host: %s (%d)"), 
 					error_message ? error_message : "no message given", 
 					source));
 		return;
@@ -2674,7 +2697,6 @@
 	/* TODO: other fields, store in 'user' */
 
 	msim_msg_free(contact_info);
-	g_free(username);
 }
 
 /** Add first ContactID in contact_info to buddy's list. Used to add
--- a/libpurple/protocols/novell/novell.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/novell/novell.c	Mon Nov 12 16:53:54 2007 +0000
@@ -120,21 +120,27 @@
 		_check_for_disconnect(user, rc);
 
 	} else {
-
+		PurpleConnectionError reason;
 		char *err = g_strdup_printf(_("Login failed (%s)."),
 					    nm_error_to_string (ret_code));
 
-		/* Don't attempt to auto-reconnect if our password
-		 * was invalid.
-		 */
-		if (ret_code == NMERR_AUTHENTICATION_FAILED ||
-			ret_code == NMERR_CREDENTIALS_MISSING ||
-			ret_code == NMERR_PASSWORD_INVALID) {
-			if (!purple_account_get_remember_password(gc->account))
-				purple_account_set_password(gc->account, NULL);
-			gc->wants_to_die = TRUE;
+		switch (ret_code) {
+			case NMERR_AUTHENTICATION_FAILED:
+			case NMERR_CREDENTIALS_MISSING:
+			case NMERR_PASSWORD_INVALID:
+				/* Don't attempt to auto-reconnect if our
+				 * password was invalid.
+				 */
+				if (!purple_account_get_remember_password(gc->account))
+					purple_account_set_password(gc->account, NULL);
+				reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
+				break;
+			default:
+				/* FIXME: There are other reasons login could fail */
+				reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 		}
-		purple_connection_error(gc, err);
+
+		purple_connection_error_reason (gc, reason, err);
 		g_free(err);
 	}
 }
@@ -1120,8 +1126,9 @@
 
 	if (_is_disconnect_error(err)) {
 
-		purple_connection_error(gc, _("Error communicating with server."
-									" Closing connection."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Error communicating with server. Closing connection."));
 		return TRUE;
 
 	}
@@ -1667,7 +1674,7 @@
 	user = gc->proto_data;
 	user->conn->ssl_conn->data = NULL;
 
-	purple_connection_error(gc, _("Unable to make SSL connection to server."));
+	purple_connection_ssl_error (gc, error);
 }
 
 static void
@@ -1690,9 +1697,9 @@
 
 		if (_is_disconnect_error(rc)) {
 
-			purple_connection_error(gc,
-								  _("Error communicating with server."
-									" Closing connection."));
+			purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Error communicating with server. Closing connection."));
 		} else {
 			purple_debug(PURPLE_DEBUG_INFO, "novell",
 					   "Error processing event or response (%d).\n", rc);
@@ -1731,7 +1738,9 @@
 		conn->connected = TRUE;
 		purple_ssl_input_add(gsc, novell_ssl_recv_cb, gc);
 	} else {
-		purple_connection_error(gc, _("Unable to connect to server."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Unable to connect to server."));
 	}
 
 	purple_connection_update_progress(gc, _("Waiting for response..."),
@@ -2011,11 +2020,12 @@
 	gc = purple_account_get_connection(account);
 	if (gc)
 	{
-		gc->wants_to_die = TRUE; /* we don't want to reconnect in this case */
 		if (!purple_account_get_remember_password(account))
 			purple_account_set_password(account, NULL);
-		purple_connection_error(gc, _("You have been logged out because you"
-									" logged in at another workstation."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_NAME_IN_USE,
+			_("You have been logged out because you"
+			  " logged in at another workstation."));
 	}
 }
 
@@ -2169,9 +2179,10 @@
 		 */
 
 		/* ...but for now just error out with a nice message. */
-		purple_connection_error(gc, _("Unable to connect to server."
-									" Please enter the address of the server"
-									" you wish to connect to."));
+		purple_connection_error_reason (gc,
+			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
+			_("Unable to connect to server. Please enter the "
+			  "address of the server you wish to connect to."));
 		return;
 	}
 
@@ -2197,8 +2208,9 @@
 													  user->conn->addr, user->conn->port,
 													  novell_ssl_connected_cb, novell_ssl_connect_error, gc);
 		if (user->conn->ssl_conn->data == NULL) {
-			purple_connection_error(gc, _("Error."
-										" SSL support is not installed."));
+			purple_connection_error_reason (gc,
+				PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
+				_("Error. SSL support is not installed."));
 		}
 	}
 }
--- a/libpurple/protocols/oscar/flap_connection.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/oscar/flap_connection.c	Mon Nov 12 16:53:54 2007 +0000
@@ -380,11 +380,13 @@
 	{
 		/* No more FLAP connections!  Sign off this PurpleConnection! */
 		gchar *tmp;
+		PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+
 		if (conn->disconnect_code == 0x0001) {
+			reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE;
 			tmp = g_strdup(_("You have signed on from another location."));
 			if (!purple_account_get_remember_password(account))
 				purple_account_set_password(account, NULL);
-			od->gc->wants_to_die = TRUE;
 		} else if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED)
 			tmp = g_strdup(_("Server closed the connection."));
 		else if (conn->disconnect_reason == OSCAR_DISCONNECT_LOST_CONNECTION)
@@ -404,7 +406,7 @@
 
 		if (tmp != NULL)
 		{
-			purple_connection_error(od->gc, tmp);
+			purple_connection_error_reason(od->gc, reason, tmp);
 			g_free(tmp);
 		}
 	}
--- a/libpurple/protocols/oscar/oscar.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Mon Nov 12 16:53:54 2007 +0000
@@ -994,7 +994,7 @@
 			gchar *msg;
 			msg = g_strdup_printf(_("Could not connect to authentication server:\n%s"),
 					error_message);
-			purple_connection_error(gc, msg);
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
 			g_free(msg);
 		}
 		else if (conn->type == SNAC_FAMILY_LOCATE)
@@ -1002,7 +1002,7 @@
 			gchar *msg;
 			msg = g_strdup_printf(_("Could not connect to BOS server:\n%s"),
 					error_message);
-			purple_connection_error(gc, msg);
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg);
 			g_free(msg);
 		}
 		else
@@ -1260,8 +1260,7 @@
 	if (!aim_snvalid(purple_account_get_username(account))) {
 		gchar *buf;
 		buf = g_strdup_printf(_("Unable to login: Could not sign on as %s because the screen name is invalid.  Screen names must be a valid email address, or start with a letter and contain only letters, numbers and spaces, or contain only numbers."), purple_account_get_username(account));
-		gc->wants_to_die = TRUE;
-		purple_connection_error(gc, buf);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, buf);
 		g_free(buf);
 		return;
 	}
@@ -1283,7 +1282,8 @@
 			connection_established_cb, newconn);
 	if (newconn->connect_data == NULL)
 	{
-		purple_connection_error(gc, _("Couldn't connect to host"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Couldn't connect to host"));
 		return;
 	}
 
@@ -1344,43 +1344,37 @@
 		switch (info->errorcode) {
 		case 0x01:
 			/* Unregistered screen name */
-			gc->wants_to_die = TRUE;
-			purple_connection_error(gc, _("Invalid screen name."));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_INVALID_USERNAME, _("Invalid screen name."));
 			break;
 		case 0x05:
 			/* Incorrect password */
-			gc->wants_to_die = TRUE;
 			if (!purple_account_get_remember_password(account))
 				purple_account_set_password(account, NULL);
-			purple_connection_error(gc, _("Incorrect password."));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password."));
 			break;
 		case 0x11:
 			/* Suspended account */
-			gc->wants_to_die = TRUE;
-			purple_connection_error(gc, _("Your account is currently suspended."));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Your account is currently suspended."));
 			break;
 		case 0x14:
 			/* service temporarily unavailable */
-			purple_connection_error(gc, _("The AOL Instant Messenger service is temporarily unavailable."));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("The AOL Instant Messenger service is temporarily unavailable."));
 			break;
 		case 0x18:
 			/* screen name connecting too frequently */
-			gc->wants_to_die = TRUE;
-			purple_connection_error(gc, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer."));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer."));
 			break;
 		case 0x1c:
 			/* client too old */
-			gc->wants_to_die = TRUE;
 			g_snprintf(buf, sizeof(buf), _("The client version you are using is too old. Please upgrade at %s"), PURPLE_WEBSITE);
-			purple_connection_error(gc, buf);
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, buf);
 			break;
 		case 0x1d:
 			/* IP address connecting too frequently */
-			gc->wants_to_die = TRUE;
-			purple_connection_error(gc, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer."));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer."));
 			break;
 		default:
-			purple_connection_error(gc, _("Authentication failed"));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Authentication failed"));
 			break;
 		}
 		purple_debug_info("oscar", "Login Error Code 0x%04hx\n", info->errorcode);
@@ -1410,7 +1404,7 @@
 	g_free(host);
 	if (newconn->connect_data == NULL)
 	{
-		purple_connection_error(gc, _("Could Not Connect"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Could Not Connect"));
 		return 0;
 	}
 
@@ -1435,8 +1429,9 @@
 	PurpleConnection *gc = user_data;
 
 	/* Disconnect */
-	gc->wants_to_die = TRUE;
-	purple_connection_error(gc, _("The SecurID key entered is invalid."));
+	purple_connection_error_reason(gc,
+		PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
+		_("The SecurID key entered is invalid."));
 }
 
 static int
--- a/libpurple/protocols/qq/keep_alive.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/qq/keep_alive.c	Mon Nov 12 16:53:54 2007 +0000
@@ -84,7 +84,8 @@
 		/* segments[0] and segment[1] are all 0x30 ("0") */
 		qd->all_online = strtol(segments[2], NULL, 10);
 		if(0 == qd->all_online)
-			purple_connection_error(gc, _("Keep alive error"));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+					_("Keep alive error"));
 		g_free(qd->my_ip);
 		qd->my_ip = g_strdup(segments[3]);
 		qd->my_port = strtol(segments[4], NULL, 10);
--- a/libpurple/protocols/qq/login_logout.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/qq/login_logout.c	Mon Nov 12 16:53:54 2007 +0000
@@ -405,7 +405,7 @@
 				">>> %d bytes -> [default] decrypt and dump\n%s",
 				buf_len, hex_dump);
 		try_dump_as_gbk(buf, buf_len);
-		purple_connection_error(gc, _("Error requesting login token"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Error requesting login token"));
 	}
 	g_free(hex_dump);
 }
@@ -479,13 +479,14 @@
 
 	switch (ret) {
 	case QQ_LOGIN_REPLY_PWD_ERROR:
-		gc->wants_to_die = TRUE;
 		if (!purple_account_get_remember_password(gc->account))
 			purple_account_set_password(gc->account, NULL);
-		purple_connection_error(gc, _("Incorrect password."));
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password."));
 		break;
 	case QQ_LOGIN_REPLY_MISC_ERROR:
-		purple_connection_error(gc, _("Unable to login, check debug log"));
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login, check debug log"));
 		break;
 	case QQ_LOGIN_REPLY_OK:
 		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login replys OK, everything is fine\n");
--- a/libpurple/protocols/qq/qq.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/qq/qq.c	Mon Nov 12 16:53:54 2007 +0000
@@ -136,7 +136,8 @@
 	purple_connection_update_progress(gc, _("Connecting"), 0, QQ_CONNECT_STEPS);
 
 	if (qq_connect(account, qq_server, strtol(qq_port, NULL, 10), use_tcp, FALSE) < 0)
-		purple_connection_error(gc, _("Unable to connect."));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Unable to connect."));
 }
 
 /* directly goes for qq_disconnect */
--- a/libpurple/protocols/qq/qq_proxy.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/qq/qq_proxy.c	Mon Nov 12 16:53:54 2007 +0000
@@ -139,7 +139,7 @@
 	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
 
 	if (source < 0) {	/* socket returns -1 */
-		purple_connection_error(gc, error_message);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message);
 		return;
 	}
 
@@ -497,7 +497,7 @@
 		ret = send(qd->fd, data, len, 0);
 	}
 	if (ret == -1)
-		purple_connection_error(qd->gc, g_strerror(errno));
+		purple_connection_error_reason(qd->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, g_strerror(errno));
 
 	return ret;
 }
--- a/libpurple/protocols/qq/recv_core.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/qq/recv_core.c	Mon Nov 12 16:53:54 2007 +0000
@@ -306,7 +306,8 @@
 	gc = (PurpleConnection *) data;
 
 	if(cond != PURPLE_INPUT_READ) {
-		purple_connection_error(gc, _("Socket error"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Socket error"));
 		return;
 	}
 
@@ -316,7 +317,8 @@
 	/* here we have UDP proxy suppport */
 	len = qq_proxy_read(qd, buf, MAX_PACKET_SIZE);
 	if (len <= 0) {
-		purple_connection_error(gc, _("Unable to read from socket"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Unable to read from socket"));
 		return;
 	} else {
 		_qq_packet_process(buf, len, gc);
--- a/libpurple/protocols/qq/sendqueue.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/qq/sendqueue.c	Mon Nov 12 16:53:54 2007 +0000
@@ -120,7 +120,8 @@
 			case QQ_CMD_KEEP_ALIVE:
 				if (qd->logged_in) {
 					purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Connection lost!\n");
-					purple_connection_error(gc, _("Connection lost"));
+					purple_connection_error_reason(gc,
+						PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Connection lost"));
 					qd->logged_in = FALSE;
 				}
 				p->resend_times = -1;
@@ -128,7 +129,8 @@
 			case QQ_CMD_LOGIN:
 			case QQ_CMD_REQUEST_LOGIN_TOKEN:
 				if (!qd->logged_in)	/* cancel login progress */
-					purple_connection_error(gc, _("Login failed, no reply"));
+					purple_connection_error_reason(gc,
+						PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Login failed, no reply"));
 				p->resend_times = -1;
 				break;
 			default:{
--- a/libpurple/protocols/sametime/sametime.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/sametime/sametime.c	Mon Nov 12 16:53:54 2007 +0000
@@ -414,7 +414,9 @@
 
   } else if(len > 0) {
     DEBUG_ERROR("write returned %i, %i bytes left unwritten\n", ret, len);
-    purple_connection_error(pd->gc, _("Connection closed (writing)"));
+    purple_connection_error_reason(pd->gc,
+                                   PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+                                   _("Connection closed (writing)"));
 
 #if 0
     close(pd->socket);
@@ -1552,7 +1554,38 @@
 
     if(GPOINTER_TO_UINT(info) & ERR_FAILURE) {
       char *err = mwError(GPOINTER_TO_UINT(info));
-      purple_connection_error(gc, err);
+      PurpleConnectionError reason;
+      switch (GPOINTER_TO_UINT(info)) {
+      case VERSION_MISMATCH:
+        reason = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+        break;
+
+      case USER_RESTRICTED:
+      case INCORRECT_LOGIN:
+      case USER_UNREGISTERED:
+      case GUEST_IN_USE:
+        reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
+        break;
+
+      case ENCRYPT_MISMATCH:
+      case ERR_ENCRYPT_NO_SUPPORT:
+      case ERR_NO_COMMON_ENCRYPT:
+        reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR;
+        break;
+
+      case VERIFICATION_DOWN:
+        reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE;
+        break;
+
+      case MULTI_SERVER_LOGIN:
+      case MULTI_SERVER_LOGIN2:
+        reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE;
+        break;
+
+      default:
+        reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+      }
+      purple_connection_error_reason(gc, reason, err);
       g_free(err);
     }
     break;
@@ -1698,16 +1731,22 @@
   }
 
   if(! ret) {
+    const char *msg = _("Connection reset");
     DEBUG_INFO("connection reset\n");
-    purple_connection_error(pd->gc, _("Connection reset"));
+    purple_connection_error_reason(pd->gc,
+                                   PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+                                   msg);
 
   } else if(ret < 0) {
-    char *msg = g_strerror(err);
-
-    DEBUG_INFO("error in read callback: %s\n", msg);
-
-    msg = g_strdup_printf(_("Error reading from socket: %s"), msg);
-    purple_connection_error(pd->gc, msg);
+    const gchar *err_str = g_strerror(err);
+    char *msg = NULL;
+
+    DEBUG_INFO("error in read callback: %s\n", err_str);
+
+    msg = g_strdup_printf(_("Error reading from socket: %s"), err_str);
+    purple_connection_error_reason(pd->gc,
+                                   PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+                                   msg);
     g_free(msg);
   }
 }
@@ -1729,7 +1768,10 @@
 
     } else {
       /* this is a regular connect, error out */
-      purple_connection_error(pd->gc, _("Unable to connect to host"));
+      const char *msg = _("Unable to connect to host");
+      purple_connection_error_reason(pd->gc,
+                                     PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+                                     msg);
     }
 
     return;
@@ -3611,7 +3653,10 @@
 
 
 static void prompt_host_cancel_cb(PurpleConnection *gc) {
-  purple_connection_error(gc, _("No Sametime Community Server specified"));
+  const char *msg = _("No Sametime Community Server specified");
+  purple_connection_error_reason(gc,
+                                 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
+                                 msg);
 }
 
 
@@ -3723,7 +3768,8 @@
   purple_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS);
 
   if (purple_proxy_connect(gc, account, host, port, connect_cb, pd) == NULL) {
-    purple_connection_error(gc, _("Unable to connect to host"));
+    purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+                                   _("Unable to connect to host"));
   }
 }
 
--- a/libpurple/protocols/silc/silc.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/silc/silc.c	Mon Nov 12 16:53:54 2007 +0000
@@ -314,34 +314,40 @@
 
 		/* Close the connection */
 		if (!sg->detaching)
-		  purple_connection_error(gc, _("Disconnected by server"));
+		  purple_connection_error_reason(gc,
+		                                 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+		                                 _("Disconnected by server"));
 		else
 		  /* TODO: Does this work correctly? Maybe we need to set wants_to_die? */
 		  purple_account_disconnect(purple_connection_get_account(gc));
 		break;
 
 	case SILC_CLIENT_CONN_ERROR:
-		purple_connection_error(gc, _("Error during connecting to SILC Server"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+		                             _("Error during connecting to SILC Server"));
 		g_unlink(silcpurple_session_file(purple_account_get_username(sg->account)));
 		break;
 
 	case SILC_CLIENT_CONN_ERROR_KE:
-		purple_connection_error(gc, _("Key Exchange failed"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
+		                             _("Key Exchange failed"));
 		break;
 
 	case SILC_CLIENT_CONN_ERROR_AUTH:
-		purple_connection_error(gc, _("Authentication failed"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
+		                             _("Authentication failed"));
 		break;
 
 	case SILC_CLIENT_CONN_ERROR_RESUME:
-		purple_connection_error(gc,
-				      _("Resuming detached session failed. "
-					"Press Reconnect to create new connection."));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+		                             _("Resuming detached session failed. "
+		                               "Press Reconnect to create new connection."));
 		g_unlink(silcpurple_session_file(purple_account_get_username(sg->account)));
 		break;
 
 	case SILC_CLIENT_CONN_ERROR_TIMEOUT:
-		purple_connection_error(gc, _("Connection Timeout"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+		                             _("Connection Timeout"));
 		break;
 	}
 
@@ -362,7 +368,9 @@
 	sg = gc->proto_data;
 
 	if (status != SILC_SOCKET_OK) {
-		purple_connection_error(gc, _("Connection failed"));
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Connection failed"));
 		silc_pkcs_public_key_free(sg->public_key);
 		silc_pkcs_private_key_free(sg->private_key);
 		silc_free(sg);
@@ -408,7 +416,8 @@
 	sg = gc->proto_data;
 
 	if (source < 0) {
-		purple_connection_error(gc, _("Connection failed"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+		                             _("Connection failed"));
 		silc_pkcs_public_key_free(sg->public_key);
 		silc_pkcs_private_key_free(sg->private_key);
 		silc_free(sg);
@@ -416,7 +425,7 @@
 		return;
 	}
 
-	silc_hash_alloc("sha1", &sg->sha1hash);
+	silc_hash_alloc((unsigned char *)"sha1", &sg->sha1hash);
 
 	/* Wrap socket to TCP stream */
 	silc_socket_tcp_stream_create(source, TRUE, FALSE,
@@ -431,6 +440,7 @@
 	PurpleAccount *account = purple_connection_get_account(gc);
 	char pkd[256], prd[256];
 
+
 	/* Progress */
 	purple_connection_update_progress(gc, _("Connecting to SILC Server"), 1, 5);
 
@@ -441,8 +451,8 @@
 				(char *)purple_account_get_string(account, "private-key", prd),
 				(gc->password == NULL) ? "" : gc->password,
 				&sg->public_key, &sg->private_key)) {
-		g_snprintf(pkd, sizeof(pkd), _("Could not load SILC key pair"));
-		purple_connection_error(gc, pkd);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+		                             _("Could not load SILC key pair"));
 		gc->proto_data = NULL;
 		silc_free(sg);
 		return;
@@ -455,7 +465,8 @@
 				 purple_account_get_int(account, "port", 706),
 				 silcpurple_login_connected, gc) == NULL)
 	{
-		purple_connection_error(gc, _("Unable to create connection"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+		                             _("Unable to create connection"));
 		gc->proto_data = NULL;
 		silc_free(sg);
 		return;
@@ -484,7 +495,8 @@
 	/* Allocate SILC client */
 	client = silc_client_alloc(&ops, &params, gc, NULL);
 	if (!client) {
-		purple_connection_error(gc, _("Out of memory"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+		                             _("Out of memory"));
 		return;
 	}
 
@@ -534,8 +546,8 @@
 	/* Init SILC client */
 	if (!silc_client_init(client, username, hostname, realname,
 			      silcpurple_running, sg)) {
-		gc->wants_to_die = TRUE;
-		purple_connection_error(gc, _("Cannot initialize SILC protocol"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+		                             _("Cannot initialize SILC protocol"));
 		gc->proto_data = NULL;
 		silc_free(sg);
 		return;
@@ -543,8 +555,8 @@
 
 	/* Check the ~/.silc dir and create it, and new key pair if necessary. */
 	if (!silcpurple_check_silc_dir(gc)) {
-		gc->wants_to_die = TRUE;
-		purple_connection_error(gc, _("Error loading SILC key pair"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+		                             _("Error loading SILC key pair"));
 		gc->proto_data = NULL;
 		silc_free(sg);
 		return;
--- a/libpurple/protocols/silc/util.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/silc/util.c	Mon Nov 12 16:53:54 2007 +0000
@@ -212,7 +212,8 @@
 						  (gc->password == NULL)
 						  ? "" : gc->password,
 						  NULL, NULL, FALSE)) {
-				purple_connection_error(gc, _("Cannot create SILC key pair\n"));
+				purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+				                             _("Cannot create SILC key pair\n"));
 				return FALSE;
 			}
 
@@ -254,7 +255,8 @@
 						  (gc->password == NULL)
 						  ? "" : gc->password,
 						  NULL, NULL, FALSE)) {
-				purple_connection_error(gc, _("Cannot create SILC key pair\n"));
+				purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+				                             _("Cannot create SILC key pair\n"));
 				return FALSE;
 			}
 
--- a/libpurple/protocols/silc10/buddy.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/silc10/buddy.c	Mon Nov 12 16:53:54 2007 +0000
@@ -311,7 +311,7 @@
 
 	purple_request_action_with_hint(client->application, _("Key Agreement Request"), tmp,
 			    hostname ? tmp2 : NULL, 1, gc->account, client_entry->nickname,
-				NULL, a, PURPLE_REQUEST_UI_HINT_BLIST, 2, _("Yes"), G_CALLBACK(silcpurple_buddy_keyagr_request_cb),
+				NULL, PURPLE_REQUEST_UI_HINT_BLIST, a, 2, _("Yes"), G_CALLBACK(silcpurple_buddy_keyagr_request_cb),
 			    _("No"), G_CALLBACK(silcpurple_buddy_keyagr_request_cb));
 }
 
--- a/libpurple/protocols/silc10/pk.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/silc10/pk.c	Mon Nov 12 16:53:54 2007 +0000
@@ -115,7 +115,7 @@
 
 	purple_request_action_with_hint(gc, _("Verify Public Key"), tmp, tmp2,
 						PURPLE_DEFAULT_ACTION_NONE,
-						purple_connection_get_account(gc), entity, NULL, verify, PURPLE_REQUEST_UI_HINT_BLIST, 3,
+						purple_connection_get_account(gc), entity, NULL, PURPLE_REQUEST_UI_HINT_BLIST, verify, 3,
 			    _("Yes"), G_CALLBACK(silcpurple_verify_cb),
 			    _("No"), G_CALLBACK(silcpurple_verify_cb),
 			    _("_View..."), G_CALLBACK(silcpurple_verify_details));
--- a/libpurple/protocols/silc10/util.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/silc10/util.c	Mon Nov 12 16:53:54 2007 +0000
@@ -667,7 +667,7 @@
 			text = purple_unescape_html(tmp);
 			g_free(tmp);
 			/* Add text */
-			silc_mime_add_data(p, text, strlen(text));
+			silc_mime_add_data(p, (unsigned char *)text, strlen(text));
 			g_free(text);
 
 			if (!parts)
@@ -720,7 +720,7 @@
 				    "text/plain; charset=utf-8");
 
 		/* Add text */
-		silc_mime_add_data(p, tmp, strlen(tmp));
+		silc_mime_add_data(p, (unsigned char *)tmp, strlen(tmp));
 		g_free(tmp);
 
 		if (!parts)
--- a/libpurple/protocols/simple/simple.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/simple/simple.c	Mon Nov 12 16:53:54 2007 +0000
@@ -414,7 +414,9 @@
 		written = 0;
 	else if(written <= 0) {
 		/*TODO: do we really want to disconnect on a failure to write?*/
-		purple_connection_error(gc, _("Could not write"));
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Could not write"));
 		return;
 	}
 
@@ -436,7 +438,9 @@
 	}
 
 	if(source < 0) {
-		purple_connection_error(gc, _("Could not connect"));
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Could not connect"));
 		return;
 	}
 
@@ -462,7 +466,7 @@
 	if(!sip->connecting) {
 		purple_debug_info("simple", "connecting to %s port %d\n", sip->realhostname ? sip->realhostname : "{NULL}", sip->realport);
 		if (purple_proxy_connect(gc, sip->account, sip->realhostname, sip->realport, send_later_cb, gc) == NULL) {
-			purple_connection_error(gc, _("Couldn't create socket"));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Couldn't create socket"));
 		}
 		sip->connecting = TRUE;
 	}
@@ -1101,11 +1105,11 @@
 			if(sip->registerstatus != SIMPLE_REGISTER_RETRY) {
 				purple_debug_info("simple", "REGISTER retries %d\n", sip->registrar.retries);
 				if(sip->registrar.retries > SIMPLE_REGISTER_RETRY_MAX) {
-					purple_debug_info("simple", "Setting wants_to_die to true.\n");
-					sip->gc->wants_to_die = TRUE;
 					if (!purple_account_get_remember_password(sip->gc->account))
 						purple_account_set_password(sip->gc->account, NULL);
-					purple_connection_error(sip->gc, _("Incorrect password."));
+					purple_connection_error_reason(sip->gc,
+						PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
+						_("Incorrect password."));
 					return TRUE;
 				}
 				tmp = sipmsg_find_header(msg, "WWW-Authenticate");
@@ -1118,8 +1122,9 @@
 			if (sip->registerstatus != SIMPLE_REGISTER_RETRY) {
 				purple_debug_info("simple", "Unrecognized return code for REGISTER.\n");
 				if (sip->registrar.retries > SIMPLE_REGISTER_RETRY_MAX) {
-					sip->gc->wants_to_die = TRUE;
-					purple_connection_error(sip->gc, _("Unknown server response."));
+					purple_connection_error_reason(sip->gc,
+						PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+						_("Unknown server response."));
 					return TRUE;
 				}
 				sip->registerstatus = SIMPLE_REGISTER_RETRY;
@@ -1681,7 +1686,9 @@
 	}
 
 	if(source < 0) {
-		purple_connection_error(gc, _("Could not connect"));
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Could not connect"));
 		return;
 	}
 
@@ -1715,7 +1722,9 @@
 	sip->listen_data = NULL;
 
 	if(listenfd == -1) {
-		purple_connection_error(sip->gc, _("Could not create listen socket"));
+		purple_connection_error_reason(sip->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Could not create listen socket"));
 		return;
 	}
 
@@ -1738,7 +1747,9 @@
 	sip->query_data = NULL;
 
 	if (!hosts || !hosts->data) {
-		purple_connection_error(sip->gc, _("Couldn't resolve host"));
+		purple_connection_error_reason(sip->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Couldn't resolve host"));
 		return;
 	}
 
@@ -1757,7 +1768,9 @@
 	sip->listen_data = purple_network_listen_range(5060, 5160, SOCK_DGRAM,
 				simple_udp_host_resolved_listen_cb, sip);
 	if (sip->listen_data == NULL) {
-		purple_connection_error(sip->gc, _("Could not create listen socket"));
+		purple_connection_error_reason(sip->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Could not create listen socket"));
 		return;
 	}
 }
@@ -1770,7 +1783,9 @@
 
 	sip->listenfd = listenfd;
 	if(sip->listenfd == -1) {
-		purple_connection_error(sip->gc, _("Could not create listen socket"));
+		purple_connection_error_reason(sip->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Could not create listen socket"));
 		return;
 	}
 
@@ -1783,7 +1798,9 @@
 	/* open tcp connection to the server */
 	if (purple_proxy_connect(sip->gc, sip->account, sip->realhostname,
 			sip->realport, login_cb, sip->gc) == NULL) {
-		purple_connection_error(sip->gc, _("Couldn't create socket"));
+		purple_connection_error_reason(sip->gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Couldn't create socket"));
 	}
 }
 
@@ -1821,7 +1838,9 @@
 		sip->listen_data = purple_network_listen_range(5060, 5160, SOCK_STREAM,
 					simple_tcp_connect_listen_cb, sip);
 		if (sip->listen_data == NULL) {
-			purple_connection_error(sip->gc, _("Could not create listen socket"));
+			purple_connection_error_reason(sip->gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Could not create listen socket"));
 			return;
 		}
 	} else { /* UDP */
@@ -1829,7 +1848,9 @@
 
 		sip->query_data = purple_dnsquery_a(hostname, port, simple_udp_host_resolved, sip);
 		if (sip->query_data == NULL) {
-			purple_connection_error(sip->gc, _("Could not resolve hostname"));
+			purple_connection_error_reason(sip->gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Could not resolve hostname"));
 		}
 	}
 }
@@ -1845,8 +1866,9 @@
 	gc = purple_account_get_connection(account);
 
 	if (strpbrk(username, " \t\v\r\n") != NULL) {
-		gc->wants_to_die = TRUE;
-		purple_connection_error(gc, _("SIP screen names may not contain whitespaces or @ symbols"));
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
+			_("SIP screen names may not contain whitespaces or @ symbols"));
 		return;
 	}
 
--- a/libpurple/protocols/yahoo/yahoo.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/yahoo/yahoo.c	Mon Nov 12 16:53:54 2007 +0000
@@ -201,10 +201,10 @@
 	char *message = NULL;
 
 	if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) {
-		gc->wants_to_die = TRUE;
 		if (!purple_account_get_remember_password(account))
 			purple_account_set_password(account, NULL);
-		purple_connection_error(gc, _("You have signed on from another location."));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NAME_IN_USE,
+			_("You have signed on from another location."));
 		return;
 	}
 
@@ -2090,6 +2090,7 @@
 	char *url = NULL;
 	char *fullmsg;
 	PurpleAccount *account = gc->account;
+	PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
 
 	while (l) {
 		struct yahoo_pair *pair = l->data;
@@ -2105,6 +2106,7 @@
 	switch (err) {
 	case 3:
 		msg = g_strdup(_("Invalid screen name."));
+		reason = PURPLE_CONNECTION_ERROR_INVALID_USERNAME;
 		break;
 	case 13:
 #ifdef TRY_WEBMESSENGER_LOGIN
@@ -2139,8 +2141,7 @@
 	else
 		fullmsg = g_strdup(msg);
 
-	gc->wants_to_die = TRUE;
-	purple_connection_error(gc, fullmsg);
+	purple_connection_error_reason(gc, reason, fullmsg);
 	g_free(msg);
 	g_free(fullmsg);
 }
@@ -2464,11 +2465,12 @@
 
 		tmp = g_strdup_printf(_("Lost connection with server:\n%s"),
 				g_strerror(errno));
-		purple_connection_error(gc, tmp);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
 		return;
 	} else if (len == 0) {
-		purple_connection_error(gc, _("Server closed the connection."));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Server closed the connection."));
 		return;
 	}
 
@@ -2559,7 +2561,7 @@
 		gchar *tmp;
 		tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"),
 				error_message);
-		purple_connection_error(gc, tmp);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
 		return;
 	}
@@ -2591,7 +2593,7 @@
 		gchar *tmp;
 		tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"),
 				error_message);
-		purple_connection_error(gc, tmp);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
 		return;
 	}
@@ -2631,11 +2633,12 @@
 
 		tmp = g_strdup_printf(_("Lost connection with server:\n%s"),
 				g_strerror(errno));
-		purple_connection_error(gc, tmp);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
 		return;
 	} else if (len == 0) {
-		purple_connection_error(gc, _("Server closed the connection."));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Server closed the connection."));
 		return;
 	}
 
@@ -2650,7 +2653,8 @@
 
 	if ((strncmp(buf, "HTTP/1.0 302", strlen("HTTP/1.0 302")) &&
 			  strncmp(buf, "HTTP/1.1 302", strlen("HTTP/1.1 302")))) {
-		purple_connection_error(gc, _("Received unexpected HTTP response from server."));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Received unexpected HTTP response from server."));
 		return;
 	}
 
@@ -2672,9 +2676,10 @@
 	yd->rxlen = 0;
 	/* Now we have our cookies to login with.  I'll go get the milk. */
 	if (purple_proxy_connect(gc, account, "wcs2.msg.dcn.yahoo.com",
-			       purple_account_get_int(account, "port", YAHOO_PAGER_PORT),
-			       yahoo_got_web_connected, gc) == NULL) {
-		purple_connection_error(gc, _("Connection problem"));
+	                         purple_account_get_int(account, "port", YAHOO_PAGER_PORT),
+	                         yahoo_got_web_connected, gc) == NULL) {
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+		                               _("Connection problem"));
 		return;
 	}
 }
@@ -2702,7 +2707,7 @@
 		gc->inpa = 0;
 		tmp = g_strdup_printf(_("Lost connection with %s:\n%s"),
 				"login.yahoo.com:80", g_strerror(errno));
-		purple_connection_error(gc, tmp);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
 		return;
 	}
@@ -2727,7 +2732,7 @@
 		gchar *tmp;
 		tmp = g_strdup_printf(_("Could not establish a connection with %s:\n%s"),
 				"login.yahoo.com:80", error_message);
-		purple_connection_error(gc, tmp);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
 		return;
 	}
@@ -2811,7 +2816,8 @@
 
 	if (error_message != NULL)
 	{
-		purple_connection_error(gc, error_message);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+		                               error_message);
 		return;
 	}
 
@@ -2860,7 +2866,8 @@
 	g_hash_table_destroy(hash);
 	yd->auth = g_string_free(url, FALSE);
 	if (purple_proxy_connect(gc, account, "login.yahoo.com", 80, yahoo_got_cookies, gc) == NULL) {
-		purple_connection_error(gc, _("Connection problem"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+		                               _("Connection problem"));
 		return;
 	}
 
@@ -2963,7 +2970,8 @@
 		                       purple_account_get_int(account, "port", YAHOO_PAGER_PORT),
 		                       yahoo_got_connected, gc) == NULL)
 		{
-			purple_connection_error(gc, _("Connection problem"));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			                               _("Connection problem"));
 			return;
 		}
 	} else {
@@ -2973,7 +2981,8 @@
 		                       purple_account_get_int(account, "port", YAHOO_PAGER_PORT),
 		                       yahoo_got_connected, gc) == NULL)
 		{
-			purple_connection_error(gc, _("Connection problem"));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			                               _("Connection problem"));
 			return;
 		}
 	}
--- a/libpurple/protocols/yahoo/yahoo_packet.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/yahoo/yahoo_packet.c	Mon Nov 12 16:53:54 2007 +0000
@@ -303,7 +303,8 @@
 		return;
 	else if (ret < 0) {
 		/* TODO: what to do here - do we really have to disconnect? */
-		purple_connection_error(yd->gc, _("Write Error"));
+		purple_connection_error_reason(yd->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+		                               _("Write Error"));
 		return;
 	}
 
--- a/libpurple/protocols/yahoo/ycht.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/protocols/yahoo/ycht.c	Mon Nov 12 16:53:54 2007 +0000
@@ -285,7 +285,8 @@
 	else if (ret <= 0) {
 		/* TODO: error handling */
 /*
-		purple_connection_error(purple_account_get_connection(irc->account),
+		purple_connection_error_reason(purple_account_get_connection(irc->account),
+			      PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
 			      _("Server has disconnected"));
 */
 		return;
--- a/libpurple/purple-uninstalled.pc.in	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/purple-uninstalled.pc.in	Mon Nov 12 16:53:54 2007 +0000
@@ -3,6 +3,7 @@
 libdir=@libdir@
 includedir=@includedir@
 datadir=@datadir@
+datarootdir=@datarootdir@
 sysconfdir=@sysconfdir@
 
 Name: libpurple
--- a/libpurple/purple.pc.in	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/purple.pc.in	Mon Nov 12 16:53:54 2007 +0000
@@ -3,8 +3,9 @@
 libdir=@libdir@
 includedir=@includedir@
 datadir=@datadir@
+datarootdir=@datarootdir@
 sysconfdir=@sysconfdir@
- 
+
 Name: libpurple
 Description: libpurple is a GLib-based instant messenger library.
 Version: @VERSION@
--- a/libpurple/signals.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/signals.c	Mon Nov 12 16:53:54 2007 +0000
@@ -649,6 +649,16 @@
 	((void (*)(void *, gint, gint, void *))cb)(arg1, arg2, arg3, data);
 }
 
+void purple_marshal_VOID__POINTER_INT_POINTER(PurpleCallback cb, va_list args,
+                                              void *data, void **return_val)
+{
+	void *arg1 = va_arg(args, void *);
+	gint arg2 = va_arg(args, gint);
+	void *arg3 = va_arg(args, void *);
+
+	((void (*)(void *, gint, void *, void *))cb)(arg1, arg2, arg3, data);
+}
+
 void
 purple_marshal_VOID__POINTER_POINTER(PurpleCallback cb, va_list args,
 								   void *data, void **return_val)
--- a/libpurple/signals.h	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/signals.h	Mon Nov 12 16:53:54 2007 +0000
@@ -284,6 +284,8 @@
 		PurpleCallback cb, va_list args, void *data, void **return_val);
 void purple_marshal_VOID__POINTER_INT_INT(
 		PurpleCallback cb, va_list args, void *data, void **return_val);
+void purple_marshal_VOID__POINTER_INT_POINTER(
+		PurpleCallback cb, va_list args, void *data, void **return_val);
 void purple_marshal_VOID__POINTER_POINTER(
 		PurpleCallback cb, va_list args, void *data, void **return_val);
 void purple_marshal_VOID__POINTER_POINTER_UINT(
--- a/libpurple/sslconn.h	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/sslconn.h	Mon Nov 12 16:53:54 2007 +0000
@@ -26,11 +26,6 @@
 #ifndef _PURPLE_SSLCONN_H_
 #define _PURPLE_SSLCONN_H_
 
-#include "certificate.h"
-#include "proxy.h"
-
-#define PURPLE_SSL_DEFAULT_PORT 443
-
 /** Possible SSL errors. */
 typedef enum
 {
@@ -39,6 +34,11 @@
 	PURPLE_SSL_CERTIFICATE_INVALID = 3
 } PurpleSslErrorType;
 
+#include "certificate.h"
+#include "proxy.h"
+
+#define PURPLE_SSL_DEFAULT_PORT 443
+
 typedef struct _PurpleSslConnection PurpleSslConnection;
 
 typedef void (*PurpleSslInputFunction)(gpointer, PurpleSslConnection *,
@@ -126,9 +126,9 @@
 	/** Obtains the certificate chain provided by the peer
 	 *
 	 * @param gsc   Connection context
-	 * @return      A newly allocated list of #PurpleCertificate containing the
-	 *              certificates the peer provided.
-	 * @see purple_ssl_get_peer_certificates
+	 * @return      A newly allocated list containing the certificates
+	 *              the peer provided.
+	 * @see PurpleCertificate
 	 * @todo        Decide whether the ordering of certificates in this
 	 *              list can be guaranteed.
 	 */
--- a/libpurple/win32/global.mak	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/win32/global.mak	Mon Nov 12 16:53:54 2007 +0000
@@ -20,7 +20,7 @@
 NSPR_TOP ?= $(WIN32_DEV_TOP)/nspr-4.6.4
 NSS_TOP ?= $(WIN32_DEV_TOP)/nss-3.11.4
 PERL_LIB_TOP ?= $(WIN32_DEV_TOP)/perl58
-SILC_TOOLKIT ?= $(WIN32_DEV_TOP)/silc-toolkit-1.1.2
+SILC_TOOLKIT ?= $(WIN32_DEV_TOP)/silc-toolkit-1.1.5
 TCL_LIB_TOP ?= $(WIN32_DEV_TOP)/tcl-8.4.5
 GSTREAMER_TOP ?= $(WIN32_DEV_TOP)/gstreamer-0.10.13
 
--- a/libpurple/xmlnode.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/libpurple/xmlnode.c	Mon Nov 12 16:53:54 2007 +0000
@@ -590,7 +590,7 @@
 		}
 
 		for(i=0; i < nb_attributes * 5; i+=5) {
-			const char *prefix = attributes[i + 1];
+			const char *prefix = (const char *)attributes[i + 1];
 			char *txt;
 			int attrib_len = attributes[i+4] - attributes[i+3];
 			char *attrib = g_malloc(attrib_len + 1);
--- a/pidgin/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/Makefile.am	Mon Nov 12 16:53:54 2007 +0000
@@ -118,7 +118,8 @@
 	gtkstatusbox.c \
 	gtkthemes.c \
 	gtkutils.c \
-	gtkwhiteboard.c
+	gtkwhiteboard.c \
+	minidialog.c
 
 pidgin_headers = \
 	eggtrayicon.h \
@@ -170,6 +171,7 @@
 	gtkthemes.h \
 	gtkutils.h \
 	gtkwhiteboard.h \
+	minidialog.h \
 	pidgin.h
 
 pidginincludedir=$(includedir)/pidgin
--- a/pidgin/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/Makefile.mingw	Mon Nov 12 16:53:54 2007 +0000
@@ -93,6 +93,7 @@
 			gtkthemes.c \
 			gtkutils.c \
 			gtkwhiteboard.c \
+			minidialog.c \
 			pidginstock.c \
 			win32/MinimizeToTray.c \
 			win32/gtkdocklet-win32.c \
--- a/pidgin/gtkblist.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/gtkblist.c	Mon Nov 12 16:53:54 2007 +0000
@@ -58,6 +58,7 @@
 #include "gtkstatusbox.h"
 #include "gtkscrollbook.h"
 #include "gtkutils.h"
+#include "pidgin/minidialog.h"
 
 #include <gdk/gdkkeysyms.h>
 #include <gtk/gtk.h>
@@ -107,6 +108,21 @@
 	GList *entries;
 } PidginJoinChatData;
 
+typedef struct
+{
+	/** PidginScrollBook used to hold error minidialogs.  Gets packed
+	 * inside PidginBuddyList.error_buttons
+	 */
+	GtkWidget *error_scrollbook;
+
+	/** Pointer to the mini-dialog about having signed on elsewhere, if one
+	 * is showing; @c NULL otherwise.
+	 */
+	PidginMiniDialog *signed_on_elsewhere;
+} PidginBuddyListPrivate;
+
+#define PIDGIN_BUDDY_LIST_GET_PRIVATE(list) \
+	((PidginBuddyListPrivate *)((list)->priv))
 
 static GtkWidget *accountmenu = NULL;
 
@@ -4125,10 +4141,13 @@
 static void pidgin_blist_new_list(PurpleBuddyList *blist)
 {
 	PidginBuddyList *gtkblist;
+	PidginBuddyListPrivate *priv;
 
 	gtkblist = g_new0(PidginBuddyList, 1);
 	gtkblist->connection_errors = g_hash_table_new_full(g_direct_hash,
 												g_direct_equal, NULL, g_free);
+	gtkblist->priv = priv = g_new0(PidginBuddyListPrivate, 1);
+
 	blist->ui_data = gtkblist;
 }
 
@@ -4284,6 +4303,13 @@
 					widget->allocation.width - 2 - HEADLINE_CLOSE_SIZE, 2,
 					HEADLINE_CLOSE_SIZE, HEADLINE_CLOSE_SIZE,
 					GDK_RGB_DITHER_NONE, 0, 0);
+#if 0
+		/* The presence of one opening paren in each branch of
+		 * GTK_CHECK_VERSION confuses vim's bracket matching for the
+		 * rest of the file.
+		 */
+		)
+#endif
 		gtk_paint_focus(widget->style, widget->window, GTK_STATE_PRELIGHT,
 				NULL, widget, NULL,
 				widget->allocation.width - HEADLINE_CLOSE_SIZE - 3, 1,
@@ -4354,124 +4380,363 @@
 /* Connection error handling stuff */
 /***********************************/
 
+#define OBJECT_DATA_KEY_ACCOUNT "account"
+
+static gboolean
+find_account_widget(GObject *widget,
+                    PurpleAccount *account)
+{
+	if (g_object_get_data(widget, OBJECT_DATA_KEY_ACCOUNT) == account)
+		return 0; /* found */
+	else
+		return 1;
+}
+
 static void
-ce_modify_account_cb(PurpleAccount *account)
+pack_prpl_icon_start(GtkWidget *box,
+                     PurpleAccount *account)
+{
+	GdkPixbuf *pixbuf;
+	GtkWidget *image;
+
+	pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
+	if (pixbuf != NULL) {
+		image = gtk_image_new_from_pixbuf(pixbuf);
+		g_object_unref(pixbuf);
+
+		gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0);
+	}
+}
+
+static void
+add_error_dialog(PidginBuddyList *gtkblist,
+                 GtkWidget *dialog)
+{
+	PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+	gtk_container_add(GTK_CONTAINER(priv->error_scrollbook), dialog);
+
+	if (!GTK_WIDGET_HAS_FOCUS(gtkblist->window))
+		pidgin_set_urgent(GTK_WINDOW(gtkblist->window), TRUE);
+}
+
+static GtkWidget *
+find_child_widget_by_account(GtkContainer *container,
+                             PurpleAccount *account)
+{
+	GList *l = NULL;
+	GList *children = gtk_container_get_children(container);
+	GtkWidget *ret = NULL;
+	l = g_list_find_custom(children, account, (GCompareFunc) find_account_widget);
+	if (l)
+		ret = GTK_WIDGET(l->data);
+	g_list_free(children);
+	return ret;
+}
+
+static void
+remove_child_widget_by_account(GtkContainer *container,
+                               PurpleAccount *account)
+{
+	GtkWidget *widget = find_child_widget_by_account(container, account);
+	if(widget)
+		gtk_widget_destroy(widget);
+}
+
+/* Generic error buttons */
+
+static void
+generic_error_modify_cb(PurpleAccount *account)
 {
 	pidgin_account_dialog_show(PIDGIN_MODIFY_ACCOUNT_DIALOG, account);
 }
 
 static void
-ce_enable_account_cb(PurpleAccount *account)
+generic_error_enable_cb(PurpleAccount *account)
+{
+	purple_account_set_enabled(account, purple_core_get_ui(), TRUE);
+}
+
+static void
+generic_error_ignore_cb(PurpleAccount *account)
+{
+	purple_account_clear_current_error(account);
+}
+
+static void
+generic_error_destroy_cb(GtkObject *dialog,
+                         PurpleAccount *account)
+{
+	g_hash_table_remove(gtkblist->connection_errors, account);
+}
+
+static void
+add_generic_error_dialog(PurpleAccount *account,
+                         const PurpleConnectionErrorInfo *err)
+{
+	GtkWidget *mini_dialog;
+	const char *username = purple_account_get_username(account);
+	gboolean enabled =
+		purple_account_get_enabled(account, purple_core_get_ui());
+	char *primary;
+	
+	if (enabled)
+		primary = g_strdup_printf(_("%s disconnected"), username);
+	else
+		primary = g_strdup_printf(_("%s disabled"), username);
+
+	mini_dialog = pidgin_make_mini_dialog(NULL, PIDGIN_STOCK_DIALOG_ERROR,
+		primary, err->description, account,
+		(enabled ? _("Reconnect") : _("Re-enable")),
+		(enabled ? PURPLE_CALLBACK(purple_account_connect)
+		         : PURPLE_CALLBACK(generic_error_enable_cb)),
+		_("Modify Account"), PURPLE_CALLBACK(generic_error_modify_cb),
+		_("Ignore"), PURPLE_CALLBACK(generic_error_ignore_cb),
+		NULL);
+
+	g_free(primary);
+
+	g_object_set_data(G_OBJECT(mini_dialog), OBJECT_DATA_KEY_ACCOUNT,
+		account);
+
+	g_signal_connect_after(mini_dialog, "destroy",
+		(GCallback)generic_error_destroy_cb,
+		account);
+
+	add_error_dialog(gtkblist, mini_dialog);
+}
+
+static void
+remove_generic_error_dialog(PurpleAccount *account)
+{
+	PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+	remove_child_widget_by_account(GTK_CONTAINER(priv->error_scrollbook),
+		account);
+}
+
+
+/* Notifications about accounts which were disconnected with
+ * PURPLE_CONNECTION_ERROR_NAME_IN_USE
+ */
+
+typedef void (*AccountFunction)(PurpleAccount *);
+
+static void
+elsewhere_foreach_account(PidginMiniDialog *mini_dialog,
+                          AccountFunction f)
+{
+	PurpleAccount *account;
+	GList *labels = gtk_container_get_children(
+		GTK_CONTAINER(mini_dialog->contents));
+	GList *l;
+
+	for (l = labels; l; l = l->next) {
+		account = g_object_get_data(G_OBJECT(l->data), OBJECT_DATA_KEY_ACCOUNT);
+		if (account)
+			f(account);
+		else
+			purple_debug_warning("gtkblist", "mini_dialog's child "
+				"didn't have an account stored in it!");
+	}
+	g_list_free(labels);
+}
+
+static void
+enable_account(PurpleAccount *account)
 {
 	purple_account_set_enabled(account, purple_core_get_ui(), TRUE);
 }
 
 static void
-connection_error_button_clicked_cb(GtkButton *widget, gpointer user_data)
-{
-	PurpleAccount *account;
-	char *primary;
-	const char *text;
-	gboolean enabled;
-	GList *list;
-
-	account = user_data;
-	primary = g_strdup_printf(_("%s disconnected"),
-							  purple_account_get_username(account));
-	text = g_hash_table_lookup(gtkblist->connection_errors, account);
-
-	enabled = purple_account_get_enabled(account, purple_core_get_ui());
-	purple_request_action_with_hint(account, _("Connection Error"), primary, text, 2,
-						account, NULL, NULL,
-						PURPLE_REQUEST_UI_HINT_ACCOUNT, account, 3,
-						_("OK"), NULL,
-						_("Modify Account"), PURPLE_CALLBACK(ce_modify_account_cb),
-						enabled ? _("Connect") : _("Re-enable Account"),
-						enabled ? PURPLE_CALLBACK(purple_account_connect) :
-									PURPLE_CALLBACK(ce_enable_account_cb));
-	g_free(primary);
-	gtk_widget_destroy(GTK_WIDGET(widget));
-	g_hash_table_remove(gtkblist->connection_errors, account);
-	if ((list = gtk_container_get_children(GTK_CONTAINER(gtkblist->error_buttons))) == NULL) {
-		gtk_widget_hide(gtkblist->error_buttons);
-	} else {
-		g_list_free(list);
-	}
-}
-
-/* Add some buttons that show connection errors */
+reconnect_elsewhere_accounts(PidginMiniDialog *mini_dialog,
+                             GtkButton *button,
+                             gpointer unused)
+{
+	elsewhere_foreach_account(mini_dialog, enable_account);
+}
+
+static void
+ignore_elsewhere_accounts(PidginMiniDialog *mini_dialog,
+                          GtkButton *button,
+                          gpointer unused)
+{
+	elsewhere_foreach_account(mini_dialog, purple_account_clear_current_error);
+}
+
 static void
-create_connection_error_buttons(gpointer key, gpointer value,
-                                gpointer user_data)
-{
-	PurpleAccount *account;
-	gchar *escaped, *text;
-	GtkWidget *button, *label, *image, *hbox;
-	GdkPixbuf *pixbuf;
-
-	account = key;
-	escaped = g_markup_escape_text((const gchar *)value, -1);
-	text = g_strdup_printf(_("<span color=\"red\">%s disconnected: %s</span>"),
-	                       purple_account_get_username(account),
-	                       escaped);
-	g_free(escaped);
+ensure_signed_on_elsewhere_minidialog(PidginBuddyList *gtkblist)
+{
+	PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+	PidginMiniDialog *mini_dialog;
+
+	if(priv->signed_on_elsewhere)
+		return;
+	
+	mini_dialog = priv->signed_on_elsewhere =
+		pidgin_mini_dialog_new(NULL, NULL, PIDGIN_STOCK_DISCONNECT);
+
+	pidgin_mini_dialog_add_button(mini_dialog, _("Re-enable"),
+		reconnect_elsewhere_accounts, NULL);
+
+	pidgin_mini_dialog_add_button(mini_dialog, _("Ignore"),
+		ignore_elsewhere_accounts, NULL);
+
+	add_error_dialog(gtkblist, GTK_WIDGET(mini_dialog));
+
+	/* Set priv->signed_on_elsewhere to NULL when the dialog is destroyed */
+	g_signal_connect(G_OBJECT(mini_dialog), "destroy",
+		(GCallback) gtk_widget_destroyed, &(priv->signed_on_elsewhere));
+}
+
+static void
+update_signed_on_elsewhere_minidialog_title(void)
+{
+	PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+	PidginMiniDialog *mini_dialog = priv->signed_on_elsewhere;
+	guint accounts;
+	char *title;
+
+	if (mini_dialog == NULL)
+		return;
+
+	accounts = pidgin_mini_dialog_get_num_children(mini_dialog);
+
+	title = g_strdup_printf(
+		ngettext("%d account was disabled because you signed on from another location.",
+			 "%d accounts were disabled because you signed on from another location.",
+			 accounts),
+		accounts);
+	pidgin_mini_dialog_set_title(mini_dialog, title);
+	g_free(title);
+}
+
+static GtkWidget *
+create_account_label(PurpleAccount *account)
+{
+	GtkWidget *hbox, *label;
+	const char *username = purple_account_get_username(account);
+	char *markup;
 
 	hbox = gtk_hbox_new(FALSE, 6);
-
-	/* Create the icon */
-	if (purple_account_get_status_type_with_primitive(account,
-							PURPLE_STATUS_OFFLINE) != NULL) {
-		pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
-		if (pixbuf != NULL) {
-			image = gtk_image_new_from_pixbuf(pixbuf);
-			g_object_unref(pixbuf);
-
-			gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
-		}
-	}
-
-	/* Create the text */
-	label = gtk_label_new("");
-	gtk_label_set_markup(GTK_LABEL(label), text);
-	g_free(text);
+	g_object_set_data(G_OBJECT(hbox), OBJECT_DATA_KEY_ACCOUNT, account);
+
+	pack_prpl_icon_start(hbox, account);
+
+	label = gtk_label_new(NULL);
+	markup = g_strdup_printf("<span size=\"smaller\">%s</span>", username);
+	gtk_label_set_markup(GTK_LABEL(label), markup);
+	g_free(markup);
+	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
 #if GTK_CHECK_VERSION(2,6,0)
-	g_object_set(label, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+	g_object_set(G_OBJECT(label), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+#endif
+#if GTK_CHECK_VERSION(2,12,0)
+	{ /* avoid unused variable warnings on pre-2.12 Gtk */
+		char *description =
+			purple_account_get_current_error(account)->description;
+		if (description != NULL && *description != '\0')
+			gtk_widget_set_tooltip_text(label, description);
+	}
 #endif
 	gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
 
-	/* Create the actual button and put the icon and text on it */
-	button = gtk_button_new();
-	gtk_container_add(GTK_CONTAINER(button), hbox);
-	g_signal_connect(G_OBJECT(button), "clicked",
-	                 G_CALLBACK(connection_error_button_clicked_cb),
-	                 account);
-	gtk_widget_show_all(button);
-	gtk_box_pack_end(GTK_BOX(gtkblist->error_buttons), button,
-	                 FALSE, FALSE, 0);
-	gtk_widget_show_all(gtkblist->error_buttons);
+	return hbox;
+}
+
+static void
+add_to_signed_on_elsewhere(PurpleAccount *account)
+{
+	PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+	PidginMiniDialog *mini_dialog;
+	GtkWidget *account_label;
+
+	ensure_signed_on_elsewhere_minidialog(gtkblist);
+	mini_dialog = priv->signed_on_elsewhere;
+
+	if(find_child_widget_by_account(GTK_CONTAINER(mini_dialog->contents), account))
+		return;
+
+	account_label = create_account_label(account);
+	gtk_box_pack_start(mini_dialog->contents, account_label, FALSE, FALSE, 0);
+	gtk_widget_show_all(account_label);
+
+	update_signed_on_elsewhere_minidialog_title();
+
+	if (!GTK_WIDGET_HAS_FOCUS(gtkblist->window))
+		pidgin_set_urgent(GTK_WINDOW(gtkblist->window), TRUE);
+}
+
+static void
+remove_from_signed_on_elsewhere(PurpleAccount *account)
+{
+	PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+	PidginMiniDialog *mini_dialog = priv->signed_on_elsewhere;
+	if(mini_dialog == NULL)
+		return;
+
+	remove_child_widget_by_account(GTK_CONTAINER(mini_dialog->contents), account);
+
+	update_signed_on_elsewhere_minidialog_title();
+}
+
+
+/* Call appropriate error notification code based on error types */
+static void
+update_account_error_state(PurpleAccount *account,
+                           const PurpleConnectionErrorInfo *old,
+                           const PurpleConnectionErrorInfo *new,
+                           PidginBuddyList *gtkblist)
+{
+	/* For backwards compatibility: */
+	if (new)
+		pidgin_blist_update_account_error_state(account, new->description);
+	else
+		pidgin_blist_update_account_error_state(account, NULL);
+
+	if (old) {
+		if(old->type == PURPLE_CONNECTION_ERROR_NAME_IN_USE)
+			remove_from_signed_on_elsewhere(account);
+		else
+			remove_generic_error_dialog(account);
+	}
+
+	if (new) {
+		if(new->type == PURPLE_CONNECTION_ERROR_NAME_IN_USE)
+			add_to_signed_on_elsewhere(account);
+		else
+			add_generic_error_dialog(account, new);
+	}
+}
+
+/* In case accounts are loaded before the blist (which they currently are),
+ * let's call update_account_error_state ourselves on every account's current
+ * state when the blist starts.
+ */
+static void
+show_initial_account_errors(PidginBuddyList *gtkblist)
+{
+	GList *l = purple_accounts_get_all();
+	PurpleAccount *account;
+	const PurpleConnectionErrorInfo *err;
+
+	for (; l; l = l->next)
+	{
+		account = l->data;
+		err = purple_account_get_current_error(account);
+
+		update_account_error_state(account, NULL, err, gtkblist);
+	}
 }
 
 void
 pidgin_blist_update_account_error_state(PurpleAccount *account, const char *text)
 {
-	GList *l;
-
+	/* connection_errors isn't actually used anywhere; it's just kept in
+	 * sync with reality in case a plugin uses it.
+	 */
 	if (text == NULL)
 		g_hash_table_remove(gtkblist->connection_errors, account);
 	else
 		g_hash_table_insert(gtkblist->connection_errors, account, g_strdup(text));
-
-	/* Remove the old error buttons */
-	for (l = gtk_container_get_children(GTK_CONTAINER(gtkblist->error_buttons));
-			l != NULL;
-			l = g_list_delete_link(l, l))
-	{
-		gtk_widget_destroy(GTK_WIDGET(l->data));
-	}
-
-	/* Add new error buttons */
-	g_hash_table_foreach(gtkblist->connection_errors,
-			create_connection_error_buttons, NULL);
 }
 
 static gboolean
@@ -4598,6 +4863,7 @@
 
 static void pidgin_blist_show(PurpleBuddyList *list)
 {
+	PidginBuddyListPrivate *priv;
 	void *handle;
 	GtkCellRenderer *rend;
 	GtkTreeViewColumn *column;
@@ -4624,6 +4890,7 @@
 	}
 
 	gtkblist = PIDGIN_BLIST(list);
+	priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
 
 	gtkblist->empty_avatar = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 32, 32);
 	gdk_pixbuf_fill(gtkblist->empty_avatar, 0x00000000);
@@ -4926,11 +5193,19 @@
 	gtkblist->scrollbook = pidgin_scroll_book_new();
 	gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->scrollbook, FALSE, FALSE, 0);
 
-	/* Create an empty vbox used for showing connection errors */
+	/* Create an vbox which holds the scrollbook which is actually used to
+	 * display connection errors.  The vbox needs to still exist for
+	 * backwards compatibility.
+	 */
 	gtkblist->error_buttons = gtk_vbox_new(FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->error_buttons, FALSE, FALSE, 0);
-        gtk_container_set_border_width(GTK_CONTAINER(gtkblist->error_buttons), 3);
-	
+	gtk_container_set_border_width(GTK_CONTAINER(gtkblist->error_buttons), 0);
+
+	priv->error_scrollbook = pidgin_scroll_book_new();
+	gtk_box_pack_start(GTK_BOX(gtkblist->error_buttons),
+		priv->error_scrollbook, FALSE, FALSE, 0);
+
+
 	/* Add the statusbox */
 	gtkblist->statusbox = pidgin_status_box_new();
 	gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->statusbox, FALSE, TRUE, 0);
@@ -5001,43 +5276,56 @@
 	purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/sound/method",
 			pidgin_blist_sound_method_pref_cb, NULL);
 
+
 	/* Setup some purple signal handlers. */
-	purple_signal_connect(purple_accounts_get_handle(), "account-enabled",
-			gtkblist, PURPLE_CALLBACK(account_modified), gtkblist);
-	purple_signal_connect(purple_accounts_get_handle(), "account-disabled",
-			gtkblist, PURPLE_CALLBACK(account_modified), gtkblist);
-	purple_signal_connect(purple_accounts_get_handle(), "account-removed",
-			gtkblist, PURPLE_CALLBACK(account_modified), gtkblist);
-	purple_signal_connect(purple_accounts_get_handle(), "account-status-changed",
-			gtkblist, PURPLE_CALLBACK(account_status_changed), gtkblist);
-
-	purple_signal_connect(pidgin_account_get_handle(), "account-modified",
-			gtkblist, PURPLE_CALLBACK(account_modified), gtkblist);
-
-	purple_signal_connect(purple_connections_get_handle(), "signed-on",
-						gtkblist, PURPLE_CALLBACK(sign_on_off_cb), list);
-	purple_signal_connect(purple_connections_get_handle(), "signed-off",
-						gtkblist, PURPLE_CALLBACK(sign_on_off_cb), list);
-
-	purple_signal_connect(purple_plugins_get_handle(), "plugin-load",
-			gtkblist, PURPLE_CALLBACK(plugin_changed_cb), NULL);
-	purple_signal_connect(purple_plugins_get_handle(), "plugin-unload",
-			gtkblist, PURPLE_CALLBACK(plugin_changed_cb), NULL);
-
-	purple_signal_connect(purple_conversations_get_handle(), "conversation-updated",
-						gtkblist, PURPLE_CALLBACK(conversation_updated_cb),
-						gtkblist);
-	purple_signal_connect(purple_conversations_get_handle(), "deleting-conversation",
-						gtkblist, PURPLE_CALLBACK(conversation_deleting_cb),
-						gtkblist);
-	purple_signal_connect(purple_conversations_get_handle(), "conversation-created",
-			gtkblist, PURPLE_CALLBACK(conversation_created_cb),
-			gtkblist);
+
+	handle = purple_accounts_get_handle();
+	purple_signal_connect(handle, "account-enabled", gtkblist,
+	                      PURPLE_CALLBACK(account_modified), gtkblist);
+	purple_signal_connect(handle, "account-disabled", gtkblist,
+	                      PURPLE_CALLBACK(account_modified), gtkblist);
+	purple_signal_connect(handle, "account-removed", gtkblist,
+	                      PURPLE_CALLBACK(account_modified), gtkblist);
+	purple_signal_connect(handle, "account-status-changed", gtkblist,
+	                      PURPLE_CALLBACK(account_status_changed),
+	                      gtkblist);
+	purple_signal_connect(handle, "account-error-changed", gtkblist,
+	                      PURPLE_CALLBACK(update_account_error_state),
+	                      gtkblist);
+
+	handle = pidgin_account_get_handle();
+	purple_signal_connect(handle, "account-modified", gtkblist,
+	                      PURPLE_CALLBACK(account_modified), gtkblist);
+
+	handle = purple_connections_get_handle();
+	purple_signal_connect(handle, "signed-on", gtkblist,
+	                      PURPLE_CALLBACK(sign_on_off_cb), list);
+	purple_signal_connect(handle, "signed-off", gtkblist,
+	                      PURPLE_CALLBACK(sign_on_off_cb), list);
+
+	handle = purple_plugins_get_handle();
+	purple_signal_connect(handle, "plugin-load", gtkblist,
+	                      PURPLE_CALLBACK(plugin_changed_cb), NULL);
+	purple_signal_connect(handle, "plugin-unload", gtkblist,
+	                      PURPLE_CALLBACK(plugin_changed_cb), NULL);
+
+	handle = purple_conversations_get_handle();
+	purple_signal_connect(handle, "conversation-updated", gtkblist,
+	                      PURPLE_CALLBACK(conversation_updated_cb),
+	                      gtkblist);
+	purple_signal_connect(handle, "deleting-conversation", gtkblist,
+	                      PURPLE_CALLBACK(conversation_deleting_cb),
+	                      gtkblist);
+	purple_signal_connect(handle, "conversation-created", gtkblist,
+	                      PURPLE_CALLBACK(conversation_created_cb),
+	                      gtkblist);
 
 	gtk_widget_hide(gtkblist->headline_hbox);
-	gtk_widget_hide(gtkblist->error_buttons);
+
+	show_initial_account_errors(gtkblist);
 
 	/* emit our created signal */
+	handle = pidgin_blist_get_handle();
 	purple_signal_emit(handle, "gtkblist-created", list);
 }
 
@@ -5660,6 +5948,8 @@
 
 static void pidgin_blist_destroy(PurpleBuddyList *list)
 {
+	PidginBuddyListPrivate *priv;
+
 	if (!gtkblist)
 		return;
 
@@ -5693,6 +5983,9 @@
 	gtkblist->hand_cursor = NULL;
 	gtkblist->arrow_cursor = NULL;
 
+	priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+	g_free(priv);
+
 	g_free(gtkblist);
 	accountmenu = NULL;
 	gtkblist = NULL;
--- a/pidgin/gtkblist.h	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/gtkblist.h	Mon Nov 12 16:53:54 2007 +0000
@@ -84,7 +84,14 @@
 	GtkWidget *menutray;            /**< The menu tray widget. */
 	GtkWidget *menutrayicon;        /**< The menu tray icon. */
 
-	GHashTable *connection_errors;  /**< Caches connection error messages and accounts. */
+	/** Caches connection error messages; keys are #PurpleAccount and
+	 *  values are non-@c NULL <tt>const char *</tt>s containing localised
+	 *  error messages.  (If an account does not have an error, it will not
+	 *  appear in the table.)
+	 *  @deprecated in favour of purple_account_get_current_error(), which also
+	 *              gives you the #PurpleConnectionError value.
+	 */
+	GHashTable *connection_errors;
 
 	guint refresh_timer;            /**< The timer for refreshing every 30 seconds */
 
@@ -119,6 +126,8 @@
 	GtkWidget *error_buttons;        /**< Box containing the connection error buttons */
 	GtkWidget *statusbox;            /**< The status selector dropdown */
 	GdkPixbuf *empty_avatar;         /**< A 32x32 transparent pixbuf */
+
+	gpointer priv;                   /**< Pointer to opaque private data */
 };
 
 #define PIDGIN_BLIST(list) ((PidginBuddyList *)(list)->ui_data)
@@ -339,13 +348,16 @@
 void pidgin_append_blist_node_extended_menu(GtkWidget *menu, PurpleBlistNode *node);
 
 /**
- * Used by the connection API to tell the blist if an account
- * has a connection error or no longer has a connection error.
+ * Was used by the connection API to tell the blist if an account has a
+ * connection error or no longer has a connection error, but the blist now does
+ * this itself with the @ref account-error-changed signal.
  *
  * @param account The account that either has a connection error
  *        or no longer has a connection error.
  * @param message The connection error message, or NULL if this
  *        account is no longer in an error state.
+ * @deprecated There was no good reason for code other than gtkconn to call
+ *             this.
  */
 void pidgin_blist_update_account_error_state(PurpleAccount *account, const char *message);
 
--- a/pidgin/gtkconn.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/gtkconn.c	Mon Nov 12 16:53:54 2007 +0000
@@ -42,6 +42,7 @@
 #define INITIAL_RECON_DELAY_MAX 60000
 
 #define MAX_RECON_DELAY 600000
+#define MAX_RACCOON_DELAY "shorter in urban areas"
 
 typedef struct {
 	int delay;
@@ -81,8 +82,6 @@
 					   (purple_connections_get_connecting() != NULL));
 
 	g_hash_table_remove(auto_reconns, account);
-
-	pidgin_blist_update_account_error_state(account, NULL);
 }
 
 static void
@@ -137,7 +136,9 @@
 }
 
 static void
-pidgin_connection_report_disconnect(PurpleConnection *gc, const char *text)
+pidgin_connection_report_disconnect_reason (PurpleConnection *gc,
+                                            PurpleConnectionError reason,
+                                            const char *text)
 {
 	PurpleAccount *account = NULL;
 	PidginAutoRecon *info;
@@ -146,8 +147,7 @@
 	account = purple_connection_get_account(gc);
 	info = g_hash_table_lookup(auto_reconns, account);
 
-	pidgin_blist_update_account_error_state(account, text);
-	if (!gc->wants_to_die) {
+	if (!purple_connection_error_is_fatal (reason)) {
 		if (info == NULL) {
 			info = g_new0(PidginAutoRecon, 1);
 			g_hash_table_insert(auto_reconns, account, info);
@@ -159,33 +159,9 @@
 		}
 		info->timeout = g_timeout_add(info->delay, do_signon, account);
 	} else {
-		char *p, *s, *n=NULL ;
 		if (info != NULL)
 			g_hash_table_remove(auto_reconns, account);
 
-		if (purple_account_get_alias(account))
-		{
-			n = g_strdup_printf("%s (%s) (%s)",
-					purple_account_get_username(account),
-					purple_account_get_alias(account),
-					purple_account_get_protocol_name(account));
-		}
-		else
-		{
-			n = g_strdup_printf("%s (%s)",
-					purple_account_get_username(account),
-					purple_account_get_protocol_name(account));
-		}
-
-		p = g_strdup_printf(_("%s disconnected"), n);
-		s = g_strdup_printf(_("%s\n\n"
-				"%s will not attempt to reconnect the account until you "
-				"correct the error and re-enable the account."), text, PIDGIN_NAME);
-		purple_notify_error(NULL, NULL, p, s);
-		g_free(p);
-		g_free(s);
-		g_free(n);
-
 		/*
 		 * TODO: Do we really want to disable the account when it's
 		 * disconnected by wants_to_die?  This happens when you sign
@@ -259,10 +235,10 @@
 	pidgin_connection_connected,
 	pidgin_connection_disconnected,
 	pidgin_connection_notice,
-	pidgin_connection_report_disconnect,
+	NULL, /* report_disconnect */
 	pidgin_connection_network_connected,
 	pidgin_connection_network_disconnected,
-	NULL,
+	pidgin_connection_report_disconnect_reason,
 	NULL,
 	NULL,
 	NULL
@@ -278,8 +254,6 @@
 account_removed_cb(PurpleAccount *account, gpointer user_data)
 {
 	g_hash_table_remove(auto_reconns, account);
-
-	pidgin_blist_update_account_error_state(account, NULL);
 }
 
 
--- a/pidgin/gtkconv.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/gtkconv.c	Mon Nov 12 16:53:54 2007 +0000
@@ -3074,6 +3074,9 @@
 					chat, (GDestroyNotify)purple_blist_remove_chat);
 		}
 	} else {
+		if (!purple_account_is_connected(conv->account))
+			return FALSE;
+
 		buddy = purple_find_buddy(conv->account, conv->name);
 
 		/* gotta remain bug-compatible :( libpurple < 2.0.2 didn't handle
--- a/pidgin/gtkmain.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/gtkmain.c	Mon Nov 12 16:53:54 2007 +0000
@@ -195,6 +195,18 @@
 
 char *segfault_message;
 
+/*
+ * This signal handler shouldn't be touching this much stuff.
+ * It should just set a flag and return, and something else in
+ * Pidgin should monitor the flag to see if something needs to
+ * be done.  Because the signal handler interrupts the program,
+ * it could be called in the middle of adding a new connection
+ * to the list of connections, and then if we try to disconnect
+ * all connections it could lead to a crash because the linked
+ * list of connections could be in a weird state.  But, well,
+ * this signal handler probably isn't called very often, so it's
+ * not a big deal.
+ */
 static void
 sighandler(int sig)
 {
--- a/pidgin/gtkroomlist.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/gtkroomlist.c	Mon Nov 12 16:53:54 2007 +0000
@@ -61,6 +61,15 @@
 	GtkWidget *tree;
 	GHashTable *cats; /**< Meow. */
 	gint num_rooms, total_rooms;
+	GtkWidget *tipwindow;
+	GdkRectangle tip_rect;
+	guint timeout;
+	PangoLayout *tip_layout;
+	PangoLayout *tip_name_layout;
+	int tip_height;
+	int tip_width;
+	int tip_name_height;
+	int tip_name_width;
 } PidginRoomlist;
 
 enum {
@@ -331,6 +340,310 @@
 	}
 }
 
+static void pidgin_roomlist_tooltip_destroy(PidginRoomlist *grl)
+{
+	if ((grl == NULL) || (grl->tipwindow == NULL))
+		return;
+
+	gtk_widget_destroy(grl->tipwindow);
+	grl->tipwindow = NULL;
+}
+
+static void pidgin_roomlist_tooltip_destroy_cb(GObject *object, PidginRoomlist *grl)
+{
+	if ((grl == NULL) || (grl->tipwindow == NULL))
+		return;
+
+	if (grl->timeout)
+		g_source_remove(grl->timeout);
+	grl->timeout = 0;
+
+	pidgin_roomlist_tooltip_destroy(grl);
+}
+
+#define SMALL_SPACE 6
+#define TOOLTIP_BORDER 12
+
+static void pidgin_roomlist_paint_tip(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
+{
+	PidginRoomlist *grl = (PidginRoomlist *)user_data;
+	GtkStyle *style;
+	int current_height, max_width;
+	int max_text_width;
+	GtkTextDirection dir = gtk_widget_get_direction(GTK_WIDGET(grl->tree));
+
+	style = grl->tipwindow->style;
+	gtk_paint_flat_box(style, grl->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+			NULL, grl->tipwindow, "tooltip", 0, 0, -1, -1);
+
+	max_text_width = 0;
+
+	max_text_width = MAX(grl->tip_width, grl->tip_name_width);
+	max_width = TOOLTIP_BORDER + SMALL_SPACE + max_text_width + TOOLTIP_BORDER;
+
+	current_height = 12;
+
+	if (dir == GTK_TEXT_DIR_RTL) {
+		gtk_paint_layout(style, grl->tipwindow->window, GTK_STATE_NORMAL, FALSE,
+				NULL, grl->tipwindow, "tooltip",
+				max_width - (TOOLTIP_BORDER + SMALL_SPACE) - PANGO_PIXELS(600000),
+				current_height, grl->tip_name_layout);
+	} else {
+		gtk_paint_layout (style, grl->tipwindow->window, GTK_STATE_NORMAL, FALSE,
+				NULL, grl->tipwindow, "tooltip",
+				TOOLTIP_BORDER + SMALL_SPACE, current_height, grl->tip_name_layout);
+	}
+	if (dir != GTK_TEXT_DIR_RTL) {
+		gtk_paint_layout (style, grl->tipwindow->window, GTK_STATE_NORMAL, FALSE,
+				NULL, grl->tipwindow, "tooltip",
+				TOOLTIP_BORDER + SMALL_SPACE, current_height + grl->tip_name_height, grl->tip_layout);
+	} else {
+		gtk_paint_layout(style, grl->tipwindow->window, GTK_STATE_NORMAL, FALSE,
+				NULL, grl->tipwindow, "tooltip",
+				max_width - (TOOLTIP_BORDER + SMALL_SPACE) - PANGO_PIXELS(600000),
+				current_height + grl->tip_name_height,
+				grl->tip_layout);
+	}
+
+}
+
+static gboolean pidgin_roomlist_create_tip(PurpleRoomlist *list)
+{
+	PidginRoomlist *grl = list->ui_data;
+	GtkWidget *tv = grl->tree;
+	PurpleRoomlistRoom *room;
+	GtkTreePath *path;
+	GtkTreeIter iter;
+	GValue val;
+	gchar *name, *tmp, *node_name;
+	GString *tooltip_text = NULL;
+	GList *l, *k;
+	gint j;
+	gboolean first = TRUE;
+
+	if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), grl->tip_rect.x, grl->tip_rect.y + (grl->tip_rect.height/2),
+		&path, NULL, NULL, NULL))
+		return FALSE;
+
+	gtk_tree_model_get_iter(GTK_TREE_MODEL(grl->model), &iter, path);
+
+	val.g_type = 0;
+	gtk_tree_model_get_value(GTK_TREE_MODEL(grl->model), &iter, ROOM_COLUMN, &val);
+	room = g_value_get_pointer(&val);
+
+	if (!room || !(room->type & PURPLE_ROOMLIST_ROOMTYPE_ROOM))
+		return FALSE;
+
+	tooltip_text = g_string_new("");
+	gtk_tree_model_get(GTK_TREE_MODEL(grl->model), &iter, NAME_COLUMN, &name, -1);
+
+	for (j = NUM_OF_COLUMNS, l = room->fields, k = list->fields; l && k; j++, l = l->next, k = k->next) {
+		PurpleRoomlistField *f = k->data;
+		gchar *label;
+		if (f->hidden)
+			continue;
+		label = g_markup_escape_text(f->label, -1);
+		switch (f->type) {
+			case PURPLE_ROOMLIST_FIELD_BOOL:
+				g_string_append_printf(tooltip_text, "%s<b>%s:</b> %s", first ? "" : "\n", label, l->data ? "True" : "False");
+				break;
+			case PURPLE_ROOMLIST_FIELD_INT:
+				g_string_append_printf(tooltip_text, "%s<b>%s:</b> %d", first ? "" : "\n", label, GPOINTER_TO_INT(l->data));
+				break;
+			case PURPLE_ROOMLIST_FIELD_STRING:
+				tmp = g_markup_escape_text((char *)l->data, -1);
+				g_string_append_printf(tooltip_text, "%s<b>%s:</b> %s", first ? "" : "\n", label, tmp);
+				g_free(tmp);
+				break;
+		}
+		first = FALSE;
+		g_free(label);
+	}
+
+	gtk_tree_path_free(path);
+
+	grl->tip_layout = gtk_widget_create_pango_layout(grl->tipwindow, NULL);
+	grl->tip_name_layout = gtk_widget_create_pango_layout(grl->tipwindow, NULL);
+
+	tmp = g_markup_escape_text(name, -1);
+	g_free(name);
+	node_name = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", tmp);
+	g_free(tmp);
+
+	pango_layout_set_markup(grl->tip_layout, tooltip_text->str, -1);
+	pango_layout_set_wrap(grl->tip_layout, PANGO_WRAP_WORD);
+	pango_layout_set_width(grl->tip_layout, 600000);
+
+	pango_layout_get_size (grl->tip_layout, &grl->tip_width, &grl->tip_height);
+	grl->tip_width = PANGO_PIXELS(grl->tip_width);
+	grl->tip_height = PANGO_PIXELS(grl->tip_height);
+
+	pango_layout_set_markup(grl->tip_name_layout, node_name, -1);
+	pango_layout_set_wrap(grl->tip_name_layout, PANGO_WRAP_WORD);
+	pango_layout_set_width(grl->tip_name_layout, 600000);
+
+	pango_layout_get_size (grl->tip_name_layout, &grl->tip_name_width, &grl->tip_name_height);
+	grl->tip_name_width = PANGO_PIXELS(grl->tip_name_width) + SMALL_SPACE;
+	grl->tip_name_height = MAX(PANGO_PIXELS(grl->tip_name_height), SMALL_SPACE);
+
+	g_free(node_name);
+	g_string_free(tooltip_text, TRUE);
+
+	return TRUE;
+}
+
+static void pidgin_roomlist_draw_tooltip(PurpleRoomlist *list, GtkWidget *widget)
+{
+	PidginRoomlist *grl = list->ui_data;
+	int scr_w, scr_h, w, h, x, y;
+#if GTK_CHECK_VERSION(2,2,0)
+	int mon_num;
+	GdkScreen *screen = NULL;
+#endif
+	GdkRectangle mon_size;
+	int sig;
+	const char *name;
+
+	pidgin_roomlist_tooltip_destroy(grl);
+	grl->tipwindow = gtk_window_new(GTK_WINDOW_POPUP);
+	gtk_widget_ensure_style (grl->tipwindow);
+
+	if (!pidgin_roomlist_create_tip(list)) {
+		pidgin_roomlist_tooltip_destroy(grl);
+		return;
+	}
+
+	name = gtk_window_get_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)));
+	gtk_widget_set_app_paintable(grl->tipwindow, TRUE);
+	gtk_window_set_title(GTK_WINDOW(grl->tipwindow), name ? name : _("Room List"));
+	gtk_window_set_resizable(GTK_WINDOW(grl->tipwindow), FALSE);
+	gtk_widget_set_name(grl->tipwindow, "gtk-tooltips");
+	g_signal_connect(G_OBJECT(grl->tipwindow), "expose_event",
+			G_CALLBACK(pidgin_roomlist_paint_tip), grl);
+
+	w = TOOLTIP_BORDER + SMALL_SPACE +
+		MAX(grl->tip_width, grl->tip_name_width) + TOOLTIP_BORDER;
+	h = TOOLTIP_BORDER + grl->tip_height + grl->tip_name_height
+		+ TOOLTIP_BORDER;
+
+#if GTK_CHECK_VERSION(2,2,0)
+	gdk_display_get_pointer(gdk_display_get_default(), &screen, &x, &y, NULL);
+	mon_num = gdk_screen_get_monitor_at_point(screen, x, y);
+	gdk_screen_get_monitor_geometry(screen, mon_num, &mon_size);
+
+	scr_w = mon_size.width + mon_size.x;
+	scr_h = mon_size.height + mon_size.y;
+#else
+	scr_w = gdk_screen_width();
+	scr_h = gdk_screen_height();
+	gdk_window_get_pointer(NULL, &x, &y, NULL);
+	mon_size.x = 0;
+	mon_size.y = 0;
+#endif
+
+#if GTK_CHECK_VERSION(2,2,0)
+	if (w > mon_size.width)
+		w = mon_size.width - 10;
+
+	if (h > mon_size.height)
+		h = mon_size.height - 10;
+#endif
+	x -= ((w >> 1) + 4);
+
+	if ((y + h + 4) > scr_h)
+		y = y - h - 5;
+	else
+		y = y + 6;
+
+	if (y < mon_size.y)
+		y = mon_size.y;
+
+	if (y != mon_size.y) {
+		if ((x + w) > scr_w)
+			x -= (x + w + 5) - scr_w;
+		else if (x < mon_size.x)
+			x = mon_size.x;
+	} else {
+		x -= (w / 2 + 10);
+		if (x < mon_size.x)
+			x = mon_size.x;
+	}
+
+	gtk_widget_set_size_request(grl->tipwindow, w, h);
+	gtk_window_move(GTK_WINDOW(grl->tipwindow), x, y);
+	gtk_widget_show(grl->tipwindow);
+
+	/* Hide the tooltip when the widget is destroyed */
+	sig = g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(pidgin_roomlist_tooltip_destroy_cb), grl);
+	g_signal_connect_swapped(G_OBJECT(grl->tipwindow), "destroy", G_CALLBACK(g_source_remove), GINT_TO_POINTER(sig));
+}
+
+static gboolean pidgin_roomlist_tooltip_timeout(PurpleRoomlist *list)
+{
+	PidginRoomlist *grl = list->ui_data;
+	GtkWidget *tv = grl->tree;
+	GtkTreePath *path;
+
+	pidgin_roomlist_tooltip_destroy(grl);
+
+	if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), grl->tip_rect.x, grl->tip_rect.y + (grl->tip_rect.height/2),
+	                                   &path, NULL, NULL, NULL))
+		return FALSE;
+
+	pidgin_roomlist_draw_tooltip(list, GTK_WIDGET(grl->tree));
+
+	return FALSE;
+}
+
+static gboolean row_motion_cb(GtkWidget *tv, GdkEventMotion *event, gpointer user_data)
+{
+	PurpleRoomlist *list = user_data;
+	PidginRoomlist *grl = list->ui_data;
+	GtkTreePath *path;
+	int delay;
+
+	/* XXX: should this be using the blist delay pref? */
+	delay = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/tooltip_delay");
+
+	if (delay == 0)
+		return FALSE;
+
+	if (grl->timeout) {
+		if ((event->y > grl->tip_rect.y) && ((event->y - grl->tip_rect.height) < grl->tip_rect.y))
+			return FALSE;
+		/* We've left the cell.  Remove the timeout and create a new one below */
+		pidgin_roomlist_tooltip_destroy(grl);
+	}
+
+	gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL);
+
+	if (path == NULL) {
+		pidgin_roomlist_tooltip_destroy(grl);
+		return FALSE;
+	}
+
+	gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, &grl->tip_rect);
+
+	if (path)
+		gtk_tree_path_free(path);
+	grl->timeout = g_timeout_add(delay, (GSourceFunc)pidgin_roomlist_tooltip_timeout, list);
+
+	return FALSE;
+}
+
+static void row_leave_cb(GtkWidget *tv, GdkEventCrossing *e, gpointer user_data)
+{
+	PurpleRoomlist *list = user_data;
+	PidginRoomlist *grl = list->ui_data;
+
+	if (grl->timeout) {
+		g_source_remove(grl->timeout);
+		grl->timeout = 0;
+	}
+
+	pidgin_roomlist_tooltip_destroy(grl);
+}
+
 static gboolean account_filter_func(PurpleAccount *account)
 {
 	PurpleConnection *gc = purple_account_get_connection(account);
@@ -650,6 +963,8 @@
 	g_signal_connect(G_OBJECT(tree), "button-press-event", G_CALLBACK(room_click_cb), list);
 	g_signal_connect(G_OBJECT(tree), "row-expanded", G_CALLBACK(row_expanded_cb), list);
 	g_signal_connect(G_OBJECT(tree), "row-activated", G_CALLBACK(row_activated_cb), list);
+	g_signal_connect(G_OBJECT(tree), "motion-notify-event", G_CALLBACK(row_motion_cb), list);
+	g_signal_connect(G_OBJECT(tree), "leave-notify-event", G_CALLBACK(row_leave_cb), list);
 
 	/* Enable CTRL+F searching */
 	gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree), NAME_COLUMN);
--- a/pidgin/gtkutils.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/gtkutils.c	Mon Nov 12 16:53:54 2007 +0000
@@ -61,6 +61,7 @@
 #include "pidginstock.h"
 #include "gtkthemes.h"
 #include "gtkutils.h"
+#include "pidgin/minidialog.h"
 
 typedef struct {
 	GtkWidget *menu;
@@ -2910,91 +2911,76 @@
 	minidialogs = g_slist_remove(minidialogs, widget);
 }
 
-void *pidgin_make_mini_dialog(PurpleConnection *gc, const char *icon_name,
-				const char *primary, const char *secondary,
-				void *user_data,  ...)
+struct _old_button_clicked_cb_data
+{
+	PidginUtilMiniDialogCallback cb;
+	gpointer data;
+};
+
+static void
+old_mini_dialog_button_clicked_cb(PidginMiniDialog *mini_dialog,
+                                  GtkButton *button,
+                                  gpointer user_data)
+{
+	struct _old_button_clicked_cb_data *data = user_data;
+	data->cb(data->data, button);
+}
+
+static void
+old_mini_dialog_destroy_cb(GtkWidget *dialog,
+                           GList *cb_datas)
 {
-	GtkWidget *vbox;
-	GtkWidget *hbox;
-	GtkWidget *hbox2;
-	GtkWidget *label;
-	GtkWidget *button;
-	GtkWidget *img = NULL;
-	GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH);
-	char label_text[2048];
+	while (cb_datas != NULL)
+	{
+		g_free(cb_datas->data);
+		cb_datas = g_list_delete_link(cb_datas, cb_datas);
+	}
+}
+
+GtkWidget *
+pidgin_make_mini_dialog(PurpleConnection *gc,
+                        const char *icon_name,
+                        const char *primary,
+                        const char *secondary,
+                        void *user_data,
+                        ...)
+{
+	PidginMiniDialog *mini_dialog;
 	const char *button_text;
-	GCallback callback;
-	char *primary_esc, *secondary_esc = NULL;
+	GList *cb_datas = NULL;
 	va_list args;
 	static gboolean first_call = TRUE;
 
-	img = gtk_image_new_from_stock(icon_name, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
-	gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
-
-	vbox = gtk_vbox_new(FALSE,0);
-	gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BOX_SPACE);
-
-	g_object_set_data(G_OBJECT(vbox), "gc" ,gc);
-	minidialogs = g_slist_prepend(minidialogs, vbox);
-	g_signal_connect(G_OBJECT(vbox), "destroy", G_CALLBACK(alert_killed_cb), NULL);
-
 	if (first_call) {
 		first_call = FALSE;
 		purple_signal_connect(purple_connections_get_handle(), "signed-off",
-				    pidgin_utils_get_handle(),
-				    PURPLE_CALLBACK(connection_signed_off_cb), NULL);
+		                      pidgin_utils_get_handle(),
+		                      PURPLE_CALLBACK(connection_signed_off_cb), NULL);
 	}
 
-	hbox = gtk_hbox_new(FALSE, 0);
-	gtk_container_add(GTK_CONTAINER(vbox), hbox);
-
-	if (img != NULL)
-		gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
-
-	primary_esc = g_markup_escape_text(primary, -1);
-
-	if (secondary)
-		secondary_esc = g_markup_escape_text(secondary, -1);
-	g_snprintf(label_text, sizeof(label_text),
-		   "<span weight=\"bold\" size=\"smaller\">%s</span>%s<span size=\"smaller\">%s</span>",
-		   primary_esc, secondary ? "\n" : "", secondary_esc ? secondary_esc : "");
-	g_free(primary_esc);
-	g_free(secondary_esc);
-	label = gtk_label_new(NULL);
-	gtk_widget_set_size_request(label, purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/width")-25,-1);
-	gtk_label_set_markup(GTK_LABEL(label), label_text);
-	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
-	gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
-
-	hbox2 = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
+	mini_dialog = pidgin_mini_dialog_new(primary, secondary, icon_name);
+	g_object_set_data(G_OBJECT(mini_dialog), "gc" ,gc);
+	g_signal_connect(G_OBJECT(mini_dialog), "destroy",
+		G_CALLBACK(alert_killed_cb), NULL);
 
 	va_start(args, user_data);
 	while ((button_text = va_arg(args, char*))) {
-		callback = va_arg(args, GCallback);
-		button = gtk_button_new();
-
-		if (callback)
-			g_signal_connect_swapped(G_OBJECT(button), "clicked", callback, user_data);
-		g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), vbox);
-		hbox = gtk_hbox_new(FALSE, 0);
-		gtk_container_add(GTK_CONTAINER(button), hbox);
-		gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
-		g_snprintf(label_text, sizeof(label_text),
-			   "<span size=\"smaller\">%s</span>", button_text);
-		label = gtk_label_new(NULL);
-		gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), label_text);
-		gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
-		gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
-		gtk_box_pack_end(GTK_BOX(hbox2), button, FALSE, FALSE, 0);
-		gtk_size_group_add_widget(sg, button);
+		PidginUtilMiniDialogCallback callback =
+			va_arg(args, PidginUtilMiniDialogCallback);
+		struct _old_button_clicked_cb_data *data =
+			g_new0(struct _old_button_clicked_cb_data, 1);
+		data->cb = callback;
+		data->data = user_data;
+		pidgin_mini_dialog_add_button(mini_dialog, button_text,
+			old_mini_dialog_button_clicked_cb, data);
+		cb_datas = g_list_append(cb_datas, data);
 	}
 	va_end(args);
 
-	g_object_unref(sg);
-
-	return vbox;
+	g_signal_connect(G_OBJECT(mini_dialog), "destroy",
+		G_CALLBACK(old_mini_dialog_destroy_cb), cb_datas);
+
+	return GTK_WIDGET(mini_dialog);
 }
 
 /*
--- a/pidgin/gtkutils.h	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/gtkutils.h	Mon Nov 12 16:53:54 2007 +0000
@@ -599,18 +599,38 @@
 char *pidgin_make_pretty_arrows(const char *str);
 
 /**
- * Creates a "mini-dialog" suitable for embedding in the buddy list scrollbook
+ * The type of callbacks passed to pidgin_make_mini_dialog().
+ */
+typedef void (*PidginUtilMiniDialogCallback)(gpointer user_data, GtkButton *);
+
+/**
+ * Creates a #PidginMiniDialog, tied to a #PurpleConnection, suitable for
+ * embedding in the buddy list scrollbook with pidgin_blist_add_alert().
  *
- * @param handle         A handle
- * @param stock_id       The ID of a stock image to use in the mini dialog
+ * @param handle         The #PurpleConnection to which this mini-dialog
+ *                       refers, or @c NULL if it does not refer to a
+ *                       connection.  If @a handle is supplied, the mini-dialog
+ *                       will be automatically removed and destroyed when the
+ *                       connection signs off.
+ * @param stock_id       The ID of a stock image to use in the mini dialog.
  * @param primary        The primary text
- * @param secondary      The secondary text
+ * @param secondary      The secondary text, or @c NULL for no description.
  * @param user_data      Data to pass to the callbacks
- * @param ...            a NULL-terminated list of button labels and callbacks
+ * @param ...            a <tt>NULL</tt>-terminated list of button labels
+ *                       (<tt>char *</tt>) and callbacks
+ *                       (#PidginUtilMiniDialogCallback).  @a user_data will be
+ *                       passed as the first argument.  (Callbacks may lack a
+ *                       second argument, or be @c NULL to take no action when
+ *                       the corresponding button is pressed.) When a button is
+ *                       pressed, the callback (if any) will be called; when
+ *                       the callback returns the dialog will be destroyed.
+ * @return               A #PidginMiniDialog, suitable for passing to
+ *                       pidgin_blist_add_alert().
+ * @see pidginstock.h
  */
-void *pidgin_make_mini_dialog(PurpleConnection *handle, const char* stock_id, 
-				const char *primary, const char *secondary,
-				void *user_data,  ...);
+GtkWidget *pidgin_make_mini_dialog(PurpleConnection *handle,
+	const char* stock_id, const char *primary, const char *secondary,
+	void *user_data, ...);
 
 /**
  * This is a callback function to be used for Ctrl+F searching in treeviews.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/minidialog.c	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,388 @@
+/**
+ * @file minidialog.c Implementation of the #PidginMiniDialog Gtk widget.
+ * @ingroup pidgin
+ */
+
+/* pidgin
+ *
+ * Pidgin is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+#include "internal.h"
+
+#include <gtk/gtkhbox.h>
+#include <gtk/gtkbutton.h>
+
+#include "libpurple/prefs.h"
+
+#include "pidgin/minidialog.h"
+#include "pidgin/pidgin.h"
+#include "pidgin/pidginstock.h"
+
+G_DEFINE_TYPE (PidginMiniDialog, pidgin_mini_dialog, GTK_TYPE_VBOX)
+
+enum
+{
+	PROP_TITLE = 1,
+	PROP_DESCRIPTION,
+	PROP_ICON_NAME,
+
+	LAST_PROPERTY
+} HazeConnectionProperties;
+
+typedef struct _PidginMiniDialogPrivate
+{
+	GtkImage *icon;
+	GtkBox *title_box;
+	GtkLabel *title;
+	GtkLabel *desc;
+	GtkBox *buttons;
+} PidginMiniDialogPrivate;
+
+#define PIDGIN_MINI_DIALOG_GET_PRIVATE(dialog) \
+	((PidginMiniDialogPrivate *) ((dialog)->priv))
+
+PidginMiniDialog *
+pidgin_mini_dialog_new(const gchar *title,
+                       const gchar *description,
+                       const gchar *icon_name)
+{
+	PidginMiniDialog *mini_dialog = g_object_new(PIDGIN_TYPE_MINI_DIALOG,
+		"title", title,
+		"description", description,
+		"icon-name", icon_name,
+		NULL);
+
+	return mini_dialog;
+}
+
+void
+pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog,
+                             const char *title)
+{
+	g_object_set(G_OBJECT(mini_dialog), "title", title, NULL);
+}
+
+void
+pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog,
+                                   const char *description)
+{
+	g_object_set(G_OBJECT(mini_dialog), "description", description, NULL);
+}
+
+void
+pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog,
+                                 const char *icon_name)
+{
+	g_object_set(G_OBJECT(mini_dialog), "icon_name", icon_name, NULL);
+}
+
+struct _mini_dialog_button_clicked_cb_data
+{
+	PidginMiniDialog *mini_dialog;
+	PidginMiniDialogCallback callback;
+	gpointer user_data;
+};
+
+guint
+pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog)
+{
+	return g_list_length(mini_dialog->contents->children);
+}
+
+static gboolean
+idle_destroy_cb(GtkWidget *mini_dialog)
+{
+	gtk_widget_destroy(mini_dialog);
+	return FALSE;
+}
+
+static void
+mini_dialog_button_clicked_cb(GtkButton *button,
+                              gpointer user_data)
+{
+	struct _mini_dialog_button_clicked_cb_data *data = user_data;
+
+	data->callback(data->mini_dialog, button, data->user_data);
+
+	g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog);
+}
+
+static void
+mini_dialog_button_destroy_cb(GtkButton *button,
+                              gpointer user_data)
+{
+	struct _mini_dialog_button_clicked_cb_data *data = user_data;
+	g_free(data);
+}
+
+void
+pidgin_mini_dialog_add_button(PidginMiniDialog *self,
+                              const char *text,
+                              PidginMiniDialogCallback clicked_cb,
+                              gpointer user_data)
+{
+	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+	struct _mini_dialog_button_clicked_cb_data *callback_data
+		= g_new0(struct _mini_dialog_button_clicked_cb_data, 1);
+	GtkWidget *button = gtk_button_new();
+	GtkWidget *label = gtk_label_new(NULL);
+	char *button_text =
+		g_strdup_printf("<span size=\"smaller\">%s</span>", text);
+
+	gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), button_text);
+	g_free(button_text);
+
+	callback_data->mini_dialog = self;
+	callback_data->callback = clicked_cb;
+	callback_data->user_data = user_data;
+	g_signal_connect(G_OBJECT(button), "clicked",
+		(GCallback) mini_dialog_button_clicked_cb, callback_data);
+	g_signal_connect(G_OBJECT(button), "destroy",
+		(GCallback) mini_dialog_button_destroy_cb, callback_data);
+
+	gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
+	gtk_container_add(GTK_CONTAINER(button), label);
+
+	gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE,
+		0);
+	gtk_widget_show_all(GTK_WIDGET(button));
+}
+
+static void
+pidgin_mini_dialog_get_property(GObject *object,
+                                guint property_id,
+                                GValue *value,
+                                GParamSpec *pspec)
+{
+	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
+	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+
+	switch (property_id) {
+		case PROP_TITLE:
+			g_value_set_string(value, gtk_label_get_text(priv->title));
+			break;
+		case PROP_DESCRIPTION:
+			g_value_set_string(value, gtk_label_get_text(priv->desc));
+			break;
+		case PROP_ICON_NAME:
+		{
+			gchar *icon_name = NULL;
+			GtkIconSize size;
+			gtk_image_get_stock(priv->icon, &icon_name, &size);
+			g_value_set_string(value, icon_name);
+			break;
+		}
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+	}
+}
+
+static void
+mini_dialog_set_title(PidginMiniDialog *self,
+                      const char *title)
+{
+	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+
+	char *title_esc = g_markup_escape_text(title, -1);
+	char *title_markup = g_strdup_printf(
+		"<span weight=\"bold\" size=\"smaller\">%s</span>",
+		title_esc ? title_esc : "");
+
+	gtk_label_set_markup(priv->title, title_markup);
+
+	g_free(title_esc);
+	g_free(title_markup);
+}
+
+static void
+mini_dialog_set_description(PidginMiniDialog *self,
+                            const char *description)
+{
+	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+	if(description)
+	{
+		char *desc_esc = g_markup_escape_text(description, -1);
+		char *desc_markup = g_strdup_printf(
+			"<span size=\"smaller\">%s</span>", desc_esc);
+
+		gtk_label_set_markup(priv->desc, desc_markup);
+
+		g_free(desc_esc);
+		g_free(desc_markup);
+
+		gtk_widget_show(GTK_WIDGET(priv->desc));
+		g_object_set(G_OBJECT(priv->desc), "no-show-all", FALSE, NULL);
+	}
+	else
+	{
+		gtk_label_set_text(priv->desc, NULL);
+		gtk_widget_hide(GTK_WIDGET(priv->desc));
+		/* make calling show_all() on the minidialog not affect desc
+		 * even though it's packed inside it.
+	 	 */
+		g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL);
+	}
+}
+
+static void
+pidgin_mini_dialog_set_property(GObject *object,
+                                guint property_id,
+                                const GValue *value,
+                                GParamSpec *pspec)
+{
+	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
+	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+
+	switch (property_id) {
+		case PROP_TITLE:
+			mini_dialog_set_title(self, g_value_get_string(value));
+			break;
+		case PROP_DESCRIPTION:
+			mini_dialog_set_description(self, g_value_get_string(value));
+			break;
+		case PROP_ICON_NAME:
+			gtk_image_set_from_stock(priv->icon, g_value_get_string(value),
+				gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+	}
+}
+
+static void
+pidgin_mini_dialog_finalize(GObject *object)
+{
+	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
+	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+
+	g_free(priv);
+	self->priv = NULL;
+
+	purple_prefs_disconnect_by_handle(self);
+
+	G_OBJECT_CLASS (pidgin_mini_dialog_parent_class)->finalize (object);
+}
+
+static void
+pidgin_mini_dialog_class_init(PidginMiniDialogClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS(klass);
+	GParamSpec *param_spec;
+
+	object_class->get_property = pidgin_mini_dialog_get_property;
+	object_class->set_property = pidgin_mini_dialog_set_property;
+	object_class->finalize = pidgin_mini_dialog_finalize;
+
+	param_spec = g_param_spec_string("title", "title",
+		"String specifying the mini-dialog's title", NULL,
+#if GTK_CHECK_VERSION(2,8,0)
+		G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
+#endif
+		G_PARAM_READWRITE);
+	g_object_class_install_property (object_class, PROP_TITLE, param_spec);
+
+	param_spec = g_param_spec_string("description", "description",
+		"Description text for the mini-dialog, if desired", NULL,
+#if GTK_CHECK_VERSION(2,8,0)
+		G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
+#endif
+		G_PARAM_READWRITE);
+	g_object_class_install_property (object_class, PROP_DESCRIPTION, param_spec);
+
+	param_spec = g_param_spec_string("icon-name", "icon-name",
+		"String specifying the Gtk stock name of the dialog's icon",
+		NULL,
+#if GTK_CHECK_VERSION(2,8,0)
+		G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
+#endif
+		G_PARAM_READWRITE);
+	g_object_class_install_property (object_class, PROP_ICON_NAME, param_spec);
+}
+
+/* 16 is the width of the icon, due to PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL */
+#define BLIST_WIDTH_OTHER_THAN_LABEL \
+	((PIDGIN_HIG_BOX_SPACE * 3) + 16)
+
+#define BLIST_WIDTH_PREF \
+	(PIDGIN_PREFS_ROOT "/blist/width")
+
+static void
+blist_width_changed_cb(const char *name,
+                       PurplePrefType type,
+                       gconstpointer val,
+                       gpointer data)
+{
+	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(data);
+	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+	guint blist_width = GPOINTER_TO_INT(val);
+	guint label_width = blist_width - BLIST_WIDTH_OTHER_THAN_LABEL;
+
+	gtk_widget_set_size_request(GTK_WIDGET(priv->title), label_width, -1);
+	gtk_widget_set_size_request(GTK_WIDGET(priv->desc), label_width, -1);
+}
+
+static void
+pidgin_mini_dialog_init(PidginMiniDialog *self)
+{
+	GtkBox *self_box = GTK_BOX(self);
+	guint blist_width = purple_prefs_get_int(BLIST_WIDTH_PREF);
+	guint label_width = blist_width - BLIST_WIDTH_OTHER_THAN_LABEL;
+
+	PidginMiniDialogPrivate *priv = g_new0(PidginMiniDialogPrivate, 1);
+	self->priv = priv;
+
+	gtk_container_set_border_width(GTK_CONTAINER(self), PIDGIN_HIG_BOX_SPACE);
+
+	priv->title_box = GTK_BOX(gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE));
+
+	priv->icon = GTK_IMAGE(gtk_image_new());
+	gtk_misc_set_alignment(GTK_MISC(priv->icon), 0, 0);
+
+	priv->title = GTK_LABEL(gtk_label_new(NULL));
+	gtk_widget_set_size_request(GTK_WIDGET(priv->title), label_width, -1);
+	gtk_label_set_line_wrap(priv->title, TRUE);
+	gtk_misc_set_alignment(GTK_MISC(priv->title), 0, 0);
+
+	gtk_box_pack_start(priv->title_box, GTK_WIDGET(priv->icon), FALSE, FALSE, 0);
+	gtk_box_pack_start(priv->title_box, GTK_WIDGET(priv->title), TRUE, TRUE, 0);
+
+	priv->desc = GTK_LABEL(gtk_label_new(NULL));
+	gtk_widget_set_size_request(GTK_WIDGET(priv->desc), label_width, -1);
+	gtk_label_set_line_wrap(priv->desc, TRUE);
+	gtk_misc_set_alignment(GTK_MISC(priv->desc), 0, 0);
+	/* make calling show_all() on the minidialog not affect desc even though
+	 * it's packed inside it.
+	 */
+	g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL);
+
+	purple_prefs_connect_callback(self, BLIST_WIDTH_PREF,
+		blist_width_changed_cb, self);
+
+	self->contents = GTK_BOX(gtk_vbox_new(FALSE, 0));
+
+	priv->buttons = GTK_BOX(gtk_hbox_new(FALSE, 0));
+
+	gtk_box_pack_start(self_box, GTK_WIDGET(priv->title_box), FALSE, FALSE, 0);
+	gtk_box_pack_start(self_box, GTK_WIDGET(priv->desc), FALSE, FALSE, 0);
+	gtk_box_pack_start(self_box, GTK_WIDGET(self->contents), TRUE, TRUE, 0);
+	gtk_box_pack_start(self_box, GTK_WIDGET(priv->buttons), FALSE, FALSE, 0);
+
+	gtk_widget_show_all(GTK_WIDGET(self));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/minidialog.h	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,162 @@
+/**
+ * @file minidialog.h API for the #PidginMiniDialog Gtk widget.
+ * @ingroup pidgin
+ */
+
+/* pidgin
+ *
+ * Pidgin is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+#ifndef __PIDGIN_MINI_DIALOG_H__
+#define __PIDGIN_MINI_DIALOG_H__
+
+#include <glib-object.h>
+#include <gtk/gtkvbox.h>
+#include <gtk/gtklabel.h>
+
+G_BEGIN_DECLS
+
+#define PIDGIN_TYPE_MINI_DIALOG pidgin_mini_dialog_get_type()
+
+#define PIDGIN_MINI_DIALOG(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+  PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialog))
+
+#define PIDGIN_MINI_DIALOG_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), \
+  PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialogClass))
+
+#define PIDGIN_IS_MINI_DIALOG(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+  PIDGIN_TYPE_MINI_DIALOG))
+
+#define PIDGIN_IS_MINI_DIALOG_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+  PIDGIN_TYPE_MINI_DIALOG))
+
+#define PIDGIN_MINI_DIALOG_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+  PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialogClass))
+
+/**
+ * A widget resembling a diminutive dialog box, designed to be embedded in the
+ * #PidginBuddyList.  Mini-dialogs have titles, optional descriptions, and a row
+ * of buttons at the bottom; above the buttons is a <tt>GtkHBox</tt> into which
+ * you can pack any random widgets you want to add to the dialog.  When any of
+ * the dialog's buttons is clicked, the dialog will be destroyed.
+ *
+ * Dialogs have the following GObject properties:
+ * <dl>
+ *   <dt><tt>"title"</tt> (<tt>char *</tt>)</dt>
+ *   <dd>A string to be displayed as the dialog's title.</dd>
+ *   <dt><tt>"description"</tt> (<tt>char *</tt>)</dt>
+ *   <dd>A string to be displayed as the dialog's description.  If this is @c
+ *       NULL, the description widget will be hidden.
+ *   </dd>
+ *   <dt><tt>"icon-name"</tt> (<tt>char *</tt>)</dt>
+ *   <dd>The Gtk stock id of an icon for the dialog, or @c NULL for no icon.
+ *       @see pidginstock.h
+ *   </dd>
+ * </dl>
+ */
+typedef struct {
+	GtkVBox parent;
+
+	/** A GtkVBox into which extra widgets for the dialog should be packed.
+	 */
+	GtkBox *contents;
+
+	gpointer priv;
+} PidginMiniDialog;
+
+/** The class of #PidginMiniDialog objects. */
+typedef struct {
+	GtkBoxClass parent_class;
+
+	void (*_purple_reserved1) (void);
+	void (*_purple_reserved2) (void);
+	void (*_purple_reserved3) (void);
+	void (*_purple_reserved4) (void);
+} PidginMiniDialogClass;
+
+/** The type of a callback triggered by a button in a mini-dialog being pressed.
+ * @param mini_dialog a dialog, one of whose buttons has been pressed.
+ * @param button      the button which was pressed.
+ * @param user_data   arbitrary data, supplied to
+ *                    pidgin_mini_dialog_add_button() when the button was
+ *                    created.
+ */
+typedef void (*PidginMiniDialogCallback)(PidginMiniDialog *mini_dialog,
+	GtkButton *button, gpointer user_data);
+
+/** Get the GType of #PidginMiniDialog. */
+GType pidgin_mini_dialog_get_type (void);
+
+/** Creates a new #PidginMiniDialog.  This is a shortcut for creating the dialog
+ *  with @c g_object_new() then setting each property yourself.
+ *  @return a new #PidginMiniDialog.
+ */
+PidginMiniDialog *pidgin_mini_dialog_new(const gchar *title,
+	const gchar *description, const gchar *icon_name);
+
+/** Shortcut for setting a mini-dialog's title via GObject properties.
+ *  @param mini_dialog a mini-dialog
+ *  @param title       the new title for @a mini_dialog
+ */
+void pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialogtitle ,
+	const char *title);
+
+/** Shortcut for setting a mini-dialog's description via GObject properties.
+ *  @param mini_dialog a mini-dialog
+ *  @param description the new description for @a mini_dialog, or @c NULL to
+ *                     hide the description widget.
+ */
+void pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog,
+	const char *description);
+
+/** Shortcut for setting a mini-dialog's icon via GObject properties.
+ *  @param mini_dialog a mini-dialog
+ *  @param title       the Gtk stock ID of an icon, or @c NULL for no icon.
+ */
+void pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog,
+	const char *icon_name);
+
+/** Adds a new button to a mini-dialog, and attaches the supplied callback to
+ *  its <tt>clicked</tt> signal.  After a button is clicked, the dialog is
+ *  destroyed.
+ *  @param mini_dialog a mini-dialog
+ *  @param text        the text to display on the new button
+ *  @param clicked_cb  the function to call when the button is clicked
+ *  @param user_data   arbitrary data to pass to @a clicked_cb when it is
+ *                     called.
+ */
+void pidgin_mini_dialog_add_button(PidginMiniDialog *mini_dialog,
+	const char *text, PidginMiniDialogCallback clicked_cb,
+	gpointer user_data);
+
+/** Gets the number of widgets packed into PidginMiniDialog.contents.
+ *  @param mini_dialog a mini-dialog
+ *  @return the number of widgets in @a mini_dialog->contents.
+ */
+guint pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog);
+
+G_END_DECLS
+
+#endif /* __PIDGIN_MINI_DIALOG_H__ */
--- a/pidgin/pidgin-uninstalled.pc.in	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/pidgin-uninstalled.pc.in	Mon Nov 12 16:53:54 2007 +0000
@@ -3,6 +3,7 @@
 libdir=@libdir@
 includedir=@includedir@
 datadir=@datadir@
+datarootdir=@datarootdir@
 sysconfdir=@sysconfdir@
 
 Name: Pidgin
--- a/pidgin/pidgin.pc.in	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/pidgin.pc.in	Mon Nov 12 16:53:54 2007 +0000
@@ -3,6 +3,7 @@
 libdir=@libdir@
 includedir=@includedir@
 datadir=@datadir@
+datarootdir=@datarootdir@
 sysconfdir=@sysconfdir@
 
 Name: Pidgin
--- a/pidgin/pixmaps/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/pixmaps/Makefile.am	Mon Nov 12 16:53:54 2007 +0000
@@ -1,38 +1,12 @@
 pidginpixmapdir = $(datadir)/pixmaps/pidgin
+pidginiconsdir = $(datadir)
 
-SUBDIRS = buddy_icons/qq dialogs/16 dialogs/64 emblems/16 \
-          emotes/default/24 emotes/none \
-          icons/16 icons/22 icons/24 icons/32 icons/48 \
-          protocols/16 protocols/22 protocols/48 \
-          status/11 status/16 status/22 status/32 status/48 \
-          toolbar/16 toolbar/22 tray/16 tray/22 tray/32 tray/48
+SUBDIRS = buddy_icons/qq emotes/default/24 emotes/none
 
 MAKEFILE_MINGW = \
 		buddy_icons/qq/Makefile.mingw \
-		dialogs/16/Makefile.mingw \
-		dialogs/64/Makefile.mingw \
-		emotes/default/Makefile.mingw \
 		emotes/default/24/Makefile.mingw \
-		emotes/none/Makefile.mingw \
-		emblems/16/Makefile.mingw \
-		protocols/22/Makefile.mingw \
-		protocols/48/Makefile.mingw \
-		status/11/Makefile.mingw \
-		status/11/rtl/Makefile.mingw \
-		status/16/Makefile.mingw \
-		status/16/rtl/Makefile.mingw \
-		status/22/Makefile.mingw \
-		status/22/rtl/Makefile.mingw \
-		status/32/Makefile.mingw \
-		status/32/rtl/Makefile.mingw \
-		status/48/Makefile.mingw \
-		status/48/rtl/Makefile.mingw \
-		toolbar/16/Makefile.mingw \
-		toolbar/22/Makefile.mingw \
-		tray/16/Makefile.mingw \
-		tray/22/Makefile.mingw \
-		tray/32/Makefile.mingw \
-		tray/48/Makefile.mingw
+		emotes/none/Makefile.mingw
 
 ANIMATIONS_16 = \
 		animations/16/connect0.png \
@@ -56,6 +30,13 @@
 		dialogs/16/scalable/info.svg \
 		dialogs/16/scalable/mail.svg
 
+DIALOGS_16 = \
+		dialogs/16/auth.png \
+		dialogs/16/error.png \
+		dialogs/16/info.png \
+		dialogs/16/mail.png \
+		dialogs/16/question.png
+
 DIALOGS_64_SCALABLE = \
 		dialogs/64/scalable/auth.svg \
 		dialogs/64/scalable/cool.svg \
@@ -65,6 +46,16 @@
 		dialogs/64/scalable/question.svg \
 		dialogs/64/scalable/warning.svg
 
+DIALOGS_64 = \
+		dialogs/64/auth.png \
+		dialogs/64/cool.png \
+		dialogs/64/dialog.png \
+		dialogs/64/error.png \
+		dialogs/64/info.png \
+		dialogs/64/mail.png \
+		dialogs/64/question.png \
+		dialogs/64/warning.png
+
 EMBLEMS_16_SCALABLE = \
 		emblems/16/scalable/aol-client.svg \
 		emblems/16/scalable/blocked.svg \
@@ -83,6 +74,29 @@
 		emblems/16/scalable/video.svg \
 		emblems/16/scalable/voice.svg
 
+EMBLEMS_16 = \
+		emblems/16/aol-client.png \
+		emblems/16/birthday.png \
+		emblems/16/blocked.png \
+		emblems/16/bot.png \
+		emblems/16/external.png \
+		emblems/16/female.png \
+		emblems/16/founder.png \
+		emblems/16/free-for-chat.png \
+		emblems/16/game.png \
+		emblems/16/half-operator.png \
+		emblems/16/hiptop.png \
+		emblems/16/male.png \
+		emblems/16/mobile.png \
+		emblems/16/music.png \
+		emblems/16/not-authorized.png \
+		emblems/16/operator.png \
+		emblems/16/qq-member.png \
+		emblems/16/secure.png \
+		emblems/16/unavailable.png \
+		emblems/16/video.png \
+		emblems/16/voice.png
+
 EMOTES_DEFAULT_24_SCALABLE = \
 		emotes/default/24/scalable/act-up.svg \
 		emotes/default/24/scalable/airplane.svg \
@@ -290,20 +304,48 @@
 		protocols/16/scalable/yahoo.svg \
 		protocols/16/scalable/zephyr.svg
 
+PROTOCOLS_16 = \
+		protocols/16/aim.png \
+		protocols/16/bonjour.png \
+		protocols/16/gadu-gadu.png \
+		protocols/16/google-talk.png \
+		protocols/16/novell.png \
+		protocols/16/icq.png \
+		protocols/16/irc.png \
+		protocols/16/jabber.png \
+		protocols/16/meanwhile.png \
+		protocols/16/msn.png \
+		protocols/16/myspace.png \
+		protocols/16/qq.png \
+		protocols/16/silc.png \
+		protocols/16/simple.png \
+		protocols/16/yahoo.png \
+		protocols/16/zephyr.png
+
 ICONS_16_SCALABLE = \
-		icons/16/scalable/pidgin.svg
+		icons/hicolor/16x16/apps/scalable/pidgin.svg
+
+ICONS_16 = icons/hicolor/16x16/apps/pidgin.png
 
 ICONS_22_SCALABLE = \
-		icons/22/scalable/pidgin.svg
+		icons/hicolor/22x22/apps/scalable/pidgin.svg
+
+ICONS_22 = icons/hicolor/22x22/apps/pidgin.png
 
 ICONS_24_SCALABLE = \
-		icons/24/scalable/pidgin.svg
+		icons/hicolor/24x24/apps/scalable/pidgin.svg
+
+ICONS_24 = icons/hicolor/24x24/apps/pidgin.png
 
 ICONS_32_SCALABLE = \
-		icons/32/scalable/pidgin.svg
+		icons/hicolor/32x32/apps/scalable/pidgin.svg
+
+ICONS_32 = icons/hicolor/32x32/apps/pidgin.png
 
 ICONS_48_SCALABLE = \
-		icons/48/scalable/pidgin.svg
+		icons/hicolor/48x48/apps/scalable/pidgin.svg
+
+ICONS_48 = icons/hicolor/48x48/apps/pidgin.png
 
 PROTOCOLS_22_SCALABLE = \
 		protocols/22/scalable/aim.svg \
@@ -321,6 +363,24 @@
 		protocols/22/scalable/yahoo.svg \
 		protocols/22/scalable/zephyr.svg
 
+PROTOCOLS_22 = \
+		protocols/22/aim.png \
+		protocols/22/bonjour.png \
+		protocols/22/gadu-gadu.png \
+		protocols/22/google-talk.png \
+		protocols/22/novell.png \
+		protocols/22/icq.png \
+		protocols/22/irc.png \
+		protocols/22/jabber.png \
+		protocols/22/meanwhile.png \
+		protocols/22/msn.png \
+		protocols/22/myspace.png \
+		protocols/22/qq.png \
+		protocols/22/silc.png \
+		protocols/22/simple.png \
+		protocols/22/yahoo.png \
+		protocols/22/zephyr.png
+
 PROTOCOLS_48_SCALABLE = \
 		protocols/48/scalable/aim.svg \
 		protocols/48/scalable/bonjour.svg \
@@ -338,6 +398,23 @@
 		protocols/48/scalable/yahoo.svg \
 		protocols/48/scalable/zephyr.svg
 
+PROTOCOLS_48 = \
+		protocols/48/aim.png \
+		protocols/48/bonjour.png \
+		protocols/48/gadu-gadu.png \
+		protocols/48/novell.png \
+		protocols/48/icq.png \
+		protocols/48/irc.png \
+		protocols/48/jabber.png \
+		protocols/48/meanwhile.png \
+		protocols/48/msn.png \
+		protocols/48/myspace.png \
+		protocols/48/qq.png \
+		protocols/48/silc.png \
+		protocols/48/simple.png \
+		protocols/48/yahoo.png \
+		protocols/48/zephyr.png
+
 STATUS_11_SCALABLE = \
 		status/11/scalable/available.svg \
 		status/11/scalable/away.svg \
@@ -348,6 +425,21 @@
 		status/11/scalable/offline.svg \
 		status/11/scalable/person.svg
 
+STATUS_11 = \
+		status/11/available.png \
+		status/11/away.png \
+		status/11/busy.png \
+		status/11/chat.png \
+		status/11/extended-away.png \
+		status/11/invisible.png \
+		status/11/log-in.png \
+		status/11/log-out.png \
+		status/11/offline.png \
+		status/11/person.png
+
+STATUS_11_RTL = \
+		status/11/rtl/extended-away.png
+
 STATUS_16_SCALABLE = \
 		status/16/scalable/available.svg \
 		status/16/scalable/away.svg \
@@ -360,6 +452,23 @@
 		status/16/scalable/offline.svg \
 		status/16/scalable/person.svg
 
+STATUS_16 = \
+		status/16/available.png \
+		status/16/away.png \
+		status/16/busy.png \
+		status/16/chat.png \
+		status/16/extended-away.png \
+		status/16/invisible.png \
+		status/16/log-in.png \
+		status/16/log-out.png \
+		status/16/offline.png \
+		status/16/person.png
+
+STATUS_16_RTL = \
+		status/16/rtl/extended-away.png \
+		status/16/rtl/log-in.png \
+		status/16/rtl/log-out.png
+
 STATUS_22_SCALABLE = \
 		status/22/scalable/available.svg \
 		status/22/scalable/away.svg \
@@ -371,6 +480,23 @@
 		status/22/scalable/offline.svg \
 		status/22/scalable/person.svg
 
+STATUS_22 = \
+		status/22/available.png \
+		status/22/away.png \
+		status/22/busy.png \
+		status/22/chat.png \
+		status/22/extended-away.png \
+		status/22/invisible.png \
+		status/22/log-in.png \
+		status/22/log-out.png \
+		status/22/offline.png \
+		status/22/person.png
+
+STATUS_22_RTL = \
+		status/22/rtl/extended-away.png \
+		status/22/rtl/log-in.png \
+		status/22/rtl/log-out.png
+
 STATUS_32_SCALABLE = \
 		status/32/scalable/available.svg \
 		status/32/scalable/away.svg \
@@ -382,6 +508,37 @@
 		status/32/scalable/offline.svg \
 		status/32/scalable/person.svg
 
+STATUS_32 = \
+		status/32/available.png \
+		status/32/away.png \
+		status/32/busy.png \
+		status/32/chat.png \
+		status/32/extended-away.png \
+		status/32/invisible.png \
+		status/32/log-in.png \
+		status/32/log-out.png \
+		status/32/offline.png \
+		status/32/person.png
+
+STATUS_32_RTL = \
+		status/32/rtl/extended-away.png \
+		status/32/rtl/log-in.png \
+		status/32/rtl/log-out.png
+
+STATUS_48 = \
+		status/48/available.png \
+		status/48/away.png \
+		status/48/busy.png \
+		status/48/chat.png \
+		status/48/extended-away.png \
+		status/48/log-in.png \
+		status/48/log-out.png \
+		status/48/offline.png \
+		status/48/person.png
+
+STATUS_48_RTL = \
+		status/48/rtl/extended-away.png
+
 TOOLBAR_11 = \
 		toolbar/11/message-new.png
 
@@ -392,9 +549,27 @@
 		toolbar/16/scalable/font-size-down.svg \
 		toolbar/16/scalable/font-size-up.svg
 
+TOOLBAR_16 = \
+		toolbar/16/change-bgcolor.png \
+		toolbar/16/change-fgcolor.png \
+		toolbar/16/emote-select.png \
+		toolbar/16/font-face.png \
+		toolbar/16/font-size-down.png \
+		toolbar/16/font-size-up.png \
+		toolbar/16/insert.png \
+		toolbar/16/insert-image.png \
+		toolbar/16/insert-link.png \
+		toolbar/16/message-new.png \
+		toolbar/16/plugins.png \
+		toolbar/16/send-file.png \
+		toolbar/16/unblock.png
+
 TOOLBAR_22_SCALABLE = \
 		toolbar/22/scalable/select-avatar.svg
 
+TOOLBAR_22 = \
+		toolbar/22/select-avatar.png
+
 TRAY_16_SCALABLE = \
 		tray/16/scalable/tray-away.svg \
 		tray/16/scalable/tray-busy.svg \
@@ -405,9 +580,61 @@
 		tray/16/scalable/tray-offline.svg \
 		tray/16/scalable/tray-online.svg
 
+TRAY_16_ICO = \
+		tray/16/available_4bit.ico \
+		tray/16/away_4bit.ico \
+		tray/16/busy_4bit.ico \
+		tray/16/connecting_4bit.ico \
+		tray/16/extended-away_4bit.ico \
+		tray/16/invisible_4bit.ico \
+		tray/16/message_4bit.ico \
+		tray/16/offline_4bit.ico
+
+TRAY_16 = \
+		tray/16/tray-away.png \
+		tray/16/tray-busy.png \
+		tray/16/tray-invisible.png \
+		tray/16/tray-connecting.png \
+		tray/16/tray-extended-away.png \
+		tray/16/tray-message.png \
+		tray/16/tray-new-im.png \
+		tray/16/tray-offline.png \
+		tray/16/tray-online.png
+
 TRAY_22_SCALABLE = \
 		tray/22/scalable/tray-invisible.svg
 
+TRAY_22 = \
+		tray/22/tray-away.png \
+		tray/22/tray-busy.png \
+		tray/22/tray-connecting.png \
+		tray/22/tray-extended-away.png \
+		tray/22/tray-invisible.png \
+		tray/22/tray-message.png \
+		tray/22/tray-new-im.png \
+		tray/22/tray-offline.png \
+		tray/22/tray-online.png
+
+TRAY_32 = \
+		tray/32/tray-away.png \
+		tray/32/tray-busy.png \
+		tray/32/tray-connecting.png \
+		tray/32/tray-extended-away.png \
+		tray/32/tray-invisible.png \
+		tray/32/tray-new-im.png \
+		tray/32/tray-offline.png \
+		tray/32/tray-online.png
+
+TRAY_48 = \
+		tray/48/tray-away.png \
+		tray/48/tray-busy.png \
+		tray/48/tray-connecting.png \
+		tray/48/tray-extended-away.png \
+		tray/48/tray-invisible.png \
+		tray/48/tray-new-im.png \
+		tray/48/tray-offline.png \
+		tray/48/tray-online.png
+
 EXTRA_DIST = \
 		edit.png			\
 		info.png			\
@@ -439,6 +666,7 @@
 		$(TOOLBAR_11)		\
 		$(TOOLBAR_16_SCALABLE)	\
 		$(TOOLBAR_22_SCALABLE)	\
+		$(TRAY_16_ICO) \
 		$(TRAY_16_SCALABLE)	\
 		$(TRAY_22_SCALABLE)
 
@@ -448,4 +676,34 @@
 pidgindistpixdir = $(datadir)/pixmaps/pidgin
 pidgindistpix_DATA = logo.png arrow-down.xpm arrow-left.xpm arrow-right.xpm arrow-up.xpm
 
-nobase_dist_pidginpixmap_DATA = $(ANIMATIONS_16)
+nobase_dist_pidginpixmap_DATA = \
+		$(ANIMATIONS_16) \
+		$(DIALOGS_16) \
+		$(DIALOGS_64) \
+		$(EMBLEMS_16) \
+		$(PROTOCOLS_16) \
+		$(PROTOCOLS_22) \
+		$(PROTOCOLS_48) \
+		$(STATUS_11) \
+		$(STATUS_11_RTL) \
+		$(STATUS_16) \
+		$(STATUS_16_RTL) \
+		$(STATUS_22) \
+		$(STATUS_22_RTL) \
+		$(STATUS_32) \
+		$(STATUS_32_RTL) \
+		$(STATUS_48) \
+		$(STATUS_48_RTL) \
+		$(TOOLBAR_16) \
+		$(TOOLBAR_22) \
+		$(TRAY_16) \
+		$(TRAY_22) \
+		$(TRAY_32) \
+		$(TRAY_48)
+
+nobase_dist_pidginicons_DATA = \
+		$(ICONS_16) \
+		$(ICONS_22) \
+		$(ICONS_24) \
+		$(ICONS_32) \
+		$(ICONS_48)
--- a/pidgin/pixmaps/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/pixmaps/Makefile.mingw	Mon Nov 12 16:53:54 2007 +0000
@@ -15,9 +15,7 @@
 install:
 	if test '$(SUBDIRS)'; then \
 	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if [[ "$$subdir" != icons/* ]]; then \
 	    $(MAKE) -C $$subdir -f $(MINGW_MAKEFILE) install || exit 1 ;\
-	  fi \
 	  done; \
 	fi;
 	if test '$(nobase_dist_pidginpixmap_DATA)'; then \
--- a/pidgin/pixmaps/dialogs/16/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-EXTRA_DIST = 	auth.png \
-		error.png \
-		info.png \
-		mail.png \
-		question.png
-
-pidgindialogpixdir = $(datadir)/pixmaps/pidgin/dialogs/16
-
-pidgindialogpix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/dialogs/16/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidgindialogpix_DATA)'; then \
-	  mkdir -p $(pidgindialogpixdir); \
-	  cp $(pidgindialogpix_DATA) $(pidgindialogpixdir); \
-	fi;
-
--- a/pidgin/pixmaps/dialogs/64/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-EXTRA_DIST = 	auth.png \
-		cool.png \
-		dialog.png \
-		error.png \
-		info.png \
-		mail.png \
-		question.png \
-		warning.png
-
-pidgindialogpixdir = $(datadir)/pixmaps/pidgin/dialogs/64
-
-pidgindialogpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/dialogs/64/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidgindialogpix_DATA)'; then \
-	  mkdir -p $(pidgindialogpixdir); \
-	  cp $(pidgindialogpix_DATA) $(pidgindialogpixdir); \
-	fi;
-
--- a/pidgin/pixmaps/emblems/16/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-EXTRA_DIST = 	aol-client.png \
-		birthday.png \
-		blocked.png \
-		bot.png \
-		external.png \
-		female.png \
-		founder.png \
-		free-for-chat.png \
-		game.png \
-		half-operator.png \
-		hiptop.png \
-		male.png \
-		mobile.png \
-		music.png \
-		not-authorized.png \
-		operator.png \
-		qq-member.png \
-		secure.png \
-		unavailable.png \
-		video.png \
-		voice.png
-
-pidginemblempixdir = $(datadir)/pixmaps/pidgin/emblems/16
-pidginemblempix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/emblems/16/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginemblempix_DATA)'; then \
-	  mkdir -p $(pidginemblempixdir); \
-	  cp $(pidginemblempix_DATA) $(pidginemblempixdir); \
-	fi;
-
--- a/pidgin/pixmaps/emotes/default/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-include ./Makefile.am
-
-.PHONY: install clean
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \
-	  done; \
-	fi;
-
-clean:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f Makefile.mingw clean || exit 1; \
-	  done; \
-	fi;
-
--- a/pidgin/pixmaps/icons/16/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = pidgin.png 
-
-pidginiconspixdir = $(datadir)/icons/hicolor/16x16/apps
-
-pidginiconspix_DATA = $(EXTRA_DIST)
-
Binary file pidgin/pixmaps/icons/16/pidgin.png has changed
--- a/pidgin/pixmaps/icons/16/scalable/pidgin.svg	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,784 +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://web.resource.org/cc/"
-   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="16"
-   height="16"
-   id="svg4345"
-   sodipodi:version="0.32"
-   inkscape:version="0.44.1"
-   sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/16/scalable"
-   sodipodi:docname="pidgin.svg"
-   inkscape:export-filename="/home/hbons/Desktop/pidgin16.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   version="1.0">
-  <defs
-     id="defs4347">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3157">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop3159" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop3161" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3149">
-      <stop
-         style="stop-color:#3b1941;stop-opacity:1;"
-         offset="0"
-         id="stop3151" />
-      <stop
-         style="stop-color:#3b1941;stop-opacity:0;"
-         offset="1"
-         id="stop3153" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3141">
-      <stop
-         style="stop-color:#82508e;stop-opacity:1;"
-         offset="0"
-         id="stop3143" />
-      <stop
-         style="stop-color:#82508e;stop-opacity:0;"
-         offset="1"
-         id="stop3145" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3128">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop3130" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop3132" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5438">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop5440" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop5442" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6817">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6819" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6821" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6537">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6539" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6541" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6506">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop6508" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop6510" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5280">
-      <stop
-         style="stop-color:#82508e;stop-opacity:1;"
-         offset="0"
-         id="stop5282" />
-      <stop
-         style="stop-color:#82508e;stop-opacity:0;"
-         offset="1"
-         id="stop5284" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2804">
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="0"
-         id="stop2806" />
-      <stop
-         id="stop2812"
-         offset="0.5"
-         style="stop-color:black;stop-opacity:1;" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop2808" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25572"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836637"
-       cy="1.5104795"
-       fx="7.8836637"
-       fy="1.5104795"
-       r="8.4883642" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25568"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836741"
-       cy="0.14505707"
-       fx="7.8836741"
-       fy="0.14505707"
-       r="8.4883642" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient25546">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop25548" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop25550" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25554"
-       cx="7.8836637"
-       cy="2.6242435"
-       fx="7.8836637"
-       fy="2.6242435"
-       r="8.4883642"
-       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient3800">
-      <stop
-         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
-         offset="0.0000000"
-         id="stop3802" />
-      <stop
-         style="stop-color:#df9725;stop-opacity:1.0000000;"
-         offset="1.0000000"
-         id="stop3804" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5280"
-       id="radialGradient5286"
-       cx="15.004828"
-       cy="39.80859"
-       fx="15.004828"
-       fy="39.80859"
-       r="9.7225161"
-       gradientTransform="matrix(1,0,0,0.732283,0,10.65742)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6537"
-       id="linearGradient6543"
-       x1="30.5"
-       y1="0.033532728"
-       x2="30.5"
-       y2="23.559282"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6817"
-       id="linearGradient6823"
-       x1="0.23931108"
-       y1="38.950283"
-       x2="5.7089725"
-       y2="42.982571"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.63556,0,0,0.371995,11.16667,-5.489292)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5438"
-       id="linearGradient5444"
-       x1="30.152058"
-       y1="-0.86487341"
-       x2="30.152058"
-       y2="23.011967"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3976">
-      <stop
-         style="stop-color:#3b1941;stop-opacity:1;"
-         offset="0"
-         id="stop3978" />
-      <stop
-         style="stop-color:#3b1941;stop-opacity:0;"
-         offset="1"
-         id="stop3980" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3968">
-      <stop
-         style="stop-color:#82508e;stop-opacity:1;"
-         offset="0"
-         id="stop3970" />
-      <stop
-         style="stop-color:#82508e;stop-opacity:0;"
-         offset="1"
-         id="stop3972" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3958">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop3960" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop3962" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2850">
-      <stop
-         style="stop-color:#ce5c00;stop-opacity:1;"
-         offset="0"
-         id="stop2852" />
-      <stop
-         style="stop-color:#ce5c00;stop-opacity:0;"
-         offset="1"
-         id="stop2854" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6563">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6565" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6567" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2110">
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="0"
-         id="stop2112" />
-      <stop
-         id="stop2114"
-         offset="0.5"
-         style="stop-color:black;stop-opacity:1;" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop2067" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient2069"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836637"
-       cy="1.5104795"
-       fx="7.8836637"
-       fy="1.5104795"
-       r="8.4883642" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient2071"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836741"
-       cy="0.14505707"
-       fx="7.8836741"
-       fy="0.14505707"
-       r="8.4883642" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient2079"
-       cx="7.8836637"
-       cy="2.6242435"
-       fx="7.8836637"
-       fy="2.6242435"
-       r="8.4883642"
-       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient2081">
-      <stop
-         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
-         offset="0.0000000"
-         id="stop2104" />
-      <stop
-         style="stop-color:#df9725;stop-opacity:1.0000000;"
-         offset="1.0000000"
-         id="stop2085" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient2101"
-       x1="15.645709"
-       y1="39.743458"
-       x2="14.943421"
-       y2="50.079575"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6537"
-       id="linearGradient2089"
-       x1="30.5"
-       y1="0.033532728"
-       x2="30.5"
-       y2="23.559282"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6563"
-       id="linearGradient6569"
-       x1="-1.6841649"
-       y1="39.902092"
-       x2="5.5366187"
-       y2="44.272076"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="23.011967"
-       x2="30.152058"
-       y1="-0.86487341"
-       x1="30.152058"
-       id="linearGradient2097"
-       xlink:href="#linearGradient5438"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="42.982571"
-       x2="5.7089725"
-       y1="38.950283"
-       x1="0.23931108"
-       id="linearGradient2095"
-       xlink:href="#linearGradient6817"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="50.726673"
-       x2="15.645709"
-       y1="40.434063"
-       x1="15.645709"
-       id="linearGradient2093"
-       xlink:href="#linearGradient6506"
-       inkscape:collect="always" />
-    <linearGradient
-       id="linearGradient2087">
-      <stop
-         id="stop2089"
-         offset="0.0000000"
-         style="stop-color:#f4d9b1;stop-opacity:1.0000000;" />
-      <stop
-         id="stop2091"
-         offset="1.0000000"
-         style="stop-color:#df9725;stop-opacity:1.0000000;" />
-    </linearGradient>
-    <radialGradient
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
-       r="8.4883642"
-       fy="2.6242435"
-       fx="7.8836637"
-       cy="2.6242435"
-       cx="7.8836637"
-       id="radialGradient2085"
-       xlink:href="#linearGradient25546"
-       inkscape:collect="always" />
-    <radialGradient
-       r="8.4883642"
-       fy="0.14505707"
-       fx="7.8836741"
-       cy="0.14505707"
-       cx="7.8836741"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient2077"
-       xlink:href="#linearGradient25546"
-       inkscape:collect="always" />
-    <radialGradient
-       r="8.4883642"
-       fy="1.5104795"
-       fx="7.8836637"
-       cy="1.5104795"
-       cx="7.8836637"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient2075"
-       xlink:href="#linearGradient25546"
-       inkscape:collect="always" />
-    <linearGradient
-       id="linearGradient2067">
-      <stop
-         id="stop2069"
-         offset="0"
-         style="stop-color:black;stop-opacity:0;" />
-      <stop
-         style="stop-color:black;stop-opacity:1;"
-         offset="0.5"
-         id="stop2071" />
-      <stop
-         id="stop2073"
-         offset="1"
-         style="stop-color:black;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3108"
-       inkscape:collect="always">
-      <stop
-         id="stop3110"
-         offset="0"
-         style="stop-color:#eeeeec;stop-opacity:1;" />
-      <stop
-         id="stop3112"
-         offset="1"
-         style="stop-color:#eeeeec;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3116"
-       inkscape:collect="always">
-      <stop
-         id="stop3118"
-         offset="0"
-         style="stop-color:#82508e;stop-opacity:1;" />
-      <stop
-         id="stop3120"
-         offset="1"
-         style="stop-color:#82508e;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3124"
-       inkscape:collect="always">
-      <stop
-         id="stop3126"
-         offset="0"
-         style="stop-color:#3b1941;stop-opacity:1;" />
-      <stop
-         id="stop3128"
-         offset="1"
-         style="stop-color:#3b1941;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2850"
-       id="linearGradient2187"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.769231,0,0,0.714287,47.76924,-9.285729)"
-       x1="21.785719"
-       y1="28.142857"
-       x2="17.785713"
-       y2="30.07143" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2850"
-       id="linearGradient2195"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.769231,0,0,0.714287,13.76923,-8.28573)"
-       x1="21.785719"
-       y1="28.142857"
-       x2="17.785713"
-       y2="30.07143" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3958"
-       id="radialGradient2209"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.116159,0,0,1.076653,14.60502,-22.28695)"
-       cx="9.0640488"
-       cy="21.511742"
-       fx="9.0640488"
-       fy="21.511742"
-       r="16.663956" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient2211"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.660903,0,0,0.627207,18.73149,-12.3201)"
-       x1="15.645709"
-       y1="39.743458"
-       x2="15.645709"
-       y2="53.502155" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3968"
-       id="linearGradient2214"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.67692,0,0,0.646801,18.46433,-12.90841)"
-       x1="16.13257"
-       y1="40.781811"
-       x2="16.13257"
-       y2="48.068741" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3976"
-       id="linearGradient2216"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.67692,0,0,0.646801,18.46433,-12.90841)"
-       x1="12.095973"
-       y1="40.907658"
-       x2="12.095973"
-       y2="46.463146" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6537"
-       id="linearGradient2219"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.668893,0,0,0.668627,18.08624,-12.19246)"
-       x1="30.5"
-       y1="0.033532728"
-       x2="30.5"
-       y2="23.559282" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3108"
-       id="linearGradient2229"
-       gradientUnits="userSpaceOnUse"
-       x1="10.18327"
-       y1="16.618088"
-       x2="27.598003"
-       y2="36.64465"
-       gradientTransform="matrix(0.660903,0,0,0.627207,49.74106,-7.361383)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient2231"
-       gradientUnits="userSpaceOnUse"
-       x1="15.645709"
-       y1="39.743458"
-       x2="15.645709"
-       y2="53.502155"
-       gradientTransform="matrix(0.660903,0,0,0.627207,49.74106,-7.361383)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3116"
-       id="linearGradient2234"
-       gradientUnits="userSpaceOnUse"
-       x1="15.722902"
-       y1="39.585075"
-       x2="15.722902"
-       y2="45.76453"
-       gradientTransform="matrix(0.67692,0,0,0.646801,49.4739,-7.949693)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3124"
-       id="linearGradient2236"
-       gradientUnits="userSpaceOnUse"
-       x1="13.150809"
-       y1="39.39394"
-       x2="13.150809"
-       y2="45.551888"
-       gradientTransform="matrix(0.67692,0,0,0.646801,49.4739,-7.949693)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3128"
-       id="linearGradient3134"
-       x1="8.0725698"
-       y1="17.765934"
-       x2="24.284664"
-       y2="37.578945"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3141"
-       id="linearGradient3147"
-       x1="12.353984"
-       y1="38.611191"
-       x2="12.353984"
-       y2="45.595356"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3149"
-       id="linearGradient3155"
-       x1="10.166225"
-       y1="38.766953"
-       x2="10.166225"
-       y2="45.595673"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3157"
-       id="linearGradient3163"
-       x1="11.982447"
-       y1="39.088425"
-       x2="11.982447"
-       y2="45.778931"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="30.009658"
-     inkscape:cx="15.476031"
-     inkscape:cy="9.174961"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1434"
-     inkscape:window-height="840"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:grid-points="false"
-     width="16px"
-     height="16px"
-     inkscape:object-bbox="true" />
-  <metadata
-     id="metadata4350">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       style="opacity:1;fill:#75507b;fill-opacity:1"
-       d="M 36.0625,8 C 33.978257,8 33.334928,10.523086 34.78125,12.9375 C 35.250389,13.720651 36.674297,15.15311 36.86722,15.15311 L 36.878267,14.508325 C 36.288194,13.580567 35.517363,12.502064 35.686987,12.281543 C 37.835781,12.281543 38,11.491782 38,10.027674 C 38,8.7542399 37.228501,8 36.0625,8 z "
-       id="path6521"
-       transform="matrix(1.148904,0,0,0.920169,-34.28919,-3.241212)"
-       sodipodi:nodetypes="csccccc" />
-    <path
-       style="opacity:1;fill:url(#linearGradient3147);fill-opacity:1.0;stroke:url(#linearGradient3155);stroke-width:2.30209565;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 3,31.153143 2.9750563,38.402618 2.9750563,45.572826 C 4.1625449,45.572826 27.946366,45.600605 30.637365,45.600605 C 32.751492,45.600605 32.586331,43.541005 32.586331,43.541005 C 32.586331,40.875594 27.597902,38.639057 25.813453,36.682531 C 23.985035,34.68151 26,30.884078 26,30.884078 C 26.641306,29.354278 28.01889,26.891006 28.01889,25.115922 C 28.01889,18.215923 21.624002,13 15,13 z "
-       id="path5176"
-       sodipodi:nodetypes="ccccszcsc"
-       transform="matrix(0.43939,0,0,0.42944,-0.819445,-4.082726)" />
-    <rect
-       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect6331"
-       width="2.6154532"
-       height="1.1545694"
-       x="5.513658"
-       y="6.4806929"
-       rx="0.48532724"
-       ry="0.32910046"
-       transform="matrix(1.147027,0,0,0.866113,-0.324314,2.386999)" />
-    <path
-       transform="matrix(0.399589,0,0,0.393554,-5.973603e-2,-3.038964)"
-       style="opacity:0.5;fill:url(#linearGradient3134);fill-opacity:1.0;stroke:url(#linearGradient3163);stroke-width:2.5216887;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0617033,25.489349 4.0625,25.5 C 4.0625,32.787473 3.9033639,38.26012 3.9033639,44.499878 C 5.8399452,44.499878 24.86993,44.470084 30.695903,44.470084 C 29.746978,42.549359 26.273076,40.711023 23.972608,38.78763 C 23.362603,37.973536 23.023697,35.459892 22.969233,34.418473 C 23.611113,31.359155 25.129532,28.401757 26.527172,25.440129 C 26.527172,19.094533 21.022436,14.0625 15,14.0625 z "
-       id="path5241"
-       sodipodi:nodetypes="csccccccc" />
-    <path
-       style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 6,7.2175674 C 6,8.8735678 4.5070272,10 3.4999996,10 C 2.1199999,10 1,8.6559998 1,6.9999995 C 1,5.5609093 1.7677476,4 3.1477475,4 C 4.5277481,4 6,5.9092686 6,7.2175674 z "
-       id="path3137"
-       sodipodi:nodetypes="csssc" />
-    <path
-       transform="matrix(0.626764,0,0,0.689441,-3.309086,-9.833164)"
-       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
-       id="path5157"
-       sodipodi:nodetypes="csssc" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5162"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(0.805757,0,0,1.158623,-4.194263,-20.66902)" />
-    <path
-       style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 11.387086,4.6790601 C 10.509745,3.6558267 9.0824486,3.9284339 8.5222543,4.5817815 C 7.7545814,5.4771092 7.8435868,7.0342022 8.7209273,8.0574357 C 9.4833498,8.9466415 10.737398,9.413013 11.505071,8.5176851 C 12.272744,7.6223568 12.080215,5.4874505 11.387086,4.6790601 z "
-       id="path3139"
-       sodipodi:nodetypes="csssc" />
-    <path
-       transform="matrix(0.29055,-0.412361,-0.273947,-0.388798,13.58792,20.45445)"
-       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
-       id="path5169"
-       sodipodi:nodetypes="csssc" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5171"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(0.805754,0,0,1.158626,0.805772,-20.66909)" />
-    <path
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M -3.174544e-16,1.7837407 C 0.49897694,0.43045085 3.4176637,1.3941391 4.4321866,1.7478251 L 2.7448964,2 L -3.174544e-16,1.7837407 z "
-       id="path5192"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 4,8.9694498 C 6.5363255,9.6796143 7.1434322,8 7.6676187,8 C 8.1845929,8 8.1150542,9.7216455 10.752536,9.1373864 C 10.257681,9.8617678 8.7366795,11 8.0954601,11 C 7.4470215,11 4.8041406,10.039472 4,8.9694498 z "
-       id="path3987"
-       sodipodi:nodetypes="czczc" />
-    <path
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 2.5678134,0.78213791 C 3.0667903,-0.57115198 7,-0.11652293 7,1.7459005 L 5.3127098,0.99839721 L 2.5678134,0.78213791 z "
-       id="path1991"
-       sodipodi:nodetypes="cccc" />
-  </g>
-</svg>
--- a/pidgin/pixmaps/icons/22/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = pidgin.png 
-
-pidginiconspixdir = $(datadir)/icons/hicolor/22x22/apps
-
-pidginiconspix_DATA = $(EXTRA_DIST)
-
Binary file pidgin/pixmaps/icons/22/pidgin.png has changed
--- a/pidgin/pixmaps/icons/22/scalable/pidgin.svg	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,591 +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://web.resource.org/cc/"
-   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="22"
-   height="22"
-   id="svg4345"
-   sodipodi:version="0.32"
-   inkscape:version="0.44.1"
-   sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable"
-   sodipodi:docname="pidgin.svg"
-   inkscape:export-filename="/home/hbons/Desktop/pidgin24.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   version="1.0">
-  <defs
-     id="defs4347">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3124">
-      <stop
-         style="stop-color:#3b1941;stop-opacity:1;"
-         offset="0"
-         id="stop3126" />
-      <stop
-         style="stop-color:#3b1941;stop-opacity:0;"
-         offset="1"
-         id="stop3128" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3116">
-      <stop
-         style="stop-color:#82508e;stop-opacity:1;"
-         offset="0"
-         id="stop3118" />
-      <stop
-         style="stop-color:#82508e;stop-opacity:0;"
-         offset="1"
-         id="stop3120" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3108">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop3110" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop3112" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5438">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop5440" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop5442" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6817">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6819" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6821" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6537">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6539" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6541" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6506">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop6508" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop6510" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2804">
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="0"
-         id="stop2806" />
-      <stop
-         id="stop2812"
-         offset="0.5"
-         style="stop-color:black;stop-opacity:1;" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop2808" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25572"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836637"
-       cy="1.5104795"
-       fx="7.8836637"
-       fy="1.5104795"
-       r="8.4883642" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25568"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836741"
-       cy="0.14505707"
-       fx="7.8836741"
-       fy="0.14505707"
-       r="8.4883642" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient25546">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop25548" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop25550" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25554"
-       cx="7.8836637"
-       cy="2.6242435"
-       fx="7.8836637"
-       fy="2.6242435"
-       r="8.4883642"
-       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient3800">
-      <stop
-         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
-         offset="0.0000000"
-         id="stop3802" />
-      <stop
-         style="stop-color:#df9725;stop-opacity:1.0000000;"
-         offset="1.0000000"
-         id="stop3804" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient6512"
-       x1="15.645709"
-       y1="39.029884"
-       x2="15.645709"
-       y2="43.206608"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6817"
-       id="linearGradient6823"
-       x1="0.23931108"
-       y1="38.950283"
-       x2="5.7089725"
-       y2="42.982571"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5438"
-       id="linearGradient5444"
-       x1="30.152058"
-       y1="-0.86487341"
-       x2="30.152058"
-       y2="23.011967"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="44.272076"
-       x2="5.5366187"
-       y1="39.902092"
-       x1="-1.6841649"
-       id="linearGradient6569"
-       xlink:href="#linearGradient6563"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="23.559282"
-       x2="30.5"
-       y1="0.033532728"
-       x1="30.5"
-       id="linearGradient2089"
-       xlink:href="#linearGradient6537"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="50.079575"
-       x2="14.943421"
-       y1="39.743458"
-       x1="15.645709"
-       id="linearGradient2087"
-       xlink:href="#linearGradient6506"
-       inkscape:collect="always" />
-    <linearGradient
-       id="linearGradient2081">
-      <stop
-         id="stop2083"
-         offset="0.0000000"
-         style="stop-color:#f4d9b1;stop-opacity:1.0000000;" />
-      <stop
-         id="stop2085"
-         offset="1.0000000"
-         style="stop-color:#df9725;stop-opacity:1.0000000;" />
-    </linearGradient>
-    <radialGradient
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
-       r="8.4883642"
-       fy="2.6242435"
-       fx="7.8836637"
-       cy="2.6242435"
-       cx="7.8836637"
-       id="radialGradient2079"
-       xlink:href="#linearGradient25546"
-       inkscape:collect="always" />
-    <radialGradient
-       r="8.4883642"
-       fy="0.14505707"
-       fx="7.8836741"
-       cy="0.14505707"
-       cx="7.8836741"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient2071"
-       xlink:href="#linearGradient25546"
-       inkscape:collect="always" />
-    <radialGradient
-       r="8.4883642"
-       fy="1.5104795"
-       fx="7.8836637"
-       cy="1.5104795"
-       cx="7.8836637"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient2069"
-       xlink:href="#linearGradient25546"
-       inkscape:collect="always" />
-    <linearGradient
-       id="linearGradient2061">
-      <stop
-         id="stop2063"
-         offset="0"
-         style="stop-color:black;stop-opacity:0;" />
-      <stop
-         style="stop-color:black;stop-opacity:1;"
-         offset="0.5"
-         id="stop2065" />
-      <stop
-         id="stop2067"
-         offset="1"
-         style="stop-color:black;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient6563"
-       inkscape:collect="always">
-      <stop
-         id="stop6565"
-         offset="0"
-         style="stop-color:white;stop-opacity:1;" />
-      <stop
-         id="stop6567"
-         offset="1"
-         style="stop-color:white;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2850"
-       inkscape:collect="always">
-      <stop
-         id="stop2852"
-         offset="0"
-         style="stop-color:#ce5c00;stop-opacity:1;" />
-      <stop
-         id="stop2854"
-         offset="1"
-         style="stop-color:#ce5c00;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3958"
-       inkscape:collect="always">
-      <stop
-         id="stop3960"
-         offset="0"
-         style="stop-color:#eeeeec;stop-opacity:1;" />
-      <stop
-         id="stop3962"
-         offset="1"
-         style="stop-color:#eeeeec;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3968"
-       inkscape:collect="always">
-      <stop
-         id="stop3970"
-         offset="0"
-         style="stop-color:#82508e;stop-opacity:1;" />
-      <stop
-         id="stop3972"
-         offset="1"
-         style="stop-color:#82508e;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3976"
-       inkscape:collect="always">
-      <stop
-         id="stop3978"
-         offset="0"
-         style="stop-color:#3b1941;stop-opacity:1;" />
-      <stop
-         id="stop3980"
-         offset="1"
-         style="stop-color:#3b1941;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2850"
-       id="linearGradient2149"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.769231,0,0,0.714287,-34.23081,-12.28573)"
-       x1="21.785719"
-       y1="28.142857"
-       x2="17.785713"
-       y2="30.07143" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3958"
-       id="radialGradient2191"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.116159,0,0,1.076653,-36.39499,-20.28695)"
-       cx="9.0640488"
-       cy="21.511742"
-       fx="9.0640488"
-       fy="21.511742"
-       r="16.663956" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient2193"
-       gradientUnits="userSpaceOnUse"
-       x1="15.645709"
-       y1="39.743458"
-       x2="15.645709"
-       y2="53.502155"
-       gradientTransform="matrix(0.660903,0,0,0.627207,-32.26852,-10.3201)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3968"
-       id="linearGradient2196"
-       gradientUnits="userSpaceOnUse"
-       x1="16.13257"
-       y1="40.781811"
-       x2="16.13257"
-       y2="48.068741"
-       gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3976"
-       id="linearGradient2198"
-       gradientUnits="userSpaceOnUse"
-       x1="12.095973"
-       y1="40.907658"
-       x2="12.095973"
-       y2="46.463146"
-       gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6537"
-       id="linearGradient2201"
-       gradientUnits="userSpaceOnUse"
-       x1="30.5"
-       y1="0.033532728"
-       x2="30.5"
-       y2="23.559282"
-       gradientTransform="matrix(0.668893,0,0,0.668627,-32.91377,-10.19246)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3108"
-       id="linearGradient3114"
-       x1="10.18327"
-       y1="16.618088"
-       x2="27.598003"
-       y2="36.64465"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3116"
-       id="linearGradient3122"
-       x1="15.722902"
-       y1="38.768803"
-       x2="15.722902"
-       y2="43.249905"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3124"
-       id="linearGradient3130"
-       x1="13.150809"
-       y1="38.849556"
-       x2="13.150809"
-       y2="43.105652"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2850"
-       id="linearGradient3146"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.769231,0,0,0.714287,-3.230767,-7.285729)"
-       x1="21.785719"
-       y1="28.142857"
-       x2="17.785713"
-       y2="30.07143" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5438"
-       id="linearGradient2848"
-       gradientUnits="userSpaceOnUse"
-       x1="30.152058"
-       y1="-0.86487341"
-       x2="30.152058"
-       y2="23.011967" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.743067"
-     inkscape:cx="23.715241"
-     inkscape:cy="10.08258"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1434"
-     inkscape:window-height="840"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:grid-points="false"
-     width="22px"
-     height="22px"
-     inkscape:object-bbox="true" />
-  <metadata
-     id="metadata4350">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       style="opacity:1;fill:#75507b;fill-opacity:1"
-       d="M 36.0625,8 C 33.978257,8 33.334928,10.523086 34.78125,12.9375 C 35.250389,13.720651 36.674297,15.15311 36.86722,15.15311 L 36.878267,14.508325 C 36.288194,13.580567 35.517363,12.502064 35.686987,12.281543 C 37.835781,12.281543 38,11.491782 38,10.027674 C 38,8.7542399 37.228501,8 36.0625,8 z "
-       id="path6521"
-       transform="matrix(1.747787,0,0,1.397993,-52.41719,-5.183942)"
-       sodipodi:nodetypes="csccccc" />
-    <path
-       style="opacity:1;fill:url(#linearGradient3122);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:1.51128328;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 3,31.153143 2.9750563,38.402618 2.9750563,45.572826 C 4.1625449,45.572826 27.946366,45.600605 30.637365,45.600605 C 32.751492,45.600605 32.586331,43.541005 32.586331,43.541005 C 32.586331,40.875594 27.597902,38.639057 25.813453,36.682531 C 23.985035,34.68151 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z "
-       id="path5176"
-       sodipodi:nodetypes="ccccszcsc"
-       transform="matrix(0.67692,0,0,0.646801,-1.52611,-5.949693)" />
-    <path
-       transform="matrix(0.660903,0,0,0.627207,-1.258953,-5.361383)"
-       style="opacity:0.5;fill:url(#linearGradient3114);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:1.55319393;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0617033,25.489349 4.0625,25.5 C 4.0625,32.787473 3.9033639,38.26012 3.9033639,44.499878 C 5.8399452,44.499878 22.452275,44.470084 28.278248,44.470084 C 29.445455,44.470084 31.431654,44.974157 31.431654,43.509594 C 31.431654,43.287851 31.231903,42.870917 30.681654,42.353344 C 30.131405,41.835771 29.308414,41.280003 28.400404,40.728344 C 26.665321,39.858723 25.411769,39.090553 24.621247,37.290844 C 24.011242,36.47675 23.731303,35.519763 23.676839,34.478344 C 23.622375,33.436925 24.107721,32.319635 24.224561,31.259594 C 24.458241,29.139511 24.96875,30.28125 24.96875,30.28125 C 24.98374,30.216952 25.004663,30.154183 25.03125,30.09375 C 25.618731,28.692346 25.9375,27.131297 25.9375,25.5 C 25.9375,19.154404 21.022436,14.0625 15,14.0625 z "
-       id="path5241"
-       sodipodi:nodetypes="cscccssccsscssc" />
-    <path
-       style="fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 3.072604,7.0864988 C 4.607952,5.4493238 7.105721,5.8854918 8.086061,6.9308478 C 9.4294869,8.3633698 9.273726,10.85472 7.738379,12.491894 C 6.404137,13.914624 4.209552,14.660821 2.866124,13.228299 C 1.522696,11.795776 1.859625,8.3799248 3.072604,7.0864988 z "
-       id="path3138"
-       sodipodi:nodetypes="csssc" />
-    <path
-       transform="matrix(1.010846,0,0,1.029732,-5.552971,-15.17001)"
-       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
-       id="path5157"
-       sodipodi:nodetypes="csssc" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5162"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(1.208633,0,0,1.158621,-6.791366,-17.66897)" />
-    <path
-       transform="matrix(0.670792,0,0,0.486348,-3.805943,-3.90166)"
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 11.651119,11.193815 C 13.577759,8.2509126 16.249277,11.481501 17.614226,12.804399 L 14.761306,13.747613 L 11.651119,11.193815 z "
-       id="path5192"
-       sodipodi:nodetypes="cccc" />
-    <path
-       transform="matrix(0.851014,0,0,0.554879,-3.938174,-5.194599)"
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.174576,11.994261 17.519594,13.650486 L 14.543472,12.891665 L 11.689238,9.8218679 z "
-       id="rect5189"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 16.371022,7.8148748 C 15.47069,6.586993 14.005993,6.9141191 13.43112,7.6981356 C 12.643332,8.7725276 12.734671,10.64104 13.635002,11.868921 C 14.417404,12.93597 15.704314,13.495617 16.492103,12.421225 C 17.279892,11.346833 17.082315,8.7849447 16.371022,7.8148748 z "
-       id="path3132"
-       sodipodi:nodetypes="csssc" />
-    <path
-       style="fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 16.502957,8.5432477 C 15.827476,7.7246593 14.728576,7.9427464 14.297274,8.4654263 C 13.706229,9.1816906 13.774757,10.427368 14.450238,11.245957 C 15.037241,11.957323 16.002754,12.33042 16.593798,11.614156 C 17.184843,10.897891 17.03661,9.1899614 16.502957,8.5432477 z "
-       id="path3134"
-       sodipodi:nodetypes="csssc" />
-    <path
-       sodipodi:type="arc"
-       style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path3136"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(1.153827,0,0,1.158621,3.593156,-17.66895)" />
-    <rect
-       style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect3140"
-       width="4.4400907"
-       height="1"
-       x="8.5358553"
-       y="13"
-       rx="0.69182354"
-       ry="0.5" />
-    <path
-       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 6,13.893438 C 11.088512,17.243015 10.655188,12 11.431469,12 C 12.197069,12 11.699301,17.201991 16,13.895644 C 15.267157,15.102946 13.014668,17 12.06507,17 C 11.104781,17 7.190872,15.676807 6,13.893438 z "
-       id="path3142"
-       sodipodi:nodetypes="czczc" />
-    <path
-       style="fill:url(#linearGradient3146);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 6,13.893439 C 10.740404,18.171305 10.655188,12 11.431469,12 C 12.197069,12 11.641283,17.027939 16,13.895646 C 15.267157,15.102947 13.014668,17 12.06507,17 C 11.104781,17 7.190873,15.676809 6,13.893439 z "
-       id="path3144"
-       sodipodi:nodetypes="czczc" />
-  </g>
-</svg>
--- a/pidgin/pixmaps/icons/24/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = pidgin.png 
-
-pidginiconspixdir = $(datadir)/icons/hicolor/24x24/apps
-
-pidginiconspix_DATA = $(EXTRA_DIST)
-
Binary file pidgin/pixmaps/icons/24/pidgin.png has changed
--- a/pidgin/pixmaps/icons/24/scalable/pidgin.svg	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,589 +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://web.resource.org/cc/"
-   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="svg4345"
-   sodipodi:version="0.32"
-   inkscape:version="0.44.1"
-   sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable"
-   sodipodi:docname="pidgin.svg"
-   inkscape:export-filename="/home/hbons/Desktop/pidgin24.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   version="1.0">
-  <defs
-     id="defs4347">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3124">
-      <stop
-         style="stop-color:#3b1941;stop-opacity:1;"
-         offset="0"
-         id="stop3126" />
-      <stop
-         style="stop-color:#3b1941;stop-opacity:0;"
-         offset="1"
-         id="stop3128" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3116">
-      <stop
-         style="stop-color:#82508e;stop-opacity:1;"
-         offset="0"
-         id="stop3118" />
-      <stop
-         style="stop-color:#82508e;stop-opacity:0;"
-         offset="1"
-         id="stop3120" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3108">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop3110" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop3112" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5438">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop5440" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop5442" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6817">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6819" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6821" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6537">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6539" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6541" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6506">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop6508" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop6510" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2804">
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="0"
-         id="stop2806" />
-      <stop
-         id="stop2812"
-         offset="0.5"
-         style="stop-color:black;stop-opacity:1;" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop2808" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25572"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836637"
-       cy="1.5104795"
-       fx="7.8836637"
-       fy="1.5104795"
-       r="8.4883642" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25568"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836741"
-       cy="0.14505707"
-       fx="7.8836741"
-       fy="0.14505707"
-       r="8.4883642" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient25546">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop25548" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop25550" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25554"
-       cx="7.8836637"
-       cy="2.6242435"
-       fx="7.8836637"
-       fy="2.6242435"
-       r="8.4883642"
-       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient3800">
-      <stop
-         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
-         offset="0.0000000"
-         id="stop3802" />
-      <stop
-         style="stop-color:#df9725;stop-opacity:1.0000000;"
-         offset="1.0000000"
-         id="stop3804" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient6512"
-       x1="15.645709"
-       y1="39.029884"
-       x2="15.645709"
-       y2="43.206608"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.660903,0,0,0.627207,-0.293224,-4.361383)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6817"
-       id="linearGradient6823"
-       x1="0.23931108"
-       y1="38.950283"
-       x2="5.7089725"
-       y2="42.982571"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5438"
-       id="linearGradient5444"
-       x1="30.152058"
-       y1="-0.86487341"
-       x2="30.152058"
-       y2="23.011967"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="44.272076"
-       x2="5.5366187"
-       y1="39.902092"
-       x1="-1.6841649"
-       id="linearGradient6569"
-       xlink:href="#linearGradient6563"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="23.559282"
-       x2="30.5"
-       y1="0.033532728"
-       x1="30.5"
-       id="linearGradient2089"
-       xlink:href="#linearGradient6537"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="50.079575"
-       x2="14.943421"
-       y1="39.743458"
-       x1="15.645709"
-       id="linearGradient2087"
-       xlink:href="#linearGradient6506"
-       inkscape:collect="always" />
-    <linearGradient
-       id="linearGradient2081">
-      <stop
-         id="stop2083"
-         offset="0.0000000"
-         style="stop-color:#f4d9b1;stop-opacity:1.0000000;" />
-      <stop
-         id="stop2085"
-         offset="1.0000000"
-         style="stop-color:#df9725;stop-opacity:1.0000000;" />
-    </linearGradient>
-    <radialGradient
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
-       r="8.4883642"
-       fy="2.6242435"
-       fx="7.8836637"
-       cy="2.6242435"
-       cx="7.8836637"
-       id="radialGradient2079"
-       xlink:href="#linearGradient25546"
-       inkscape:collect="always" />
-    <radialGradient
-       r="8.4883642"
-       fy="0.14505707"
-       fx="7.8836741"
-       cy="0.14505707"
-       cx="7.8836741"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient2071"
-       xlink:href="#linearGradient25546"
-       inkscape:collect="always" />
-    <radialGradient
-       r="8.4883642"
-       fy="1.5104795"
-       fx="7.8836637"
-       cy="1.5104795"
-       cx="7.8836637"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient2069"
-       xlink:href="#linearGradient25546"
-       inkscape:collect="always" />
-    <linearGradient
-       id="linearGradient2061">
-      <stop
-         id="stop2063"
-         offset="0"
-         style="stop-color:black;stop-opacity:0;" />
-      <stop
-         style="stop-color:black;stop-opacity:1;"
-         offset="0.5"
-         id="stop2065" />
-      <stop
-         id="stop2067"
-         offset="1"
-         style="stop-color:black;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient6563"
-       inkscape:collect="always">
-      <stop
-         id="stop6565"
-         offset="0"
-         style="stop-color:white;stop-opacity:1;" />
-      <stop
-         id="stop6567"
-         offset="1"
-         style="stop-color:white;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2850"
-       inkscape:collect="always">
-      <stop
-         id="stop2852"
-         offset="0"
-         style="stop-color:#ce5c00;stop-opacity:1;" />
-      <stop
-         id="stop2854"
-         offset="1"
-         style="stop-color:#ce5c00;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3958"
-       inkscape:collect="always">
-      <stop
-         id="stop3960"
-         offset="0"
-         style="stop-color:#eeeeec;stop-opacity:1;" />
-      <stop
-         id="stop3962"
-         offset="1"
-         style="stop-color:#eeeeec;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3968"
-       inkscape:collect="always">
-      <stop
-         id="stop3970"
-         offset="0"
-         style="stop-color:#82508e;stop-opacity:1;" />
-      <stop
-         id="stop3972"
-         offset="1"
-         style="stop-color:#82508e;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3976"
-       inkscape:collect="always">
-      <stop
-         id="stop3978"
-         offset="0"
-         style="stop-color:#3b1941;stop-opacity:1;" />
-      <stop
-         id="stop3980"
-         offset="1"
-         style="stop-color:#3b1941;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2850"
-       id="linearGradient2149"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.769231,0,0,0.714287,-34.23081,-12.28573)"
-       x1="21.785719"
-       y1="28.142857"
-       x2="17.785713"
-       y2="30.07143" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3958"
-       id="radialGradient2191"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.116159,0,0,1.076653,-36.39499,-20.28695)"
-       cx="9.0640488"
-       cy="21.511742"
-       fx="9.0640488"
-       fy="21.511742"
-       r="16.663956" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient2193"
-       gradientUnits="userSpaceOnUse"
-       x1="15.645709"
-       y1="39.743458"
-       x2="15.645709"
-       y2="53.502155"
-       gradientTransform="matrix(0.660903,0,0,0.627207,-32.26852,-10.3201)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3968"
-       id="linearGradient2196"
-       gradientUnits="userSpaceOnUse"
-       x1="16.13257"
-       y1="40.781811"
-       x2="16.13257"
-       y2="48.068741"
-       gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3976"
-       id="linearGradient2198"
-       gradientUnits="userSpaceOnUse"
-       x1="12.095973"
-       y1="40.907658"
-       x2="12.095973"
-       y2="46.463146"
-       gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6537"
-       id="linearGradient2201"
-       gradientUnits="userSpaceOnUse"
-       x1="30.5"
-       y1="0.033532728"
-       x2="30.5"
-       y2="23.559282"
-       gradientTransform="matrix(0.668893,0,0,0.668627,-32.91377,-10.19246)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3108"
-       id="linearGradient3114"
-       x1="10.18327"
-       y1="16.618088"
-       x2="27.598003"
-       y2="36.64465"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.660903,0,0,0.627207,-0.293224,-4.361383)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3116"
-       id="linearGradient3122"
-       x1="15.722902"
-       y1="38.768803"
-       x2="15.722902"
-       y2="43.249905"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.67692,0,0,0.646801,-0.560381,-4.949693)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3124"
-       id="linearGradient3130"
-       x1="13.150809"
-       y1="38.849556"
-       x2="13.150809"
-       y2="43.105652"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.67692,0,0,0.646801,-0.560381,-4.949693)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2850"
-       id="linearGradient3146"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.769231,0,0,0.714287,-2.265038,-6.285729)"
-       x1="21.785719"
-       y1="28.142857"
-       x2="17.785713"
-       y2="30.07143" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5438"
-       id="linearGradient2848"
-       gradientUnits="userSpaceOnUse"
-       x1="30.152058"
-       y1="-0.86487341"
-       x2="30.152058"
-       y2="23.011967" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="32.163554"
-     inkscape:cx="16.820721"
-     inkscape:cy="19.317678"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1440"
-     inkscape:window-height="846"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:grid-points="false"
-     width="24px"
-     height="24px"
-     inkscape:object-bbox="true" />
-  <metadata
-     id="metadata4350">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       style="opacity:1;fill:#75507b;fill-opacity:1"
-       d="M 11.578108,7.0000021 C 7.9352949,7.0000021 6.8108928,10.527259 9.3387556,13.902593 C 10.158711,14.997432 12.647399,17 12.984587,17 L 13.003895,16.098595 C 11.972573,14.801596 10.625325,13.293856 10.921791,12.985569 C 14.677426,12.985569 14.964445,11.881489 14.964445,9.8346762 C 14.964445,8.0544242 13.616029,7.0000021 11.578108,7.0000021 z "
-       id="path6521"
-       sodipodi:nodetypes="csccccc" />
-    <path
-       style="opacity:1;fill:url(#linearGradient3122);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:0.99999976;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 9.593419,3.4587201 C 5.1094995,3.4587201 1.470379,7.0808064 1.470379,11.543733 C 1.470379,15.200191 1.4534941,19.889159 1.4534941,24.526857 C 2.2573289,24.526857 18.357073,24.544824 20.178665,24.544824 C 21.609759,24.544824 21.497959,23.212673 21.497959,23.212673 C 21.497959,21.488682 18.121191,20.042088 16.913262,18.776605 C 15.675569,17.482342 17.039539,14.777738 17.039539,14.777738 C 17.473652,13.788261 17.716459,12.691859 17.716459,11.543733 C 17.716459,7.0808064 14.077339,3.4587201 9.593419,3.4587201 z "
-       id="path5176"
-       sodipodi:nodetypes="ccccszcsc" />
-    <path
-       style="opacity:0.5;fill:url(#linearGradient3114);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 9.620321,4.4587156 C 5.6467762,4.4587156 2.4025968,7.6421549 2.3916944,11.612795 C 2.3916761,11.619492 2.3911679,11.625715 2.3916944,11.632396 C 2.3916944,16.20315 2.2865209,19.635632 2.2865209,23.549252 C 3.5664133,23.549252 14.545552,23.530565 18.395955,23.530565 C 19.167366,23.530565 20.480051,23.846723 20.480051,22.928139 C 20.480051,22.78906 20.348035,22.527556 19.984374,22.202931 C 19.620712,21.878306 19.076795,21.529724 18.476689,21.18372 C 17.329967,20.638287 16.501491,20.156486 15.979032,19.027696 C 15.575878,18.51709 15.390866,17.916861 15.35487,17.263676 C 15.318875,16.610491 15.639642,15.909718 15.716861,15.244853 C 15.871301,13.915122 16.208698,14.631229 16.208698,14.631229 C 16.218605,14.590901 16.232433,14.551532 16.250005,14.513628 C 16.638273,13.634657 16.848948,12.655557 16.848948,11.632396 C 16.848948,7.6523934 13.600567,4.4587156 9.620321,4.4587156 z "
-       id="path5241"
-       sodipodi:nodetypes="cscccssccsscssc" />
-    <path
-       style="fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 4.038333,8.0864989 C 5.573681,6.4493239 8.07145,6.8854919 9.05179,7.9308479 C 10.395216,9.3633699 10.239455,11.85472 8.704108,13.491894 C 7.369866,14.914624 5.175281,15.660821 3.831853,14.228299 C 2.488425,12.795776 2.825354,9.3799249 4.038333,8.0864989 z "
-       id="path3138"
-       sodipodi:nodetypes="csssc" />
-    <path
-       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 8.8136637,11.188225 C 8.8136637,12.837133 7.3689434,13.95874 6.3944626,13.95874 C 5.0590642,13.95874 3.9752623,12.620497 3.9752623,10.971589 C 3.9752623,9.5386622 4.7181965,7.9844383 6.0535952,7.9844383 C 7.3889945,7.9844383 8.8136637,9.8855295 8.8136637,11.188225 z "
-       id="path5157"
-       sodipodi:nodetypes="csssc" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5162"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(1.208633,0,0,1.158621,-5.825637,-16.66897)" />
-    <path
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 4.9752634,2.5424297 C 6.2676381,1.111155 8.059671,2.6823452 8.9752679,3.325734 L 7.061552,3.7844642 L 4.9752634,2.5424297 z "
-       id="path5192"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 6.9752602,1.2553494 C 8.5939382,0.25341885 11.64336,2.4607647 11.936975,3.3797691 L 9.4042533,2.9587153 L 6.9752602,1.2553494 z "
-       id="rect5189"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 17.336751,8.8148749 C 16.436419,7.5869931 14.971722,7.9141192 14.396849,8.6981357 C 13.609061,9.7725277 13.7004,11.64104 14.600731,12.868921 C 15.383133,13.93597 16.670043,14.495617 17.457832,13.421225 C 18.245621,12.346833 18.048044,9.7849448 17.336751,8.8148749 z "
-       id="path3132"
-       sodipodi:nodetypes="csssc" />
-    <path
-       style="fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 17.468686,9.5432478 C 16.793205,8.7246594 15.694305,8.9427465 15.263003,9.4654264 C 14.671958,10.181691 14.740486,11.427368 15.415967,12.245957 C 16.00297,12.957323 16.968483,13.33042 17.559527,12.614156 C 18.150572,11.897891 18.002339,10.189962 17.468686,9.5432478 z "
-       id="path3134"
-       sodipodi:nodetypes="csssc" />
-    <path
-       sodipodi:type="arc"
-       style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path3136"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(1.153827,0,0,1.158621,4.558885,-16.66895)" />
-    <rect
-       style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect3140"
-       width="4.4400907"
-       height="1"
-       x="9.501585"
-       y="14"
-       rx="0.69182354"
-       ry="0.5" />
-    <path
-       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 6.965729,14.893438 C 12.054241,18.243015 11.620917,13 12.397198,13 C 13.162798,13 12.66503,18.201991 16.965729,14.895644 C 16.232886,16.102946 13.980397,18 13.030799,18 C 12.07051,18 8.156601,16.676807 6.965729,14.893438 z "
-       id="path3142"
-       sodipodi:nodetypes="czczc" />
-    <path
-       style="fill:url(#linearGradient3146);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 6.965729,14.893439 C 11.706133,19.171305 11.620917,13 12.397198,13 C 13.162798,13 12.607012,18.027939 16.965729,14.895646 C 16.232886,16.102947 13.980397,18 13.030799,18 C 12.07051,18 8.156602,16.676809 6.965729,14.893439 z "
-       id="path3144"
-       sodipodi:nodetypes="czczc" />
-  </g>
-</svg>
--- a/pidgin/pixmaps/icons/32/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = pidgin.png 
-
-pidginiconspixdir = $(datadir)/icons/hicolor/32x32/apps
-
-pidginiconspix_DATA = $(EXTRA_DIST)
-
Binary file pidgin/pixmaps/icons/32/pidgin.png has changed
--- a/pidgin/pixmaps/icons/32/scalable/pidgin.svg	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,489 +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://web.resource.org/cc/"
-   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="svg4345"
-   sodipodi:version="0.32"
-   inkscape:version="0.44.1"
-   sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/32/scalable"
-   sodipodi:docname="pidgin.svg"
-   inkscape:export-filename="/home/hbons/Desktop/pidgin32.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   version="1.0">
-  <defs
-     id="defs4347">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3976">
-      <stop
-         style="stop-color:#3b1941;stop-opacity:1;"
-         offset="0"
-         id="stop3978" />
-      <stop
-         style="stop-color:#3b1941;stop-opacity:0;"
-         offset="1"
-         id="stop3980" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3968">
-      <stop
-         style="stop-color:#82508e;stop-opacity:1;"
-         offset="0"
-         id="stop3970" />
-      <stop
-         style="stop-color:#82508e;stop-opacity:0;"
-         offset="1"
-         id="stop3972" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3958">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop3960" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop3962" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2850">
-      <stop
-         style="stop-color:#ce5c00;stop-opacity:1;"
-         offset="0"
-         id="stop2852" />
-      <stop
-         style="stop-color:#ce5c00;stop-opacity:0;"
-         offset="1"
-         id="stop2854" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2850"
-       id="linearGradient2856"
-       x1="21.785719"
-       y1="28.142857"
-       x2="17.785713"
-       y2="30.07143"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-47,-15.99998)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2816">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop2818" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop2820" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2816"
-       id="radialGradient2824"
-       cx="9.4288578"
-       cy="19.283415"
-       fx="9.4288578"
-       fy="19.283415"
-       r="16.390338"
-       gradientTransform="matrix(1.556432,0,0,1.618148,-52.04294,-30.39321)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2826">
-      <stop
-         style="stop-color:#3b1941;stop-opacity:1;"
-         offset="0"
-         id="stop2828" />
-      <stop
-         style="stop-color:#3b1941;stop-opacity:0;"
-         offset="1"
-         id="stop2830" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2826"
-       id="linearGradient2832"
-       x1="13.191773"
-       y1="41.606163"
-       x2="13.191773"
-       y2="47.843258"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.988192,-46.55265,-16.48621)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2834">
-      <stop
-         style="stop-color:#82508e;stop-opacity:1;"
-         offset="0"
-         id="stop2836" />
-      <stop
-         style="stop-color:#82508e;stop-opacity:0;"
-         offset="1"
-         id="stop2838" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2834"
-       id="linearGradient2840"
-       x1="11.373499"
-       y1="41.566242"
-       x2="11.373499"
-       y2="47.746658"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.988192,-46.55265,-16.48621)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6563">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6565" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6567" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6537">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6539" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6541" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6506">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop6508" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop6510" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2804">
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="0"
-         id="stop2806" />
-      <stop
-         id="stop2812"
-         offset="0.5"
-         style="stop-color:black;stop-opacity:1;" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop2808" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25572"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836637"
-       cy="1.5104795"
-       fx="7.8836637"
-       fy="1.5104795"
-       r="8.4883642" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25568"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836741"
-       cy="0.14505707"
-       fx="7.8836741"
-       fy="0.14505707"
-       r="8.4883642" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient25546">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop25548" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop25550" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25554"
-       cx="7.8836637"
-       cy="2.6242435"
-       fx="7.8836637"
-       fy="2.6242435"
-       r="8.4883642"
-       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient3800">
-      <stop
-         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
-         offset="0.0000000"
-         id="stop3802" />
-      <stop
-         style="stop-color:#df9725;stop-opacity:1.0000000;"
-         offset="1.0000000"
-         id="stop3804" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient6512"
-       x1="15.645709"
-       y1="39.743458"
-       x2="14.943421"
-       y2="50.079575"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6537"
-       id="linearGradient6543"
-       x1="30.5"
-       y1="0.033532728"
-       x2="30.5"
-       y2="23.559282"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6563"
-       id="linearGradient6569"
-       x1="-1.6841649"
-       y1="39.902092"
-       x2="5.5366187"
-       y2="44.272076"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6537"
-       id="linearGradient3069"
-       gradientUnits="userSpaceOnUse"
-       x1="30.5"
-       y1="0.033532728"
-       x2="30.5"
-       y2="23.559282" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient3071"
-       gradientUnits="userSpaceOnUse"
-       x1="15.645709"
-       y1="39.743458"
-       x2="15.645709"
-       y2="53.502155"
-       gradientTransform="translate(-47,-15)" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3958"
-       id="radialGradient3966"
-       cx="9.0640488"
-       cy="21.511742"
-       fx="9.0640488"
-       fy="21.511742"
-       r="16.663956"
-       gradientTransform="matrix(1.68884,0,0,1.716583,-6.243689,-15.89085)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3968"
-       id="linearGradient3974"
-       x1="16.13257"
-       y1="40.781811"
-       x2="16.13257"
-       y2="48.068741"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3976"
-       id="linearGradient3982"
-       x1="12.095973"
-       y1="40.907658"
-       x2="12.095973"
-       y2="46.463146"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2850"
-       id="linearGradient3991"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.769231,0,0,0.714287,-1.230773,-2.285726)"
-       x1="21.785719"
-       y1="28.142857"
-       x2="17.785713"
-       y2="30.07143" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="17.236022"
-     inkscape:cx="21.944662"
-     inkscape:cy="16.287609"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1434"
-     inkscape:window-height="840"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:grid-points="false"
-     width="32px"
-     height="32px"
-     inkscape:object-bbox="true" />
-  <metadata
-     id="metadata4350">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       sodipodi:type="inkscape:offset"
-       inkscape:radius="-1.0057179"
-       inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z "
-       style="fill:none;fill-opacity:1;stroke:white;stroke-width:1.47727883;stroke-miterlimit:4;stroke-opacity:1"
-       id="path6504"
-       d="M 20.53125,2.5 C 17.817519,2.5 15.5,5.0792547 15.5,8.46875 L 15.5,20.53125 C 15.5,23.920745 17.817519,26.5 20.53125,26.5 L 34.53125,26.5 C 35.082213,26.503178 35.528072,26.949037 35.53125,27.5 L 35.53125,29.09375 L 38.75,26.6875 C 38.923102,26.563771 39.130983,26.498125 39.34375,26.5 L 41.5,26.5 C 43.245978,26.5 44.034662,25.931926 44.625,24.9375 C 45.215338,23.943074 45.5,22.371297 45.5,20.53125 L 45.5,8.46875 C 45.5,5.079255 43.182481,2.5 40.46875,2.5 L 20.53125,2.5 z "
-       transform="matrix(0.67692,0,0,0.67692,0.161535,-0.515354)" />
-    <path
-       style="fill:#efefef;fill-opacity:1;stroke:#787878;stroke-width:1.46586692;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 20.53125,1.5 C 17.192693,1.5 14.5,4.611235 14.5,8.46875 L 14.5,20.53125 C 14.5,24.388765 17.428915,28.139948 20.767472,28.139948 L 33.409288,28.041495 L 33.415412,31.845969 L 38.723454,28.076231 L 42.130099,28.139948 C 46.142836,28.139948 46.5,24.580097 46.5,20.728157 L 46.5,8.46875 C 46.5,4.6112353 43.807307,1.5 40.46875,1.5 L 20.53125,1.5 z "
-       id="rect5498"
-       sodipodi:nodetypes="cccccccccccc"
-       transform="matrix(0.687501,0,0,0.67692,-0.468758,-0.515381)" />
-    <path
-       transform="matrix(0.668893,0,0,0.668627,8.626692e-2,-0.192463)"
-       style="fill:url(#linearGradient6543);fill-opacity:1;stroke:white;stroke-width:1.49530375;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 20.53125,2.53125 C 17.841732,2.53125 15.53125,5.0973912 15.53125,8.46875 L 15.53125,20.53125 C 15.53125,23.902609 17.841732,26.46875 20.53125,26.46875 L 33.967629,26.46875 C 34.534122,26.476048 34.991581,26.933507 34.998879,27.5 L 34.998879,29 L 38.71875,26.65625 C 38.901723,26.528628 39.120742,26.462922 39.34375,26.46875 L 42.415884,26.46875 C 45.139435,26.46875 45.46875,24.282574 45.46875,20.53125 L 45.46875,8.46875 C 45.46875,5.0973915 43.158268,2.53125 40.46875,2.53125 L 20.53125,2.53125 z "
-       id="path6535"
-       sodipodi:nodetypes="cccccccccccccc" />
-    <path
-       style="opacity:1;fill:url(#linearGradient3974);fill-opacity:1.0;stroke:url(#linearGradient3982);stroke-width:1.51128328;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 4.8460021,40.483064 0.49299658,38.484005 0.052646307,45.33795 C 0.052646307,47.422072 1.0380664,48.413461 3.1446965,48.413461 C 4.3321851,48.413461 29.360035,48.5596 32.051034,48.5596 C 34.165161,48.5596 34,46.5 34,46.5 C 34,43.834589 27.597902,41.598052 25.813453,39.641526 C 23.985035,37.640505 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z "
-       id="path5176"
-       sodipodi:nodetypes="cccccszcsc"
-       transform="matrix(0.67692,0,0,0.646801,0.464358,-0.908413)" />
-    <path
-       style="opacity:0.5;fill:url(#radialGradient3966);fill-opacity:1.0;stroke:url(#linearGradient6512);stroke-width:1.55319357;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0625,25.489316 4.0625,25.5 C 4.9744187,33.020507 4.3062656,37.469969 2.59375,40.59375 C -0.19778709,46.24536 1.5610206,47.490284 3.9033639,47.490284 C 5.8399452,47.490284 23.958121,47.46049 29.784094,47.46049 C 30.951301,47.46049 32.9375,47.964563 32.9375,46.5 C 32.9375,46.278257 32.737749,45.861323 32.1875,45.34375 C 31.637251,44.826177 30.81426,44.270409 29.90625,43.71875 C 28.99824,43.167091 28.02821,42.609033 27.15625,42.0625 C 26.28429,41.515967 25.511654,41.005793 24.96875,40.28125 C 24.358745,39.467156 24.078806,38.510169 24.024342,37.46875 C 23.969878,36.427331 24.107721,35.310041 24.224561,34.25 C 24.458241,32.129917 24.96875,30.28125 24.96875,30.28125 C 24.98374,30.216952 25.004663,30.154183 25.03125,30.09375 C 25.618731,28.692346 25.9375,27.131297 25.9375,25.5 C 25.9375,19.154404 21.022436,14.0625 15,14.0625 z "
-       id="path5241"
-       sodipodi:nodetypes="csscccssssssscssc"
-       transform="matrix(0.660903,0,0,0.627207,0.731515,-0.320103)" />
-    <path
-       style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 5.0726004,12.086499 C 6.6079483,10.449324 9.1057173,10.885492 10.086057,11.930848 C 11.429483,13.36337 11.273722,15.85472 9.7383746,17.491894 C 8.4041332,18.914624 6.2095475,19.660821 4.8661202,18.228299 C 3.5226923,16.795776 3.8596213,13.379925 5.0726004,12.086499 z "
-       id="path5160"
-       sodipodi:nodetypes="csssc" />
-    <path
-       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
-       id="path5157"
-       sodipodi:nodetypes="csssc"
-       transform="matrix(1.010846,0,0,1.029732,-3.562503,-10.12874)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5162"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(1.208633,0,0,1.158621,-4.791365,-12.66897)" />
-    <path
-       transform="matrix(0.596326,-0.813274,-0.562251,-0.766804,24.4163,42.47989)"
-       style="opacity:1;fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
-       id="path5167"
-       sodipodi:nodetypes="csssc" />
-    <path
-       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
-       id="path5169"
-       sodipodi:nodetypes="csssc"
-       transform="matrix(0.447398,-0.542185,-0.421833,-0.511203,23.06465,33.31996)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5171"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(1.208633,0,0,1.158621,5.208632,-12.66896)" />
-    <rect
-       style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect5215"
-       width="4.4400907"
-       height="1"
-       x="10.535856"
-       y="18"
-       rx="0.69182354"
-       ry="0.5" />
-    <path
-       transform="matrix(0.670792,0,0,0.486348,-1.815475,1.13962)"
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 11.651119,11.193815 C 13.577759,8.2509126 16.249277,11.481501 17.614226,12.804399 L 14.761306,13.747613 L 11.651119,11.193815 z "
-       id="path5192"
-       sodipodi:nodetypes="cccc" />
-    <path
-       transform="matrix(0.851014,0,0,0.554879,-1.947706,-0.153319)"
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.174576,11.994261 17.519594,13.650486 L 14.543472,12.891665 L 11.689238,9.8218679 z "
-       id="rect5189"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 8,18.893438 C 13.088512,22.243015 12.655188,17 13.431469,17 C 14.197069,17 13.699301,22.201991 18,18.895644 C 17.267157,20.102946 15.014668,22 14.06507,22 C 13.104781,22 9.1908718,20.676807 8,18.893438 z "
-       id="path3987"
-       sodipodi:nodetypes="czczc" />
-    <path
-       style="fill:url(#linearGradient3991);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 8,18.893439 C 12.740404,23.171305 12.655188,17 13.431469,17 C 14.197069,17 13.641283,22.027939 18,18.895646 C 17.267157,20.102947 15.014668,22 14.06507,22 C 13.104781,22 9.1908731,20.676809 8,18.893439 z "
-       id="path3989"
-       sodipodi:nodetypes="czczc" />
-  </g>
-</svg>
--- a/pidgin/pixmaps/icons/48/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = pidgin.png 
-
-pidginiconspixdir = $(datadir)/icons/hicolor/48x48/apps
-
-pidginiconspix_DATA = $(EXTRA_DIST)
-
Binary file pidgin/pixmaps/icons/48/pidgin.png has changed
--- a/pidgin/pixmaps/icons/48/scalable/pidgin.svg	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,460 +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://web.resource.org/cc/"
-   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="48px"
-   height="48px"
-   id="svg4345"
-   sodipodi:version="0.32"
-   inkscape:version="0.44.1"
-   sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/48/scalable"
-   sodipodi:docname="pidgin.svg"
-   inkscape:export-filename="/home/hbons/Desktop/pidgin48.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4347">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2850">
-      <stop
-         style="stop-color:#ce5c00;stop-opacity:1;"
-         offset="0"
-         id="stop2852" />
-      <stop
-         style="stop-color:#ce5c00;stop-opacity:0;"
-         offset="1"
-         id="stop2854" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2834">
-      <stop
-         style="stop-color:#82508e;stop-opacity:1;"
-         offset="0"
-         id="stop2836" />
-      <stop
-         style="stop-color:#82508e;stop-opacity:0;"
-         offset="1"
-         id="stop2838" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2826">
-      <stop
-         style="stop-color:#3b1941;stop-opacity:1;"
-         offset="0"
-         id="stop2828" />
-      <stop
-         style="stop-color:#3b1941;stop-opacity:0;"
-         offset="1"
-         id="stop2830" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2816">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop2818" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop2820" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6563">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6565" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6567" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6537">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop6539" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop6541" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6506">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop6508" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop6510" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient6493">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop6495" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop6497" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5280">
-      <stop
-         style="stop-color:#82508e;stop-opacity:1;"
-         offset="0"
-         id="stop5282" />
-      <stop
-         style="stop-color:#82508e;stop-opacity:0;"
-         offset="1"
-         id="stop5284" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2804">
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="0"
-         id="stop2806" />
-      <stop
-         id="stop2812"
-         offset="0.5"
-         style="stop-color:black;stop-opacity:1;" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop2808" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25572"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836637"
-       cy="1.5104795"
-       fx="7.8836637"
-       fy="1.5104795"
-       r="8.4883642" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25568"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
-       cx="7.8836741"
-       cy="0.14505707"
-       fx="7.8836741"
-       fy="0.14505707"
-       r="8.4883642" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient25546">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop25548" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop25550" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient25546"
-       id="radialGradient25554"
-       cx="7.8836637"
-       cy="2.6242435"
-       fx="7.8836637"
-       fy="2.6242435"
-       r="8.4883642"
-       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient3800">
-      <stop
-         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
-         offset="0.0000000"
-         id="stop3802" />
-      <stop
-         style="stop-color:#df9725;stop-opacity:1.0000000;"
-         offset="1.0000000"
-         id="stop3804" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5280"
-       id="radialGradient5286"
-       cx="15.004828"
-       cy="39.80859"
-       fx="15.004828"
-       fy="39.80859"
-       r="9.7225161"
-       gradientTransform="matrix(1,0,0,0.732283,0,10.65742)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6493"
-       id="linearGradient6499"
-       x1="3.3105288"
-       y1="43.5"
-       x2="5.6917014"
-       y2="43.5"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6506"
-       id="linearGradient6512"
-       x1="15.645709"
-       y1="41.751736"
-       x2="15.645709"
-       y2="47.370037"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.988192,0.5625,-1.39645)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6537"
-       id="linearGradient6543"
-       x1="30.5"
-       y1="5.7732024"
-       x2="30.5"
-       y2="19.518673"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient6563"
-       id="linearGradient6573"
-       gradientUnits="userSpaceOnUse"
-       x1="12.01321"
-       y1="38.950283"
-       x2="5.5366187"
-       y2="44.272076" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2816"
-       id="radialGradient2824"
-       cx="9.4288578"
-       cy="19.283415"
-       fx="9.4288578"
-       fy="19.283415"
-       r="16.390338"
-       gradientTransform="matrix(1.556432,0,0,1.618148,-5.04294,-15.39321)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2826"
-       id="linearGradient2832"
-       x1="13.191773"
-       y1="41.606163"
-       x2="13.191773"
-       y2="47.843258"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2834"
-       id="linearGradient2840"
-       x1="11.373499"
-       y1="41.566242"
-       x2="11.373499"
-       y2="47.746658"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2850"
-       id="linearGradient2856"
-       x1="21.785719"
-       y1="28.142857"
-       x2="17.785713"
-       y2="30.07143"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(0,-0.999982)" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="14"
-     inkscape:cx="34.459692"
-     inkscape:cy="22.220728"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1434"
-     inkscape:window-height="840"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:grid-points="true" />
-  <metadata
-     id="metadata4350">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <rect
-       style="opacity:0.23144106;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect6514"
-       width="36.000004"
-       height="2.9999979"
-       x="-4.4446878"
-       y="57.424854"
-       rx="2.0412357"
-       ry="1.4999989" />
-    <path
-       sodipodi:type="inkscape:offset"
-       inkscape:radius="-1.0057179"
-       inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z "
-       style="fill:none;fill-opacity:1;stroke:white;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       id="path6504"
-       d="M 20.53125,2.5 C 17.817519,2.5 15.5,5.0792547 15.5,8.46875 L 15.5,20.53125 C 15.5,23.920745 17.817519,26.5 20.53125,26.5 L 34.53125,26.5 C 35.082213,26.503178 35.528072,26.949037 35.53125,27.5 L 35.53125,29.09375 L 38.75,26.6875 C 38.923102,26.563771 39.130983,26.498125 39.34375,26.5 L 41.5,26.5 C 43.245978,26.5 44.034662,25.931926 44.625,24.9375 C 45.215338,23.943074 45.5,22.371297 45.5,20.53125 L 45.5,8.46875 C 45.5,5.079255 43.182481,2.5 40.46875,2.5 L 20.53125,2.5 z " />
-    <path
-       style="fill:#efefef;fill-opacity:1;stroke:#787878;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 20.53125,1.5 C 17.192693,1.5 14.5,4.611235 14.5,8.46875 L 14.5,20.53125 C 14.5,24.388765 17.192693,27.5 20.53125,27.5 L 34.530203,27.5 L 34.530203,31.107567 L 39.353553,27.485509 L 41.5,27.5 C 45.512737,27.5 46.5,24.38319 46.5,20.53125 L 46.5,8.46875 C 46.5,4.6112353 43.807307,1.5 40.46875,1.5 L 20.53125,1.5 z "
-       id="rect5498"
-       sodipodi:nodetypes="cccccccccccc" />
-    <path
-       sodipodi:type="inkscape:offset"
-       inkscape:radius="-1.044691"
-       inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z "
-       style="fill:url(#linearGradient6543);fill-opacity:1.0;stroke:white;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       id="path6535"
-       d="M 20.53125,2.53125 C 17.841732,2.53125 15.53125,5.0973912 15.53125,8.46875 L 15.53125,20.53125 C 15.53125,23.902609 17.841732,26.46875 20.53125,26.46875 L 34.53125,26.46875 C 35.097743,26.476048 35.555202,26.933507 35.5625,27.5 L 35.5625,29 L 38.71875,26.65625 C 38.901723,26.528628 39.120742,26.462922 39.34375,26.46875 L 41.5,26.46875 C 43.235888,26.46875 44.009537,25.921608 44.59375,24.9375 C 45.177963,23.953392 45.46875,22.367968 45.46875,20.53125 L 45.46875,8.46875 C 45.46875,5.0973915 43.158268,2.53125 40.46875,2.53125 L 20.53125,2.53125 z " />
-    <path
-       style="opacity:1;fill:url(#linearGradient2840);fill-opacity:1.0;stroke:url(#linearGradient2832);stroke-width:1.00595677;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 4.8460021,40.483064 0.49299658,38.484005 0.052646307,45.33795 C 0.052646307,47.422072 1.0380664,48.413461 3.1446965,48.413461 C 4.3321851,48.413461 29.360035,48.5596 32.051034,48.5596 C 34.165161,48.5596 34,46.5 34,46.5 C 34,43.834589 27.597902,41.598052 25.813453,39.641526 C 23.985035,37.640505 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z "
-       id="path5176"
-       sodipodi:nodetypes="cccccszcsc"
-       transform="matrix(1,0,0,0.988192,0.447354,-1.486208)" />
-    <path
-       style="opacity:0.5;fill:url(#radialGradient2824);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 15.5625,12.5 C 9.550204,12.5 4.641496,17.515648 4.625,23.771565 C 4.624972,23.782116 4.625,23.791888 4.625,23.802446 C 5.536919,31.234151 4.868766,35.631074 3.15625,38.717969 C 0.36471303,44.302845 2.123521,45.533069 4.465864,45.533069 C 6.402445,45.533069 24.520621,45.503627 30.346594,45.503627 C 31.513801,45.503627 33.5,46.001748 33.5,44.554478 C 33.5,44.335354 33.300249,43.923343 32.75,43.411881 C 32.199751,42.90042 31.37676,42.351214 30.46875,41.806069 C 29.56074,41.260924 28.59071,40.709456 27.71875,40.169376 C 26.84679,39.629297 26.074154,39.125147 25.53125,38.409159 C 24.921245,37.604678 24.641306,36.658991 24.586842,35.629869 C 24.532378,34.600747 24.670221,33.49665 24.787061,32.449126 C 25.020741,30.354077 25.53125,28.527239 25.53125,28.527239 C 25.54624,28.4637 25.567163,28.401673 25.59375,28.341953 C 26.181231,26.957097 26.5,25.414481 26.5,23.802446 C 26.5,17.531779 21.584936,12.5 15.5625,12.5 z "
-       id="path5241"
-       sodipodi:nodetypes="csscccssssssscssc" />
-    <path
-       style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 7.269301,19.503118 C 9.2717505,17.238166 12.529418,17.841584 13.808008,19.287784 C 15.560146,21.269611 15.356996,24.71627 13.354547,26.981222 C 11.614386,28.949501 8.7521391,29.981828 7,28 C 5.2478601,26.018172 5.6872953,21.292511 7.269301,19.503118 z "
-       id="path5160"
-       sodipodi:nodetypes="csssc" />
-    <path
-       transform="matrix(1.46245,0,0,1.378883,-5.440518,-10.80605)"
-       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
-       id="path5157"
-       sodipodi:nodetypes="csssc" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5162"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(1.208632,0,0,1.544828,-1.738701,-14.41893)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:black;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5164"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(0.402878,0,0,0.514947,6.455534,10.62004)" />
-    <path
-       style="opacity:1;fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 27.88281,19.946791 C 26.359012,18.309616 23.880032,18.745786 22.907068,19.791141 C 21.573747,21.223665 21.728337,23.715015 23.252136,25.35219 C 24.576341,26.77492 26.754418,27.521117 28.087739,26.088593 C 29.42106,24.656068 29.086665,21.240217 27.88281,19.946791 z "
-       id="path5167"
-       sodipodi:nodetypes="csssc" />
-    <path
-       transform="matrix(0.726374,-0.813272,-0.684868,-0.766801,34.41717,50.34012)"
-       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
-       id="path5169"
-       sodipodi:nodetypes="csssc" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5171"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(1.208632,0,0,1.598777,13.20865,-15.80042)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:black;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path5173"
-       sodipodi:cx="10.169642"
-       sodipodi:cy="24.3125"
-       sodipodi:rx="1.2410715"
-       sodipodi:ry="1.2946428"
-       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
-       transform="matrix(0.402878,0,0,0.53293,21.40289,10.11299)" />
-    <rect
-       style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect5215"
-       width="7"
-       height="1.8602936"
-       x="15"
-       y="27.000017"
-       rx="0.81387848"
-       ry="0.93014681" />
-    <path
-       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 12.000005,28.650812 C 17.33287,31.553263 18.051747,26 19.060912,26 C 20.056192,26 20.46502,31.577054 25,28.653901 C 24.047304,30.344123 21.119071,32.999996 19.884593,32.999996 C 18.636217,32.999996 13.548138,31.147528 12.000005,28.650812 z "
-       id="rect5187"
-       sodipodi:nodetypes="czczc" />
-    <path
-       transform="matrix(1.236264,0,0,0.549587,-6.482886,4.775206)"
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 11.651119,11.193815 C 12.963532,7.814583 16.999999,10.43431 16.999999,12.891665 L 13.737594,13.834879 L 11.651119,11.193815 z "
-       id="path5192"
-       sodipodi:nodetypes="cccc" />
-    <path
-       transform="matrix(1.50247,0,0,1,-7.59464,-1.139701)"
-       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.219555,11.23544 17.564573,12.891665 L 14.543472,12.891665 L 11.689238,9.8218679 z "
-       id="rect5189"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:url(#linearGradient2856);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 12.000005,28.650834 C 17.332871,31.553285 18.051747,26.000022 19.060912,26.000022 C 20.056192,26.000022 20.46502,31.577076 25,28.653923 C 24.047304,30.344145 21.119071,33.000018 19.884593,33.000018 C 18.636217,33.000018 13.548139,31.14755 12.000005,28.650834 z "
-       id="path6561"
-       sodipodi:nodetypes="czczc" />
-  </g>
-</svg>
Binary file pidgin/pixmaps/icons/hicolor/16x16/apps/pidgin.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/icons/hicolor/16x16/apps/scalable/pidgin.svg	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,784 @@
+<?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://web.resource.org/cc/"
+   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="16"
+   height="16"
+   id="svg4345"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/16/scalable"
+   sodipodi:docname="pidgin.svg"
+   inkscape:export-filename="/home/hbons/Desktop/pidgin16.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"
+   version="1.0">
+  <defs
+     id="defs4347">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3157">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop3159" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop3161" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3149">
+      <stop
+         style="stop-color:#3b1941;stop-opacity:1;"
+         offset="0"
+         id="stop3151" />
+      <stop
+         style="stop-color:#3b1941;stop-opacity:0;"
+         offset="1"
+         id="stop3153" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3141">
+      <stop
+         style="stop-color:#82508e;stop-opacity:1;"
+         offset="0"
+         id="stop3143" />
+      <stop
+         style="stop-color:#82508e;stop-opacity:0;"
+         offset="1"
+         id="stop3145" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3128">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop3130" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop3132" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5438">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop5440" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop5442" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6817">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6819" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6821" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6537">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6539" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6541" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6506">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop6508" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop6510" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5280">
+      <stop
+         style="stop-color:#82508e;stop-opacity:1;"
+         offset="0"
+         id="stop5282" />
+      <stop
+         style="stop-color:#82508e;stop-opacity:0;"
+         offset="1"
+         id="stop5284" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2804">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop2806" />
+      <stop
+         id="stop2812"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2808" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25572"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836637"
+       cy="1.5104795"
+       fx="7.8836637"
+       fy="1.5104795"
+       r="8.4883642" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25568"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836741"
+       cy="0.14505707"
+       fx="7.8836741"
+       fy="0.14505707"
+       r="8.4883642" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient25546">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop25548" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop25550" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25554"
+       cx="7.8836637"
+       cy="2.6242435"
+       fx="7.8836637"
+       fy="2.6242435"
+       r="8.4883642"
+       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3800">
+      <stop
+         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop3802" />
+      <stop
+         style="stop-color:#df9725;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop3804" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5280"
+       id="radialGradient5286"
+       cx="15.004828"
+       cy="39.80859"
+       fx="15.004828"
+       fy="39.80859"
+       r="9.7225161"
+       gradientTransform="matrix(1,0,0,0.732283,0,10.65742)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6537"
+       id="linearGradient6543"
+       x1="30.5"
+       y1="0.033532728"
+       x2="30.5"
+       y2="23.559282"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6817"
+       id="linearGradient6823"
+       x1="0.23931108"
+       y1="38.950283"
+       x2="5.7089725"
+       y2="42.982571"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.63556,0,0,0.371995,11.16667,-5.489292)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5438"
+       id="linearGradient5444"
+       x1="30.152058"
+       y1="-0.86487341"
+       x2="30.152058"
+       y2="23.011967"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3976">
+      <stop
+         style="stop-color:#3b1941;stop-opacity:1;"
+         offset="0"
+         id="stop3978" />
+      <stop
+         style="stop-color:#3b1941;stop-opacity:0;"
+         offset="1"
+         id="stop3980" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3968">
+      <stop
+         style="stop-color:#82508e;stop-opacity:1;"
+         offset="0"
+         id="stop3970" />
+      <stop
+         style="stop-color:#82508e;stop-opacity:0;"
+         offset="1"
+         id="stop3972" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3958">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop3960" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop3962" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2850">
+      <stop
+         style="stop-color:#ce5c00;stop-opacity:1;"
+         offset="0"
+         id="stop2852" />
+      <stop
+         style="stop-color:#ce5c00;stop-opacity:0;"
+         offset="1"
+         id="stop2854" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6563">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6565" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6567" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2110">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop2112" />
+      <stop
+         id="stop2114"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2067" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient2069"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836637"
+       cy="1.5104795"
+       fx="7.8836637"
+       fy="1.5104795"
+       r="8.4883642" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient2071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836741"
+       cy="0.14505707"
+       fx="7.8836741"
+       fy="0.14505707"
+       r="8.4883642" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient2079"
+       cx="7.8836637"
+       cy="2.6242435"
+       fx="7.8836637"
+       fy="2.6242435"
+       r="8.4883642"
+       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient2081">
+      <stop
+         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2104" />
+      <stop
+         style="stop-color:#df9725;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2085" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient2101"
+       x1="15.645709"
+       y1="39.743458"
+       x2="14.943421"
+       y2="50.079575"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6537"
+       id="linearGradient2089"
+       x1="30.5"
+       y1="0.033532728"
+       x2="30.5"
+       y2="23.559282"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6563"
+       id="linearGradient6569"
+       x1="-1.6841649"
+       y1="39.902092"
+       x2="5.5366187"
+       y2="44.272076"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="23.011967"
+       x2="30.152058"
+       y1="-0.86487341"
+       x1="30.152058"
+       id="linearGradient2097"
+       xlink:href="#linearGradient5438"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="42.982571"
+       x2="5.7089725"
+       y1="38.950283"
+       x1="0.23931108"
+       id="linearGradient2095"
+       xlink:href="#linearGradient6817"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="50.726673"
+       x2="15.645709"
+       y1="40.434063"
+       x1="15.645709"
+       id="linearGradient2093"
+       xlink:href="#linearGradient6506"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2087">
+      <stop
+         id="stop2089"
+         offset="0.0000000"
+         style="stop-color:#f4d9b1;stop-opacity:1.0000000;" />
+      <stop
+         id="stop2091"
+         offset="1.0000000"
+         style="stop-color:#df9725;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
+       r="8.4883642"
+       fy="2.6242435"
+       fx="7.8836637"
+       cy="2.6242435"
+       cx="7.8836637"
+       id="radialGradient2085"
+       xlink:href="#linearGradient25546"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.4883642"
+       fy="0.14505707"
+       fx="7.8836741"
+       cy="0.14505707"
+       cx="7.8836741"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2077"
+       xlink:href="#linearGradient25546"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.4883642"
+       fy="1.5104795"
+       fx="7.8836637"
+       cy="1.5104795"
+       cx="7.8836637"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2075"
+       xlink:href="#linearGradient25546"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2067">
+      <stop
+         id="stop2069"
+         offset="0"
+         style="stop-color:black;stop-opacity:0;" />
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0.5"
+         id="stop2071" />
+      <stop
+         id="stop2073"
+         offset="1"
+         style="stop-color:black;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3108"
+       inkscape:collect="always">
+      <stop
+         id="stop3110"
+         offset="0"
+         style="stop-color:#eeeeec;stop-opacity:1;" />
+      <stop
+         id="stop3112"
+         offset="1"
+         style="stop-color:#eeeeec;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3116"
+       inkscape:collect="always">
+      <stop
+         id="stop3118"
+         offset="0"
+         style="stop-color:#82508e;stop-opacity:1;" />
+      <stop
+         id="stop3120"
+         offset="1"
+         style="stop-color:#82508e;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3124"
+       inkscape:collect="always">
+      <stop
+         id="stop3126"
+         offset="0"
+         style="stop-color:#3b1941;stop-opacity:1;" />
+      <stop
+         id="stop3128"
+         offset="1"
+         style="stop-color:#3b1941;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2850"
+       id="linearGradient2187"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.769231,0,0,0.714287,47.76924,-9.285729)"
+       x1="21.785719"
+       y1="28.142857"
+       x2="17.785713"
+       y2="30.07143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2850"
+       id="linearGradient2195"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.769231,0,0,0.714287,13.76923,-8.28573)"
+       x1="21.785719"
+       y1="28.142857"
+       x2="17.785713"
+       y2="30.07143" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3958"
+       id="radialGradient2209"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.116159,0,0,1.076653,14.60502,-22.28695)"
+       cx="9.0640488"
+       cy="21.511742"
+       fx="9.0640488"
+       fy="21.511742"
+       r="16.663956" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient2211"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.660903,0,0,0.627207,18.73149,-12.3201)"
+       x1="15.645709"
+       y1="39.743458"
+       x2="15.645709"
+       y2="53.502155" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3968"
+       id="linearGradient2214"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67692,0,0,0.646801,18.46433,-12.90841)"
+       x1="16.13257"
+       y1="40.781811"
+       x2="16.13257"
+       y2="48.068741" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3976"
+       id="linearGradient2216"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67692,0,0,0.646801,18.46433,-12.90841)"
+       x1="12.095973"
+       y1="40.907658"
+       x2="12.095973"
+       y2="46.463146" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6537"
+       id="linearGradient2219"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.668893,0,0,0.668627,18.08624,-12.19246)"
+       x1="30.5"
+       y1="0.033532728"
+       x2="30.5"
+       y2="23.559282" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3108"
+       id="linearGradient2229"
+       gradientUnits="userSpaceOnUse"
+       x1="10.18327"
+       y1="16.618088"
+       x2="27.598003"
+       y2="36.64465"
+       gradientTransform="matrix(0.660903,0,0,0.627207,49.74106,-7.361383)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient2231"
+       gradientUnits="userSpaceOnUse"
+       x1="15.645709"
+       y1="39.743458"
+       x2="15.645709"
+       y2="53.502155"
+       gradientTransform="matrix(0.660903,0,0,0.627207,49.74106,-7.361383)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3116"
+       id="linearGradient2234"
+       gradientUnits="userSpaceOnUse"
+       x1="15.722902"
+       y1="39.585075"
+       x2="15.722902"
+       y2="45.76453"
+       gradientTransform="matrix(0.67692,0,0,0.646801,49.4739,-7.949693)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3124"
+       id="linearGradient2236"
+       gradientUnits="userSpaceOnUse"
+       x1="13.150809"
+       y1="39.39394"
+       x2="13.150809"
+       y2="45.551888"
+       gradientTransform="matrix(0.67692,0,0,0.646801,49.4739,-7.949693)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3128"
+       id="linearGradient3134"
+       x1="8.0725698"
+       y1="17.765934"
+       x2="24.284664"
+       y2="37.578945"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3141"
+       id="linearGradient3147"
+       x1="12.353984"
+       y1="38.611191"
+       x2="12.353984"
+       y2="45.595356"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3149"
+       id="linearGradient3155"
+       x1="10.166225"
+       y1="38.766953"
+       x2="10.166225"
+       y2="45.595673"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3157"
+       id="linearGradient3163"
+       x1="11.982447"
+       y1="39.088425"
+       x2="11.982447"
+       y2="45.778931"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="30.009658"
+     inkscape:cx="15.476031"
+     inkscape:cy="9.174961"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1434"
+     inkscape:window-height="840"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:grid-points="false"
+     width="16px"
+     height="16px"
+     inkscape:object-bbox="true" />
+  <metadata
+     id="metadata4350">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="opacity:1;fill:#75507b;fill-opacity:1"
+       d="M 36.0625,8 C 33.978257,8 33.334928,10.523086 34.78125,12.9375 C 35.250389,13.720651 36.674297,15.15311 36.86722,15.15311 L 36.878267,14.508325 C 36.288194,13.580567 35.517363,12.502064 35.686987,12.281543 C 37.835781,12.281543 38,11.491782 38,10.027674 C 38,8.7542399 37.228501,8 36.0625,8 z "
+       id="path6521"
+       transform="matrix(1.148904,0,0,0.920169,-34.28919,-3.241212)"
+       sodipodi:nodetypes="csccccc" />
+    <path
+       style="opacity:1;fill:url(#linearGradient3147);fill-opacity:1.0;stroke:url(#linearGradient3155);stroke-width:2.30209565;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 3,31.153143 2.9750563,38.402618 2.9750563,45.572826 C 4.1625449,45.572826 27.946366,45.600605 30.637365,45.600605 C 32.751492,45.600605 32.586331,43.541005 32.586331,43.541005 C 32.586331,40.875594 27.597902,38.639057 25.813453,36.682531 C 23.985035,34.68151 26,30.884078 26,30.884078 C 26.641306,29.354278 28.01889,26.891006 28.01889,25.115922 C 28.01889,18.215923 21.624002,13 15,13 z "
+       id="path5176"
+       sodipodi:nodetypes="ccccszcsc"
+       transform="matrix(0.43939,0,0,0.42944,-0.819445,-4.082726)" />
+    <rect
+       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect6331"
+       width="2.6154532"
+       height="1.1545694"
+       x="5.513658"
+       y="6.4806929"
+       rx="0.48532724"
+       ry="0.32910046"
+       transform="matrix(1.147027,0,0,0.866113,-0.324314,2.386999)" />
+    <path
+       transform="matrix(0.399589,0,0,0.393554,-5.973603e-2,-3.038964)"
+       style="opacity:0.5;fill:url(#linearGradient3134);fill-opacity:1.0;stroke:url(#linearGradient3163);stroke-width:2.5216887;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0617033,25.489349 4.0625,25.5 C 4.0625,32.787473 3.9033639,38.26012 3.9033639,44.499878 C 5.8399452,44.499878 24.86993,44.470084 30.695903,44.470084 C 29.746978,42.549359 26.273076,40.711023 23.972608,38.78763 C 23.362603,37.973536 23.023697,35.459892 22.969233,34.418473 C 23.611113,31.359155 25.129532,28.401757 26.527172,25.440129 C 26.527172,19.094533 21.022436,14.0625 15,14.0625 z "
+       id="path5241"
+       sodipodi:nodetypes="csccccccc" />
+    <path
+       style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 6,7.2175674 C 6,8.8735678 4.5070272,10 3.4999996,10 C 2.1199999,10 1,8.6559998 1,6.9999995 C 1,5.5609093 1.7677476,4 3.1477475,4 C 4.5277481,4 6,5.9092686 6,7.2175674 z "
+       id="path3137"
+       sodipodi:nodetypes="csssc" />
+    <path
+       transform="matrix(0.626764,0,0,0.689441,-3.309086,-9.833164)"
+       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
+       id="path5157"
+       sodipodi:nodetypes="csssc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5162"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(0.805757,0,0,1.158623,-4.194263,-20.66902)" />
+    <path
+       style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 11.387086,4.6790601 C 10.509745,3.6558267 9.0824486,3.9284339 8.5222543,4.5817815 C 7.7545814,5.4771092 7.8435868,7.0342022 8.7209273,8.0574357 C 9.4833498,8.9466415 10.737398,9.413013 11.505071,8.5176851 C 12.272744,7.6223568 12.080215,5.4874505 11.387086,4.6790601 z "
+       id="path3139"
+       sodipodi:nodetypes="csssc" />
+    <path
+       transform="matrix(0.29055,-0.412361,-0.273947,-0.388798,13.58792,20.45445)"
+       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
+       id="path5169"
+       sodipodi:nodetypes="csssc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5171"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(0.805754,0,0,1.158626,0.805772,-20.66909)" />
+    <path
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M -3.174544e-16,1.7837407 C 0.49897694,0.43045085 3.4176637,1.3941391 4.4321866,1.7478251 L 2.7448964,2 L -3.174544e-16,1.7837407 z "
+       id="path5192"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 4,8.9694498 C 6.5363255,9.6796143 7.1434322,8 7.6676187,8 C 8.1845929,8 8.1150542,9.7216455 10.752536,9.1373864 C 10.257681,9.8617678 8.7366795,11 8.0954601,11 C 7.4470215,11 4.8041406,10.039472 4,8.9694498 z "
+       id="path3987"
+       sodipodi:nodetypes="czczc" />
+    <path
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 2.5678134,0.78213791 C 3.0667903,-0.57115198 7,-0.11652293 7,1.7459005 L 5.3127098,0.99839721 L 2.5678134,0.78213791 z "
+       id="path1991"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
Binary file pidgin/pixmaps/icons/hicolor/22x22/apps/pidgin.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/icons/hicolor/22x22/apps/scalable/pidgin.svg	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,591 @@
+<?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://web.resource.org/cc/"
+   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="22"
+   height="22"
+   id="svg4345"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable"
+   sodipodi:docname="pidgin.svg"
+   inkscape:export-filename="/home/hbons/Desktop/pidgin24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"
+   version="1.0">
+  <defs
+     id="defs4347">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3124">
+      <stop
+         style="stop-color:#3b1941;stop-opacity:1;"
+         offset="0"
+         id="stop3126" />
+      <stop
+         style="stop-color:#3b1941;stop-opacity:0;"
+         offset="1"
+         id="stop3128" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3116">
+      <stop
+         style="stop-color:#82508e;stop-opacity:1;"
+         offset="0"
+         id="stop3118" />
+      <stop
+         style="stop-color:#82508e;stop-opacity:0;"
+         offset="1"
+         id="stop3120" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3108">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop3110" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop3112" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5438">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop5440" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop5442" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6817">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6819" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6821" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6537">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6539" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6541" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6506">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop6508" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop6510" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2804">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop2806" />
+      <stop
+         id="stop2812"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2808" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25572"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836637"
+       cy="1.5104795"
+       fx="7.8836637"
+       fy="1.5104795"
+       r="8.4883642" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25568"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836741"
+       cy="0.14505707"
+       fx="7.8836741"
+       fy="0.14505707"
+       r="8.4883642" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient25546">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop25548" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop25550" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25554"
+       cx="7.8836637"
+       cy="2.6242435"
+       fx="7.8836637"
+       fy="2.6242435"
+       r="8.4883642"
+       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3800">
+      <stop
+         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop3802" />
+      <stop
+         style="stop-color:#df9725;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop3804" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient6512"
+       x1="15.645709"
+       y1="39.029884"
+       x2="15.645709"
+       y2="43.206608"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6817"
+       id="linearGradient6823"
+       x1="0.23931108"
+       y1="38.950283"
+       x2="5.7089725"
+       y2="42.982571"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5438"
+       id="linearGradient5444"
+       x1="30.152058"
+       y1="-0.86487341"
+       x2="30.152058"
+       y2="23.011967"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="44.272076"
+       x2="5.5366187"
+       y1="39.902092"
+       x1="-1.6841649"
+       id="linearGradient6569"
+       xlink:href="#linearGradient6563"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="23.559282"
+       x2="30.5"
+       y1="0.033532728"
+       x1="30.5"
+       id="linearGradient2089"
+       xlink:href="#linearGradient6537"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="50.079575"
+       x2="14.943421"
+       y1="39.743458"
+       x1="15.645709"
+       id="linearGradient2087"
+       xlink:href="#linearGradient6506"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2081">
+      <stop
+         id="stop2083"
+         offset="0.0000000"
+         style="stop-color:#f4d9b1;stop-opacity:1.0000000;" />
+      <stop
+         id="stop2085"
+         offset="1.0000000"
+         style="stop-color:#df9725;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
+       r="8.4883642"
+       fy="2.6242435"
+       fx="7.8836637"
+       cy="2.6242435"
+       cx="7.8836637"
+       id="radialGradient2079"
+       xlink:href="#linearGradient25546"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.4883642"
+       fy="0.14505707"
+       fx="7.8836741"
+       cy="0.14505707"
+       cx="7.8836741"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2071"
+       xlink:href="#linearGradient25546"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.4883642"
+       fy="1.5104795"
+       fx="7.8836637"
+       cy="1.5104795"
+       cx="7.8836637"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2069"
+       xlink:href="#linearGradient25546"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2061">
+      <stop
+         id="stop2063"
+         offset="0"
+         style="stop-color:black;stop-opacity:0;" />
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0.5"
+         id="stop2065" />
+      <stop
+         id="stop2067"
+         offset="1"
+         style="stop-color:black;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6563"
+       inkscape:collect="always">
+      <stop
+         id="stop6565"
+         offset="0"
+         style="stop-color:white;stop-opacity:1;" />
+      <stop
+         id="stop6567"
+         offset="1"
+         style="stop-color:white;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2850"
+       inkscape:collect="always">
+      <stop
+         id="stop2852"
+         offset="0"
+         style="stop-color:#ce5c00;stop-opacity:1;" />
+      <stop
+         id="stop2854"
+         offset="1"
+         style="stop-color:#ce5c00;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3958"
+       inkscape:collect="always">
+      <stop
+         id="stop3960"
+         offset="0"
+         style="stop-color:#eeeeec;stop-opacity:1;" />
+      <stop
+         id="stop3962"
+         offset="1"
+         style="stop-color:#eeeeec;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3968"
+       inkscape:collect="always">
+      <stop
+         id="stop3970"
+         offset="0"
+         style="stop-color:#82508e;stop-opacity:1;" />
+      <stop
+         id="stop3972"
+         offset="1"
+         style="stop-color:#82508e;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3976"
+       inkscape:collect="always">
+      <stop
+         id="stop3978"
+         offset="0"
+         style="stop-color:#3b1941;stop-opacity:1;" />
+      <stop
+         id="stop3980"
+         offset="1"
+         style="stop-color:#3b1941;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2850"
+       id="linearGradient2149"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.769231,0,0,0.714287,-34.23081,-12.28573)"
+       x1="21.785719"
+       y1="28.142857"
+       x2="17.785713"
+       y2="30.07143" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3958"
+       id="radialGradient2191"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.116159,0,0,1.076653,-36.39499,-20.28695)"
+       cx="9.0640488"
+       cy="21.511742"
+       fx="9.0640488"
+       fy="21.511742"
+       r="16.663956" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient2193"
+       gradientUnits="userSpaceOnUse"
+       x1="15.645709"
+       y1="39.743458"
+       x2="15.645709"
+       y2="53.502155"
+       gradientTransform="matrix(0.660903,0,0,0.627207,-32.26852,-10.3201)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3968"
+       id="linearGradient2196"
+       gradientUnits="userSpaceOnUse"
+       x1="16.13257"
+       y1="40.781811"
+       x2="16.13257"
+       y2="48.068741"
+       gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3976"
+       id="linearGradient2198"
+       gradientUnits="userSpaceOnUse"
+       x1="12.095973"
+       y1="40.907658"
+       x2="12.095973"
+       y2="46.463146"
+       gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6537"
+       id="linearGradient2201"
+       gradientUnits="userSpaceOnUse"
+       x1="30.5"
+       y1="0.033532728"
+       x2="30.5"
+       y2="23.559282"
+       gradientTransform="matrix(0.668893,0,0,0.668627,-32.91377,-10.19246)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3108"
+       id="linearGradient3114"
+       x1="10.18327"
+       y1="16.618088"
+       x2="27.598003"
+       y2="36.64465"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3116"
+       id="linearGradient3122"
+       x1="15.722902"
+       y1="38.768803"
+       x2="15.722902"
+       y2="43.249905"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3124"
+       id="linearGradient3130"
+       x1="13.150809"
+       y1="38.849556"
+       x2="13.150809"
+       y2="43.105652"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2850"
+       id="linearGradient3146"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.769231,0,0,0.714287,-3.230767,-7.285729)"
+       x1="21.785719"
+       y1="28.142857"
+       x2="17.785713"
+       y2="30.07143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5438"
+       id="linearGradient2848"
+       gradientUnits="userSpaceOnUse"
+       x1="30.152058"
+       y1="-0.86487341"
+       x2="30.152058"
+       y2="23.011967" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.743067"
+     inkscape:cx="23.715241"
+     inkscape:cy="10.08258"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1434"
+     inkscape:window-height="840"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:grid-points="false"
+     width="22px"
+     height="22px"
+     inkscape:object-bbox="true" />
+  <metadata
+     id="metadata4350">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="opacity:1;fill:#75507b;fill-opacity:1"
+       d="M 36.0625,8 C 33.978257,8 33.334928,10.523086 34.78125,12.9375 C 35.250389,13.720651 36.674297,15.15311 36.86722,15.15311 L 36.878267,14.508325 C 36.288194,13.580567 35.517363,12.502064 35.686987,12.281543 C 37.835781,12.281543 38,11.491782 38,10.027674 C 38,8.7542399 37.228501,8 36.0625,8 z "
+       id="path6521"
+       transform="matrix(1.747787,0,0,1.397993,-52.41719,-5.183942)"
+       sodipodi:nodetypes="csccccc" />
+    <path
+       style="opacity:1;fill:url(#linearGradient3122);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:1.51128328;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 3,31.153143 2.9750563,38.402618 2.9750563,45.572826 C 4.1625449,45.572826 27.946366,45.600605 30.637365,45.600605 C 32.751492,45.600605 32.586331,43.541005 32.586331,43.541005 C 32.586331,40.875594 27.597902,38.639057 25.813453,36.682531 C 23.985035,34.68151 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z "
+       id="path5176"
+       sodipodi:nodetypes="ccccszcsc"
+       transform="matrix(0.67692,0,0,0.646801,-1.52611,-5.949693)" />
+    <path
+       transform="matrix(0.660903,0,0,0.627207,-1.258953,-5.361383)"
+       style="opacity:0.5;fill:url(#linearGradient3114);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:1.55319393;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0617033,25.489349 4.0625,25.5 C 4.0625,32.787473 3.9033639,38.26012 3.9033639,44.499878 C 5.8399452,44.499878 22.452275,44.470084 28.278248,44.470084 C 29.445455,44.470084 31.431654,44.974157 31.431654,43.509594 C 31.431654,43.287851 31.231903,42.870917 30.681654,42.353344 C 30.131405,41.835771 29.308414,41.280003 28.400404,40.728344 C 26.665321,39.858723 25.411769,39.090553 24.621247,37.290844 C 24.011242,36.47675 23.731303,35.519763 23.676839,34.478344 C 23.622375,33.436925 24.107721,32.319635 24.224561,31.259594 C 24.458241,29.139511 24.96875,30.28125 24.96875,30.28125 C 24.98374,30.216952 25.004663,30.154183 25.03125,30.09375 C 25.618731,28.692346 25.9375,27.131297 25.9375,25.5 C 25.9375,19.154404 21.022436,14.0625 15,14.0625 z "
+       id="path5241"
+       sodipodi:nodetypes="cscccssccsscssc" />
+    <path
+       style="fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 3.072604,7.0864988 C 4.607952,5.4493238 7.105721,5.8854918 8.086061,6.9308478 C 9.4294869,8.3633698 9.273726,10.85472 7.738379,12.491894 C 6.404137,13.914624 4.209552,14.660821 2.866124,13.228299 C 1.522696,11.795776 1.859625,8.3799248 3.072604,7.0864988 z "
+       id="path3138"
+       sodipodi:nodetypes="csssc" />
+    <path
+       transform="matrix(1.010846,0,0,1.029732,-5.552971,-15.17001)"
+       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
+       id="path5157"
+       sodipodi:nodetypes="csssc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5162"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(1.208633,0,0,1.158621,-6.791366,-17.66897)" />
+    <path
+       transform="matrix(0.670792,0,0,0.486348,-3.805943,-3.90166)"
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 11.651119,11.193815 C 13.577759,8.2509126 16.249277,11.481501 17.614226,12.804399 L 14.761306,13.747613 L 11.651119,11.193815 z "
+       id="path5192"
+       sodipodi:nodetypes="cccc" />
+    <path
+       transform="matrix(0.851014,0,0,0.554879,-3.938174,-5.194599)"
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.174576,11.994261 17.519594,13.650486 L 14.543472,12.891665 L 11.689238,9.8218679 z "
+       id="rect5189"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 16.371022,7.8148748 C 15.47069,6.586993 14.005993,6.9141191 13.43112,7.6981356 C 12.643332,8.7725276 12.734671,10.64104 13.635002,11.868921 C 14.417404,12.93597 15.704314,13.495617 16.492103,12.421225 C 17.279892,11.346833 17.082315,8.7849447 16.371022,7.8148748 z "
+       id="path3132"
+       sodipodi:nodetypes="csssc" />
+    <path
+       style="fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 16.502957,8.5432477 C 15.827476,7.7246593 14.728576,7.9427464 14.297274,8.4654263 C 13.706229,9.1816906 13.774757,10.427368 14.450238,11.245957 C 15.037241,11.957323 16.002754,12.33042 16.593798,11.614156 C 17.184843,10.897891 17.03661,9.1899614 16.502957,8.5432477 z "
+       id="path3134"
+       sodipodi:nodetypes="csssc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path3136"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(1.153827,0,0,1.158621,3.593156,-17.66895)" />
+    <rect
+       style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect3140"
+       width="4.4400907"
+       height="1"
+       x="8.5358553"
+       y="13"
+       rx="0.69182354"
+       ry="0.5" />
+    <path
+       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 6,13.893438 C 11.088512,17.243015 10.655188,12 11.431469,12 C 12.197069,12 11.699301,17.201991 16,13.895644 C 15.267157,15.102946 13.014668,17 12.06507,17 C 11.104781,17 7.190872,15.676807 6,13.893438 z "
+       id="path3142"
+       sodipodi:nodetypes="czczc" />
+    <path
+       style="fill:url(#linearGradient3146);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 6,13.893439 C 10.740404,18.171305 10.655188,12 11.431469,12 C 12.197069,12 11.641283,17.027939 16,13.895646 C 15.267157,15.102947 13.014668,17 12.06507,17 C 11.104781,17 7.190873,15.676809 6,13.893439 z "
+       id="path3144"
+       sodipodi:nodetypes="czczc" />
+  </g>
+</svg>
Binary file pidgin/pixmaps/icons/hicolor/24x24/apps/pidgin.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/icons/hicolor/24x24/apps/scalable/pidgin.svg	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,589 @@
+<?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://web.resource.org/cc/"
+   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="svg4345"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable"
+   sodipodi:docname="pidgin.svg"
+   inkscape:export-filename="/home/hbons/Desktop/pidgin24.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"
+   version="1.0">
+  <defs
+     id="defs4347">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3124">
+      <stop
+         style="stop-color:#3b1941;stop-opacity:1;"
+         offset="0"
+         id="stop3126" />
+      <stop
+         style="stop-color:#3b1941;stop-opacity:0;"
+         offset="1"
+         id="stop3128" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3116">
+      <stop
+         style="stop-color:#82508e;stop-opacity:1;"
+         offset="0"
+         id="stop3118" />
+      <stop
+         style="stop-color:#82508e;stop-opacity:0;"
+         offset="1"
+         id="stop3120" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3108">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop3110" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop3112" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5438">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop5440" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop5442" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6817">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6819" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6821" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6537">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6539" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6541" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6506">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop6508" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop6510" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2804">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop2806" />
+      <stop
+         id="stop2812"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2808" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25572"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836637"
+       cy="1.5104795"
+       fx="7.8836637"
+       fy="1.5104795"
+       r="8.4883642" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25568"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836741"
+       cy="0.14505707"
+       fx="7.8836741"
+       fy="0.14505707"
+       r="8.4883642" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient25546">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop25548" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop25550" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25554"
+       cx="7.8836637"
+       cy="2.6242435"
+       fx="7.8836637"
+       fy="2.6242435"
+       r="8.4883642"
+       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3800">
+      <stop
+         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop3802" />
+      <stop
+         style="stop-color:#df9725;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop3804" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient6512"
+       x1="15.645709"
+       y1="39.029884"
+       x2="15.645709"
+       y2="43.206608"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.660903,0,0,0.627207,-0.293224,-4.361383)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6817"
+       id="linearGradient6823"
+       x1="0.23931108"
+       y1="38.950283"
+       x2="5.7089725"
+       y2="42.982571"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5438"
+       id="linearGradient5444"
+       x1="30.152058"
+       y1="-0.86487341"
+       x2="30.152058"
+       y2="23.011967"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="44.272076"
+       x2="5.5366187"
+       y1="39.902092"
+       x1="-1.6841649"
+       id="linearGradient6569"
+       xlink:href="#linearGradient6563"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="23.559282"
+       x2="30.5"
+       y1="0.033532728"
+       x1="30.5"
+       id="linearGradient2089"
+       xlink:href="#linearGradient6537"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="50.079575"
+       x2="14.943421"
+       y1="39.743458"
+       x1="15.645709"
+       id="linearGradient2087"
+       xlink:href="#linearGradient6506"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2081">
+      <stop
+         id="stop2083"
+         offset="0.0000000"
+         style="stop-color:#f4d9b1;stop-opacity:1.0000000;" />
+      <stop
+         id="stop2085"
+         offset="1.0000000"
+         style="stop-color:#df9725;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
+       r="8.4883642"
+       fy="2.6242435"
+       fx="7.8836637"
+       cy="2.6242435"
+       cx="7.8836637"
+       id="radialGradient2079"
+       xlink:href="#linearGradient25546"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.4883642"
+       fy="0.14505707"
+       fx="7.8836741"
+       cy="0.14505707"
+       cx="7.8836741"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2071"
+       xlink:href="#linearGradient25546"
+       inkscape:collect="always" />
+    <radialGradient
+       r="8.4883642"
+       fy="1.5104795"
+       fx="7.8836637"
+       cy="1.5104795"
+       cx="7.8836637"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2069"
+       xlink:href="#linearGradient25546"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2061">
+      <stop
+         id="stop2063"
+         offset="0"
+         style="stop-color:black;stop-opacity:0;" />
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0.5"
+         id="stop2065" />
+      <stop
+         id="stop2067"
+         offset="1"
+         style="stop-color:black;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6563"
+       inkscape:collect="always">
+      <stop
+         id="stop6565"
+         offset="0"
+         style="stop-color:white;stop-opacity:1;" />
+      <stop
+         id="stop6567"
+         offset="1"
+         style="stop-color:white;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2850"
+       inkscape:collect="always">
+      <stop
+         id="stop2852"
+         offset="0"
+         style="stop-color:#ce5c00;stop-opacity:1;" />
+      <stop
+         id="stop2854"
+         offset="1"
+         style="stop-color:#ce5c00;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3958"
+       inkscape:collect="always">
+      <stop
+         id="stop3960"
+         offset="0"
+         style="stop-color:#eeeeec;stop-opacity:1;" />
+      <stop
+         id="stop3962"
+         offset="1"
+         style="stop-color:#eeeeec;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3968"
+       inkscape:collect="always">
+      <stop
+         id="stop3970"
+         offset="0"
+         style="stop-color:#82508e;stop-opacity:1;" />
+      <stop
+         id="stop3972"
+         offset="1"
+         style="stop-color:#82508e;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3976"
+       inkscape:collect="always">
+      <stop
+         id="stop3978"
+         offset="0"
+         style="stop-color:#3b1941;stop-opacity:1;" />
+      <stop
+         id="stop3980"
+         offset="1"
+         style="stop-color:#3b1941;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2850"
+       id="linearGradient2149"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.769231,0,0,0.714287,-34.23081,-12.28573)"
+       x1="21.785719"
+       y1="28.142857"
+       x2="17.785713"
+       y2="30.07143" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3958"
+       id="radialGradient2191"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.116159,0,0,1.076653,-36.39499,-20.28695)"
+       cx="9.0640488"
+       cy="21.511742"
+       fx="9.0640488"
+       fy="21.511742"
+       r="16.663956" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient2193"
+       gradientUnits="userSpaceOnUse"
+       x1="15.645709"
+       y1="39.743458"
+       x2="15.645709"
+       y2="53.502155"
+       gradientTransform="matrix(0.660903,0,0,0.627207,-32.26852,-10.3201)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3968"
+       id="linearGradient2196"
+       gradientUnits="userSpaceOnUse"
+       x1="16.13257"
+       y1="40.781811"
+       x2="16.13257"
+       y2="48.068741"
+       gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3976"
+       id="linearGradient2198"
+       gradientUnits="userSpaceOnUse"
+       x1="12.095973"
+       y1="40.907658"
+       x2="12.095973"
+       y2="46.463146"
+       gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6537"
+       id="linearGradient2201"
+       gradientUnits="userSpaceOnUse"
+       x1="30.5"
+       y1="0.033532728"
+       x2="30.5"
+       y2="23.559282"
+       gradientTransform="matrix(0.668893,0,0,0.668627,-32.91377,-10.19246)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3108"
+       id="linearGradient3114"
+       x1="10.18327"
+       y1="16.618088"
+       x2="27.598003"
+       y2="36.64465"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.660903,0,0,0.627207,-0.293224,-4.361383)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3116"
+       id="linearGradient3122"
+       x1="15.722902"
+       y1="38.768803"
+       x2="15.722902"
+       y2="43.249905"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67692,0,0,0.646801,-0.560381,-4.949693)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3124"
+       id="linearGradient3130"
+       x1="13.150809"
+       y1="38.849556"
+       x2="13.150809"
+       y2="43.105652"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67692,0,0,0.646801,-0.560381,-4.949693)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2850"
+       id="linearGradient3146"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.769231,0,0,0.714287,-2.265038,-6.285729)"
+       x1="21.785719"
+       y1="28.142857"
+       x2="17.785713"
+       y2="30.07143" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5438"
+       id="linearGradient2848"
+       gradientUnits="userSpaceOnUse"
+       x1="30.152058"
+       y1="-0.86487341"
+       x2="30.152058"
+       y2="23.011967" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="32.163554"
+     inkscape:cx="16.820721"
+     inkscape:cy="19.317678"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1440"
+     inkscape:window-height="846"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:grid-points="false"
+     width="24px"
+     height="24px"
+     inkscape:object-bbox="true" />
+  <metadata
+     id="metadata4350">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="opacity:1;fill:#75507b;fill-opacity:1"
+       d="M 11.578108,7.0000021 C 7.9352949,7.0000021 6.8108928,10.527259 9.3387556,13.902593 C 10.158711,14.997432 12.647399,17 12.984587,17 L 13.003895,16.098595 C 11.972573,14.801596 10.625325,13.293856 10.921791,12.985569 C 14.677426,12.985569 14.964445,11.881489 14.964445,9.8346762 C 14.964445,8.0544242 13.616029,7.0000021 11.578108,7.0000021 z "
+       id="path6521"
+       sodipodi:nodetypes="csccccc" />
+    <path
+       style="opacity:1;fill:url(#linearGradient3122);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:0.99999976;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 9.593419,3.4587201 C 5.1094995,3.4587201 1.470379,7.0808064 1.470379,11.543733 C 1.470379,15.200191 1.4534941,19.889159 1.4534941,24.526857 C 2.2573289,24.526857 18.357073,24.544824 20.178665,24.544824 C 21.609759,24.544824 21.497959,23.212673 21.497959,23.212673 C 21.497959,21.488682 18.121191,20.042088 16.913262,18.776605 C 15.675569,17.482342 17.039539,14.777738 17.039539,14.777738 C 17.473652,13.788261 17.716459,12.691859 17.716459,11.543733 C 17.716459,7.0808064 14.077339,3.4587201 9.593419,3.4587201 z "
+       id="path5176"
+       sodipodi:nodetypes="ccccszcsc" />
+    <path
+       style="opacity:0.5;fill:url(#linearGradient3114);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 9.620321,4.4587156 C 5.6467762,4.4587156 2.4025968,7.6421549 2.3916944,11.612795 C 2.3916761,11.619492 2.3911679,11.625715 2.3916944,11.632396 C 2.3916944,16.20315 2.2865209,19.635632 2.2865209,23.549252 C 3.5664133,23.549252 14.545552,23.530565 18.395955,23.530565 C 19.167366,23.530565 20.480051,23.846723 20.480051,22.928139 C 20.480051,22.78906 20.348035,22.527556 19.984374,22.202931 C 19.620712,21.878306 19.076795,21.529724 18.476689,21.18372 C 17.329967,20.638287 16.501491,20.156486 15.979032,19.027696 C 15.575878,18.51709 15.390866,17.916861 15.35487,17.263676 C 15.318875,16.610491 15.639642,15.909718 15.716861,15.244853 C 15.871301,13.915122 16.208698,14.631229 16.208698,14.631229 C 16.218605,14.590901 16.232433,14.551532 16.250005,14.513628 C 16.638273,13.634657 16.848948,12.655557 16.848948,11.632396 C 16.848948,7.6523934 13.600567,4.4587156 9.620321,4.4587156 z "
+       id="path5241"
+       sodipodi:nodetypes="cscccssccsscssc" />
+    <path
+       style="fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 4.038333,8.0864989 C 5.573681,6.4493239 8.07145,6.8854919 9.05179,7.9308479 C 10.395216,9.3633699 10.239455,11.85472 8.704108,13.491894 C 7.369866,14.914624 5.175281,15.660821 3.831853,14.228299 C 2.488425,12.795776 2.825354,9.3799249 4.038333,8.0864989 z "
+       id="path3138"
+       sodipodi:nodetypes="csssc" />
+    <path
+       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 8.8136637,11.188225 C 8.8136637,12.837133 7.3689434,13.95874 6.3944626,13.95874 C 5.0590642,13.95874 3.9752623,12.620497 3.9752623,10.971589 C 3.9752623,9.5386622 4.7181965,7.9844383 6.0535952,7.9844383 C 7.3889945,7.9844383 8.8136637,9.8855295 8.8136637,11.188225 z "
+       id="path5157"
+       sodipodi:nodetypes="csssc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5162"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(1.208633,0,0,1.158621,-5.825637,-16.66897)" />
+    <path
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 4.9752634,2.5424297 C 6.2676381,1.111155 8.059671,2.6823452 8.9752679,3.325734 L 7.061552,3.7844642 L 4.9752634,2.5424297 z "
+       id="path5192"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 6.9752602,1.2553494 C 8.5939382,0.25341885 11.64336,2.4607647 11.936975,3.3797691 L 9.4042533,2.9587153 L 6.9752602,1.2553494 z "
+       id="rect5189"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 17.336751,8.8148749 C 16.436419,7.5869931 14.971722,7.9141192 14.396849,8.6981357 C 13.609061,9.7725277 13.7004,11.64104 14.600731,12.868921 C 15.383133,13.93597 16.670043,14.495617 17.457832,13.421225 C 18.245621,12.346833 18.048044,9.7849448 17.336751,8.8148749 z "
+       id="path3132"
+       sodipodi:nodetypes="csssc" />
+    <path
+       style="fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 17.468686,9.5432478 C 16.793205,8.7246594 15.694305,8.9427465 15.263003,9.4654264 C 14.671958,10.181691 14.740486,11.427368 15.415967,12.245957 C 16.00297,12.957323 16.968483,13.33042 17.559527,12.614156 C 18.150572,11.897891 18.002339,10.189962 17.468686,9.5432478 z "
+       id="path3134"
+       sodipodi:nodetypes="csssc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path3136"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(1.153827,0,0,1.158621,4.558885,-16.66895)" />
+    <rect
+       style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect3140"
+       width="4.4400907"
+       height="1"
+       x="9.501585"
+       y="14"
+       rx="0.69182354"
+       ry="0.5" />
+    <path
+       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 6.965729,14.893438 C 12.054241,18.243015 11.620917,13 12.397198,13 C 13.162798,13 12.66503,18.201991 16.965729,14.895644 C 16.232886,16.102946 13.980397,18 13.030799,18 C 12.07051,18 8.156601,16.676807 6.965729,14.893438 z "
+       id="path3142"
+       sodipodi:nodetypes="czczc" />
+    <path
+       style="fill:url(#linearGradient3146);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 6.965729,14.893439 C 11.706133,19.171305 11.620917,13 12.397198,13 C 13.162798,13 12.607012,18.027939 16.965729,14.895646 C 16.232886,16.102947 13.980397,18 13.030799,18 C 12.07051,18 8.156602,16.676809 6.965729,14.893439 z "
+       id="path3144"
+       sodipodi:nodetypes="czczc" />
+  </g>
+</svg>
Binary file pidgin/pixmaps/icons/hicolor/32x32/apps/pidgin.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/icons/hicolor/32x32/apps/scalable/pidgin.svg	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,489 @@
+<?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://web.resource.org/cc/"
+   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="svg4345"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/32/scalable"
+   sodipodi:docname="pidgin.svg"
+   inkscape:export-filename="/home/hbons/Desktop/pidgin32.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"
+   version="1.0">
+  <defs
+     id="defs4347">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3976">
+      <stop
+         style="stop-color:#3b1941;stop-opacity:1;"
+         offset="0"
+         id="stop3978" />
+      <stop
+         style="stop-color:#3b1941;stop-opacity:0;"
+         offset="1"
+         id="stop3980" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3968">
+      <stop
+         style="stop-color:#82508e;stop-opacity:1;"
+         offset="0"
+         id="stop3970" />
+      <stop
+         style="stop-color:#82508e;stop-opacity:0;"
+         offset="1"
+         id="stop3972" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3958">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop3960" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop3962" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2850">
+      <stop
+         style="stop-color:#ce5c00;stop-opacity:1;"
+         offset="0"
+         id="stop2852" />
+      <stop
+         style="stop-color:#ce5c00;stop-opacity:0;"
+         offset="1"
+         id="stop2854" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2850"
+       id="linearGradient2856"
+       x1="21.785719"
+       y1="28.142857"
+       x2="17.785713"
+       y2="30.07143"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-47,-15.99998)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2816">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop2818" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop2820" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2816"
+       id="radialGradient2824"
+       cx="9.4288578"
+       cy="19.283415"
+       fx="9.4288578"
+       fy="19.283415"
+       r="16.390338"
+       gradientTransform="matrix(1.556432,0,0,1.618148,-52.04294,-30.39321)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2826">
+      <stop
+         style="stop-color:#3b1941;stop-opacity:1;"
+         offset="0"
+         id="stop2828" />
+      <stop
+         style="stop-color:#3b1941;stop-opacity:0;"
+         offset="1"
+         id="stop2830" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2826"
+       id="linearGradient2832"
+       x1="13.191773"
+       y1="41.606163"
+       x2="13.191773"
+       y2="47.843258"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.988192,-46.55265,-16.48621)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2834">
+      <stop
+         style="stop-color:#82508e;stop-opacity:1;"
+         offset="0"
+         id="stop2836" />
+      <stop
+         style="stop-color:#82508e;stop-opacity:0;"
+         offset="1"
+         id="stop2838" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2834"
+       id="linearGradient2840"
+       x1="11.373499"
+       y1="41.566242"
+       x2="11.373499"
+       y2="47.746658"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.988192,-46.55265,-16.48621)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6563">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6565" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6567" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6537">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6539" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6541" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6506">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop6508" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop6510" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2804">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop2806" />
+      <stop
+         id="stop2812"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2808" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25572"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836637"
+       cy="1.5104795"
+       fx="7.8836637"
+       fy="1.5104795"
+       r="8.4883642" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25568"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836741"
+       cy="0.14505707"
+       fx="7.8836741"
+       fy="0.14505707"
+       r="8.4883642" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient25546">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop25548" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop25550" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25554"
+       cx="7.8836637"
+       cy="2.6242435"
+       fx="7.8836637"
+       fy="2.6242435"
+       r="8.4883642"
+       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3800">
+      <stop
+         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop3802" />
+      <stop
+         style="stop-color:#df9725;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop3804" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient6512"
+       x1="15.645709"
+       y1="39.743458"
+       x2="14.943421"
+       y2="50.079575"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6537"
+       id="linearGradient6543"
+       x1="30.5"
+       y1="0.033532728"
+       x2="30.5"
+       y2="23.559282"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6563"
+       id="linearGradient6569"
+       x1="-1.6841649"
+       y1="39.902092"
+       x2="5.5366187"
+       y2="44.272076"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6537"
+       id="linearGradient3069"
+       gradientUnits="userSpaceOnUse"
+       x1="30.5"
+       y1="0.033532728"
+       x2="30.5"
+       y2="23.559282" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       x1="15.645709"
+       y1="39.743458"
+       x2="15.645709"
+       y2="53.502155"
+       gradientTransform="translate(-47,-15)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3958"
+       id="radialGradient3966"
+       cx="9.0640488"
+       cy="21.511742"
+       fx="9.0640488"
+       fy="21.511742"
+       r="16.663956"
+       gradientTransform="matrix(1.68884,0,0,1.716583,-6.243689,-15.89085)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3968"
+       id="linearGradient3974"
+       x1="16.13257"
+       y1="40.781811"
+       x2="16.13257"
+       y2="48.068741"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3976"
+       id="linearGradient3982"
+       x1="12.095973"
+       y1="40.907658"
+       x2="12.095973"
+       y2="46.463146"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2850"
+       id="linearGradient3991"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.769231,0,0,0.714287,-1.230773,-2.285726)"
+       x1="21.785719"
+       y1="28.142857"
+       x2="17.785713"
+       y2="30.07143" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.236022"
+     inkscape:cx="21.944662"
+     inkscape:cy="16.287609"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1434"
+     inkscape:window-height="840"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:grid-points="false"
+     width="32px"
+     height="32px"
+     inkscape:object-bbox="true" />
+  <metadata
+     id="metadata4350">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0057179"
+       inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z "
+       style="fill:none;fill-opacity:1;stroke:white;stroke-width:1.47727883;stroke-miterlimit:4;stroke-opacity:1"
+       id="path6504"
+       d="M 20.53125,2.5 C 17.817519,2.5 15.5,5.0792547 15.5,8.46875 L 15.5,20.53125 C 15.5,23.920745 17.817519,26.5 20.53125,26.5 L 34.53125,26.5 C 35.082213,26.503178 35.528072,26.949037 35.53125,27.5 L 35.53125,29.09375 L 38.75,26.6875 C 38.923102,26.563771 39.130983,26.498125 39.34375,26.5 L 41.5,26.5 C 43.245978,26.5 44.034662,25.931926 44.625,24.9375 C 45.215338,23.943074 45.5,22.371297 45.5,20.53125 L 45.5,8.46875 C 45.5,5.079255 43.182481,2.5 40.46875,2.5 L 20.53125,2.5 z "
+       transform="matrix(0.67692,0,0,0.67692,0.161535,-0.515354)" />
+    <path
+       style="fill:#efefef;fill-opacity:1;stroke:#787878;stroke-width:1.46586692;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 20.53125,1.5 C 17.192693,1.5 14.5,4.611235 14.5,8.46875 L 14.5,20.53125 C 14.5,24.388765 17.428915,28.139948 20.767472,28.139948 L 33.409288,28.041495 L 33.415412,31.845969 L 38.723454,28.076231 L 42.130099,28.139948 C 46.142836,28.139948 46.5,24.580097 46.5,20.728157 L 46.5,8.46875 C 46.5,4.6112353 43.807307,1.5 40.46875,1.5 L 20.53125,1.5 z "
+       id="rect5498"
+       sodipodi:nodetypes="cccccccccccc"
+       transform="matrix(0.687501,0,0,0.67692,-0.468758,-0.515381)" />
+    <path
+       transform="matrix(0.668893,0,0,0.668627,8.626692e-2,-0.192463)"
+       style="fill:url(#linearGradient6543);fill-opacity:1;stroke:white;stroke-width:1.49530375;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 20.53125,2.53125 C 17.841732,2.53125 15.53125,5.0973912 15.53125,8.46875 L 15.53125,20.53125 C 15.53125,23.902609 17.841732,26.46875 20.53125,26.46875 L 33.967629,26.46875 C 34.534122,26.476048 34.991581,26.933507 34.998879,27.5 L 34.998879,29 L 38.71875,26.65625 C 38.901723,26.528628 39.120742,26.462922 39.34375,26.46875 L 42.415884,26.46875 C 45.139435,26.46875 45.46875,24.282574 45.46875,20.53125 L 45.46875,8.46875 C 45.46875,5.0973915 43.158268,2.53125 40.46875,2.53125 L 20.53125,2.53125 z "
+       id="path6535"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <path
+       style="opacity:1;fill:url(#linearGradient3974);fill-opacity:1.0;stroke:url(#linearGradient3982);stroke-width:1.51128328;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 4.8460021,40.483064 0.49299658,38.484005 0.052646307,45.33795 C 0.052646307,47.422072 1.0380664,48.413461 3.1446965,48.413461 C 4.3321851,48.413461 29.360035,48.5596 32.051034,48.5596 C 34.165161,48.5596 34,46.5 34,46.5 C 34,43.834589 27.597902,41.598052 25.813453,39.641526 C 23.985035,37.640505 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z "
+       id="path5176"
+       sodipodi:nodetypes="cccccszcsc"
+       transform="matrix(0.67692,0,0,0.646801,0.464358,-0.908413)" />
+    <path
+       style="opacity:0.5;fill:url(#radialGradient3966);fill-opacity:1.0;stroke:url(#linearGradient6512);stroke-width:1.55319357;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0625,25.489316 4.0625,25.5 C 4.9744187,33.020507 4.3062656,37.469969 2.59375,40.59375 C -0.19778709,46.24536 1.5610206,47.490284 3.9033639,47.490284 C 5.8399452,47.490284 23.958121,47.46049 29.784094,47.46049 C 30.951301,47.46049 32.9375,47.964563 32.9375,46.5 C 32.9375,46.278257 32.737749,45.861323 32.1875,45.34375 C 31.637251,44.826177 30.81426,44.270409 29.90625,43.71875 C 28.99824,43.167091 28.02821,42.609033 27.15625,42.0625 C 26.28429,41.515967 25.511654,41.005793 24.96875,40.28125 C 24.358745,39.467156 24.078806,38.510169 24.024342,37.46875 C 23.969878,36.427331 24.107721,35.310041 24.224561,34.25 C 24.458241,32.129917 24.96875,30.28125 24.96875,30.28125 C 24.98374,30.216952 25.004663,30.154183 25.03125,30.09375 C 25.618731,28.692346 25.9375,27.131297 25.9375,25.5 C 25.9375,19.154404 21.022436,14.0625 15,14.0625 z "
+       id="path5241"
+       sodipodi:nodetypes="csscccssssssscssc"
+       transform="matrix(0.660903,0,0,0.627207,0.731515,-0.320103)" />
+    <path
+       style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 5.0726004,12.086499 C 6.6079483,10.449324 9.1057173,10.885492 10.086057,11.930848 C 11.429483,13.36337 11.273722,15.85472 9.7383746,17.491894 C 8.4041332,18.914624 6.2095475,19.660821 4.8661202,18.228299 C 3.5226923,16.795776 3.8596213,13.379925 5.0726004,12.086499 z "
+       id="path5160"
+       sodipodi:nodetypes="csssc" />
+    <path
+       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
+       id="path5157"
+       sodipodi:nodetypes="csssc"
+       transform="matrix(1.010846,0,0,1.029732,-3.562503,-10.12874)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5162"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(1.208633,0,0,1.158621,-4.791365,-12.66897)" />
+    <path
+       transform="matrix(0.596326,-0.813274,-0.562251,-0.766804,24.4163,42.47989)"
+       style="opacity:1;fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
+       id="path5167"
+       sodipodi:nodetypes="csssc" />
+    <path
+       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
+       id="path5169"
+       sodipodi:nodetypes="csssc"
+       transform="matrix(0.447398,-0.542185,-0.421833,-0.511203,23.06465,33.31996)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5171"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(1.208633,0,0,1.158621,5.208632,-12.66896)" />
+    <rect
+       style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5215"
+       width="4.4400907"
+       height="1"
+       x="10.535856"
+       y="18"
+       rx="0.69182354"
+       ry="0.5" />
+    <path
+       transform="matrix(0.670792,0,0,0.486348,-1.815475,1.13962)"
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 11.651119,11.193815 C 13.577759,8.2509126 16.249277,11.481501 17.614226,12.804399 L 14.761306,13.747613 L 11.651119,11.193815 z "
+       id="path5192"
+       sodipodi:nodetypes="cccc" />
+    <path
+       transform="matrix(0.851014,0,0,0.554879,-1.947706,-0.153319)"
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.174576,11.994261 17.519594,13.650486 L 14.543472,12.891665 L 11.689238,9.8218679 z "
+       id="rect5189"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 8,18.893438 C 13.088512,22.243015 12.655188,17 13.431469,17 C 14.197069,17 13.699301,22.201991 18,18.895644 C 17.267157,20.102946 15.014668,22 14.06507,22 C 13.104781,22 9.1908718,20.676807 8,18.893438 z "
+       id="path3987"
+       sodipodi:nodetypes="czczc" />
+    <path
+       style="fill:url(#linearGradient3991);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 8,18.893439 C 12.740404,23.171305 12.655188,17 13.431469,17 C 14.197069,17 13.641283,22.027939 18,18.895646 C 17.267157,20.102947 15.014668,22 14.06507,22 C 13.104781,22 9.1908731,20.676809 8,18.893439 z "
+       id="path3989"
+       sodipodi:nodetypes="czczc" />
+  </g>
+</svg>
Binary file pidgin/pixmaps/icons/hicolor/48x48/apps/pidgin.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/icons/hicolor/48x48/apps/scalable/pidgin.svg	Mon Nov 12 16:53:54 2007 +0000
@@ -0,0 +1,460 @@
+<?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://web.resource.org/cc/"
+   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="48px"
+   height="48px"
+   id="svg4345"
+   sodipodi:version="0.32"
+   inkscape:version="0.44.1"
+   sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/48/scalable"
+   sodipodi:docname="pidgin.svg"
+   inkscape:export-filename="/home/hbons/Desktop/pidgin48.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4347">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2850">
+      <stop
+         style="stop-color:#ce5c00;stop-opacity:1;"
+         offset="0"
+         id="stop2852" />
+      <stop
+         style="stop-color:#ce5c00;stop-opacity:0;"
+         offset="1"
+         id="stop2854" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2834">
+      <stop
+         style="stop-color:#82508e;stop-opacity:1;"
+         offset="0"
+         id="stop2836" />
+      <stop
+         style="stop-color:#82508e;stop-opacity:0;"
+         offset="1"
+         id="stop2838" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2826">
+      <stop
+         style="stop-color:#3b1941;stop-opacity:1;"
+         offset="0"
+         id="stop2828" />
+      <stop
+         style="stop-color:#3b1941;stop-opacity:0;"
+         offset="1"
+         id="stop2830" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2816">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop2818" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop2820" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6563">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6565" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6567" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6537">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6539" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6541" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6506">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop6508" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop6510" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6493">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop6495" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:0;"
+         offset="1"
+         id="stop6497" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5280">
+      <stop
+         style="stop-color:#82508e;stop-opacity:1;"
+         offset="0"
+         id="stop5282" />
+      <stop
+         style="stop-color:#82508e;stop-opacity:0;"
+         offset="1"
+         id="stop5284" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2804">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop2806" />
+      <stop
+         id="stop2812"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2808" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25572"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836637"
+       cy="1.5104795"
+       fx="7.8836637"
+       fy="1.5104795"
+       r="8.4883642" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25568"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)"
+       cx="7.8836741"
+       cy="0.14505707"
+       fx="7.8836741"
+       fy="0.14505707"
+       r="8.4883642" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient25546">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop25548" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop25550" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient25546"
+       id="radialGradient25554"
+       cx="7.8836637"
+       cy="2.6242435"
+       fx="7.8836637"
+       fy="2.6242435"
+       r="8.4883642"
+       gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3800">
+      <stop
+         style="stop-color:#f4d9b1;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop3802" />
+      <stop
+         style="stop-color:#df9725;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop3804" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5280"
+       id="radialGradient5286"
+       cx="15.004828"
+       cy="39.80859"
+       fx="15.004828"
+       fy="39.80859"
+       r="9.7225161"
+       gradientTransform="matrix(1,0,0,0.732283,0,10.65742)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6493"
+       id="linearGradient6499"
+       x1="3.3105288"
+       y1="43.5"
+       x2="5.6917014"
+       y2="43.5"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6506"
+       id="linearGradient6512"
+       x1="15.645709"
+       y1="41.751736"
+       x2="15.645709"
+       y2="47.370037"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.988192,0.5625,-1.39645)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6537"
+       id="linearGradient6543"
+       x1="30.5"
+       y1="5.7732024"
+       x2="30.5"
+       y2="19.518673"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6563"
+       id="linearGradient6573"
+       gradientUnits="userSpaceOnUse"
+       x1="12.01321"
+       y1="38.950283"
+       x2="5.5366187"
+       y2="44.272076" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2816"
+       id="radialGradient2824"
+       cx="9.4288578"
+       cy="19.283415"
+       fx="9.4288578"
+       fy="19.283415"
+       r="16.390338"
+       gradientTransform="matrix(1.556432,0,0,1.618148,-5.04294,-15.39321)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2826"
+       id="linearGradient2832"
+       x1="13.191773"
+       y1="41.606163"
+       x2="13.191773"
+       y2="47.843258"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2834"
+       id="linearGradient2840"
+       x1="11.373499"
+       y1="41.566242"
+       x2="11.373499"
+       y2="47.746658"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2850"
+       id="linearGradient2856"
+       x1="21.785719"
+       y1="28.142857"
+       x2="17.785713"
+       y2="30.07143"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,-0.999982)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14"
+     inkscape:cx="34.459692"
+     inkscape:cy="22.220728"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1434"
+     inkscape:window-height="840"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:grid-points="true" />
+  <metadata
+     id="metadata4350">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <rect
+       style="opacity:0.23144106;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect6514"
+       width="36.000004"
+       height="2.9999979"
+       x="-4.4446878"
+       y="57.424854"
+       rx="2.0412357"
+       ry="1.4999989" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0057179"
+       inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z "
+       style="fill:none;fill-opacity:1;stroke:white;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       id="path6504"
+       d="M 20.53125,2.5 C 17.817519,2.5 15.5,5.0792547 15.5,8.46875 L 15.5,20.53125 C 15.5,23.920745 17.817519,26.5 20.53125,26.5 L 34.53125,26.5 C 35.082213,26.503178 35.528072,26.949037 35.53125,27.5 L 35.53125,29.09375 L 38.75,26.6875 C 38.923102,26.563771 39.130983,26.498125 39.34375,26.5 L 41.5,26.5 C 43.245978,26.5 44.034662,25.931926 44.625,24.9375 C 45.215338,23.943074 45.5,22.371297 45.5,20.53125 L 45.5,8.46875 C 45.5,5.079255 43.182481,2.5 40.46875,2.5 L 20.53125,2.5 z " />
+    <path
+       style="fill:#efefef;fill-opacity:1;stroke:#787878;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 20.53125,1.5 C 17.192693,1.5 14.5,4.611235 14.5,8.46875 L 14.5,20.53125 C 14.5,24.388765 17.192693,27.5 20.53125,27.5 L 34.530203,27.5 L 34.530203,31.107567 L 39.353553,27.485509 L 41.5,27.5 C 45.512737,27.5 46.5,24.38319 46.5,20.53125 L 46.5,8.46875 C 46.5,4.6112353 43.807307,1.5 40.46875,1.5 L 20.53125,1.5 z "
+       id="rect5498"
+       sodipodi:nodetypes="cccccccccccc" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.044691"
+       inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z "
+       style="fill:url(#linearGradient6543);fill-opacity:1.0;stroke:white;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       id="path6535"
+       d="M 20.53125,2.53125 C 17.841732,2.53125 15.53125,5.0973912 15.53125,8.46875 L 15.53125,20.53125 C 15.53125,23.902609 17.841732,26.46875 20.53125,26.46875 L 34.53125,26.46875 C 35.097743,26.476048 35.555202,26.933507 35.5625,27.5 L 35.5625,29 L 38.71875,26.65625 C 38.901723,26.528628 39.120742,26.462922 39.34375,26.46875 L 41.5,26.46875 C 43.235888,26.46875 44.009537,25.921608 44.59375,24.9375 C 45.177963,23.953392 45.46875,22.367968 45.46875,20.53125 L 45.46875,8.46875 C 45.46875,5.0973915 43.158268,2.53125 40.46875,2.53125 L 20.53125,2.53125 z " />
+    <path
+       style="opacity:1;fill:url(#linearGradient2840);fill-opacity:1.0;stroke:url(#linearGradient2832);stroke-width:1.00595677;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 4.8460021,40.483064 0.49299658,38.484005 0.052646307,45.33795 C 0.052646307,47.422072 1.0380664,48.413461 3.1446965,48.413461 C 4.3321851,48.413461 29.360035,48.5596 32.051034,48.5596 C 34.165161,48.5596 34,46.5 34,46.5 C 34,43.834589 27.597902,41.598052 25.813453,39.641526 C 23.985035,37.640505 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z "
+       id="path5176"
+       sodipodi:nodetypes="cccccszcsc"
+       transform="matrix(1,0,0,0.988192,0.447354,-1.486208)" />
+    <path
+       style="opacity:0.5;fill:url(#radialGradient2824);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 15.5625,12.5 C 9.550204,12.5 4.641496,17.515648 4.625,23.771565 C 4.624972,23.782116 4.625,23.791888 4.625,23.802446 C 5.536919,31.234151 4.868766,35.631074 3.15625,38.717969 C 0.36471303,44.302845 2.123521,45.533069 4.465864,45.533069 C 6.402445,45.533069 24.520621,45.503627 30.346594,45.503627 C 31.513801,45.503627 33.5,46.001748 33.5,44.554478 C 33.5,44.335354 33.300249,43.923343 32.75,43.411881 C 32.199751,42.90042 31.37676,42.351214 30.46875,41.806069 C 29.56074,41.260924 28.59071,40.709456 27.71875,40.169376 C 26.84679,39.629297 26.074154,39.125147 25.53125,38.409159 C 24.921245,37.604678 24.641306,36.658991 24.586842,35.629869 C 24.532378,34.600747 24.670221,33.49665 24.787061,32.449126 C 25.020741,30.354077 25.53125,28.527239 25.53125,28.527239 C 25.54624,28.4637 25.567163,28.401673 25.59375,28.341953 C 26.181231,26.957097 26.5,25.414481 26.5,23.802446 C 26.5,17.531779 21.584936,12.5 15.5625,12.5 z "
+       id="path5241"
+       sodipodi:nodetypes="csscccssssssscssc" />
+    <path
+       style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 7.269301,19.503118 C 9.2717505,17.238166 12.529418,17.841584 13.808008,19.287784 C 15.560146,21.269611 15.356996,24.71627 13.354547,26.981222 C 11.614386,28.949501 8.7521391,29.981828 7,28 C 5.2478601,26.018172 5.6872953,21.292511 7.269301,19.503118 z "
+       id="path5160"
+       sodipodi:nodetypes="csssc" />
+    <path
+       transform="matrix(1.46245,0,0,1.378883,-5.440518,-10.80605)"
+       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
+       id="path5157"
+       sodipodi:nodetypes="csssc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5162"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(1.208632,0,0,1.544828,-1.738701,-14.41893)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:black;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5164"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(0.402878,0,0,0.514947,6.455534,10.62004)" />
+    <path
+       style="opacity:1;fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 27.88281,19.946791 C 26.359012,18.309616 23.880032,18.745786 22.907068,19.791141 C 21.573747,21.223665 21.728337,23.715015 23.252136,25.35219 C 24.576341,26.77492 26.754418,27.521117 28.087739,26.088593 C 29.42106,24.656068 29.086665,21.240217 27.88281,19.946791 z "
+       id="path5167"
+       sodipodi:nodetypes="csssc" />
+    <path
+       transform="matrix(0.726374,-0.813272,-0.684868,-0.766801,34.41717,50.34012)"
+       style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z "
+       id="path5169"
+       sodipodi:nodetypes="csssc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5171"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(1.208632,0,0,1.598777,13.20865,-15.80042)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:black;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path5173"
+       sodipodi:cx="10.169642"
+       sodipodi:cy="24.3125"
+       sodipodi:rx="1.2410715"
+       sodipodi:ry="1.2946428"
+       d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1  8.928571,24.3125 A 1.2410715 1.2946428 0 1 1  11.410714 24.3125 z"
+       transform="matrix(0.402878,0,0,0.53293,21.40289,10.11299)" />
+    <rect
+       style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5215"
+       width="7"
+       height="1.8602936"
+       x="15"
+       y="27.000017"
+       rx="0.81387848"
+       ry="0.93014681" />
+    <path
+       style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 12.000005,28.650812 C 17.33287,31.553263 18.051747,26 19.060912,26 C 20.056192,26 20.46502,31.577054 25,28.653901 C 24.047304,30.344123 21.119071,32.999996 19.884593,32.999996 C 18.636217,32.999996 13.548138,31.147528 12.000005,28.650812 z "
+       id="rect5187"
+       sodipodi:nodetypes="czczc" />
+    <path
+       transform="matrix(1.236264,0,0,0.549587,-6.482886,4.775206)"
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 11.651119,11.193815 C 12.963532,7.814583 16.999999,10.43431 16.999999,12.891665 L 13.737594,13.834879 L 11.651119,11.193815 z "
+       id="path5192"
+       sodipodi:nodetypes="cccc" />
+    <path
+       transform="matrix(1.50247,0,0,1,-7.59464,-1.139701)"
+       style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.219555,11.23544 17.564573,12.891665 L 14.543472,12.891665 L 11.689238,9.8218679 z "
+       id="rect5189"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:url(#linearGradient2856);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 12.000005,28.650834 C 17.332871,31.553285 18.051747,26.000022 19.060912,26.000022 C 20.056192,26.000022 20.46502,31.577076 25,28.653923 C 24.047304,30.344145 21.119071,33.000018 19.884593,33.000018 C 18.636217,33.000018 13.548139,31.14755 12.000005,28.650834 z "
+       id="path6561"
+       sodipodi:nodetypes="czczc" />
+  </g>
+</svg>
--- a/pidgin/pixmaps/protocols/16/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-EXTRA_DIST =	aim.png \
-		bonjour.png \
-		gadu-gadu.png \
-		google-talk.png \
-		novell.png \
-		icq.png \
-		irc.png \
-		jabber.png \
-		meanwhile.png \
-		msn.png \
-		myspace.png \
-		qq.png \
-		silc.png \
-		simple.png \
-		yahoo.png \
-		zephyr.png
-
-pidginprotocolpixdir = $(datadir)/pixmaps/pidgin/protocols/16
-pidginprotocolpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/protocols/16/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginprotocolpix_DATA)'; then \
-	  mkdir -p $(pidginprotocolpixdir); \
-	  cp $(pidginprotocolpix_DATA) $(pidginprotocolpixdir); \
-	fi;
-
--- a/pidgin/pixmaps/protocols/22/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-EXTRA_DIST =	aim.png \
-		bonjour.png \
-		gadu-gadu.png \
-		google-talk.png \
-		novell.png \
-		icq.png \
-		irc.png \
-		jabber.png \
-		meanwhile.png \
-		msn.png \
-		myspace.png \
-		qq.png \
-		silc.png \
-		simple.png \
-		yahoo.png \
-		zephyr.png
-
-pidginprotocolpixdir = $(datadir)/pixmaps/pidgin/protocols/22
-
-pidginprotocolpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/protocols/22/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginprotocolpix_DATA)'; then \
-	  mkdir -p $(pidginprotocolpixdir); \
-	  cp $(pidginprotocolpix_DATA) $(pidginprotocolpixdir); \
-	fi;
-
--- a/pidgin/pixmaps/protocols/48/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-EXTRA_DIST =	aim.png \
-		bonjour.png \
-		gadu-gadu.png \
-		novell.png \
-		icq.png \
-		irc.png \
-		jabber.png \
-		meanwhile.png \
-		msn.png \
-		myspace.png \
-		qq.png \
-		silc.png \
-		simple.png \
-		yahoo.png \
-		zephyr.png
-
-pidginprotocolpixdir = $(datadir)/pixmaps/pidgin/protocols/48
-
-pidginprotocolpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/protocols/48/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginprotocolpix_DATA)'; then \
-	  mkdir -p $(pidginprotocolpixdir); \
-	  cp $(pidginprotocolpix_DATA) $(pidginprotocolpixdir); \
-	fi;
-
--- a/pidgin/pixmaps/status/11/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-SUBDIRS = rtl
-
-EXTRA_DIST = 	available.png \
-		away.png \
-		busy.png \
-		chat.png \
-		extended-away.png \
-		invisible.png \
-		log-in.png \
-		log-out.png \
-		offline.png \
-		person.png
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/11
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/11/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
-	$(MAKE) -C rtl -f Makefile.mingw install || exit 1; \
-
--- a/pidgin/pixmaps/status/11/rtl/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = 	extended-away.png
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/11/rtl
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/11/rtl/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
--- a/pidgin/pixmaps/status/16/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-SUBDIRS = rtl
-
-EXTRA_DIST = 	available.png \
-		away.png \
-		busy.png \
-		chat.png \
-		extended-away.png \
-		invisible.png \
-		log-in.png \
-		log-out.png \
-		offline.png \
-		person.png 
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/16
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/16/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
-	$(MAKE) -C rtl -f Makefile.mingw install || exit 1; \
-
--- a/pidgin/pixmaps/status/16/rtl/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = 	extended-away.png log-in.png log-out.png
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/16/rtl
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/16/rtl/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
--- a/pidgin/pixmaps/status/22/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-SUBDIRS = rtl
-
-EXTRA_DIST = 	available.png \
-		away.png \
-		busy.png \
-		chat.png \
-		extended-away.png \
-		invisible.png \
-		log-in.png \
-		log-out.png \
-		offline.png \
-		person.png
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/22
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/22/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
-	$(MAKE) -C rtl -f Makefile.mingw install || exit 1; \
-
--- a/pidgin/pixmaps/status/22/rtl/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = 	extended-away.png log-in.png log-out.png
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/22/rtl
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/22/rtl/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
--- a/pidgin/pixmaps/status/32/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-SUBDIRS = rtl
-
-EXTRA_DIST = 	available.png \
-		away.png \
-		busy.png \
-		chat.png \
-		extended-away.png \
-		invisible.png \
-		log-in.png \
-		log-out.png \
-		offline.png \
-		person.png
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/32
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/32/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
-	$(MAKE) -C rtl -f Makefile.mingw install || exit 1; \
-
--- a/pidgin/pixmaps/status/32/rtl/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = 	extended-away.png log-in.png log-out.png
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/32/rtl
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/32/rtl/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
--- a/pidgin/pixmaps/status/48/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-SUBDIRS = rtl
-
-EXTRA_DIST = 	available.png \
-		away.png \
-		busy.png \
-		chat.png \
-		extended-away.png \
-		log-in.png \
-		log-out.png \
-		offline.png \
-		person.png
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/48
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/48/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
-	$(MAKE) -C rtl -f Makefile.mingw install || exit 1; \
-
--- a/pidgin/pixmaps/status/48/rtl/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-EXTRA_DIST = 	extended-away.png
-
-pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/48/rtl
-
-pidginstatuspix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/status/48/rtl/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidginstatuspix_DATA)'; then \
-	  mkdir -p $(pidginstatuspixdir); \
-	  cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \
-	fi;
-
--- a/pidgin/pixmaps/toolbar/16/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-EXTRA_DIST = change-bgcolor.png \
-		change-fgcolor.png \
-		emote-select.png \
-		font-face.png \
-		font-size-down.png \
-		font-size-up.png \
-		insert.png \
-		insert-image.png \
-		insert-link.png \
-		message-new.png \
-		plugins.png \
-		send-file.png \
-		unblock.png
-
-pidgintoolbarpixdir = $(datadir)/pixmaps/pidgin/toolbar/16
-pidgintoolbarpix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/toolbar/16/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidgintoolbarpix_DATA)'; then \
-	  mkdir -p $(pidgintoolbarpixdir); \
-	  cp $(pidgintoolbarpix_DATA) $(pidgintoolbarpixdir); \
-	fi;
-
--- a/pidgin/pixmaps/toolbar/22/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-EXTRA_DIST = select-avatar.png
-
-pidgintoolbarpixdir = $(datadir)/pixmaps/pidgin/toolbar/22
-pidgintoolbarpix_DATA = $(EXTRA_DIST)
-
--- a/pidgin/pixmaps/toolbar/22/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidgintoolbarpix_DATA)'; then \
-	  mkdir -p $(pidgintoolbarpixdir); \
-	  cp $(pidgintoolbarpix_DATA) $(pidgintoolbarpixdir); \
-	fi;
-
--- a/pidgin/pixmaps/tray/16/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-TRAY_ICONS =	tray-away.png \
-		tray-busy.png \
-		tray-invisible.png \
-		tray-connecting.png \
-		tray-extended-away.png \
-		tray-message.png \
-		tray-new-im.png \
-		tray-offline.png \
-		tray-online.png
-
-EXTRA_DIST = $(TRAY_ICONS) \
-	available_4bit.ico \
-	away_4bit.ico \
-	busy_4bit.ico \
-	connecting_4bit.ico \
-	extended-away_4bit.ico \
-	invisible_4bit.ico \
-	message_4bit.ico \
-	offline_4bit.ico
-
-pidgintraypixdir = $(datadir)/pixmaps/pidgin/tray/16
-pidgintraypix_DATA = $(TRAY_ICONS)
--- a/pidgin/pixmaps/tray/16/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidgintraypix_DATA)'; then \
-	  mkdir -p $(pidgintraypixdir); \
-	  cp $(pidgintraypix_DATA) $(pidgintraypixdir); \
-	fi;
-
--- a/pidgin/pixmaps/tray/16/scalable/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-EXTRA_DIST = 	tray-away.svg \
-		tray-busy.svg \
-		tray-connecting.svg \
-		tray-extended-away.svg \
-		tray-invisible.svg \
-		tray-message.svg \
-		tray-offline.svg \
-		tray-online.svg
--- a/pidgin/pixmaps/tray/22/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-TRAY_ICONS =	tray-away.png \
-		tray-busy.png \
-		tray-connecting.png \
-		tray-extended-away.png \
-		tray-invisible.png \
-		tray-message.png \
-		tray-new-im.png \
-		tray-offline.png \
-		tray-online.png
-
-EXTRA_DIST =	$(TRAY_ICONS)
-
-pidgintraypixdir = $(datadir)/pixmaps/pidgin/tray/22
-pidgintraypix_DATA = $(TRAY_ICONS)
--- a/pidgin/pixmaps/tray/22/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidgintraypix_DATA)'; then \
-	  mkdir -p $(pidgintraypixdir); \
-	  cp $(pidgintraypix_DATA) $(pidgintraypixdir); \
-	fi;
-
--- a/pidgin/pixmaps/tray/22/scalable/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-EXTRA_DIST = tray-invisible.svg
--- a/pidgin/pixmaps/tray/32/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-TRAY_ICONS =	tray-away.png \
-		tray-busy.png \
-		tray-connecting.png \
-		tray-extended-away.png \
-		tray-invisible.png \
-		tray-new-im.png \
-		tray-offline.png \
-		tray-online.png
-
-EXTRA_DIST =	$(TRAY_ICONS)
-
-pidgintraypixdir = $(datadir)/pixmaps/pidgin/tray/32
-pidgintraypix_DATA = $(TRAY_ICONS)
--- a/pidgin/pixmaps/tray/32/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidgintraypix_DATA)'; then \
-	  mkdir -p $(pidgintraypixdir); \
-	  cp $(pidgintraypix_DATA) $(pidgintraypixdir); \
-	fi;
-
--- a/pidgin/pixmaps/tray/48/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-TRAY_ICONS =	tray-away.png \
-		tray-busy.png \
-		tray-connecting.png \
-		tray-extended-away.png \
-		tray-invisible.png \
-		tray-new-im.png \
-		tray-offline.png \
-		tray-online.png
-
-EXTRA_DIST =	$(TRAY_ICONS)
-
-pidgintraypixdir = $(datadir)/pixmaps/pidgin/tray/48
-pidgintraypix_DATA = $(TRAY_ICONS)
--- a/pidgin/pixmaps/tray/48/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version of Pidgin pixmaps
-#
-
-PIDGIN_TREE_TOP := ../../../..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-datadir = $(PIDGIN_INSTALL_DIR)
-include ./Makefile.am
-
-.PHONY: install
-
-install:
-	if test '$(pidgintraypix_DATA)'; then \
-	  mkdir -p $(pidgintraypixdir); \
-	  cp $(pidgintraypix_DATA) $(pidgintraypixdir); \
-	fi;
-
--- a/pidgin/plugins/cap/cap.c	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/plugins/cap/cap.c	Mon Nov 12 16:53:54 2007 +0000
@@ -437,6 +437,7 @@
 static void buddy_idle(PurpleBuddy *buddy, gboolean old_idle, gboolean idle) {
 }
 
+#if 0
 static void blist_node_extended_menu(PurpleBlistNode *node, GList **menu) {
 	PurpleBuddy *buddy;
 	PurpleMenuAction *menu_action;
@@ -451,6 +452,7 @@
 			PURPLE_CALLBACK(display_statistics_action_cb), NULL, NULL);
 	*menu = g_list_append(*menu, menu_action);
 }
+#endif
 
 /* drawing-tooltip */
 static void drawing_tooltip(PurpleBlistNode *node, GString *text, gboolean full) {
--- a/pidgin/plugins/cap/cap.h	Mon Nov 12 16:15:53 2007 +0000
+++ b/pidgin/plugins/cap/cap.h	Mon Nov 12 16:53:54 2007 +0000
@@ -99,7 +99,6 @@
 /* buddy-signed-off */
 static void buddy_signed_off(PurpleBuddy *buddy);
 static void buddy_idle(PurpleBuddy *buddy, gboolean old_idle, gboolean idle);
-static void blist_node_extended_menu(PurpleBlistNode *node, GList **menu);
 /* drawing-tooltip */
 static void drawing_tooltip(PurpleBlistNode *node, GString *text, gboolean full);
 /* signed-on */
--- a/po/ChangeLog	Mon Nov 12 16:15:53 2007 +0000
+++ b/po/ChangeLog	Mon Nov 12 16:53:54 2007 +0000
@@ -1,5 +1,8 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 2.3.0
+	* German translation updated (Bjoern Voigt, Jochen Kemnade)
+
 version 2.2.3
 	* Belarusian Latin translation updated (Ihar Hrachyshka)
 	* Indonesian translation updated (Rai S. Regawa)
--- a/po/POTFILES.in	Mon Nov 12 16:15:53 2007 +0000
+++ b/po/POTFILES.in	Mon Nov 12 16:53:54 2007 +0000
@@ -103,6 +103,16 @@
 libpurple/protocols/msn/state.c
 libpurple/protocols/msn/switchboard.c
 libpurple/protocols/msn/userlist.c
+libpurple/protocols/msnp9/dialog.c
+libpurple/protocols/msnp9/error.c
+libpurple/protocols/msnp9/msn.c
+libpurple/protocols/msnp9/nexus.c
+libpurple/protocols/msnp9/notification.c
+libpurple/protocols/msnp9/servconn.c
+libpurple/protocols/msnp9/session.c
+libpurple/protocols/msnp9/state.c
+libpurple/protocols/msnp9/switchboard.c
+libpurple/protocols/msnp9/userlist.c
 libpurple/protocols/myspace/myspace.c
 libpurple/protocols/myspace/user.c
 libpurple/protocols/myspace/zap.c
--- a/po/de.po	Mon Nov 12 16:15:53 2007 +0000
+++ b/po/de.po	Mon Nov 12 16:53:54 2007 +0000
@@ -12,8 +12,8 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-11-09 20:52+0100\n"
-"PO-Revision-Date: 2007-11-09 21:57+0100\n"
+"POT-Creation-Date: 2007-11-12 09:54+0100\n"
+"PO-Revision-Date: 2007-11-12 09:54+0100\n"
 "Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n"
 "Language-Team: Deutsch <de@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -1948,11 +1948,8 @@
 msgstr "Konnte Ihr Plugin nicht laden."
 
 #, c-format
-msgid "The dependent plugin %s failed to unload."
-msgstr "Das erforderliche Plugin %s konnte nicht entladen werden."
-
-msgid "There were errors unloading the plugin."
-msgstr "Beim Entladen des Plugins traten Fehler auf."
+msgid "%s requires %s, but it failed to unload."
+msgstr "%s hängt von %s ab, konnte aber nicht entladen werden."
 
 msgid "Autoaccept"
 msgstr "Auto-Akzeptieren"
@@ -2596,7 +2593,6 @@
 "Informationen besuchen Sie die FAQ unter: http://developer.pidgin.im/wiki/"
 "Using%20Pidgin#CanIusePidginforBonjourLink-LocalMessaging."
 
-#. Send a message about the connection error
 msgid "Unable to listen for incoming IM connections\n"
 msgstr "Kann nicht auf eingehende IM-Verbindungen hören\n"
 
@@ -2684,12 +2680,13 @@
 msgid "Your buddylist is empty, nothing was written to the file."
 msgstr "Ihre Buddy-Liste ist leer, es wurde nichts in die Datei geschrieben."
 
-msgid "Couldn't open file"
-msgstr "Kann Datei nicht öffnen"
-
 msgid "Buddylist saved successfully!"
 msgstr "Buddy-Liste wurde erfolgreich gespeichert!"
 
+#, c-format
+msgid "Couldn't write buddy list for %s to %s"
+msgstr "Konnte Buddy-Liste für %s nicht nach %s schreiben"
+
 msgid "Couldn't load buddylist"
 msgstr "Konnte Buddy-Liste nicht laden"
 
@@ -2967,8 +2964,6 @@
 msgid "SSL support unavailable"
 msgstr "SSL-Unterstützung nicht verfügbar"
 
-#. TODO: try other ports if in auto mode, then save
-#. * working port and try that first next time.
 msgid "Couldn't create socket"
 msgstr "Kann Socket nicht erstellen"
 
@@ -3405,7 +3400,6 @@
 msgid "Server does not use any supported authentication method"
 msgstr "Der Server benutzt keine der unterstützten Authentifizierungsmethoden"
 
-#. This should never happen!
 msgid "Invalid response from server."
 msgstr "Ungültige Serverantwort."
 
@@ -3814,9 +3808,6 @@
 msgid "Find Rooms"
 msgstr "Finde Räume"
 
-msgid "Error initializing session"
-msgstr "Fehler bei Initialisieren der Sitzung"
-
 msgid "You require encryption, but it is not available on this server."
 msgstr ""
 "Sie fordern Verschlüsselung, aber diese ist auf dem Server nicht verfügbar."
@@ -3959,9 +3950,15 @@
 msgid "Mood"
 msgstr "Stimmung"
 
+msgid "Current media"
+msgstr "Aktuelles Medium"
+
 msgid "Mood Text"
 msgstr "Stimmungstext"
 
+msgid "Allow Buzz"
+msgstr "Anklopfen erlauben"
+
 msgid "Tune Artist"
 msgstr "Künstler anpassen"
 
@@ -3989,9 +3986,6 @@
 msgid "Tune URL"
 msgstr "URL anpassen"
 
-msgid "Allow Buzz"
-msgstr "Anklopfen erlauben"
-
 msgid "Password Changed"
 msgstr "Passwort geändert"
 
@@ -4674,9 +4668,6 @@
 msgid "Page"
 msgstr "Nachricht"
 
-msgid "Current media"
-msgstr "Aktuelles Medium"
-
 msgid "Be Right Back"
 msgstr "Bin gleich zurück"
 
@@ -4689,6 +4680,12 @@
 msgid "Out to Lunch"
 msgstr "Zur Mittagspause"
 
+msgid "Artist"
+msgstr "Interpret"
+
+msgid "Album"
+msgstr "Album"
+
 msgid "Set Friendly Name..."
 msgstr "Setze Spitzname..."
 
@@ -5128,6 +5125,22 @@
 msgid "The screen name specified is invalid."
 msgstr "Der angegebene Benutzername ist ungültig."
 
+msgid "Has you"
+msgstr "Hat Sie"
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "MSN Protocol Plugin"
+msgstr "MSN-Protokoll-Plugin"
+
 msgid "Missing Cipher"
 msgstr "Verschlüsselung fehlt"
 
@@ -5235,7 +5248,6 @@
 msgid "Invalid input condition"
 msgstr "Ungültige Eingabebedingung"
 
-#. TODO: g_realloc like msn, yahoo, irc, jabber?
 msgid "Read buffer full"
 msgstr "Lesepuffer voll"
 
@@ -5661,9 +5673,6 @@
 msgid "GroupWise Conference %d"
 msgstr "GroupWise-Konferenz %d"
 
-msgid "Unable to make SSL connection to server."
-msgstr "Kann keine SSL-Verbindung zum Server herstellen."
-
 msgid "Authenticating..."
 msgstr "Authentifizierung..."
 
@@ -5705,10 +5714,6 @@
 "%s scheint offline zu sein und hat die Nachricht, die Sie gerade gesendet "
 "haben, nicht empfangen."
 
-#. TODO: Would be nice to prompt if not set!
-#. *  purple_request_fields(gc, _("Server Address"),...);
-#.
-#. ...but for now just error out with a nice message.
 msgid ""
 "Unable to connect to server. Please enter the address of the server you wish "
 "to connect to."
@@ -6043,12 +6048,14 @@
 "sein oder mit einem Buchstaben beginnen und nur Buchstaben, Ziffern und "
 "Leerzeichen enthalten oder nur aus Ziffern bestehen."
 
+#. Unregistered screen name
 msgid "Invalid screen name."
 msgstr "Ungültiger Benutzername."
 
 msgid "Incorrect password."
 msgstr "Falsches Passwort."
 
+#. Suspended account
 msgid "Your account is currently suspended."
 msgstr "Ihr Benutzerkonto ist momentan gesperrt."
 
@@ -6056,6 +6063,8 @@
 msgid "The AOL Instant Messenger service is temporarily unavailable."
 msgstr "Der AOL-Sofortnachrichtendienst ist zur Zeit nicht erreichbar."
 
+#. screen name connecting too frequently
+#. IP address connecting too frequently
 msgid ""
 "You have been connecting and disconnecting too frequently. Wait ten minutes "
 "and try again. If you continue to try, you will need to wait even longer."
@@ -6064,6 +6073,7 @@
 "versuchen Sie es noch einmal. Wenn Sie es weiterversuchen, müssen Sie sogar "
 "noch länger warten."
 
+#. client too old
 #, c-format
 msgid "The client version you are using is too old. Please upgrade at %s"
 msgstr ""
@@ -6086,6 +6096,13 @@
 
 #. *
 #. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
+#. *
+#. * @since 2.3.0
+#.
+#. *
+#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
+#. *
+#. * @deprecated Please use purple_request_ok_cancel_with_hint instead.
 #.
 msgid "_OK"
 msgstr "_OK"
@@ -7143,7 +7160,6 @@
 msgid "Connection lost"
 msgstr "Verbindung verloren"
 
-#. cancel login progress
 msgid "Login failed, no reply"
 msgstr "Anmeldung fehlgeschlagen, keine Antwort"
 
@@ -8639,7 +8655,6 @@
 msgid "Could not load SILC key pair: %s"
 msgstr "Konnte SILC-Schlüsselpaar nicht laden: %s"
 
-#. TODO: do we really want to disconnect on a failure to write?
 msgid "Could not write"
 msgstr "Konnte nicht schreiben"
 
@@ -9021,7 +9036,7 @@
 msgid "Activate which ID?"
 msgstr "Welche ID aktivieren?"
 
-msgid "Join whom in chat?"
+msgid "Join who in chat?"
 msgstr "Wen wollen Sie zum Chat einladen?"
 
 msgid "Activate ID..."
@@ -9100,7 +9115,6 @@
 msgid "Unable to establish file descriptor."
 msgstr "Konnte Dateibeschreibung nicht erstellen."
 
-#. TODO: what to do here - do we really have to disconnect?
 msgid "Write Error"
 msgstr "Schreibfehler"
 
@@ -9406,6 +9420,13 @@
 
 #. *
 #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
+#. *
+#. * @since 2.3.0
+#.
+#. *
+#. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
+#. *
+#. * @deprecated Please use purple_request_yes_no_with_hint instead.
 #.
 msgid "_Yes"
 msgstr "_Ja"
@@ -9415,6 +9436,13 @@
 
 #. *
 #. * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
+#. *
+#. * @since 2.3.0
+#.
+#. *
+#. * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
+#. *
+#. * @deprecated Please use purple_request_accept_cancel_with_hint instead.
 #.
 msgid "_Accept"
 msgstr "_Akzeptieren"
@@ -9479,6 +9507,9 @@
 msgid "Mobile"
 msgstr "Mobil"
 
+msgid "Listening to music"
+msgstr ""
+
 #, c-format
 msgid "%s changed status from %s to %s"
 msgstr "%s hat den Status von %s zu %s geändert"
@@ -10038,8 +10069,28 @@
 msgstr "%s abgemeldet"
 
 #, c-format
-msgid "<span color=\"red\">%s disconnected: %s</span>"
-msgstr "<span color=\"red\">%s abgemeldet: %s</span>"
+msgid "%s disabled"
+msgstr "%s deaktiviert"
+
+msgid "Reconnect"
+msgstr "Wiederverbinden"
+
+msgid "Re-enable"
+msgstr "Reaktivieren"
+
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#, c-format
+msgid "%d account was disabled because you signed on from another location."
+msgid_plural ""
+"%d accounts were disabled because you signed on from another location."
+msgstr[0] ""
+"%d Konto wurde deaktiviert, da Sie sich von einem anderen Ort angemeldet "
+"haben."
+msgstr[1] ""
+"%d Konten wurden deaktiviert, da Sie sich von einem anderen Ort angemeldet "
+"haben."
 
 msgid "<b>Username:</b>"
 msgstr "<b>Benutzername:</b>"
@@ -10160,18 +10211,6 @@
 msgid "SSL Servers"
 msgstr "SSL-Server"
 
-#, c-format
-msgid ""
-"%s\n"
-"\n"
-"%s will not attempt to reconnect the account until you correct the error and "
-"re-enable the account."
-msgstr ""
-"%s\n"
-"\n"
-"%s wird nicht versuchen, das Konto wieder zu verbinden bis Sie den Fehler "
-"behoben und das Konto wieder aktiviert haben."
-
 msgid "Unknown command."
 msgstr "Unbekanntes Kommando."
 
@@ -10217,9 +10256,6 @@
 msgid "Un-Ignore"
 msgstr "Nicht Ignorieren"
 
-msgid "Ignore"
-msgstr "Ignorieren"
-
 msgid "Get Away Message"
 msgstr "Neue Abwesenheitsnachricht abholen"
 
@@ -10800,6 +10836,9 @@
 msgid "_Name"
 msgstr "_Name"
 
+msgid "Buddy"
+msgstr "Buddy"
+
 msgid "_Account"
 msgstr "_Konto"
 
@@ -11407,6 +11446,16 @@
 msgid "Unload Plugins"
 msgstr "Plugins entladen"
 
+msgid "Could not unload plugin"
+msgstr "Konnte das Plugin nicht entladen"
+
+msgid ""
+"The plugin could not be unloaded now, but will be disabled at the next "
+"startup."
+msgstr ""
+"Das Plugin kann im Moment nicht entladen werden, wird aber beim nächsten "
+"Start deaktiviert."
+
 #, c-format
 msgid ""
 "%s%s<span weight=\"bold\">Written by:</span>\t%s\n"
@@ -13086,9 +13135,3 @@
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr ""
 "Dieses Plugin ist nützlich zur Fehlersuche in XMPP-Servern oder -Clients."
-
-#~ msgid "Unable to connect to contact server"
-#~ msgstr "Verbindung zum Kontaktserver nicht möglich"
-
-#~ msgid "Unable to connect to OIM server"
-#~ msgstr "Verbindung zum OIM-Server nicht möglich"
--- a/po/hu.po	Mon Nov 12 16:15:53 2007 +0000
+++ b/po/hu.po	Mon Nov 12 16:53:54 2007 +0000
@@ -1,17 +1,16 @@
-# translation of pid.hu.po to Hungarian
-# Hungarian translation of gaim.
+# Hungarian translation of pidgin.
 # Copyright (C) 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
-# This file is distributed under the same license as the gaim package.
+# This file is distributed under the same license as the Pidgin package.
 # The Hungarian translation of Gaim was sponsored by Novell Hungary, many thanks for it!
 #
 # Zoltan Sutto <suttozoltan@chello.hu>, 2003.
 # Gabor Kelemen <kelemeng@gnome.hu>, 2005, 2006, 2007.
 msgid ""
 msgstr ""
-"Project-Id-Version: gaim 2.0-beta\n"
+"Project-Id-Version: pidgin 2.2.x\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-09-28 15:32-0500\n"
-"PO-Revision-Date: 2007-09-10 12:28+0200\n"
+"POT-Creation-Date: 2007-11-11 15:31+0100\n"
+"PO-Revision-Date: 2007-11-11 18:43+0100\n"
 "Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
 "Language-Team: Hungarian <gnome@gnome.hu>\n"
 "MIME-Version: 1.0\n"
@@ -51,7 +50,7 @@
 "  -n, --nologin       ne jelentkezzen be automatikusan\n"
 "  -v, --version       az aktuális verzió megjelenítése és kilépés\n"
 
-#: ../finch/finch.c:328 ../pidgin/gtkmain.c:711
+#: ../finch/finch.c:328 ../pidgin/gtkmain.c:718
 #, c-format
 msgid ""
 "%s encountered errors migrating your settings from %s to %s. Please "
@@ -63,17 +62,17 @@
 "developer.pidgin.im oldalon."
 
 #: ../finch/gntaccount.c:124 ../finch/gntaccount.c:484 ../finch/gntblist.c:300
-#: ../finch/gntblist.c:433 ../finch/gntblist.c:446 ../finch/gntplugin.c:186
-#: ../finch/gntplugin.c:234 ../finch/gntstatus.c:301 ../finch/gntstatus.c:310
+#: ../finch/gntblist.c:433 ../finch/gntblist.c:446 ../finch/gntplugin.c:189
+#: ../finch/gntplugin.c:237 ../finch/gntstatus.c:301 ../finch/gntstatus.c:310
 #: ../finch/plugins/gntclipboard.c:115 ../finch/plugins/gntclipboard.c:121
 #: ../finch/plugins/gntclipboard.c:128
-#: ../libpurple/protocols/jabber/buddy.c:2029
+#: ../libpurple/protocols/jabber/buddy.c:2032
 #: ../libpurple/protocols/jabber/chat.c:677
 #: ../libpurple/protocols/jabber/chat.c:688
-#: ../libpurple/protocols/jabber/jabber.c:1515
+#: ../libpurple/protocols/jabber/jabber.c:1522
 #: ../libpurple/protocols/qq/group_join.c:328
 #: ../libpurple/protocols/qq/im.c:576 ../libpurple/protocols/silc/ops.c:57
-#: ../libpurple/protocols/silc/ops.c:1456
+#: ../libpurple/protocols/silc/ops.c:1460
 #: ../libpurple/protocols/silc10/ops.c:1451
 msgid "Error"
 msgstr "Hiba"
@@ -102,8 +101,8 @@
 msgid "(You probably forgot to 'make install'.)"
 msgstr "(valószínűleg elfelejtette kiadni a \"make install\" parancsot)"
 
-#: ../finch/gntaccount.c:496 ../finch/gntconn.c:136
-#: ../pidgin/gtkaccount.c:1473 ../pidgin/gtkblist.c:4040
+#: ../finch/gntaccount.c:496 ../finch/gntconn.c:137
+#: ../pidgin/gtkaccount.c:1478 ../pidgin/gtkblist.c:4388
 msgid "Modify Account"
 msgstr "Fiók módosítása"
 
@@ -133,32 +132,36 @@
 #: ../finch/gntaccount.c:575 ../finch/gntaccount.c:638
 #: ../finch/gntaccount.c:889 ../finch/gntblist.c:344 ../finch/gntblist.c:421
 #: ../finch/gntblist.c:456 ../finch/gntblist.c:803 ../finch/gntblist.c:1005
-#: ../finch/gntblist.c:1101 ../finch/gntblist.c:2222 ../finch/gntcertmgr.c:91
-#: ../finch/gntplugin.c:379 ../finch/gntpounce.c:459 ../finch/gntpounce.c:667
-#: ../finch/gntprefs.c:265 ../finch/gntsound.c:1058 ../finch/gntstatus.c:145
-#: ../finch/gntstatus.c:485 ../finch/gntstatus.c:610
-#: ../libpurple/account.c:1013 ../libpurple/account.c:1263
-#: ../libpurple/account.c:1298 ../libpurple/conversation.c:1215
-#: ../libpurple/plugins/buddynote.c:51 ../libpurple/protocols/gg/gg.c:507
-#: ../libpurple/protocols/gg/gg.c:666 ../libpurple/protocols/gg/gg.c:803
-#: ../libpurple/protocols/gg/gg.c:884
+#: ../finch/gntblist.c:1101 ../finch/gntblist.c:2224 ../finch/gntblist.c:2287
+#: ../finch/gntcertmgr.c:91 ../finch/gntplugin.c:475 ../finch/gntpounce.c:472
+#: ../finch/gntpounce.c:680 ../finch/gntprefs.c:265 ../finch/gntsound.c:1058
+#: ../finch/gntstatus.c:145 ../finch/gntstatus.c:485 ../finch/gntstatus.c:610
+#: ../libpurple/account.c:1016 ../libpurple/account.c:1305
+#: ../libpurple/account.c:1340 ../libpurple/conversation.c:1215
+#: ../libpurple/plugins/buddynote.c:51 ../libpurple/protocols/gg/gg.c:517
+#: ../libpurple/protocols/gg/gg.c:676 ../libpurple/protocols/gg/gg.c:813
+#: ../libpurple/protocols/gg/gg.c:895
 #: ../libpurple/protocols/jabber/buddy.c:728
-#: ../libpurple/protocols/jabber/buddy.c:2413
-#: ../libpurple/protocols/jabber/buddy.c:2449
+#: ../libpurple/protocols/jabber/buddy.c:2426
+#: ../libpurple/protocols/jabber/buddy.c:2462
 #: ../libpurple/protocols/jabber/chat.c:786
 #: ../libpurple/protocols/jabber/jabber.c:1008
 #: ../libpurple/protocols/jabber/jabber.c:1017
-#: ../libpurple/protocols/jabber/jabber.c:1737
+#: ../libpurple/protocols/jabber/jabber.c:1715
 #: ../libpurple/protocols/jabber/si.c:874
-#: ../libpurple/protocols/jabber/usermood.c:184
+#: ../libpurple/protocols/jabber/usermood.c:202
 #: ../libpurple/protocols/jabber/usernick.c:78
 #: ../libpurple/protocols/jabber/xdata.c:400
-#: ../libpurple/protocols/msn/msn.c:287 ../libpurple/protocols/msn/msn.c:304
-#: ../libpurple/protocols/msn/msn.c:321 ../libpurple/protocols/msn/msn.c:338
-#: ../libpurple/protocols/msn/msn.c:359
-#: ../libpurple/protocols/oscar/oscar.c:6094
-#: ../libpurple/protocols/oscar/peer.c:1046
-#: ../libpurple/protocols/qq/buddy_info.c:484
+#: ../libpurple/protocols/msn/msn.c:291 ../libpurple/protocols/msn/msn.c:308
+#: ../libpurple/protocols/msn/msn.c:325 ../libpurple/protocols/msn/msn.c:342
+#: ../libpurple/protocols/msn/msn.c:363 ../libpurple/protocols/msnp9/msn.c:287
+#: ../libpurple/protocols/msnp9/msn.c:304
+#: ../libpurple/protocols/msnp9/msn.c:321
+#: ../libpurple/protocols/msnp9/msn.c:338
+#: ../libpurple/protocols/msnp9/msn.c:359
+#: ../libpurple/protocols/oscar/oscar.c:6149
+#: ../libpurple/protocols/oscar/peer.c:1048
+#: ../libpurple/protocols/qq/buddy_info.c:525
 #: ../libpurple/protocols/qq/buddy_opt.c:214
 #: ../libpurple/protocols/qq/buddy_opt.c:411
 #: ../libpurple/protocols/qq/group.c:124
@@ -169,60 +172,60 @@
 #: ../libpurple/protocols/qq/sys_msg.c:113
 #: ../libpurple/protocols/qq/sys_msg.c:172
 #: ../libpurple/protocols/qq/sys_msg.c:266
-#: ../libpurple/protocols/sametime/sametime.c:3388
-#: ../libpurple/protocols/sametime/sametime.c:3474
-#: ../libpurple/protocols/sametime/sametime.c:3645
-#: ../libpurple/protocols/sametime/sametime.c:5397
-#: ../libpurple/protocols/sametime/sametime.c:5487
-#: ../libpurple/protocols/sametime/sametime.c:5612
+#: ../libpurple/protocols/sametime/sametime.c:3389
+#: ../libpurple/protocols/sametime/sametime.c:3475
+#: ../libpurple/protocols/sametime/sametime.c:3646
+#: ../libpurple/protocols/sametime/sametime.c:5398
+#: ../libpurple/protocols/sametime/sametime.c:5488
+#: ../libpurple/protocols/sametime/sametime.c:5613
 #: ../libpurple/protocols/silc/buddy.c:455
-#: ../libpurple/protocols/silc/buddy.c:1076
-#: ../libpurple/protocols/silc/buddy.c:1191
-#: ../libpurple/protocols/silc/chat.c:616
-#: ../libpurple/protocols/silc/chat.c:746
-#: ../libpurple/protocols/silc/ops.c:1816
-#: ../libpurple/protocols/silc/silc.c:823
-#: ../libpurple/protocols/silc/silc.c:1031
+#: ../libpurple/protocols/silc/buddy.c:1079
+#: ../libpurple/protocols/silc/buddy.c:1194
+#: ../libpurple/protocols/silc/chat.c:620
+#: ../libpurple/protocols/silc/chat.c:750
+#: ../libpurple/protocols/silc/ops.c:1820
+#: ../libpurple/protocols/silc/silc.c:954
+#: ../libpurple/protocols/silc/silc.c:1162
 #: ../libpurple/protocols/silc10/buddy.c:468
-#: ../libpurple/protocols/silc10/buddy.c:1084
-#: ../libpurple/protocols/silc10/buddy.c:1189
+#: ../libpurple/protocols/silc10/buddy.c:1087
+#: ../libpurple/protocols/silc10/buddy.c:1192
 #: ../libpurple/protocols/silc10/chat.c:600
 #: ../libpurple/protocols/silc10/chat.c:730
 #: ../libpurple/protocols/silc10/ops.c:1904
 #: ../libpurple/protocols/silc10/silc.c:736
-#: ../libpurple/protocols/silc10/silc.c:942
-#: ../libpurple/protocols/yahoo/yahoo.c:1032
-#: ../libpurple/protocols/yahoo/yahoo.c:3498
-#: ../libpurple/protocols/yahoo/yahoo.c:3509 ../pidgin/gtkaccount.c:1908
-#: ../pidgin/gtkaccount.c:2495 ../pidgin/gtkblist.c:5967
-#: ../pidgin/gtkcertmgr.c:197 ../pidgin/gtkdialogs.c:773
-#: ../pidgin/gtkdialogs.c:912 ../pidgin/gtkdialogs.c:1004
-#: ../pidgin/gtkdialogs.c:1024 ../pidgin/gtkdialogs.c:1048
-#: ../pidgin/gtkdialogs.c:1070 ../pidgin/gtkdialogs.c:1118
-#: ../pidgin/gtkdialogs.c:1159 ../pidgin/gtkdialogs.c:1215
-#: ../pidgin/gtkdialogs.c:1254 ../pidgin/gtkdialogs.c:1281
-#: ../pidgin/gtkimhtmltoolbar.c:435 ../pidgin/gtklog.c:328
-#: ../pidgin/gtkplugin.c:289 ../pidgin/gtkpounce.c:1101
-#: ../pidgin/gtkprivacy.c:563 ../pidgin/gtkprivacy.c:579
-#: ../pidgin/gtkprivacy.c:604 ../pidgin/gtkprivacy.c:618
-#: ../pidgin/gtkrequest.c:271 ../pidgin/gtksavedstatuses.c:345
-#: ../pidgin/gtkstatusbox.c:1574
+#: ../libpurple/protocols/silc10/silc.c:943
+#: ../libpurple/protocols/yahoo/yahoo.c:1034
+#: ../libpurple/protocols/yahoo/yahoo.c:3500
+#: ../libpurple/protocols/yahoo/yahoo.c:3511 ../pidgin/gtkaccount.c:1913
+#: ../pidgin/gtkaccount.c:2501 ../pidgin/gtkblist.c:6346
+#: ../pidgin/gtkcertmgr.c:197 ../pidgin/gtkdialogs.c:787
+#: ../pidgin/gtkdialogs.c:926 ../pidgin/gtkdialogs.c:1018
+#: ../pidgin/gtkdialogs.c:1038 ../pidgin/gtkdialogs.c:1062
+#: ../pidgin/gtkdialogs.c:1084 ../pidgin/gtkdialogs.c:1132
+#: ../pidgin/gtkdialogs.c:1173 ../pidgin/gtkdialogs.c:1229
+#: ../pidgin/gtkdialogs.c:1268 ../pidgin/gtkdialogs.c:1295
+#: ../pidgin/gtkimhtmltoolbar.c:437 ../pidgin/gtklog.c:328
+#: ../pidgin/gtkplugin.c:289 ../pidgin/gtkpounce.c:1121
+#: ../pidgin/gtkprivacy.c:565 ../pidgin/gtkprivacy.c:581
+#: ../pidgin/gtkprivacy.c:606 ../pidgin/gtkprivacy.c:620
+#: ../pidgin/gtkrequest.c:321 ../pidgin/gtksavedstatuses.c:345
+#: ../pidgin/gtkstatusbox.c:1593
 msgid "Cancel"
 msgstr "Mégsem"
 
 #. Save button
 #. Save
-#: ../finch/gntaccount.c:579 ../finch/gntcertmgr.c:311
-#: ../finch/gntplugin.c:379 ../finch/gntpounce.c:465 ../finch/gntprefs.c:265
+#: ../finch/gntaccount.c:579 ../finch/gntcertmgr.c:311 ../finch/gntdebug.c:297
+#: ../finch/gntplugin.c:475 ../finch/gntpounce.c:478 ../finch/gntprefs.c:265
 #: ../finch/gntsound.c:1055 ../finch/gntstatus.c:488 ../finch/gntstatus.c:598
-#: ../libpurple/account.c:1297 ../libpurple/plugins/buddynote.c:50
-#: ../libpurple/protocols/jabber/buddy.c:727 ../pidgin/gtkdebug.c:749
-#: ../pidgin/gtkrequest.c:277
+#: ../libpurple/account.c:1339 ../libpurple/plugins/buddynote.c:50
+#: ../libpurple/protocols/jabber/buddy.c:727 ../pidgin/gtkdebug.c:754
+#: ../pidgin/gtkrequest.c:327
 msgid "Save"
 msgstr "Mentés"
 
-#: ../finch/gntaccount.c:632 ../pidgin/gtkaccount.c:1900
-#: ../pidgin/gtksavedstatuses.c:333 ../pidgin/gtkstatusbox.c:1568
+#: ../finch/gntaccount.c:632 ../pidgin/gtkaccount.c:1905
+#: ../pidgin/gtksavedstatuses.c:333 ../pidgin/gtkstatusbox.c:1587
 #, c-format
 msgid "Are you sure you want to delete %s?"
 msgstr "Biztos, hogy törölni akarja %s fiókot?"
@@ -233,16 +236,16 @@
 
 #. Delete button
 #: ../finch/gntaccount.c:637 ../finch/gntaccount.c:707
-#: ../finch/gntcertmgr.c:319 ../finch/gntpounce.c:666 ../finch/gntpounce.c:729
+#: ../finch/gntcertmgr.c:319 ../finch/gntpounce.c:679 ../finch/gntpounce.c:742
 #: ../finch/gntstatus.c:144 ../finch/gntstatus.c:210
-#: ../pidgin/gtkaccount.c:1907 ../pidgin/gtklog.c:327
-#: ../pidgin/gtkpounce.c:1100 ../pidgin/gtkrequest.c:274
-#: ../pidgin/gtksavedstatuses.c:344 ../pidgin/gtkstatusbox.c:1573
+#: ../pidgin/gtkaccount.c:1912 ../pidgin/gtklog.c:327
+#: ../pidgin/gtkpounce.c:1120 ../pidgin/gtkrequest.c:324
+#: ../pidgin/gtksavedstatuses.c:344 ../pidgin/gtkstatusbox.c:1592
 msgid "Delete"
 msgstr "Törlés"
 
-#: ../finch/gntaccount.c:669 ../finch/gntblist.c:2119 ../finch/gntui.c:82
-#: ../pidgin/gtkaccount.c:2325 ../pidgin/gtkdocklet.c:522
+#: ../finch/gntaccount.c:669 ../finch/gntblist.c:2121 ../finch/gntui.c:82
+#: ../pidgin/gtkaccount.c:2331 ../pidgin/gtkdocklet.c:715
 msgid "Accounts"
 msgstr "Fiókok"
 
@@ -252,52 +255,52 @@
 
 #. Add button
 #: ../finch/gntaccount.c:698 ../finch/gntaccount.c:888 ../finch/gntblist.c:343
-#: ../finch/gntblist.c:421 ../finch/gntblist.c:456 ../finch/gntcertmgr.c:306
-#: ../finch/gntnotify.c:380 ../finch/gntpounce.c:713 ../finch/gntstatus.c:199
-#: ../libpurple/protocols/gg/gg.c:883 ../libpurple/protocols/qq/sys_msg.c:114
+#: ../finch/gntblist.c:421 ../finch/gntblist.c:456 ../finch/gntblist.c:2379
+#: ../finch/gntcertmgr.c:306 ../finch/gntnotify.c:385 ../finch/gntpounce.c:726
+#: ../finch/gntstatus.c:199 ../libpurple/protocols/gg/gg.c:894
+#: ../libpurple/protocols/qq/sys_msg.c:114
 #: ../libpurple/protocols/qq/sys_msg.c:173
 #: ../libpurple/protocols/qq/sys_msg.c:267
-#: ../libpurple/protocols/sametime/sametime.c:5486
-#: ../libpurple/protocols/silc/chat.c:615
-#: ../libpurple/protocols/silc10/chat.c:599 ../pidgin/gtkaccount.c:2494
-#: ../pidgin/gtkblist.c:5966 ../pidgin/gtkconv.c:1659
-#: ../pidgin/gtkrequest.c:275
+#: ../libpurple/protocols/sametime/sametime.c:5487
+#: ../libpurple/protocols/silc/chat.c:619
+#: ../libpurple/protocols/silc10/chat.c:599 ../pidgin/gtkaccount.c:2500
+#: ../pidgin/gtkblist.c:6345 ../pidgin/gtkconv.c:1713
+#: ../pidgin/gtkrequest.c:325
 msgid "Add"
 msgstr "Hozzáadás"
 
 #. Modify button
-#: ../finch/gntaccount.c:703 ../finch/gntpounce.c:721
+#: ../finch/gntaccount.c:703 ../finch/gntpounce.c:734
 msgid "Modify"
 msgstr "Módosítás"
 
-#: ../finch/gntaccount.c:811 ../pidgin/gtkaccount.c:2441
+#: ../finch/gntaccount.c:811 ../pidgin/gtkaccount.c:2447
 #, c-format
 msgid "%s%s%s%s has made %s his or her buddy%s%s"
 msgstr "%s%s%s%s felvette %s partnert %s%s"
 
-#: ../finch/gntaccount.c:884 ../pidgin/gtkaccount.c:2493
+#: ../finch/gntaccount.c:884 ../pidgin/gtkaccount.c:2499
 msgid "Add buddy to your list?"
 msgstr "Felveszi a partnert a partnerlistájára?"
 
-#: ../finch/gntaccount.c:944 ../pidgin/gtkaccount.c:2551
+#: ../finch/gntaccount.c:944 ../pidgin/gtkaccount.c:2557
 #, c-format
 msgid "%s%s%s%s wants to add %s to his or her buddy list%s%s"
-msgstr ""
-"%s%s%s%s felhasználó szeretné %s partnert felvenni a partnerlistájára%s%s"
+msgstr "%s%s%s%s felhasználó szeretné %s partnert felvenni a partnerlistájára%s%s"
 
 #: ../finch/gntaccount.c:969 ../finch/gntaccount.c:972
-#: ../finch/gntaccount.c:999 ../pidgin/gtkaccount.c:2574
-#: ../pidgin/gtkaccount.c:2580
+#: ../finch/gntaccount.c:999 ../pidgin/gtkaccount.c:2580
+#: ../pidgin/gtkaccount.c:2586
 msgid "Authorize buddy?"
 msgstr "Engedélyezi a partnert?"
 
 #: ../finch/gntaccount.c:976 ../finch/gntaccount.c:1003
-#: ../pidgin/gtkaccount.c:2575 ../pidgin/gtkaccount.c:2581
+#: ../pidgin/gtkaccount.c:2581 ../pidgin/gtkaccount.c:2587
 msgid "Authorize"
 msgstr "Engedélyezés"
 
 #: ../finch/gntaccount.c:977 ../finch/gntaccount.c:1004
-#: ../pidgin/gtkaccount.c:2576 ../pidgin/gtkaccount.c:2582
+#: ../pidgin/gtkaccount.c:2582 ../pidgin/gtkaccount.c:2588
 msgid "Deny"
 msgstr "Elutasítás"
 
@@ -321,20 +324,21 @@
 msgid "Error adding buddy"
 msgstr "Hiba a partner hozzáadásakor"
 
-#: ../finch/gntblist.c:325 ../libpurple/protocols/oscar/oscar.c:2888
-#: ../pidgin/gtkaccount.c:1981 ../pidgin/gtksavedstatuses.c:980
+#: ../finch/gntblist.c:325 ../libpurple/protocols/oscar/oscar.c:2903
+#: ../pidgin/gtkaccount.c:1986 ../pidgin/gtksavedstatuses.c:986
 msgid "Screen Name"
 msgstr "Felhasználónév"
 
 #: ../finch/gntblist.c:328 ../finch/gntblist.c:410 ../finch/gntblist.c:1250
-#: ../libpurple/protocols/msn/msn.c:1395
-#: ../libpurple/protocols/silc/chat.c:606
+#: ../libpurple/protocols/msn/msn.c:1549
+#: ../libpurple/protocols/msnp9/msn.c:1399
+#: ../libpurple/protocols/silc/chat.c:610
 #: ../libpurple/protocols/silc10/chat.c:590
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:704
 #: ../libpurple/protocols/zephyr/zephyr.c:788
-#: ../libpurple/protocols/zephyr/zephyr.c:1207 ../pidgin/gtkdialogs.c:1023
-#: ../pidgin/gtkdialogs.c:1047 ../pidgin/gtkdialogs.c:1069
-#: ../pidgin/gtkrequest.c:278
+#: ../libpurple/protocols/zephyr/zephyr.c:1207 ../pidgin/gtkdialogs.c:1037
+#: ../pidgin/gtkdialogs.c:1061 ../pidgin/gtkdialogs.c:1083
+#: ../pidgin/gtkrequest.c:328
 msgid "Alias"
 msgstr "Álnév"
 
@@ -343,23 +347,24 @@
 msgstr "Csoport"
 
 #: ../finch/gntblist.c:335 ../finch/gntblist.c:401 ../finch/gntblist.c:1305
-#: ../finch/gntnotify.c:174 ../finch/gntstatus.c:576
-#: ../libpurple/plugins/idle.c:153 ../libpurple/plugins/idle.c:190
-#: ../pidgin/gtkblist.c:3008 ../pidgin/gtknotify.c:506
-#: ../pidgin/gtkpounce.c:1268 ../pidgin/plugins/gevolution/gevolution.c:445
+#: ../finch/gntblist.c:2210 ../finch/gntblist.c:2274 ../finch/gntnotify.c:174
+#: ../finch/gntstatus.c:576 ../libpurple/plugins/idle.c:153
+#: ../libpurple/plugins/idle.c:190 ../pidgin/gtkblist.c:3226
+#: ../pidgin/gtknotify.c:512 ../pidgin/gtkpounce.c:1288
+#: ../pidgin/plugins/gevolution/gevolution.c:445
 msgid "Account"
 msgstr "Fiók"
 
 #: ../finch/gntblist.c:341 ../finch/gntblist.c:852
 #: ../libpurple/protocols/silc/buddy.c:725
-#: ../libpurple/protocols/silc/buddy.c:1027
-#: ../libpurple/protocols/silc/buddy.c:1072
-#: ../libpurple/protocols/silc/buddy.c:1182
+#: ../libpurple/protocols/silc/buddy.c:1030
+#: ../libpurple/protocols/silc/buddy.c:1075
+#: ../libpurple/protocols/silc/buddy.c:1185
 #: ../libpurple/protocols/silc10/buddy.c:737
-#: ../libpurple/protocols/silc10/buddy.c:1033
-#: ../libpurple/protocols/silc10/buddy.c:1080
-#: ../libpurple/protocols/silc10/buddy.c:1180
-#: ../libpurple/protocols/yahoo/yahoo.c:3343 ../pidgin/gtkblist.c:5483
+#: ../libpurple/protocols/silc10/buddy.c:1036
+#: ../libpurple/protocols/silc10/buddy.c:1083
+#: ../libpurple/protocols/silc10/buddy.c:1183
+#: ../libpurple/protocols/yahoo/yahoo.c:3345 ../pidgin/gtkblist.c:5847
 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:445
 msgid "Add Buddy"
 msgstr "Partner felvétele"
@@ -368,16 +373,20 @@
 msgid "Please enter buddy information."
 msgstr "Adja meg a partnerinformációkat."
 
-#: ../finch/gntblist.c:370 ../libpurple/blist.c:1209
+#: ../finch/gntblist.c:370 ../libpurple/blist.c:1210
 msgid "Chats"
 msgstr "Csevegések"
 
 #. Extract their Name and put it in
-#: ../finch/gntblist.c:407 ../libpurple/protocols/jabber/jabber.c:924
+#: ../finch/gntblist.c:407 ../finch/gntblist.c:2205
+#: ../libpurple/protocols/jabber/jabber.c:924
 #: ../libpurple/protocols/jabber/jabber.c:927
-#: ../libpurple/protocols/msn/msn.c:1584 ../libpurple/protocols/msn/msn.c:1649
-#: ../libpurple/protocols/msn/msn.c:1676
-#: ../libpurple/protocols/qq/buddy_info.c:44 ../pidgin/gtkplugin.c:582
+#: ../libpurple/protocols/msn/msn.c:1730 ../libpurple/protocols/msn/msn.c:1795
+#: ../libpurple/protocols/msn/msn.c:1822
+#: ../libpurple/protocols/msnp9/msn.c:1582
+#: ../libpurple/protocols/msnp9/msn.c:1647
+#: ../libpurple/protocols/msnp9/msn.c:1674
+#: ../libpurple/protocols/qq/buddy_info.c:44 ../pidgin/gtkplugin.c:608
 #: ../pidgin/gtkroomlist.c:618
 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:132
 #: ../pidgin/plugins/gevolution/assoc-buddy.c:123
@@ -388,7 +397,7 @@
 msgid "Auto-join"
 msgstr "Automatikus csatlakozás"
 
-#: ../finch/gntblist.c:419 ../finch/gntblist.c:854 ../pidgin/gtkblist.c:5859
+#: ../finch/gntblist.c:419 ../finch/gntblist.c:854 ../pidgin/gtkblist.c:6231
 msgid "Add Chat"
 msgstr "Csevegés hozzáadása"
 
@@ -409,8 +418,8 @@
 msgstr "Ilyen nevű csoport már létezik."
 
 #: ../finch/gntblist.c:454 ../finch/gntblist.c:856
-#: ../libpurple/protocols/sametime/sametime.c:5396
-#: ../libpurple/protocols/sametime/sametime.c:5484 ../pidgin/gtkblist.c:5963
+#: ../libpurple/protocols/sametime/sametime.c:5397
+#: ../libpurple/protocols/sametime/sametime.c:5485 ../pidgin/gtkblist.c:6342
 msgid "Add Group"
 msgstr "Csoport felvétele"
 
@@ -434,16 +443,16 @@
 msgid "Edit Settings"
 msgstr "Beállítások szerkesztése"
 
-#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:931
+#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:930
 msgid "Information"
 msgstr "Információk"
 
-#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:931
+#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:930
 msgid "Retrieving..."
 msgstr "Lekérés..."
 
-#: ../finch/gntblist.c:904 ../finch/gntconv.c:507
-#: ../libpurple/protocols/silc/chat.c:899
+#: ../finch/gntblist.c:904 ../finch/gntconv.c:528
+#: ../libpurple/protocols/silc/chat.c:903
 #: ../libpurple/protocols/silc10/chat.c:883
 msgid "Get Info"
 msgstr "Információ lekérése"
@@ -453,10 +462,10 @@
 msgstr "Partnerfigyelmeztetés felvétele"
 
 #. if (q_bud && is_online(q_bud->status)) {
-#: ../finch/gntblist.c:915 ../finch/gntconv.c:519
+#: ../finch/gntblist.c:915 ../finch/gntconv.c:540
 #: ../libpurple/protocols/jabber/si.c:874
 #: ../libpurple/protocols/oscar/oscar.c:654 ../libpurple/protocols/qq/qq.c:587
-#: ../pidgin/gtkconv.c:1607
+#: ../pidgin/gtkconv.c:1661
 msgid "Send File"
 msgstr "Fájl küldése"
 
@@ -467,7 +476,7 @@
 #: ../finch/gntblist.c:1000
 #, c-format
 msgid "Please enter the new name for %s"
-msgstr "Kérem adja meg új  %snevét"
+msgstr "Adja meg %s új nevét"
 
 #: ../finch/gntblist.c:1002 ../finch/gntblist.c:1250
 msgid "Rename"
@@ -487,8 +496,7 @@
 
 #: ../finch/gntblist.c:1087
 msgid "Removing this group will also remove all the buddies in the group"
-msgstr ""
-"A csoport eltávolítása a csoportban található partnereket is eltávolítja"
+msgstr "A csoport eltávolítása a csoportban található partnereket is eltávolítja"
 
 #: ../finch/gntblist.c:1092
 #, c-format
@@ -501,14 +509,14 @@
 msgstr "Eltávolítás jóváhagyása"
 
 #: ../finch/gntblist.c:1100 ../finch/gntblist.c:1252 ../finch/gntft.c:227
-#: ../pidgin/gtkconv.c:1656 ../pidgin/gtkrequest.c:276
+#: ../pidgin/gtkconv.c:1710 ../pidgin/gtkrequest.c:326
 #: ../pidgin/gtkstatusbox.c:264
 msgid "Remove"
 msgstr "Eltávolítás"
 
 #. Buddy List
-#: ../finch/gntblist.c:1226 ../finch/gntblist.c:2307 ../finch/gntprefs.c:258
-#: ../finch/gntui.c:83 ../pidgin/gtkblist.c:2688 ../pidgin/gtkblist.c:4284
+#: ../finch/gntblist.c:1226 ../finch/gntblist.c:2432 ../finch/gntprefs.c:258
+#: ../finch/gntui.c:83 ../pidgin/gtkblist.c:2892 ../pidgin/gtkblist.c:4631
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:326
 msgid "Buddy List"
 msgstr "Partnerlista"
@@ -522,44 +530,49 @@
 msgstr "Címke átváltása"
 
 #. General
-#: ../finch/gntblist.c:1298 ../libpurple/protocols/gg/gg.c:637
-#: ../libpurple/protocols/gg/gg.c:1050 ../libpurple/protocols/gg/gg.c:1123
-#: ../libpurple/protocols/gg/gg.c:2207
+#: ../finch/gntblist.c:1298 ../libpurple/protocols/gg/gg.c:647
+#: ../libpurple/protocols/gg/gg.c:1061 ../libpurple/protocols/gg/gg.c:1134
+#: ../libpurple/protocols/gg/gg.c:2227
 #: ../libpurple/protocols/jabber/buddy.c:286
 #: ../libpurple/protocols/jabber/buddy.c:1247
-#: ../libpurple/protocols/jabber/buddy.c:2214
-#: ../libpurple/protocols/jabber/buddy.c:2396
+#: ../libpurple/protocols/jabber/buddy.c:2217
+#: ../libpurple/protocols/jabber/buddy.c:2409
 #: ../libpurple/protocols/jabber/jabber.c:937
-#: ../libpurple/protocols/jabber/jabber.c:1544
-#: ../libpurple/protocols/jabber/jabber.c:1567
-#: ../libpurple/protocols/jabber/jabber.c:1590
-#: ../libpurple/protocols/jabber/jabber.c:1613
-#: ../libpurple/protocols/jabber/jabber.c:1636
-#: ../libpurple/protocols/msn/msn.c:1403 ../libpurple/protocols/msn/msn.c:1587
+#: ../libpurple/protocols/jabber/jabber.c:1542
+#: ../libpurple/protocols/jabber/jabber.c:1556
+#: ../libpurple/protocols/jabber/jabber.c:1570
+#: ../libpurple/protocols/jabber/jabber.c:1584
+#: ../libpurple/protocols/jabber/jabber.c:1598
+#: ../libpurple/protocols/msn/msn.c:1557 ../libpurple/protocols/msn/msn.c:1733
+#: ../libpurple/protocols/msnp9/msn.c:1407
+#: ../libpurple/protocols/msnp9/msn.c:1585
 #: ../libpurple/protocols/qq/buddy_info.c:43
-#: ../libpurple/protocols/silc/buddy.c:1535
+#: ../libpurple/protocols/silc/buddy.c:1538
 #: ../libpurple/protocols/silc/ops.c:1002
 #: ../libpurple/protocols/silc/ops.c:1186
-#: ../libpurple/protocols/silc/ops.c:1322
-#: ../libpurple/protocols/silc10/buddy.c:1535
+#: ../libpurple/protocols/silc/ops.c:1324
+#: ../libpurple/protocols/silc10/buddy.c:1538
 #: ../libpurple/protocols/silc10/ops.c:1036
 #: ../libpurple/protocols/silc10/ops.c:1179
 #: ../libpurple/protocols/silc10/ops.c:1328
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1066 ../pidgin/gtkblist.c:3032
+#: ../libpurple/protocols/yahoo/yahoo_profile.c:1066 ../pidgin/gtkblist.c:3250
 msgid "Nickname"
 msgstr "Becenév"
 
 #. Idle stuff
 #: ../finch/gntblist.c:1320 ../finch/gntprefs.c:261
-#: ../libpurple/protocols/bonjour/bonjour.c:340
+#: ../libpurple/protocols/bonjour/bonjour.c:354
 #: ../libpurple/protocols/jabber/buddy.c:787
 #: ../libpurple/protocols/jabber/buddy.c:951
-#: ../libpurple/protocols/msn/msn.c:544 ../libpurple/protocols/msn/state.c:32
-#: ../libpurple/protocols/novell/novell.c:2825
-#: ../libpurple/protocols/oscar/oscar.c:2912
-#: ../libpurple/protocols/yahoo/yahoo.c:3097
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:710 ../pidgin/gtkblist.c:3060
-#: ../pidgin/gtkblist.c:3460 ../pidgin/gtkprefs.c:1925
+#: ../libpurple/protocols/msn/msn.c:611 ../libpurple/protocols/msn/msn.c:629
+#: ../libpurple/protocols/msn/msn.c:637 ../libpurple/protocols/msn/state.c:32
+#: ../libpurple/protocols/msnp9/msn.c:544
+#: ../libpurple/protocols/msnp9/state.c:32
+#: ../libpurple/protocols/novell/novell.c:2830
+#: ../libpurple/protocols/oscar/oscar.c:2927
+#: ../libpurple/protocols/yahoo/yahoo.c:3099
+#: ../libpurple/protocols/yahoo/yahoo_profile.c:710 ../pidgin/gtkblist.c:3278
+#: ../pidgin/gtkblist.c:3684 ../pidgin/gtkprefs.c:2026
 msgid "Idle"
 msgstr "Inaktív"
 
@@ -590,121 +603,136 @@
 "\n"
 "Utoljára látszott: %s"
 
-#: ../finch/gntblist.c:1702 ../pidgin/gtkdocklet.c:470
-#: ../pidgin/gtkstatusbox.c:1072
+#: ../finch/gntblist.c:1704 ../pidgin/gtkdocklet.c:582
 msgid "New..."
 msgstr "Új..."
 
-#: ../finch/gntblist.c:1709 ../pidgin/gtkdocklet.c:471
-#: ../pidgin/gtkstatusbox.c:1073
+#: ../finch/gntblist.c:1711 ../pidgin/gtkdocklet.c:583
 msgid "Saved..."
 msgstr "Mentett..."
 
-#: ../finch/gntblist.c:2087 ../finch/gntplugin.c:255 ../finch/gntui.c:88
-#: ../pidgin/gtkdocklet.c:523 ../pidgin/gtkplugin.c:531
+#: ../finch/gntblist.c:2089 ../finch/gntplugin.c:345 ../finch/gntui.c:88
+#: ../pidgin/gtkdocklet.c:716 ../pidgin/gtkplugin.c:555
 msgid "Plugins"
 msgstr "Bővítmények"
 
-#: ../finch/gntblist.c:2203 ../pidgin/gtkdialogs.c:754
-#: ../pidgin/gtkdialogs.c:893 ../pidgin/gtkdialogs.c:974
-msgid "_Name"
-msgstr "_Név"
-
-#: ../finch/gntblist.c:2208 ../pidgin/gtkdialogs.c:759
-#: ../pidgin/gtkdialogs.c:898 ../pidgin/gtkdialogs.c:979
-msgid "_Account"
-msgstr "_Fiók"
-
-#: ../finch/gntblist.c:2216 ../pidgin/gtkdialogs.c:767
+#: ../finch/gntblist.c:2218 ../pidgin/gtkdialogs.c:781
 msgid "New Instant Message"
 msgstr "Új azonnali üzenet"
 
-#: ../finch/gntblist.c:2218 ../pidgin/gtkdialogs.c:769
-msgid ""
-"Please enter the screen name or alias of the person you would like to IM."
-msgstr ""
-"Adja meg azon partner felhasználónevét vagy álnevét, akinek üzenni szeretne."
+#: ../finch/gntblist.c:2220 ../pidgin/gtkdialogs.c:783
+msgid "Please enter the screen name or alias of the person you would like to IM."
+msgstr "Adja meg azon partner felhasználónevét vagy álnevét, akinek üzenni szeretne."
 
 #. Not multiline
 #. Not masked?
 #. No hints?
-#: ../finch/gntblist.c:2221 ../finch/gntcertmgr.c:90 ../finch/gntconn.c:135
-#: ../finch/gntnotify.c:80 ../libpurple/account.c:1012
-#: ../libpurple/account.c:1262 ../libpurple/protocols/gg/gg.c:506
-#: ../libpurple/protocols/gg/gg.c:665 ../libpurple/protocols/gg/gg.c:802
-#: ../libpurple/protocols/jabber/jabber.c:1736
+#: ../finch/gntblist.c:2223 ../finch/gntcertmgr.c:90 ../finch/gntconn.c:136
+#: ../finch/gntnotify.c:80 ../libpurple/account.c:1015
+#: ../libpurple/account.c:1304 ../libpurple/protocols/gg/gg.c:516
+#: ../libpurple/protocols/gg/gg.c:675 ../libpurple/protocols/gg/gg.c:812
+#: ../libpurple/protocols/jabber/jabber.c:1714
 #: ../libpurple/protocols/jabber/xdata.c:399
-#: ../libpurple/protocols/msn/msn.c:286 ../libpurple/protocols/msn/msn.c:303
-#: ../libpurple/protocols/msn/msn.c:320 ../libpurple/protocols/msn/msn.c:337
-#: ../libpurple/protocols/oscar/oscar.c:6093
+#: ../libpurple/protocols/msn/msn.c:290 ../libpurple/protocols/msn/msn.c:307
+#: ../libpurple/protocols/msn/msn.c:324 ../libpurple/protocols/msn/msn.c:341
+#: ../libpurple/protocols/msnp9/msn.c:286
+#: ../libpurple/protocols/msnp9/msn.c:303
+#: ../libpurple/protocols/msnp9/msn.c:320
+#: ../libpurple/protocols/msnp9/msn.c:337
+#: ../libpurple/protocols/oscar/oscar.c:6148
 #: ../libpurple/protocols/silc/buddy.c:454
-#: ../libpurple/protocols/silc/buddy.c:1190
-#: ../libpurple/protocols/silc/chat.c:447
-#: ../libpurple/protocols/silc/chat.c:482
-#: ../libpurple/protocols/silc/chat.c:745
-#: ../libpurple/protocols/silc/ops.c:1291
-#: ../libpurple/protocols/silc/ops.c:1815
-#: ../libpurple/protocols/silc/silc.c:822
+#: ../libpurple/protocols/silc/buddy.c:1193
+#: ../libpurple/protocols/silc/chat.c:449
+#: ../libpurple/protocols/silc/chat.c:486
+#: ../libpurple/protocols/silc/chat.c:749
+#: ../libpurple/protocols/silc/ops.c:1293
+#: ../libpurple/protocols/silc/ops.c:1819
+#: ../libpurple/protocols/silc/silc.c:953
 #: ../libpurple/protocols/silc10/buddy.c:467
-#: ../libpurple/protocols/silc10/buddy.c:1188
+#: ../libpurple/protocols/silc10/buddy.c:1191
 #: ../libpurple/protocols/silc10/chat.c:425
 #: ../libpurple/protocols/silc10/chat.c:464
 #: ../libpurple/protocols/silc10/chat.c:729
 #: ../libpurple/protocols/silc10/ops.c:1297
 #: ../libpurple/protocols/silc10/ops.c:1903
 #: ../libpurple/protocols/silc10/silc.c:735
-#: ../libpurple/protocols/yahoo/yahoo.c:1031
-#: ../libpurple/protocols/yahoo/yahoo.c:3497
-#: ../libpurple/protocols/yahoo/yahoo.c:3508 ../pidgin/gtkblist.c:4039
-#: ../pidgin/gtkcertmgr.c:195 ../pidgin/gtkdialogs.c:772
-#: ../pidgin/gtkdialogs.c:911 ../pidgin/gtkdialogs.c:1003
-#: ../pidgin/gtkrequest.c:270
+#: ../libpurple/protocols/yahoo/yahoo.c:1033
+#: ../libpurple/protocols/yahoo/yahoo.c:3499
+#: ../libpurple/protocols/yahoo/yahoo.c:3510 ../pidgin/gtkblist.c:4387
+#: ../pidgin/gtkcertmgr.c:195 ../pidgin/gtkdialogs.c:786
+#: ../pidgin/gtkdialogs.c:925 ../pidgin/gtkdialogs.c:1017
+#: ../pidgin/gtkrequest.c:320
 msgid "OK"
 msgstr "Rendben"
 
+#: ../finch/gntblist.c:2270
+msgid "Channel"
+msgstr "Csatorna"
+
+#: ../finch/gntblist.c:2282 ../pidgin/gtkblist.c:924
+msgid "Join a Chat"
+msgstr "Csatlakozás egy csevegéshez"
+
+#: ../finch/gntblist.c:2284
+msgid "Please enter the name of the chat you want to join."
+msgstr "Adja meg a csevegés nevét, amelyhez csatlakozni kíván."
+
+#: ../finch/gntblist.c:2286 ../finch/gntnotify.c:394
+msgid "Join"
+msgstr "Csatlakozás"
+
 #. Create the "Options" frame.
-#: ../finch/gntblist.c:2241 ../finch/gntpounce.c:447 ../pidgin/gtkpounce.c:790
+#: ../finch/gntblist.c:2324 ../finch/gntpounce.c:460 ../pidgin/gtkpounce.c:810
 msgid "Options"
 msgstr "Beállítások"
 
-#: ../finch/gntblist.c:2247
+#: ../finch/gntblist.c:2330
 msgid "Send IM..."
 msgstr "Üzenet küldése..."
 
-#: ../finch/gntblist.c:2251
-#, fuzzy
-msgid "Show empty groups"
-msgstr "Üres csoportok megjelenítése"
-
-#: ../finch/gntblist.c:2257
-#, fuzzy
-msgid "Show offline buddies"
-msgstr "Kilépett partnerek megjelenítése"
-
-#: ../finch/gntblist.c:2263
-msgid "Sort by status"
+#: ../finch/gntblist.c:2335
+msgid "Join Chat..."
+msgstr "Csatlakozás csevegéshez..."
+
+#: ../finch/gntblist.c:2340
+msgid "Show"
+msgstr "Megjelenítés"
+
+#: ../finch/gntblist.c:2345
+msgid "Empty groups"
+msgstr "Üres csoportok"
+
+#: ../finch/gntblist.c:2352
+msgid "Offline buddies"
+msgstr "Offline partnerek"
+
+#: ../finch/gntblist.c:2359
+msgid "Sort"
+msgstr "Rendezés"
+
+#: ../finch/gntblist.c:2364
+msgid "By Status"
 msgstr "Állapot szerint"
 
-#: ../finch/gntblist.c:2267
-msgid "Sort alphabetically"
+#: ../finch/gntblist.c:2369 ../pidgin/gtkblist.c:4172
+msgid "Alphabetically"
 msgstr "ABC sorrend"
 
-#: ../finch/gntblist.c:2271
-msgid "Sort by log size"
+#: ../finch/gntblist.c:2374
+msgid "By Log Size"
 msgstr "Naplóméret szerint"
 
 #: ../finch/gntcertmgr.c:86 ../pidgin/gtkcertmgr.c:188
-#, fuzzy
 msgid "Certificate Import"
-msgstr "Tanúsítványok"
+msgstr "Tanúsítványimportálás"
 
 #: ../finch/gntcertmgr.c:87 ../pidgin/gtkcertmgr.c:189
 msgid "Specify a hostname"
-msgstr ""
+msgstr "Adjon meg egy gépnevet"
 
 #: ../finch/gntcertmgr.c:88 ../pidgin/gtkcertmgr.c:190
 msgid "Type the host name this certificate is for."
-msgstr ""
+msgstr "Írja be a tanúsítványt birtokló gép nevét."
 
 #: ../finch/gntcertmgr.c:97 ../pidgin/gtkcertmgr.c:210
 #, c-format
@@ -712,21 +740,20 @@
 "File %s could not be imported.\n"
 "Make sure that the file is readable and in PEM format.\n"
 msgstr ""
+"A(z) %s fájl nem importálható.\n"
+"Győződjön meg róla, hogy a fájl olvasható és PEM formátumban van.\n"
 
 #: ../finch/gntcertmgr.c:99 ../pidgin/gtkcertmgr.c:212
-#, fuzzy
 msgid "Certificate Import Error"
-msgstr "Tanúsítványok"
+msgstr "Tanúsítványimportálási hiba"
 
 #: ../finch/gntcertmgr.c:100 ../pidgin/gtkcertmgr.c:213
-#, fuzzy
 msgid "X.509 certificate import failed"
-msgstr "X.509 tanúsítványok"
+msgstr "Az X.509 tanúsítvány importálása meghiúsult"
 
 #: ../finch/gntcertmgr.c:110 ../pidgin/gtkcertmgr.c:224
-#, fuzzy
 msgid "Select a PEM certificate"
-msgstr "Fájl kiválasztása"
+msgstr "Válasszon ki egy PEM tanúsítványt"
 
 #: ../finch/gntcertmgr.c:127 ../pidgin/gtkcertmgr.c:245
 #, c-format
@@ -734,26 +761,25 @@
 "Export to file %s failed.\n"
 "Check that you have write permission to the target path\n"
 msgstr ""
+"Az importálás meghiúsult a(z) %s fájlba.\n"
+"Ellenőrizze, hogy van-e írási jogosultsága a célútvonalra\n"
 
 #: ../finch/gntcertmgr.c:129 ../pidgin/gtkcertmgr.c:247
-#, fuzzy
 msgid "Certificate Export Error"
-msgstr "Tanúsítványok"
+msgstr "Tanúsítványexportálási hiba"
 
 #: ../finch/gntcertmgr.c:130 ../pidgin/gtkcertmgr.c:248
-#, fuzzy
 msgid "X.509 certificate export failed"
-msgstr "X.509 tanúsítványok"
+msgstr "Az X.509 tanúsítvány exportálása meghiúsult"
 
 #: ../finch/gntcertmgr.c:159 ../pidgin/gtkcertmgr.c:299
-#, fuzzy
 msgid "PEM X.509 Certificate Export"
-msgstr "X.509 tanúsítványok"
+msgstr "PEM X.509 tanúsítvány exportálása"
 
 #: ../finch/gntcertmgr.c:188
-#, fuzzy, c-format
+#, c-format
 msgid "Certificate for %s"
-msgstr "Tanúsítványok"
+msgstr "%s tanúsítványa"
 
 #: ../finch/gntcertmgr.c:195
 #, c-format
@@ -763,59 +789,62 @@
 "SHA1 fingerprint:\n"
 "%s"
 msgstr ""
+"Közönséges név: %s\n"
+"\n"
+"SHA1 ujjlenyomat:\n"
+"%s"
 
 #: ../finch/gntcertmgr.c:198
-#, fuzzy
 msgid "SSL Host Certificate"
-msgstr "Tanúsítványok"
+msgstr "SSL kiszolgálótanúsítvány"
 
 #: ../finch/gntcertmgr.c:233 ../pidgin/gtkcertmgr.c:372
 #, c-format
 msgid "Really delete certificate for %s?"
-msgstr ""
+msgstr "Valóban törli a következő tanúsítványát: %s?"
 
 #: ../finch/gntcertmgr.c:236 ../pidgin/gtkcertmgr.c:374
 msgid "Confirm certificate delete"
-msgstr ""
-
-#: ../finch/gntcertmgr.c:293 ../pidgin/gtkcertmgr.c:602
-#, fuzzy
+msgstr "Tanúsítványtörlés megerősítése"
+
+#: ../finch/gntcertmgr.c:293 ../pidgin/gtkcertmgr.c:603
 msgid "Certificate Manager"
-msgstr "Tanúsítványok"
+msgstr "Tanúsítványkezelő"
 
 #. Creating the user splits
-#: ../finch/gntcertmgr.c:298 ../libpurple/protocols/bonjour/bonjour.c:652
-#: ../libpurple/protocols/silc/silc.c:1007
+#: ../finch/gntcertmgr.c:298 ../libpurple/protocols/bonjour/bonjour.c:666
+#: ../libpurple/protocols/silc/silc.c:1138
 #: ../libpurple/protocols/silc10/silc.c:918
 msgid "Hostname"
 msgstr "Gépnév"
 
-#: ../finch/gntcertmgr.c:315 ../finch/gntnotify.c:383 ../pidgin/gtkconv.c:1635
-#: ../pidgin/gtkdebug.c:835
+#: ../finch/gntcertmgr.c:315 ../finch/gntnotify.c:388 ../pidgin/gtkconv.c:1689
+#: ../pidgin/gtkdebug.c:840
 msgid "Info"
 msgstr "Információ"
 
 #. Close button
 #: ../finch/gntcertmgr.c:324 ../finch/gntft.c:237 ../finch/gntnotify.c:182
-#: ../finch/gntplugin.c:210 ../finch/gntplugin.c:310 ../finch/gntpounce.c:738
-#: ../finch/gntstatus.c:216 ../libpurple/protocols/msn/msn.c:403
-#: ../libpurple/protocols/silc/util.c:382
-#: ../libpurple/protocols/silc10/util.c:377 ../pidgin/gtkaccount.c:2468
-#: ../pidgin/gtkrequest.c:273
+#: ../finch/gntplugin.c:213 ../finch/gntplugin.c:406 ../finch/gntpounce.c:751
+#: ../finch/gntstatus.c:216 ../libpurple/protocols/msn/msn.c:407
+#: ../libpurple/protocols/msnp9/msn.c:403
+#: ../libpurple/protocols/silc/util.c:386
+#: ../libpurple/protocols/silc10/util.c:377 ../pidgin/gtkaccount.c:2474
+#: ../pidgin/gtkrequest.c:323
 msgid "Close"
 msgstr "Bezárás"
 
-#: ../finch/gntconn.c:124
+#: ../finch/gntconn.c:125
 #, c-format
 msgid "%s (%s)"
 msgstr "%s (%s)"
 
-#: ../finch/gntconn.c:127
+#: ../finch/gntconn.c:128
 #, c-format
 msgid "%s disconnected."
 msgstr "%s kapcsolata megszakadt."
 
-#: ../finch/gntconn.c:128
+#: ../finch/gntconn.c:129
 #, c-format
 msgid ""
 "%s\n"
@@ -828,51 +857,51 @@
 "A Finch nem próbálja meg újra csatlakoztatni a fiókot, amíg nem javítja a "
 "hibát és nem engedélyezi újra a fiókot."
 
-#: ../finch/gntconn.c:137 ../pidgin/gtkblist.c:4041
+#: ../finch/gntconn.c:138 ../pidgin/gtkblist.c:4389
 msgid "Re-enable Account"
 msgstr "Fiók újraengedélyezése"
 
-#: ../finch/gntconv.c:139
+#: ../finch/gntconv.c:137
 msgid "No such command."
 msgstr "Nincs ilyen parancs."
 
-#: ../finch/gntconv.c:143 ../pidgin/gtkconv.c:489
+#: ../finch/gntconv.c:141 ../pidgin/gtkconv.c:531
 msgid "Syntax Error:  You typed the wrong number of arguments to that command."
 msgstr ""
 "Szintaktikai hiba:  Nem megfelelő számú paramétert adott meg ennek a "
 "parancsnak."
 
-#: ../finch/gntconv.c:148 ../pidgin/gtkconv.c:495
+#: ../finch/gntconv.c:146 ../pidgin/gtkconv.c:537
 msgid "Your command failed for an unknown reason."
 msgstr "A parancs végrehajtása ismeretlen ok miatt sikertelen."
 
-#: ../finch/gntconv.c:153 ../pidgin/gtkconv.c:502
+#: ../finch/gntconv.c:151 ../pidgin/gtkconv.c:544
 msgid "That command only works in chats, not IMs."
 msgstr "Ez a parancs csak csevegéskor működik, azonnali üzeneteknél nem."
 
-#: ../finch/gntconv.c:156 ../pidgin/gtkconv.c:505
+#: ../finch/gntconv.c:154 ../pidgin/gtkconv.c:547
 msgid "That command only works in IMs, not chats."
 msgstr "Ez a parancs csak azonnali üzeneteknél működik, csevegéskor nem."
 
-#: ../finch/gntconv.c:160 ../pidgin/gtkconv.c:510
+#: ../finch/gntconv.c:158 ../pidgin/gtkconv.c:552
 msgid "That command doesn't work on this protocol."
 msgstr "Ez a parancs nem működik ezzel a protokollal."
 
-#: ../finch/gntconv.c:168
+#: ../finch/gntconv.c:166
 msgid "Message was not sent, because you are not signed on."
 msgstr "Az üzenet nem küldhető el, mivel nincs bejelentkezve."
 
-#: ../finch/gntconv.c:251
+#: ../finch/gntconv.c:245
 #, c-format
 msgid "%s (%s -- %s)"
 msgstr "%s (%s -- %s)"
 
-#: ../finch/gntconv.c:274
+#: ../finch/gntconv.c:268
 #, c-format
 msgid "%s [%s]"
 msgstr "%s [%s]"
 
-#: ../finch/gntconv.c:279 ../finch/gntconv.c:773
+#: ../finch/gntconv.c:273 ../finch/gntconv.c:795
 #, c-format
 msgid ""
 "\n"
@@ -881,67 +910,64 @@
 "\n"
 "%s gépel..."
 
-#: ../finch/gntconv.c:298
+#: ../finch/gntconv.c:292
 msgid "You have left this chat."
 msgstr "Elhagyta ezt a csevegést."
 
-#: ../finch/gntconv.c:387 ../pidgin/gtkconv.c:1362
+#: ../finch/gntconv.c:408 ../pidgin/gtkconv.c:1416
 msgid "Logging started. Future messages in this conversation will be logged."
-msgstr ""
-"A naplózás elkezdődött. A társalgás jövőbeli üzenetei naplózva lesznek."
-
-#: ../finch/gntconv.c:393 ../pidgin/gtkconv.c:1370
-msgid ""
-"Logging stopped. Future messages in this conversation will not be logged."
-msgstr ""
-"A naplózás befejeződött. A társalgás jövőbeli üzenetei nem lesznek naplózva."
-
-#: ../finch/gntconv.c:442
+msgstr "A naplózás elkezdődött. A társalgás jövőbeli üzenetei naplózva lesznek."
+
+#: ../finch/gntconv.c:414 ../pidgin/gtkconv.c:1424
+msgid "Logging stopped. Future messages in this conversation will not be logged."
+msgstr "A naplózás befejeződött. A társalgás jövőbeli üzenetei nem lesznek naplózva."
+
+#: ../finch/gntconv.c:463
 msgid "Send To"
 msgstr "Küldés ennek"
 
-#: ../finch/gntconv.c:486
+#: ../finch/gntconv.c:507
 msgid "Conversation"
 msgstr "Társalgás"
 
-#: ../finch/gntconv.c:492
+#: ../finch/gntconv.c:513
 msgid "Clear Scrollback"
 msgstr "Előzmények törlése"
 
-#: ../finch/gntconv.c:496 ../finch/gntprefs.c:191
+#: ../finch/gntconv.c:517 ../finch/gntprefs.c:191
 msgid "Show Timestamps"
 msgstr "Időbélyegek"
 
-#: ../finch/gntconv.c:512
+#: ../finch/gntconv.c:533
 msgid "Add Buddy Pounce..."
 msgstr "Partnerfigyelmeztetés felvétele..."
 
-#: ../finch/gntconv.c:527
+#: ../finch/gntconv.c:548
 msgid "Enable Logging"
 msgstr "Naplózás engedélyezése"
 
-#: ../finch/gntconv.c:533
+#: ../finch/gntconv.c:554
 msgid "Enable Sounds"
 msgstr "Hangok engedélyezése"
 
-#: ../finch/gntconv.c:739
+#: ../finch/gntconv.c:760
 msgid "<AUTO-REPLY> "
 msgstr "<AUTOMATIKUS VÁLASZ> "
 
 #. Print the list of users in the room
-#: ../finch/gntconv.c:861
+#: ../finch/gntconv.c:883
 msgid "List of users:\n"
 msgstr "Felhasználólista:\n"
 
-#: ../finch/gntconv.c:1023 ../pidgin/gtkconv.c:331
+#: ../finch/gntconv.c:1045 ../pidgin/gtkconv.c:371
 msgid "Supported debug options are:  version"
 msgstr "A támogatott hibakeresési parancsok:  version"
 
-#: ../finch/gntconv.c:1059 ../pidgin/gtkconv.c:381
+#: ../finch/gntconv.c:1081 ../pidgin/gtkconv.c:423
 msgid "No such command (in this context)."
 msgstr "Nincs ilyen parancs (ebben a kontextusban)."
 
-#: ../finch/gntconv.c:1062 ../pidgin/gtkconv.c:384
+#: ../finch/gntconv.c:1084 ../pidgin/gtkconv.c:426
 msgid ""
 "Use \"/help &lt;command&gt;\" for help on a specific command.\n"
 "The following commands are available in this context:\n"
@@ -950,19 +976,19 @@
 "megtekintéséhez.\n"
 "Ebben a kontextusban a következő parancsok állnak rendelkezésre:\n"
 
-#: ../finch/gntconv.c:1120 ../pidgin/gtkconv.c:7560
+#: ../finch/gntconv.c:1142 ../pidgin/gtkconv.c:7755
 msgid ""
 "say &lt;message&gt;:  Send a message normally as if you weren't using a "
 "command."
 msgstr "say &lt;üzenet&gt;: Üzenet küldése, mintha nem használná a parancsot."
 
-#: ../finch/gntconv.c:1123 ../pidgin/gtkconv.c:7563
+#: ../finch/gntconv.c:1145 ../pidgin/gtkconv.c:7758
 msgid "me &lt;action&gt;:  Send an IRC style action to a buddy or chat."
 msgstr ""
 "me &lt;művelet&gt;: IRC stílusú művelet küldése egy partnernak vagy "
 "csevegésnek."
 
-#: ../finch/gntconv.c:1126 ../pidgin/gtkconv.c:7566
+#: ../finch/gntconv.c:1148 ../pidgin/gtkconv.c:7761
 msgid ""
 "debug &lt;option&gt;:  Send various debug information to the current "
 "conversation."
@@ -970,43 +996,48 @@
 "debug &lt;parancs&gt;: Különböző hibakeresési információk küldése a "
 "jelenlegi társalgásba."
 
-#: ../finch/gntconv.c:1129 ../pidgin/gtkconv.c:7569
+#: ../finch/gntconv.c:1151 ../pidgin/gtkconv.c:7764
 msgid "clear: Clears the conversation scrollback."
 msgstr "clear: Törli a társalgás előzményeit."
 
-#: ../finch/gntconv.c:1132 ../pidgin/gtkconv.c:7575
+#: ../finch/gntconv.c:1154 ../pidgin/gtkconv.c:7770
 msgid "help &lt;command&gt;:  Help on a specific command."
 msgstr "help &lt;parancs&gt;: Egy adott parancs súgója."
 
-#: ../finch/gntconv.c:1135
+#: ../finch/gntconv.c:1157
 msgid "users:  Show the list of users in the chat."
 msgstr "users: A csevegés felhasználólistájának megjelenítése."
 
-#: ../finch/gntconv.c:1140
+#: ../finch/gntconv.c:1162
 msgid "plugins: Show the plugins window."
 msgstr "plugins: A bővítmények ablak megjelenítése."
 
-#: ../finch/gntconv.c:1143
+#: ../finch/gntconv.c:1165
 msgid "buddylist: Show the buddylist."
 msgstr "buddylist: A partnerlista megjelenítése."
 
-#: ../finch/gntconv.c:1146
+#: ../finch/gntconv.c:1168
 msgid "accounts: Show the accounts window."
 msgstr "accounts: A fiókok ablak megjelenítése."
 
-#: ../finch/gntconv.c:1149
+#: ../finch/gntconv.c:1171
 msgid "debugwin: Show the debug window."
 msgstr "debugwin: A hibakereső ablak megjelenítése."
 
-#: ../finch/gntconv.c:1152
+#: ../finch/gntconv.c:1174
 msgid "prefs: Show the preference window."
 msgstr "prefs: A beállítások ablak megjelenítése."
 
-#: ../finch/gntconv.c:1155
+#: ../finch/gntconv.c:1177
 msgid "statuses: Show the savedstatuses window."
 msgstr "statuses: A mentett állapotok ablak megjelenítése."
 
-#: ../finch/gntdebug.c:235 ../finch/gntui.c:86 ../pidgin/gtkdebug.c:695
+#: ../finch/gntdebug.c:231 ../pidgin/gtkconv.c:989 ../pidgin/gtkconv.c:2663
+#: ../pidgin/gtkdebug.c:220 ../pidgin/gtkft.c:543
+msgid "Unable to open file."
+msgstr "Nem lehet megnyitni a fájlt."
+
+#: ../finch/gntdebug.c:271 ../finch/gntui.c:86 ../pidgin/gtkdebug.c:700
 msgid "Debug Window"
 msgstr "Hibakereső ablak"
 
@@ -1014,15 +1045,15 @@
 #. * it's necessary to make the width of the debug window resizable ... like I said,
 #. * it doesn't make sense. The bug is likely in the packing in gntbox.c.
 #.
-#: ../finch/gntdebug.c:256 ../pidgin/gtkdebug.c:754
+#: ../finch/gntdebug.c:292 ../pidgin/gtkdebug.c:759
 msgid "Clear"
 msgstr "Törlés"
 
-#: ../finch/gntdebug.c:262
-msgid "Filter: "
+#: ../finch/gntdebug.c:303
+msgid "Filter:"
 msgstr "Szűrő:"
 
-#: ../finch/gntdebug.c:266 ../pidgin/gtkdebug.c:763
+#: ../finch/gntdebug.c:309 ../pidgin/gtkdebug.c:768
 msgid "Pause"
 msgstr "Szünet"
 
@@ -1059,25 +1090,27 @@
 
 #. XXX: Use of ggp_str_to_uin() is an ugly hack!
 #: ../finch/gntft.c:201 ../finch/gntstatus.c:547 ../finch/gntstatus.c:576
-#: ../libpurple/protocols/bonjour/bonjour.c:344
-#: ../libpurple/protocols/gg/gg.c:1039 ../libpurple/protocols/gg/gg.c:1576
-#: ../libpurple/protocols/gg/gg.c:1584
+#: ../libpurple/protocols/bonjour/bonjour.c:358
+#: ../libpurple/protocols/gg/gg.c:1050 ../libpurple/protocols/gg/gg.c:1587
+#: ../libpurple/protocols/gg/gg.c:1595
 #: ../libpurple/protocols/jabber/buddy.c:778
 #: ../libpurple/protocols/jabber/buddy.c:782
 #: ../libpurple/protocols/jabber/buddy.c:941
-#: ../libpurple/protocols/jabber/jabber.c:1500
-#: ../libpurple/protocols/msn/msn.c:543
-#: ../libpurple/protocols/novell/novell.c:2835
+#: ../libpurple/protocols/jabber/jabber.c:1507
+#: ../libpurple/protocols/msn/msn.c:621 ../libpurple/protocols/msn/msn.c:631
+#: ../libpurple/protocols/msn/msn.c:636 ../libpurple/protocols/msn/msn.c:639
+#: ../libpurple/protocols/msnp9/msn.c:543
+#: ../libpurple/protocols/novell/novell.c:2840
 #: ../libpurple/protocols/oscar/oscar.c:821
 #: ../libpurple/protocols/oscar/oscar.c:826
 #: ../libpurple/protocols/oscar/oscar.c:828
-#: ../libpurple/protocols/oscar/oscar.c:2700
-#: ../libpurple/protocols/oscar/oscar.c:3780
-#: ../libpurple/protocols/sametime/sametime.c:3263
-#: ../libpurple/protocols/sametime/sametime.c:4150
-#: ../libpurple/protocols/yahoo/yahoo.c:3248 ../pidgin/gtkblist.c:3104
-#: ../pidgin/gtkblist.c:3118 ../pidgin/gtkblist.c:3120
-#: ../pidgin/gtksavedstatuses.c:999 ../pidgin/gtksavedstatuses.c:1144
+#: ../libpurple/protocols/oscar/oscar.c:2715
+#: ../libpurple/protocols/oscar/oscar.c:3795
+#: ../libpurple/protocols/sametime/sametime.c:3264
+#: ../libpurple/protocols/sametime/sametime.c:4151
+#: ../libpurple/protocols/yahoo/yahoo.c:3250 ../pidgin/gtkblist.c:3322
+#: ../pidgin/gtkblist.c:3336 ../pidgin/gtkblist.c:3338
+#: ../pidgin/gtksavedstatuses.c:1005 ../pidgin/gtksavedstatuses.c:1150
 msgid "Status"
 msgstr "Állapot"
 
@@ -1120,7 +1153,8 @@
 msgid "Finished"
 msgstr "Befejeződött"
 
-#: ../finch/gntft.c:437 ../libpurple/protocols/msn/session.c:347
+#: ../finch/gntft.c:437 ../libpurple/protocols/msn/session.c:396
+#: ../libpurple/protocols/msnp9/session.c:347
 msgid "Transferring"
 msgstr "Átvitel"
 
@@ -1128,72 +1162,68 @@
 msgid "Emails"
 msgstr "E-mailek"
 
-#: ../finch/gntnotify.c:171 ../finch/gntnotify.c:225
+#: ../finch/gntnotify.c:171 ../finch/gntnotify.c:226
 msgid "You have mail!"
 msgstr "Levele érkezett!"
 
-#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:513
+#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:519
 msgid "Sender"
 msgstr "Feladó"
 
-#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:520
+#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:526
 msgid "Subject"
 msgstr "Tárgy"
 
-#: ../finch/gntnotify.c:201
+#: ../finch/gntnotify.c:202
 #, c-format
 msgid "%s (%s) has %d new message."
 msgid_plural "%s (%s) has %d new messages."
 msgstr[0] "%s (%s) %d új üzenetet kapott."
 msgstr[1] "%s (%s) %d új üzenetet kapott."
 
-#: ../finch/gntnotify.c:225 ../pidgin/gtknotify.c:341
+#: ../finch/gntnotify.c:226 ../pidgin/gtknotify.c:342
 msgid "New Mail"
 msgstr "Új e-mail"
 
-#: ../finch/gntnotify.c:290 ../pidgin/gtknotify.c:940
+#: ../finch/gntnotify.c:291 ../pidgin/gtknotify.c:949
 #, c-format
 msgid "Info for %s"
 msgstr "%s információi"
 
-#: ../finch/gntnotify.c:291 ../libpurple/protocols/toc/toc.c:476
-#: ../pidgin/gtknotify.c:941
+#: ../finch/gntnotify.c:292 ../libpurple/protocols/toc/toc.c:476
+#: ../pidgin/gtknotify.c:950
 msgid "Buddy Information"
 msgstr "Partnerinformáció"
 
-#: ../finch/gntnotify.c:377 ../libpurple/protocols/qq/group_join.c:367
+#: ../finch/gntnotify.c:382 ../libpurple/protocols/qq/group_join.c:367
 msgid "Continue"
 msgstr "Folytatás"
 
-#: ../finch/gntnotify.c:386 ../pidgin/gtkconv.c:1596
+#: ../finch/gntnotify.c:391 ../pidgin/gtkconv.c:1650
 msgid "IM"
 msgstr "Azonnali üzenet"
 
-#: ../finch/gntnotify.c:389
-msgid "Join"
-msgstr "Csatlakozás"
-
-#: ../finch/gntnotify.c:392 ../libpurple/protocols/sametime/sametime.c:3473
+#: ../finch/gntnotify.c:397 ../libpurple/protocols/sametime/sametime.c:3474
 msgid "Invite"
 msgstr "Meghívás"
 
-#: ../finch/gntnotify.c:395
+#: ../finch/gntnotify.c:400
 msgid "(none)"
 msgstr "(nincs)"
 
-#: ../finch/gntplugin.c:75 ../finch/gntplugin.c:84
+#: ../finch/gntplugin.c:77 ../finch/gntplugin.c:86
 msgid "ERROR"
 msgstr "HIBA"
 
-#: ../finch/gntplugin.c:75
+#: ../finch/gntplugin.c:77
 msgid "loading plugin failed"
 msgstr "a bővítmény betöltése sikertelen"
 
-#: ../finch/gntplugin.c:84
+#: ../finch/gntplugin.c:86
 msgid "unloading plugin failed"
 msgstr "a bővítmény eltávolítása meghiúsult"
 
-#: ../finch/gntplugin.c:129
+#: ../finch/gntplugin.c:132
 #, c-format
 msgid ""
 "Name: %s\n"
@@ -1210,19 +1240,39 @@
 "Weboldal: %s\n"
 "Fájlnév: %s\n"
 
-#: ../finch/gntplugin.c:187
+#: ../finch/gntplugin.c:190
 msgid "Plugin need to be loaded before you can configure it."
 msgstr "A bővítményt be kell tölteni, mielőtt beállíthatná."
 
-#: ../finch/gntplugin.c:235
+#: ../finch/gntplugin.c:238
 msgid "No configuration options for this plugin."
 msgstr "A bővítménynek nincsenek beállításai."
 
+#: ../finch/gntplugin.c:259
+msgid "Error loading plugin"
+msgstr "Hiba a bővítmény betöltésekor"
+
 #: ../finch/gntplugin.c:260
+msgid "The selected file is not a valid plugin."
+msgstr "A kiválasztott fájl nem egy érvényes bővítmény."
+
+#: ../finch/gntplugin.c:261
+msgid "Please open the debug window and try again to see the exact error message."
+msgstr "Nyissa meg a hibakereső ablakot és próbálkozzon újra a pontos hibaüzenet megjelenítéséhez."
+
+#: ../finch/gntplugin.c:324
+msgid "Select plugin to install"
+msgstr "Válassza ki a telepítendő bővítményt"
+
+#: ../finch/gntplugin.c:350
 msgid "You can (un)load plugins from the following list."
 msgstr "A következő lista bővítményeit töltheti be vagy távolíthatja el."
 
-#: ../finch/gntplugin.c:315
+#: ../finch/gntplugin.c:401
+msgid "Install Plugin..."
+msgstr "Bővítmény telepítése..."
+
+#: ../finch/gntplugin.c:411
 msgid "Configure Plugin"
 msgstr "Bővítmény beállítása"
 
@@ -1231,186 +1281,186 @@
 #. (that should have been "effect," right?)
 #. Back to instant-apply! I win!  BU-HAHAHA!
 #. Create the window
-#: ../finch/gntplugin.c:371 ../finch/gntplugin.c:378 ../finch/gntprefs.c:264
-#: ../finch/gntui.c:90 ../pidgin/gtkdocklet.c:524 ../pidgin/gtkprefs.c:2067
+#: ../finch/gntplugin.c:467 ../finch/gntplugin.c:474 ../finch/gntprefs.c:264
+#: ../finch/gntui.c:90 ../pidgin/gtkdocklet.c:717 ../pidgin/gtkprefs.c:2169
 msgid "Preferences"
 msgstr "Beállítások"
 
-#: ../finch/gntpounce.c:183 ../pidgin/gtkpounce.c:256
+#: ../finch/gntpounce.c:194 ../pidgin/gtkpounce.c:256
 msgid "Please enter a buddy to pounce."
 msgstr "Adjon meg egy figyelendő partnert."
 
-#: ../finch/gntpounce.c:328 ../pidgin/gtkpounce.c:517
+#: ../finch/gntpounce.c:339 ../pidgin/gtkpounce.c:531
 msgid "New Buddy Pounce"
 msgstr "Új partnerfigyelmeztetés"
 
-#: ../finch/gntpounce.c:328 ../pidgin/gtkpounce.c:517
+#: ../finch/gntpounce.c:339 ../pidgin/gtkpounce.c:531
 msgid "Edit Buddy Pounce"
 msgstr "Partnerfigyelmeztetés szerkesztése"
 
-#: ../finch/gntpounce.c:333
+#: ../finch/gntpounce.c:344
 msgid "Pounce Who"
 msgstr "Kinél figyelmeztet"
 
 #. Account:
-#: ../finch/gntpounce.c:336 ../finch/gntstatus.c:456
+#: ../finch/gntpounce.c:347 ../finch/gntstatus.c:456
 msgid "Account:"
 msgstr "Fiók:"
 
-#: ../finch/gntpounce.c:358
+#: ../finch/gntpounce.c:369
 msgid "Buddy name:"
 msgstr "Partner neve:"
 
 #. Create the "Pounce When Buddy..." frame.
-#: ../finch/gntpounce.c:374 ../pidgin/gtkpounce.c:585
+#: ../finch/gntpounce.c:387 ../pidgin/gtkpounce.c:600
 msgid "Pounce When Buddy..."
 msgstr "Figyelmeztetés, ha a partner..."
 
-#: ../finch/gntpounce.c:376
+#: ../finch/gntpounce.c:389
 msgid "Signs on"
 msgstr "Bejelentkezik"
 
-#: ../finch/gntpounce.c:377
+#: ../finch/gntpounce.c:390
 msgid "Signs off"
 msgstr "Kijelentkezik"
 
-#: ../finch/gntpounce.c:378
+#: ../finch/gntpounce.c:391
 msgid "Goes away"
 msgstr "A partner elmegy"
 
-#: ../finch/gntpounce.c:379
+#: ../finch/gntpounce.c:392
 msgid "Returns from away"
 msgstr "Visszatér távollétből"
 
-#: ../finch/gntpounce.c:380
+#: ../finch/gntpounce.c:393
 msgid "Becomes idle"
 msgstr "Inaktív lesz"
 
-#: ../finch/gntpounce.c:381
+#: ../finch/gntpounce.c:394
 msgid "Is no longer idle"
 msgstr "Már nem inaktív"
 
-#: ../finch/gntpounce.c:382
+#: ../finch/gntpounce.c:395
 msgid "Starts typing"
 msgstr "Elkezd gépelni"
 
-#: ../finch/gntpounce.c:383
+#: ../finch/gntpounce.c:396
 msgid "Pauses while typing"
 msgstr "Felfüggeszti a gépelést"
 
-#: ../finch/gntpounce.c:384
+#: ../finch/gntpounce.c:397
 msgid "Stops typing"
 msgstr "Abbahagyja a gépelést"
 
-#: ../finch/gntpounce.c:385
+#: ../finch/gntpounce.c:398
 msgid "Sends a message"
 msgstr "Üzenetet küld"
 
 #. Create the "Action" frame.
-#: ../finch/gntpounce.c:414 ../pidgin/gtkpounce.c:646
+#: ../finch/gntpounce.c:427 ../pidgin/gtkpounce.c:661
 msgid "Action"
 msgstr "Művelet"
 
-#: ../finch/gntpounce.c:416
+#: ../finch/gntpounce.c:429
 msgid "Open an IM window"
 msgstr "Azonnali üzenőablak megnyitása"
 
-#: ../finch/gntpounce.c:417
+#: ../finch/gntpounce.c:430
 msgid "Pop up a notification"
 msgstr "Értesítés megjelenítése"
 
-#: ../finch/gntpounce.c:418
+#: ../finch/gntpounce.c:431
 msgid "Send a message"
 msgstr "Üzenet küldése"
 
-#: ../finch/gntpounce.c:419
+#: ../finch/gntpounce.c:432
 msgid "Execute a command"
 msgstr "Parancs végrehajtása"
 
-#: ../finch/gntpounce.c:420
+#: ../finch/gntpounce.c:433
 msgid "Play a sound"
 msgstr "Hang lejátszása"
 
-#: ../finch/gntpounce.c:448
+#: ../finch/gntpounce.c:461
 msgid "Pounce only when my status is not available"
 msgstr "Csak akkor figyelmeztet, ha az állapotom nem érhető el"
 
-#: ../finch/gntpounce.c:450 ../pidgin/gtkpounce.c:1281
+#: ../finch/gntpounce.c:463 ../pidgin/gtkpounce.c:1301
 msgid "Recurring"
 msgstr "Ismétlődő"
 
-#: ../finch/gntpounce.c:618
+#: ../finch/gntpounce.c:631
 msgid "Cannot create pounce"
 msgstr "Nem hozható létre figyelmeztetés"
 
-#: ../finch/gntpounce.c:619
+#: ../finch/gntpounce.c:632
 msgid "You do not have any accounts."
 msgstr "Nincs egyetlen fiókja sem."
 
-#: ../finch/gntpounce.c:620
+#: ../finch/gntpounce.c:633
 msgid "You must create an account first before you can create a pounce."
 msgstr "A figyelmeztetések létrehozása előtt létre kell hoznia egy fiókot."
 
-#: ../finch/gntpounce.c:662 ../pidgin/gtkpounce.c:1096
+#: ../finch/gntpounce.c:675 ../pidgin/gtkpounce.c:1116
 #, c-format
 msgid "Are you sure you want to delete the pounce on %s for %s?"
 msgstr "Biztos, hogy törölni akarja %s figyelmeztetését a következőnek: %s?"
 
-#: ../finch/gntpounce.c:696 ../finch/gntui.c:84 ../pidgin/gtkpounce.c:1325
+#: ../finch/gntpounce.c:709 ../finch/gntui.c:84 ../pidgin/gtkpounce.c:1352
 msgid "Buddy Pounces"
 msgstr "Partnerfigyelmeztetések"
 
-#: ../finch/gntpounce.c:810 ../pidgin/gtkpounce.c:1452
+#: ../finch/gntpounce.c:823 ../pidgin/gtkpounce.c:1480
 #, c-format
 msgid "%s has started typing to you (%s)"
 msgstr "%s gépelni kezdett Önnek (%s)"
 
-#: ../finch/gntpounce.c:812 ../pidgin/gtkpounce.c:1454
+#: ../finch/gntpounce.c:825 ../pidgin/gtkpounce.c:1482
 #, c-format
 msgid "%s has paused while typing to you (%s)"
 msgstr "%s szünetet tart az Önnek gépelés közben (%s)"
 
-#: ../finch/gntpounce.c:814 ../pidgin/gtkpounce.c:1456
+#: ../finch/gntpounce.c:827 ../pidgin/gtkpounce.c:1484
 #, c-format
 msgid "%s has signed on (%s)"
 msgstr "%s belépett (%s)"
 
-#: ../finch/gntpounce.c:816 ../pidgin/gtkpounce.c:1458
+#: ../finch/gntpounce.c:829 ../pidgin/gtkpounce.c:1486
 #, c-format
 msgid "%s has returned from being idle (%s)"
 msgstr "%s inaktív állapota megszűnt (%s)"
 
-#: ../finch/gntpounce.c:818 ../pidgin/gtkpounce.c:1460
+#: ../finch/gntpounce.c:831 ../pidgin/gtkpounce.c:1488
 #, c-format
 msgid "%s has returned from being away (%s)"
 msgstr "%s visszatért (%s)"
 
-#: ../finch/gntpounce.c:820 ../pidgin/gtkpounce.c:1462
+#: ../finch/gntpounce.c:833 ../pidgin/gtkpounce.c:1490
 #, c-format
 msgid "%s has stopped typing to you (%s)"
 msgstr "%s abbahagyta a gépelést (%s)"
 
-#: ../finch/gntpounce.c:822 ../pidgin/gtkpounce.c:1464
+#: ../finch/gntpounce.c:835 ../pidgin/gtkpounce.c:1492
 #, c-format
 msgid "%s has signed off (%s)"
 msgstr "%s kilépett (%s)"
 
-#: ../finch/gntpounce.c:824 ../pidgin/gtkpounce.c:1466
+#: ../finch/gntpounce.c:837 ../pidgin/gtkpounce.c:1494
 #, c-format
 msgid "%s has become idle (%s)"
 msgstr "%s állapota inaktív (%s)"
 
-#: ../finch/gntpounce.c:826 ../pidgin/gtkpounce.c:1468
+#: ../finch/gntpounce.c:839 ../pidgin/gtkpounce.c:1496
 #, c-format
 msgid "%s has gone away. (%s)"
 msgstr "%s távol van. (%s)"
 
-#: ../finch/gntpounce.c:828 ../pidgin/gtkpounce.c:1470
+#: ../finch/gntpounce.c:841 ../pidgin/gtkpounce.c:1498
 #, c-format
 msgid "%s has sent you a message. (%s)"
 msgstr "%s egy üzenetet küldött. (%s)"
 
-#: ../finch/gntpounce.c:829 ../pidgin/gtkpounce.c:1471
+#: ../finch/gntpounce.c:842 ../pidgin/gtkpounce.c:1499
 #, c-format
 msgid "Unknown pounce event. Please report this!"
 msgstr "Ismeretlen figyelmeztetési esemény. Kérjük jelentse ezt!"
@@ -1419,12 +1469,12 @@
 msgid "Based on keyboard use"
 msgstr "Billentyűzet használata alapján"
 
-#: ../finch/gntprefs.c:94 ../pidgin/gtkprefs.c:1930
+#: ../finch/gntprefs.c:94 ../pidgin/gtkprefs.c:2031
 msgid "From last sent message"
 msgstr "Utolsó elküldött üzenettől"
 
-#: ../finch/gntprefs.c:96 ../pidgin/gtkprefs.c:898 ../pidgin/gtkprefs.c:907
-#: ../pidgin/gtkprefs.c:1929 ../pidgin/gtkprefs.c:1943
+#: ../finch/gntprefs.c:96 ../pidgin/gtkprefs.c:900 ../pidgin/gtkprefs.c:908
+#: ../pidgin/gtkprefs.c:2030 ../pidgin/gtkprefs.c:2044
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:333
 msgid "Never"
 msgstr "Soha"
@@ -1474,79 +1524,79 @@
 msgstr "Állapot megváltoztatása a következőre"
 
 #. Conversations
-#: ../finch/gntprefs.c:259 ../pidgin/gtkprefs.c:993 ../pidgin/gtkprefs.c:2033
+#: ../finch/gntprefs.c:259 ../pidgin/gtkprefs.c:995 ../pidgin/gtkprefs.c:2135
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:340
 msgid "Conversations"
 msgstr "Társalgások"
 
-#: ../finch/gntprefs.c:260 ../pidgin/gtkprefs.c:1467 ../pidgin/gtkprefs.c:2044
+#: ../finch/gntprefs.c:260 ../pidgin/gtkprefs.c:1563 ../pidgin/gtkprefs.c:2146
 msgid "Logging"
 msgstr "Naplózás"
 
-#: ../finch/gntrequest.c:583
+#: ../finch/gntrequest.c:585
 msgid "Not implemented yet."
 msgstr "Még nincs megvalósítva."
 
-#: ../finch/gntrequest.c:659 ../pidgin/gtkrequest.c:1555
-#: ../pidgin/gtkrequest.c:1601
+#: ../finch/gntrequest.c:661 ../pidgin/gtkrequest.c:1699
+#: ../pidgin/gtkrequest.c:1745
 msgid "Save File..."
 msgstr "Fájl mentése..."
 
-#: ../finch/gntrequest.c:659 ../pidgin/gtkrequest.c:1556
-#: ../pidgin/gtkrequest.c:1602
+#: ../finch/gntrequest.c:661 ../pidgin/gtkrequest.c:1700
+#: ../pidgin/gtkrequest.c:1746
 msgid "Open File..."
 msgstr "Fájl megnyitása..."
 
-#: ../finch/gntsound.c:97 ../pidgin/gtksound.c:64
+#: ../finch/gntsound.c:97 ../pidgin/gtksound.c:62
 msgid "Buddy logs in"
 msgstr "Partner belép"
 
-#: ../finch/gntsound.c:98 ../pidgin/gtksound.c:65
+#: ../finch/gntsound.c:98 ../pidgin/gtksound.c:63
 msgid "Buddy logs out"
 msgstr "Partner kilép"
 
-#: ../finch/gntsound.c:99 ../pidgin/gtksound.c:66
+#: ../finch/gntsound.c:99 ../pidgin/gtksound.c:64
 msgid "Message received"
 msgstr "Üzenet fogadása"
 
-#: ../finch/gntsound.c:100 ../pidgin/gtksound.c:67
+#: ../finch/gntsound.c:100 ../pidgin/gtksound.c:65
 msgid "Message received begins conversation"
 msgstr "Társalgás kezdetét jelző üzenet"
 
-#: ../finch/gntsound.c:101 ../pidgin/gtksound.c:68
+#: ../finch/gntsound.c:101 ../pidgin/gtksound.c:66
 msgid "Message sent"
 msgstr "Üzenet elküldve"
 
-#: ../finch/gntsound.c:102 ../pidgin/gtksound.c:69
+#: ../finch/gntsound.c:102 ../pidgin/gtksound.c:67
 msgid "Person enters chat"
 msgstr "Egy személy csatlakozik a csevegéshez"
 
-#: ../finch/gntsound.c:103 ../pidgin/gtksound.c:70
+#: ../finch/gntsound.c:103 ../pidgin/gtksound.c:68
 msgid "Person leaves chat"
 msgstr "Egy személy elhagyja a csevegést"
 
-#: ../finch/gntsound.c:104 ../pidgin/gtksound.c:71
+#: ../finch/gntsound.c:104 ../pidgin/gtksound.c:69
 msgid "You talk in chat"
 msgstr "Ön beszél a csevegésben"
 
-#: ../finch/gntsound.c:105 ../pidgin/gtksound.c:72
+#: ../finch/gntsound.c:105 ../pidgin/gtksound.c:70
 msgid "Others talk in chat"
 msgstr "Mások beszélnek a csevegésben"
 
-#: ../finch/gntsound.c:107 ../pidgin/gtksound.c:75
+#: ../finch/gntsound.c:107 ../pidgin/gtksound.c:73
 msgid "Someone says your screen name in chat"
 msgstr "Valaki csevegés közben leírja az Ön felhasználónevét"
 
-#: ../finch/gntsound.c:361 ../pidgin/gtksound.c:311
+#: ../finch/gntsound.c:361 ../pidgin/gtksound.c:306
 msgid "GStreamer Failure"
 msgstr "GStreamer hiba"
 
-#: ../finch/gntsound.c:362 ../pidgin/gtksound.c:312
+#: ../finch/gntsound.c:362 ../pidgin/gtksound.c:307
 msgid "GStreamer failed to initialize."
 msgstr "A GStreamer inicializálása meghiúsult."
 
-#: ../finch/gntsound.c:716 ../finch/gntsound.c:802 ../pidgin/gtkprefs.c:1587
-#: ../pidgin/gtkprefs.c:1676 ../pidgin/gtkprefs.c:1872
+#: ../finch/gntsound.c:716 ../finch/gntsound.c:802 ../pidgin/gtkprefs.c:1687
+#: ../pidgin/gtkprefs.c:1776 ../pidgin/gtkprefs.c:1972
 msgid "(default)"
 msgstr "(alapértelmezett)"
 
@@ -1562,7 +1612,7 @@
 msgid "Profiles"
 msgstr "Profilok"
 
-#: ../finch/gntsound.c:954 ../pidgin/gtkprefs.c:1717
+#: ../finch/gntsound.c:954 ../pidgin/gtkprefs.c:1817
 msgid "Automatic"
 msgstr "Automatikus"
 
@@ -1570,7 +1620,7 @@
 msgid "Console Beep"
 msgstr "Konzolos hangjelzés"
 
-#: ../finch/gntsound.c:958 ../pidgin/gtkprefs.c:1721
+#: ../finch/gntsound.c:958 ../pidgin/gtkprefs.c:1821
 msgid "Command"
 msgstr "Parancs"
 
@@ -1578,7 +1628,7 @@
 msgid "No Sound"
 msgstr "Nincsenek hangok"
 
-#: ../finch/gntsound.c:961 ../pidgin/gtkprefs.c:1712
+#: ../finch/gntsound.c:961 ../pidgin/gtkprefs.c:1812
 msgid "Sound Method"
 msgstr "Hangrendszer"
 
@@ -1596,7 +1646,7 @@
 "(%s fájlnév megadásához)"
 
 #. Sound options
-#: ../finch/gntsound.c:981 ../pidgin/gtkprefs.c:1756
+#: ../finch/gntsound.c:981 ../pidgin/gtkprefs.c:1856
 msgid "Sound Options"
 msgstr "Hangbeállítások"
 
@@ -1604,18 +1654,18 @@
 msgid "Sounds when conversation has focus"
 msgstr "Hangok lejátszása, ha a társalgás ablaka aktív"
 
-#: ../finch/gntsound.c:990 ../pidgin/gtkprefs.c:897 ../pidgin/gtkprefs.c:909
-#: ../pidgin/gtkprefs.c:1763 ../pidgin/plugins/timestamp_format.c:42
+#: ../finch/gntsound.c:990 ../pidgin/gtkprefs.c:898 ../pidgin/gtkprefs.c:910
+#: ../pidgin/gtkprefs.c:1863 ../pidgin/plugins/timestamp_format.c:42
 #: ../pidgin/plugins/timestamp_format.c:51
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:334
 msgid "Always"
 msgstr "Mindig"
 
-#: ../finch/gntsound.c:991 ../pidgin/gtkprefs.c:1761
+#: ../finch/gntsound.c:991 ../pidgin/gtkprefs.c:1861
 msgid "Only when available"
 msgstr "Csak ha elérhető"
 
-#: ../finch/gntsound.c:992 ../pidgin/gtkprefs.c:1762
+#: ../finch/gntsound.c:992 ../pidgin/gtkprefs.c:1862
 msgid "Only when not available"
 msgstr "Csak ha nem érhető el"
 
@@ -1624,11 +1674,11 @@
 msgstr "Hangerő (0-100):"
 
 #. Sound events
-#: ../finch/gntsound.c:1018 ../pidgin/gtkprefs.c:1798
+#: ../finch/gntsound.c:1018 ../pidgin/gtkprefs.c:1898
 msgid "Sound Events"
 msgstr "Hangesemények"
 
-#: ../finch/gntsound.c:1020 ../pidgin/gtkprefs.c:1857
+#: ../finch/gntsound.c:1020 ../pidgin/gtkprefs.c:1957
 msgid "Event"
 msgstr "Esemény"
 
@@ -1636,15 +1686,15 @@
 msgid "File"
 msgstr "Fájl"
 
-#: ../finch/gntsound.c:1039 ../pidgin/gtkprefs.c:1876
+#: ../finch/gntsound.c:1039 ../pidgin/gtkprefs.c:1976
 msgid "Test"
 msgstr "Teszt"
 
-#: ../finch/gntsound.c:1042 ../pidgin/gtkprefs.c:1880
+#: ../finch/gntsound.c:1042 ../pidgin/gtkprefs.c:1980
 msgid "Reset"
 msgstr "Visszaállítás"
 
-#: ../finch/gntsound.c:1045 ../pidgin/gtkprefs.c:1884
+#: ../finch/gntsound.c:1045 ../pidgin/gtkprefs.c:1984
 msgid "Choose..."
 msgstr "Kiválasztás..."
 
@@ -1664,7 +1714,8 @@
 #: ../finch/gntstatus.c:183 ../finch/gntstatus.c:539
 #: ../libpurple/protocols/jabber/buddy.c:298
 #: ../libpurple/protocols/jabber/buddy.c:1359
-#: ../libpurple/protocols/novell/novell.c:1484
+#: ../libpurple/protocols/msn/msn.c:725
+#: ../libpurple/protocols/novell/novell.c:1486
 #: ../pidgin/gtksavedstatuses.c:500
 msgid "Title"
 msgstr "Beosztás"
@@ -1682,41 +1733,44 @@
 #. not independent
 #. Attributes - each status can have a message.
 #: ../finch/gntstatus.c:183 ../finch/gntstatus.c:564 ../finch/gntstatus.c:576
-#: ../libpurple/protocols/bonjour/bonjour.c:256
-#: ../libpurple/protocols/bonjour/bonjour.c:263
-#: ../libpurple/protocols/bonjour/bonjour.c:346
-#: ../libpurple/protocols/gg/gg.c:1077 ../libpurple/protocols/gg/gg.c:1579
-#: ../libpurple/protocols/gg/gg.c:1597 ../libpurple/protocols/gg/gg.c:1607
-#: ../libpurple/protocols/gg/gg.c:1613 ../libpurple/protocols/gg/gg.c:1622
-#: ../libpurple/protocols/gg/gg.c:1627 ../libpurple/protocols/irc/irc.c:234
-#: ../libpurple/protocols/jabber/jabber.c:1532
-#: ../libpurple/protocols/jabber/jabber.c:1555
-#: ../libpurple/protocols/jabber/jabber.c:1578
-#: ../libpurple/protocols/jabber/jabber.c:1601
-#: ../libpurple/protocols/jabber/jabber.c:1624
-#: ../libpurple/protocols/jabber/jabber.c:1649
+#: ../libpurple/protocols/bonjour/bonjour.c:270
+#: ../libpurple/protocols/bonjour/bonjour.c:277
+#: ../libpurple/protocols/bonjour/bonjour.c:360
+#: ../libpurple/protocols/gg/gg.c:1088 ../libpurple/protocols/gg/gg.c:1590
+#: ../libpurple/protocols/gg/gg.c:1608 ../libpurple/protocols/gg/gg.c:1618
+#: ../libpurple/protocols/gg/gg.c:1624 ../libpurple/protocols/gg/gg.c:1633
+#: ../libpurple/protocols/gg/gg.c:1638 ../libpurple/protocols/irc/irc.c:234
+#: ../libpurple/protocols/jabber/jabber.c:1539
+#: ../libpurple/protocols/jabber/jabber.c:1553
+#: ../libpurple/protocols/jabber/jabber.c:1567
+#: ../libpurple/protocols/jabber/jabber.c:1581
+#: ../libpurple/protocols/jabber/jabber.c:1595
+#: ../libpurple/protocols/jabber/jabber.c:1611
+#: ../libpurple/protocols/msn/msn.c:677 ../libpurple/protocols/msn/msn.c:683
+#: ../libpurple/protocols/msn/msn.c:689 ../libpurple/protocols/msn/msn.c:695
+#: ../libpurple/protocols/msn/msn.c:700 ../libpurple/protocols/msn/msn.c:705
 #: ../libpurple/protocols/myspace/myspace.c:148
-#: ../libpurple/protocols/novell/novell.c:2838
-#: ../libpurple/protocols/novell/novell.c:2941
-#: ../libpurple/protocols/novell/novell.c:2947
-#: ../libpurple/protocols/novell/novell.c:2953
-#: ../libpurple/protocols/oscar/oscar.c:5554
-#: ../libpurple/protocols/oscar/oscar.c:5772
-#: ../libpurple/protocols/oscar/oscar.c:5786
-#: ../libpurple/protocols/oscar/oscar.c:5802
-#: ../libpurple/protocols/oscar/oscar.c:5809
-#: ../libpurple/protocols/oscar/oscar.c:5816
-#: ../libpurple/protocols/sametime/sametime.c:3286
-#: ../libpurple/protocols/sametime/sametime.c:3292
-#: ../libpurple/protocols/sametime/sametime.c:3298
-#: ../libpurple/protocols/sametime/sametime.c:3377
-#: ../libpurple/protocols/silc/buddy.c:1551
-#: ../libpurple/protocols/silc10/buddy.c:1551
-#: ../libpurple/protocols/simple/simple.c:246
-#: ../libpurple/protocols/yahoo/yahoo.c:3751
-#: ../libpurple/protocols/yahoo/yahoo.c:3757
+#: ../libpurple/protocols/novell/novell.c:2843
+#: ../libpurple/protocols/novell/novell.c:2946
+#: ../libpurple/protocols/novell/novell.c:2952
+#: ../libpurple/protocols/novell/novell.c:2958
+#: ../libpurple/protocols/oscar/oscar.c:5609
+#: ../libpurple/protocols/oscar/oscar.c:5827
+#: ../libpurple/protocols/oscar/oscar.c:5841
+#: ../libpurple/protocols/oscar/oscar.c:5857
+#: ../libpurple/protocols/oscar/oscar.c:5864
+#: ../libpurple/protocols/oscar/oscar.c:5871
+#: ../libpurple/protocols/sametime/sametime.c:3287
+#: ../libpurple/protocols/sametime/sametime.c:3293
+#: ../libpurple/protocols/sametime/sametime.c:3299
+#: ../libpurple/protocols/sametime/sametime.c:3378
+#: ../libpurple/protocols/silc/buddy.c:1554
+#: ../libpurple/protocols/silc10/buddy.c:1554
+#: ../libpurple/protocols/simple/simple.c:247
+#: ../libpurple/protocols/yahoo/yahoo.c:3753
+#: ../libpurple/protocols/yahoo/yahoo.c:3759
 #: ../libpurple/protocols/zephyr/zephyr.c:2337
-#: ../pidgin/gtksavedstatuses.c:526 ../pidgin/gtksavedstatuses.c:1010
+#: ../pidgin/gtksavedstatuses.c:526 ../pidgin/gtksavedstatuses.c:1016
 msgid "Message"
 msgstr "Üzenet"
 
@@ -1770,7 +1824,7 @@
 msgid "Certificates"
 msgstr "Tanúsítványok"
 
-#: ../finch/gntui.c:89 ../pidgin/gtkprefs.c:2035
+#: ../finch/gntui.c:89 ../pidgin/gtkprefs.c:2137
 msgid "Sounds"
 msgstr "Hangok"
 
@@ -1793,8 +1847,7 @@
 
 #: ../finch/plugins/gntclipboard.c:129
 msgid "This plugin cannot be loaded because it was not built with X11 support."
-msgstr ""
-"A bővítmény nem tölthető be, mivel X11 támogatás nélkül került lefordításra."
+msgstr "A bővítmény nem tölthető be, mivel X11 támogatás nélkül került lefordításra."
 
 #: ../finch/plugins/gntclipboard.c:158
 msgid "GntClipboard"
@@ -1873,16 +1926,16 @@
 msgid "Toaster plugin"
 msgstr "Kenyérpirító bővítmény"
 
-#: ../finch/plugins/gnthistory.c:116 ../pidgin/plugins/history.c:120
+#: ../finch/plugins/gnthistory.c:116 ../pidgin/plugins/history.c:125
 #, c-format
 msgid "<b>Conversation with %s on %s:</b><br>"
 msgstr "<b>Társalgás %s partnerrel ekkor: %s:</b><br>"
 
-#: ../finch/plugins/gnthistory.c:138 ../pidgin/plugins/history.c:147
+#: ../finch/plugins/gnthistory.c:138 ../pidgin/plugins/history.c:153
 msgid "History Plugin Requires Logging"
 msgstr "Az előzmények bővítmény megköveteli a naplózást"
 
-#: ../finch/plugins/gnthistory.c:139 ../pidgin/plugins/history.c:148
+#: ../finch/plugins/gnthistory.c:139 ../pidgin/plugins/history.c:154
 msgid ""
 "Logging can be enabled from Tools -> Preferences -> Logging.\n"
 "\n"
@@ -1898,11 +1951,11 @@
 msgid "GntHistory"
 msgstr "Gnt előzmények"
 
-#: ../finch/plugins/gnthistory.c:181 ../pidgin/plugins/history.c:190
+#: ../finch/plugins/gnthistory.c:181 ../pidgin/plugins/history.c:197
 msgid "Shows recently logged conversations in new conversations."
 msgstr "Legutóbb naplózott társalgások mutatása új társalgáskor."
 
-#: ../finch/plugins/gnthistory.c:182 ../pidgin/plugins/history.c:191
+#: ../finch/plugins/gnthistory.c:182 ../pidgin/plugins/history.c:198
 msgid ""
 "When a new conversation is opened this plugin will insert the last "
 "conversation into the current conversation."
@@ -1927,89 +1980,89 @@
 msgid "Lastlog plugin."
 msgstr "Lastlog bővítmény."
 
-#: ../libpurple/account.c:791
+#: ../libpurple/account.c:794
 msgid "accounts"
 msgstr "fiókok"
 
-#: ../libpurple/account.c:958 ../libpurple/protocols/jabber/auth.c:195
+#: ../libpurple/account.c:961 ../libpurple/protocols/jabber/auth.c:195
 msgid "Password is required to sign on."
 msgstr "A bejelentkezéshez jelszó szükséges."
 
-#: ../libpurple/account.c:992
+#: ../libpurple/account.c:995
 #, c-format
 msgid "Enter password for %s (%s)"
 msgstr "Adja meg a jelszót %s (%s) számára"
 
-#: ../libpurple/account.c:999
+#: ../libpurple/account.c:1002
 msgid "Enter Password"
 msgstr "Adja meg a jelszót"
 
-#: ../libpurple/account.c:1004
+#: ../libpurple/account.c:1007
 msgid "Save password"
 msgstr "Jelszó mentése"
 
-#: ../libpurple/account.c:1039 ../libpurple/connection.c:105
+#: ../libpurple/account.c:1042 ../libpurple/connection.c:105
 #: ../libpurple/connection.c:178
 #, c-format
 msgid "Missing protocol plugin for %s"
 msgstr "Hiányzó protokollbővítmény a következőhöz: %s"
 
-#: ../libpurple/account.c:1041 ../libpurple/connection.c:108
-#: ../pidgin/gtkblist.c:4036
+#: ../libpurple/account.c:1044 ../libpurple/connection.c:108
+#: ../pidgin/gtkblist.c:4384
 msgid "Connection Error"
 msgstr "Kapcsolódási hiba"
 
-#: ../libpurple/account.c:1199 ../libpurple/protocols/gg/gg.c:707
-#: ../libpurple/protocols/jabber/jabber.c:1687
+#: ../libpurple/account.c:1241 ../libpurple/protocols/gg/gg.c:717
+#: ../libpurple/protocols/jabber/jabber.c:1667
 msgid "New passwords do not match."
 msgstr "Az új jelszavak nem egyeznek."
 
-#: ../libpurple/account.c:1208
+#: ../libpurple/account.c:1250
 msgid "Fill out all fields completely."
 msgstr "Minden mezőt töltsön ki."
 
-#: ../libpurple/account.c:1231
+#: ../libpurple/account.c:1273
 msgid "Original password"
 msgstr "Eredeti jelszó"
 
-#: ../libpurple/account.c:1238
+#: ../libpurple/account.c:1280
 msgid "New password"
 msgstr "Új jelszó"
 
-#: ../libpurple/account.c:1245
+#: ../libpurple/account.c:1287
 msgid "New password (again)"
 msgstr "Új jelszó (még egyszer)"
 
-#: ../libpurple/account.c:1251
+#: ../libpurple/account.c:1293
 #, c-format
 msgid "Change password for %s"
 msgstr "%s jelszavának megváltoztatása"
 
-#: ../libpurple/account.c:1259
+#: ../libpurple/account.c:1301
 msgid "Please enter your current password and your new password."
-msgstr "Kérem adja meg a jelenlegi jelszavát és az új jelszót."
-
-#: ../libpurple/account.c:1290
+msgstr "Adja meg a jelenlegi jelszavát és az új jelszót."
+
+#: ../libpurple/account.c:1332
 #, c-format
 msgid "Change user information for %s"
 msgstr "Felhasználó-információk megváltoztatása %s számára"
 
-#: ../libpurple/account.c:1293 ../libpurple/protocols/toc/toc.c:1670
+#: ../libpurple/account.c:1335 ../libpurple/protocols/toc/toc.c:1670
 msgid "Set User Info"
 msgstr "Felhasználói adatok beállítása"
 
-#: ../libpurple/account.c:1764 ../libpurple/protocols/gg/gg.c:1017
+#: ../libpurple/account.c:1806 ../libpurple/protocols/gg/gg.c:1028
 #: ../libpurple/protocols/jabber/buddy.c:782
-#: ../libpurple/protocols/jabber/buddy.c:2027
-#: ../libpurple/protocols/jabber/buddy.c:2044
-#: ../libpurple/protocols/novell/novell.c:2831
+#: ../libpurple/protocols/jabber/buddy.c:2030
+#: ../libpurple/protocols/jabber/buddy.c:2047
+#: ../libpurple/protocols/novell/novell.c:2836
 #: ../libpurple/protocols/qq/qq.c:232 ../pidgin/gtkft.c:160
 msgid "Unknown"
 msgstr "Ismeretlen"
 
-#: ../libpurple/blist.c:521 ../libpurple/blist.c:1320
-#: ../libpurple/blist.c:1552 ../libpurple/protocols/jabber/roster.c:69
-#: ../libpurple/protocols/myspace/myspace.c:3244 ../pidgin/gtkblist.c:5373
+#: ../libpurple/blist.c:521 ../libpurple/blist.c:1321
+#: ../libpurple/blist.c:1531 ../libpurple/protocols/jabber/roster.c:69
+#: ../libpurple/protocols/myspace/myspace.c:3250 ../pidgin/gtkblist.c:5737
 #: ../pidgin/plugins/gevolution/gevo-util.c:67
 #: ../pidgin/plugins/gevolution/gevolution.c:96
 msgid "Buddies"
@@ -2019,59 +2072,59 @@
 msgid "buddy list"
 msgstr "partnerlista"
 
-#: ../libpurple/certificate.c:545
+#: ../libpurple/certificate.c:558
 msgid "(DOES NOT MATCH)"
-msgstr ""
+msgstr "(NEM EGYEZIK)"
 
 #. Make messages
-#: ../libpurple/certificate.c:549
+#: ../libpurple/certificate.c:562
 #, c-format
 msgid "%s has presented the following certificate for just-this-once use:"
-msgstr ""
-
-#: ../libpurple/certificate.c:550
+msgstr "%s a következő tanúsítványt mutatta be erre az egy alkalomra:"
+
+#: ../libpurple/certificate.c:563
 #, c-format
 msgid ""
 "Common name: %s %s\n"
 "Fingerprint (SHA1): %s"
 msgstr ""
+"Közönséges név: %s %s\n"
+"Ujjlenyomat (SHA1): %s"
 
 #. TODO: Find what the handle ought to be
-#: ../libpurple/certificate.c:555
+#: ../libpurple/certificate.c:568
 msgid "Single-use Certificate Verification"
-msgstr ""
+msgstr "Egyszer használatos tanúsítvány ellenőrzése"
 
 #. Scheme name
 #. Pool name
-#: ../libpurple/certificate.c:872
-#, fuzzy
+#: ../libpurple/certificate.c:886
 msgid "Certificate Authorities"
-msgstr "Tanúsítványok"
+msgstr "Hitelesítésszolgáltatók"
 
 #. Scheme name
 #. Pool name
-#: ../libpurple/certificate.c:1040
+#: ../libpurple/certificate.c:1054
 msgid "SSL Peers Cache"
-msgstr ""
+msgstr "SSL partner-gyorsítótár"
 
 #. Make messages
-#: ../libpurple/certificate.c:1171
-#, fuzzy, c-format
+#: ../libpurple/certificate.c:1185
+#, c-format
 msgid "Accept certificate for %s?"
-msgstr "Elfogadja a meghívást a csevegésre?"
+msgstr "Elfogadja a következő tanúsítványát: %s?"
 
 #. TODO: Find what the handle ought to be
-#: ../libpurple/certificate.c:1177
+#: ../libpurple/certificate.c:1191
 msgid "SSL Certificate Verification"
-msgstr ""
+msgstr "SSL tanúsítvány-ellenőrzés"
 
 #. Number of actions
-#: ../libpurple/certificate.c:1186
-#, fuzzy
+#: ../libpurple/certificate.c:1201
 msgid "Accept"
-msgstr "Elfog_adás"
-
-#: ../libpurple/certificate.c:1187 ../libpurple/protocols/qq/buddy_opt.c:214
+msgstr "Elfogadás"
+
+#: ../libpurple/certificate.c:1202 ../libpurple/protocols/qq/buddy_opt.c:214
 #: ../libpurple/protocols/qq/group_im.c:144
 #: ../libpurple/protocols/qq/group_opt.c:127
 #: ../libpurple/protocols/qq/sys_msg.c:90
@@ -2079,78 +2132,84 @@
 msgid "Reject"
 msgstr "Visszautasítás"
 
-#: ../libpurple/certificate.c:1188
-#, fuzzy
+#: ../libpurple/certificate.c:1203
 msgid "_View Certificate..."
-msgstr "Tanúsítványok"
+msgstr "_Tanúsítvány megjelenítése..."
 
 #. 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
-#: ../libpurple/certificate.c:1288
+#: ../libpurple/certificate.c:1303
 #, c-format
 msgid ""
 "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."
 msgstr ""
+"A(z) \"%s\" által bemutatott tanúsítvány a következőtől származónak mondja "
+"magát: \"%s\". Ez azt jelentheti, hogy a kívánttól eltérő szolgáltatáshoz "
+"kapcsolódik."
 
 #. Prompt the user to authenticate the certificate
 #. vrq will be completed by user_auth
-#: ../libpurple/certificate.c:1313
+#: ../libpurple/certificate.c:1328
 #, c-format
 msgid ""
 "The certificate presented by \"%s\" is self-signed. It cannot be "
 "automatically checked."
 msgstr ""
-
-#: ../libpurple/certificate.c:1331
+"A(z) \"%s\" által bemutatott tanúsítvány saját aláírású. Nem ellenőrizhető "
+"automatikusan."
+
+#: ../libpurple/certificate.c:1346
 #, c-format
 msgid "The certificate chain presented for %s is not valid."
-msgstr ""
+msgstr "A következőhöz bemutatott tanúsítványlánc nem érvényes: %s."
 
 #. TODO: Make this error either block the ensuing SSL
 #. connection error until the user dismisses this one, or
 #. stifle it.
 #. TODO: Probably wrong.
 #. TODO: Probably wrong
-#: ../libpurple/certificate.c:1339 ../libpurple/certificate.c:1416
-#, fuzzy
+#: ../libpurple/certificate.c:1354 ../libpurple/certificate.c:1423
 msgid "SSL Certificate Error"
-msgstr "Tanúsítványok"
-
-#: ../libpurple/certificate.c:1340
-#, fuzzy
+msgstr "SSL tanúsítványhiba"
+
+#: ../libpurple/certificate.c:1355
 msgid "Invalid certificate chain"
-msgstr "Érvénytelen cím"
+msgstr "Érvénytelen tanúsítványlánc"
 
 #. vrq will be completed by user_auth
-#: ../libpurple/certificate.c:1360
+#: ../libpurple/certificate.c:1375
 msgid ""
 "You have no database of root certificates, so this certificate cannot be "
 "validated."
 msgstr ""
+"A gyökértanúsítványok adatbázisa nem érhető el, így ez a tanúsítvány nem "
+"ellenőrizhető."
 
 #. vrq will be completed by user_auth
-#: ../libpurple/certificate.c:1382
-msgid ""
-"The root certificate this one claims to be issued by is unknown to Pidgin."
-msgstr ""
-
-#: ../libpurple/certificate.c:1408
+#: ../libpurple/certificate.c:1398
+msgid "The root certificate this one claims to be issued by is unknown to Pidgin."
+msgstr "A tanúsítványt kiadó gyökértanúsítványt a Pidgin nem ismeri."
+
+#: ../libpurple/certificate.c:1415
 #, c-format
 msgid ""
 "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."
 msgstr ""
-
-#: ../libpurple/certificate.c:1417
+"A(z) %s által bemutatott tanúsítványlánc nem rendelkezik érvényes digitális "
+"aláírással attól a hitelesítésszolgáltatótól, amely aláírásával állítása "
+"szerint rendelkezik."
+
+#: ../libpurple/certificate.c:1424
 msgid "Invalid certificate authority signature"
-msgstr ""
+msgstr "A hitelesítésszolgáltató aláírása érvénytelen"
 
 #. Make messages
-#: ../libpurple/certificate.c:1881
+#: ../libpurple/certificate.c:1888
 #, c-format
 msgid ""
 "Common name: %s\n"
@@ -2160,21 +2219,25 @@
 "Activation date: %s\n"
 "Expiration date: %s\n"
 msgstr ""
+"Közönséges név: %s\n"
+"\n"
+"Ujjlenyomat (SHA1): %s\n"
+"\n"
+"Aktiválás dátuma: %s\n"
+"Lejárat dátuma: %s\n"
 
 #. TODO: Find what the handle ought to be
-#: ../libpurple/certificate.c:1890
-#, fuzzy
+#: ../libpurple/certificate.c:1897
 msgid "Certificate Information"
-msgstr "Kiszolgálóinformációk"
+msgstr "Tanúsítványinformációk"
 
 #: ../libpurple/connection.c:107
 msgid "Registration Error"
 msgstr "Regisztrációs hiba"
 
 #: ../libpurple/connection.c:180
-#, fuzzy
 msgid "Unregistration Error"
-msgstr "Regisztrációs hiba"
+msgstr "Regisztrációtörlési hiba"
 
 #: ../libpurple/connection.c:350
 #, c-format
@@ -2186,10 +2249,12 @@
 msgid "+++ %s signed off"
 msgstr "+++ %s kilépett"
 
-#: ../libpurple/connection.c:497 ../libpurple/plugin.c:282
-#: ../libpurple/protocols/jabber/buddy.c:2337
+#: ../libpurple/connection.c:497 ../libpurple/plugin.c:277
+#: ../libpurple/protocols/jabber/buddy.c:2350
 #: ../libpurple/protocols/msn/servconn.c:141
-#: ../libpurple/protocols/msn/session.c:322
+#: ../libpurple/protocols/msn/session.c:371
+#: ../libpurple/protocols/msnp9/servconn.c:139
+#: ../libpurple/protocols/msnp9/session.c:322
 msgid "Unknown error"
 msgstr "Ismeretlen hiba"
 
@@ -2264,7 +2329,7 @@
 msgid "Failed to get serv name: %s"
 msgstr "A szolgáltatásnév lekérése nem sikerült: %s"
 
-#: ../libpurple/dbus-server.h:85
+#: ../libpurple/dbus-server.h:84
 msgid "Purple's D-BUS server is not running for the reason listed below"
 msgstr "A Purple D-BUS kiszolgálója nem fut az alábbi okok miatt"
 
@@ -2280,7 +2345,7 @@
 msgid "Unable to send request to resolver process\n"
 msgstr "Nem küldhető üzenet a feloldó folyamatnak\n"
 
-#: ../libpurple/dnsquery.c:549 ../libpurple/dnsquery.c:697
+#: ../libpurple/dnsquery.c:549 ../libpurple/dnsquery.c:698
 #, c-format
 msgid ""
 "Error resolving %s:\n"
@@ -2289,8 +2354,8 @@
 "Hiba %s feloldásakor:\n"
 "%s"
 
-#: ../libpurple/dnsquery.c:552 ../libpurple/dnsquery.c:711
-#: ../libpurple/dnsquery.c:831
+#: ../libpurple/dnsquery.c:552 ../libpurple/dnsquery.c:712
+#: ../libpurple/dnsquery.c:830
 #, c-format
 msgid "Error resolving %s: %d"
 msgstr "Hiba %s feloldásakor: %d"
@@ -2309,12 +2374,12 @@
 msgid "EOF while reading from resolver process"
 msgstr "Fájl vége jel érkezett a feloldó folyamatból olvasás közben"
 
-#: ../libpurple/dnsquery.c:761
+#: ../libpurple/dnsquery.c:762
 #, c-format
 msgid "Thread creation failure: %s"
 msgstr "Szál-előállítási hiba: %s"
 
-#: ../libpurple/dnsquery.c:762
+#: ../libpurple/dnsquery.c:763
 msgid "Unknown reason"
 msgstr "Ismeretlen ok"
 
@@ -2470,8 +2535,7 @@
 
 #: ../libpurple/gconf/purple.schemas.in.h:6
 msgid "The command used to handle \"msnim\" URLs, if enabled."
-msgstr ""
-"Az \"msnim\" URL címek kezelésére használt parancs, ha engedélyezve van."
+msgstr "Az \"msnim\" URL címek kezelésére használt parancs, ha engedélyezve van."
 
 #: ../libpurple/gconf/purple.schemas.in.h:7
 msgid "The command used to handle \"sip\" URLs, if enabled."
@@ -2479,13 +2543,11 @@
 
 #: ../libpurple/gconf/purple.schemas.in.h:8
 msgid "The command used to handle \"xmpp\" URLs, if enabled."
-msgstr ""
-"Az \"xmpp\" URL címek kezelésére használt parancs, ha engedélyezve van."
+msgstr "Az \"xmpp\" URL címek kezelésére használt parancs, ha engedélyezve van."
 
 #: ../libpurple/gconf/purple.schemas.in.h:9
 msgid "The command used to handle \"ymsgr\" URLs, if enabled."
-msgstr ""
-"Az \"ymsgr\" URL címek kezelésére használt parancs, ha engedélyezve van."
+msgstr "Az \"ymsgr\" URL címek kezelésére használt parancs, ha engedélyezve van."
 
 #: ../libpurple/gconf/purple.schemas.in.h:10
 msgid "The handler for \"aim\" URLs"
@@ -2625,8 +2687,7 @@
 
 #: ../libpurple/log.c:183
 msgid "<b><font color=\"red\">The logger has no read function</font></b>"
-msgstr ""
-"<b><font color=\"red\">A naplózónak nincsen olvasás funkciója</font></b>"
+msgstr "<b><font color=\"red\">A naplózónak nincsen olvasás funkciója</font></b>"
 
 #: ../libpurple/log.c:598
 msgid "HTML"
@@ -2680,59 +2741,54 @@
 msgid "(%s) %s <AUTO-REPLY>: %s\n"
 msgstr "(%s) %s <AUTOMATIKUS VÁLASZ>: %s\n"
 
-#: ../libpurple/plugin.c:365
+#: ../libpurple/plugin.c:360
 #, c-format
 msgid "You are using %s, but this plugin requires %s."
 msgstr "A(z) %s programot használja, de a bővítmény a következőt igényli: %s."
 
-#: ../libpurple/plugin.c:380
+#: ../libpurple/plugin.c:375
 #, c-format
 msgid "This plugin has not defined an ID."
 msgstr "A bővítmény nem adott meg azonosítót."
 
-#: ../libpurple/plugin.c:448
+#: ../libpurple/plugin.c:443
 #, c-format
 msgid "Plugin magic mismatch %d (need %d)"
 msgstr "A bővítmény típusa nem egyezik: %d (szükséges: %d"
 
-#: ../libpurple/plugin.c:465
+#: ../libpurple/plugin.c:460
 #, c-format
 msgid "ABI version mismatch %d.%d.x (need %d.%d.x)"
 msgstr "Az ABI verziója nem egyezik: %d.%d.x (szükséges: %d.%d.x)"
 
-#: ../libpurple/plugin.c:482
+#: ../libpurple/plugin.c:477
 msgid "Plugin does not implement all required functions"
 msgstr "A bővítmény nem valósítja meg az összes kívánt függvényt"
 
-#: ../libpurple/plugin.c:547
+#: ../libpurple/plugin.c:542
 #, c-format
 msgid ""
 "The required plugin %s was not found. Please install this plugin and try "
 "again."
-msgstr ""
-"A szükséges %s bővítmény nem található. Kérem telepítse, majd próbálja újra."
-
-#: ../libpurple/plugin.c:552
+msgstr "A szükséges %s bővítmény nem található. Kérem telepítse, majd próbálja újra."
+
+#: ../libpurple/plugin.c:547
 msgid "Unable to load the plugin"
 msgstr "A bővítmény nem tölthető be"
 
-#: ../libpurple/plugin.c:574
+#: ../libpurple/plugin.c:569
 #, c-format
 msgid "The required plugin %s was unable to load."
 msgstr "A szükséges %s bővítményt nem sikerült betölteni."
 
-#: ../libpurple/plugin.c:578
+#: ../libpurple/plugin.c:573
 msgid "Unable to load your plugin."
 msgstr "A bővítménye nem tölthető be."
 
-#: ../libpurple/plugin.c:677
-#, c-format
-msgid "The dependent plugin %s failed to unload."
-msgstr "A függő %s bővítmény eltávolítása meghiúsult."
-
-#: ../libpurple/plugin.c:681
-msgid "There were errors unloading the plugin."
-msgstr "Hiba történt a bővítmény eltávolítása közben."
+#: ../libpurple/plugin.c:663
+#, c-format
+msgid "%s requires %s, but it failed to unload."
+msgstr "%s megköveteli %s jelenlétét, de az eltávolítása meghiúsult."
 
 #: ../libpurple/plugins/autoaccept.c:23
 msgid "Autoaccept"
@@ -2768,14 +2824,15 @@
 
 #: ../libpurple/plugins/autoaccept.c:165 ../libpurple/plugins/idle.c:170
 #: ../libpurple/plugins/idle.c:204 ../libpurple/plugins/idle.c:230
-#: ../libpurple/protocols/oscar/oscar.c:1453
-#: ../libpurple/protocols/oscar/oscar.c:2233
-#: ../libpurple/protocols/oscar/oscar.c:2282
-#: ../libpurple/protocols/oscar/oscar.c:5886
+#: ../libpurple/protocols/oscar/oscar.c:1456
+#: ../libpurple/protocols/oscar/oscar.c:2248
+#: ../libpurple/protocols/oscar/oscar.c:2297
 #: ../libpurple/protocols/oscar/oscar.c:5941
-#: ../libpurple/protocols/oscar/oscar.c:6167
-#: ../libpurple/protocols/oscar/oscar.c:6237 ../libpurple/request.h:1388
-#: ../libpurple/request.h:1398
+#: ../libpurple/protocols/oscar/oscar.c:5996
+#: ../libpurple/protocols/oscar/oscar.c:6222
+#: ../libpurple/protocols/oscar/oscar.c:6292 ../libpurple/request.h:1828
+#: ../libpurple/request.h:1841 ../libpurple/request.h:1854
+#: ../libpurple/request.h:1867 ../pidgin/gtkblist.c:530
 msgid "_Cancel"
 msgstr "Mé_gsem"
 
@@ -2806,8 +2863,7 @@
 
 #: ../libpurple/plugins/autoaccept.c:220
 msgid "Automatically reject from users not in buddy list"
-msgstr ""
-"Automatikus visszautasítás a partnerlistán nem szereplő felhasználóktól"
+msgstr "Automatikus visszautasítás a partnerlistán nem szereplő felhasználóktól"
 
 #: ../libpurple/plugins/autoaccept.c:224
 msgid ""
@@ -2818,8 +2874,10 @@
 "befejeződésekor\n"
 "(csak ha nem társalog a küldővel)"
 
-#: ../libpurple/plugins/buddynote.c:46 ../libpurple/protocols/msn/msn.c:1660
-#: ../libpurple/protocols/msn/msn.c:1690
+#: ../libpurple/plugins/buddynote.c:46 ../libpurple/protocols/msn/msn.c:1806
+#: ../libpurple/protocols/msn/msn.c:1836
+#: ../libpurple/protocols/msnp9/msn.c:1658
+#: ../libpurple/protocols/msnp9/msn.c:1688
 msgid "Notes"
 msgstr "Megjegyzések"
 
@@ -3046,111 +3104,118 @@
 #. * offset is way off.  The user should never really see it, but
 #. * it's here just in case.  The parens are to make it clear it's
 #. * not a real timezone.
-#: ../libpurple/plugins/log_reader.c:493
+#: ../libpurple/plugins/log_reader.c:499
 msgid "(UTC)"
 msgstr "(UTC)"
 
-#: ../libpurple/plugins/log_reader.c:1577
+#: ../libpurple/plugins/log_reader.c:1554
 msgid "User is offline."
 msgstr "A felhasználó nem érhető el."
 
-#: ../libpurple/plugins/log_reader.c:1583
+#: ../libpurple/plugins/log_reader.c:1560
 msgid "Auto-response sent:"
 msgstr "Automatikus válasz elküldve:"
 
-#: ../libpurple/plugins/log_reader.c:1593
-#: ../libpurple/plugins/log_reader.c:1596
+#: ../libpurple/plugins/log_reader.c:1570
+#: ../libpurple/plugins/log_reader.c:1573
 #: ../libpurple/plugins/statenotify.c:80
 #, c-format
 msgid "%s has signed off."
 msgstr "%s kilépett."
 
-#: ../libpurple/plugins/log_reader.c:1610
+#: ../libpurple/plugins/log_reader.c:1587
 msgid "One or more messages may have been undeliverable."
 msgstr "Lehet, hogy néhány üzenet nem kézbesíthető."
 
-#: ../libpurple/plugins/log_reader.c:1620
+#: ../libpurple/plugins/log_reader.c:1597
 msgid "You were disconnected from the server."
 msgstr "Megszakadt a kapcsolat a kiszolgálóval."
 
-#: ../libpurple/plugins/log_reader.c:1628
+#: ../libpurple/plugins/log_reader.c:1605
 msgid ""
 "You are currently disconnected. Messages will not be received unless you are "
 "logged in."
-msgstr ""
-"Jelenleg nincs csatlakozva. Nem fogadhat üzeneteket, amíg nem jelentkezik be."
-
-#: ../libpurple/plugins/log_reader.c:1643
+msgstr "Jelenleg nincs csatlakozva. Nem fogadhat üzeneteket, amíg nem jelentkezik be."
+
+#: ../libpurple/plugins/log_reader.c:1620
 msgid "Message could not be sent because the maximum length was exceeded."
 msgstr "Az üzenet nem küldhető el, mivel a maximális hossz el lett érve."
 
-#: ../libpurple/plugins/log_reader.c:1648
+#: ../libpurple/plugins/log_reader.c:1625
 msgid "Message could not be sent."
 msgstr "Az üzenet nem küldhető el."
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2349
-#: ../libpurple/plugins/log_reader.c:2472
+#: ../libpurple/plugins/log_reader.c:2699
+#: ../libpurple/plugins/log_reader.c:2835
 msgid "Adium"
 msgstr "Adium"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2362
-#: ../libpurple/plugins/log_reader.c:2477
+#: ../libpurple/plugins/log_reader.c:2712
+#: ../libpurple/plugins/log_reader.c:2840
 msgid "Fire"
 msgstr "Tűz"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2374
-#: ../libpurple/plugins/log_reader.c:2481
+#: ../libpurple/plugins/log_reader.c:2724
+#: ../libpurple/plugins/log_reader.c:2844
 msgid "Messenger Plus!"
 msgstr "Messenger Plus!"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2388
-#: ../libpurple/plugins/log_reader.c:2486
+#: ../libpurple/plugins/log_reader.c:2738
+#: ../libpurple/plugins/log_reader.c:2849
 msgid "QIP"
 msgstr "QIP"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2400
-#: ../libpurple/plugins/log_reader.c:2490
+#: ../libpurple/plugins/log_reader.c:2750
+#: ../libpurple/plugins/log_reader.c:2853
 msgid "MSN Messenger"
 msgstr "MSN Messenger"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2412
-#: ../libpurple/plugins/log_reader.c:2494
+#: ../libpurple/plugins/log_reader.c:2762
+#: ../libpurple/plugins/log_reader.c:2857
 msgid "Trillian"
 msgstr "Trillian"
 
+#. The names of IM clients are marked for translation at the request of
+#. translators who wanted to transliterate them.  Many translators
+#. choose to leave them alone.  Choose what's best for your language.
+#: ../libpurple/plugins/log_reader.c:2774
+#: ../libpurple/plugins/log_reader.c:2861
+msgid "aMSN"
+msgstr "aMSN"
+
 #. Add general preferences.
-#: ../libpurple/plugins/log_reader.c:2454
+#: ../libpurple/plugins/log_reader.c:2817
 msgid "General Log Reading Configuration"
 msgstr "Általános naplóolvasás beállítása"
 
-#: ../libpurple/plugins/log_reader.c:2458
+#: ../libpurple/plugins/log_reader.c:2821
 msgid "Fast size calculations"
 msgstr "Gyors méretszámítások"
 
-#: ../libpurple/plugins/log_reader.c:2462
+#: ../libpurple/plugins/log_reader.c:2825
 msgid "Use name heuristics"
 msgstr "Névheurisztika használata"
 
 #. Add Log Directory preferences.
-#: ../libpurple/plugins/log_reader.c:2468
+#: ../libpurple/plugins/log_reader.c:2831
 msgid "Log Directory"
 msgstr "Naplókönyvtár"
 
@@ -3160,19 +3225,19 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/log_reader.c:2523
+#: ../libpurple/plugins/log_reader.c:2890
 msgid "Log Reader"
 msgstr "Naplómegjelenítő"
 
 #. *< name
 #. *< version
 #. * summary
-#: ../libpurple/plugins/log_reader.c:2527
+#: ../libpurple/plugins/log_reader.c:2894
 msgid "Includes other IM clients' logs in the log viewer."
 msgstr "Felveszi más azonnaliüzenő-kliensek naplóit a naplómegjelenítőbe."
 
 #. * description
-#: ../libpurple/plugins/log_reader.c:2531
+#: ../libpurple/plugins/log_reader.c:2898
 msgid ""
 "When viewing logs, this plugin will include logs from other IM clients. "
 "Currently, this includes Adium, MSN Messenger, and Trillian.\n"
@@ -3244,10 +3309,7 @@
 msgid ""
 "\"%s\" is currently offline. Do you want to save the rest of the messages in "
 "a pounce and automatically send them when \"%s\" logs back in?"
-msgstr ""
-"\"%s\" jelenleg nem érhető el. Kívánja menteni a további üzeneteket "
-"figyelmeztetésként, majd elküldeni azokat, amikor \"%s\" legközelebb "
-"bejelentkezik?"
+msgstr "\"%s\" jelenleg nem érhető el. Kívánja a további üzeneteket figyelmeztetésként menteni, majd elküldeni \"%s\" következő bejelentkezésekor?"
 
 #: ../libpurple/plugins/offlinemsg.c:160
 msgid "Offline Message"
@@ -3260,26 +3322,32 @@
 "törölheti"
 
 #: ../libpurple/plugins/offlinemsg.c:165
-#: ../libpurple/protocols/msn/dialog.c:133
-#: ../libpurple/protocols/msn/msn.c:550 ../libpurple/protocols/msn/msn.c:560
-#: ../libpurple/protocols/novell/novell.c:1917
+#: ../libpurple/protocols/msn/dialog.c:141
+#: ../libpurple/protocols/msn/msn.c:665
+#: ../libpurple/protocols/msnp9/dialog.c:133
+#: ../libpurple/protocols/msnp9/msn.c:550
+#: ../libpurple/protocols/msnp9/msn.c:564
+#: ../libpurple/protocols/novell/novell.c:1919
 #: ../libpurple/protocols/silc/buddy.c:317
-#: ../libpurple/protocols/silc/pk.c:113 ../libpurple/protocols/silc/wb.c:304
+#: ../libpurple/protocols/silc/pk.c:113 ../libpurple/protocols/silc/wb.c:308
 #: ../libpurple/protocols/silc10/buddy.c:314
 #: ../libpurple/protocols/silc10/pk.c:119
-#: ../libpurple/protocols/silc10/wb.c:304 ../pidgin/gtkrequest.c:268
+#: ../libpurple/protocols/silc10/wb.c:307 ../pidgin/gtkrequest.c:318
 msgid "Yes"
 msgstr "Igen"
 
 #: ../libpurple/plugins/offlinemsg.c:166
-#: ../libpurple/protocols/msn/dialog.c:134
-#: ../libpurple/protocols/msn/msn.c:550 ../libpurple/protocols/msn/msn.c:560
-#: ../libpurple/protocols/novell/novell.c:1918
+#: ../libpurple/protocols/msn/dialog.c:142
+#: ../libpurple/protocols/msn/msn.c:665
+#: ../libpurple/protocols/msnp9/dialog.c:134
+#: ../libpurple/protocols/msnp9/msn.c:550
+#: ../libpurple/protocols/msnp9/msn.c:564
+#: ../libpurple/protocols/novell/novell.c:1920
 #: ../libpurple/protocols/silc/buddy.c:318
-#: ../libpurple/protocols/silc/pk.c:114 ../libpurple/protocols/silc/wb.c:305
+#: ../libpurple/protocols/silc/pk.c:114 ../libpurple/protocols/silc/wb.c:309
 #: ../libpurple/protocols/silc10/buddy.c:315
 #: ../libpurple/protocols/silc10/pk.c:120
-#: ../libpurple/protocols/silc10/wb.c:305 ../pidgin/gtkrequest.c:269
+#: ../libpurple/protocols/silc10/wb.c:308 ../pidgin/gtkrequest.c:319
 msgid "No"
 msgstr "Nem"
 
@@ -3351,7 +3419,7 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/signals-test.c:711
+#: ../libpurple/plugins/signals-test.c:739
 msgid "Signals Test"
 msgstr "Szignálok tesztelése"
 
@@ -3359,8 +3427,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/signals-test.c:714
-#: ../libpurple/plugins/signals-test.c:716
+#: ../libpurple/plugins/signals-test.c:742
+#: ../libpurple/plugins/signals-test.c:744
 msgid "Test to see that all signals are working properly."
 msgstr "Ellenőrzi, hogy minden szignál megfelelően működik-e."
 
@@ -3383,8 +3451,8 @@
 msgstr "Tesztek, hogy a legtöbb dolog működik-e."
 
 #. Scheme name
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:902
-#: ../libpurple/plugins/ssl/ssl-nss.c:725
+#: ../libpurple/plugins/ssl/ssl-gnutls.c:911
+#: ../libpurple/plugins/ssl/ssl-nss.c:731
 msgid "X.509 Certificates"
 msgstr "X.509 tanúsítványok"
 
@@ -3394,7 +3462,7 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:986
+#: ../libpurple/plugins/ssl/ssl-gnutls.c:995
 msgid "GNUTLS"
 msgstr "GNUTLS"
 
@@ -3402,8 +3470,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:989
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:991
+#: ../libpurple/plugins/ssl/ssl-gnutls.c:998
+#: ../libpurple/plugins/ssl/ssl-gnutls.c:1000
 msgid "Provides SSL support through GNUTLS."
 msgstr "SSL támogatást biztosít a GNUTLS-en keresztül."
 
@@ -3413,7 +3481,7 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/ssl/ssl-nss.c:810
+#: ../libpurple/plugins/ssl/ssl-nss.c:816
 msgid "NSS"
 msgstr "NSS"
 
@@ -3421,8 +3489,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/ssl/ssl-nss.c:813
-#: ../libpurple/plugins/ssl/ssl-nss.c:815
+#: ../libpurple/plugins/ssl/ssl-nss.c:819
+#: ../libpurple/plugins/ssl/ssl-nss.c:821
 msgid "Provides SSL support through Mozilla NSS."
 msgstr "SSL támogatást biztosít a Mozilla NSS-en keresztül."
 
@@ -3508,15 +3576,15 @@
 "Figyelmeztet egy társalgás ablakában amikor a partner távol van, inaktív, "
 "visszaérkezik vagy az inaktív állapota megszűnik."
 
-#: ../libpurple/plugins/tcl/tcl.c:421
+#: ../libpurple/plugins/tcl/tcl.c:423
 msgid "Tcl Plugin Loader"
 msgstr "Tcl bővítménybetöltő"
 
-#: ../libpurple/plugins/tcl/tcl.c:423 ../libpurple/plugins/tcl/tcl.c:424
+#: ../libpurple/plugins/tcl/tcl.c:425 ../libpurple/plugins/tcl/tcl.c:426
 msgid "Provides support for loading Tcl plugins"
 msgstr "Tcl bővítmények betöltését támogatja"
 
-#: ../libpurple/plugins/tcl/tcl.c:507
+#: ../libpurple/plugins/tcl/tcl.c:509
 msgid ""
 "Unable to detect ActiveTCL installation. If you wish to use TCL plugins, "
 "install ActiveTCL from http://www.activestate.com\n"
@@ -3524,52 +3592,60 @@
 "Az ActiveTCL telepítés nem észlelhető. Ha TCL bővítményeket kíván használni, "
 "akkor telepítse az ActiveTCL-t a http://www.activestate.com címről\n"
 
+#: ../libpurple/protocols/bonjour/bonjour.c:107
+msgid ""
+"The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://"
+"developer.pidgin.im/wiki/Using%20Pidgin#CanIusePidginforBonjourLink-"
+"LocalMessaging for more information."
+msgstr ""
+"Az Apple Bonjour For Windows eszközkészlet nem található, további "
+"információkat a http://developer.pidgin.im/wiki/Using%"
+"20Pidgin#CanIusePidginforBonjourLink-LocalMessaging oldalon találhat."
+
 #. Send a message about the connection error
-#: ../libpurple/protocols/bonjour/bonjour.c:112
+#: ../libpurple/protocols/bonjour/bonjour.c:124
 msgid "Unable to listen for incoming IM connections\n"
 msgstr "Nem lehetséges a bejövő azonnali üzenő kapcsolatokat figyelni\n"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:137
-msgid ""
-"Unable to establish connection with the local mDNS server.  Is it running?"
-msgstr ""
-"Nem hozható létre kapcsolat a helyi mDNS kiszolgálóval. Egyáltalán fut?"
+#: ../libpurple/protocols/bonjour/bonjour.c:149
+msgid "Unable to establish connection with the local mDNS server.  Is it running?"
+msgstr "Nem hozható létre kapcsolat a helyi mDNS kiszolgálóval. Egyáltalán fut?"
 
 #. Creating the options for the protocol
-#: ../libpurple/protocols/bonjour/bonjour.c:351
-#: ../libpurple/protocols/bonjour/bonjour.c:656
-#: ../libpurple/protocols/gg/gg.c:632
+#: ../libpurple/protocols/bonjour/bonjour.c:365
+#: ../libpurple/protocols/bonjour/bonjour.c:670
+#: ../libpurple/protocols/gg/gg.c:642
 #: ../libpurple/protocols/jabber/jabber.c:942
 msgid "First name"
 msgstr "Utónév"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:353
-#: ../libpurple/protocols/bonjour/bonjour.c:659
-#: ../libpurple/protocols/gg/gg.c:627
+#: ../libpurple/protocols/bonjour/bonjour.c:367
+#: ../libpurple/protocols/bonjour/bonjour.c:673
+#: ../libpurple/protocols/gg/gg.c:637
 #: ../libpurple/protocols/jabber/jabber.c:947
 msgid "Last name"
 msgstr "Vezetéknév"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:357
+#: ../libpurple/protocols/bonjour/bonjour.c:371
 #: ../libpurple/protocols/jabber/buddy.c:295
 #: ../libpurple/protocols/jabber/buddy.c:1325
 #: ../libpurple/protocols/jabber/buddy.c:1335
-#: ../libpurple/protocols/jabber/buddy.c:2216
+#: ../libpurple/protocols/jabber/buddy.c:2219
 #: ../libpurple/protocols/silc/ops.c:1041
-#: ../libpurple/protocols/silc/util.c:555
+#: ../libpurple/protocols/silc/util.c:559
 #: ../libpurple/protocols/silc10/ops.c:1075
 #: ../libpurple/protocols/silc10/util.c:551
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1061
 msgid "E-Mail"
 msgstr "E-mail"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:360
-#: ../libpurple/protocols/bonjour/bonjour.c:665
+#: ../libpurple/protocols/bonjour/bonjour.c:374
+#: ../libpurple/protocols/bonjour/bonjour.c:679
 msgid "AIM Account"
 msgstr "AIM fiók"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:363
-#: ../libpurple/protocols/bonjour/bonjour.c:668
+#: ../libpurple/protocols/bonjour/bonjour.c:377
+#: ../libpurple/protocols/bonjour/bonjour.c:682
 msgid "XMPP Account"
 msgstr "XMPP fiók"
 
@@ -3583,20 +3659,20 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/bonjour/bonjour.c:467
-#: ../libpurple/protocols/bonjour/bonjour.c:469
+#: ../libpurple/protocols/bonjour/bonjour.c:481
+#: ../libpurple/protocols/bonjour/bonjour.c:483
 msgid "Bonjour Protocol Plugin"
 msgstr "Bonjour protokollbővítmény"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:610
+#: ../libpurple/protocols/bonjour/bonjour.c:624
 msgid "Purple Person"
 msgstr "Purple személy"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:662
-#: ../libpurple/protocols/gg/gg.c:477
+#: ../libpurple/protocols/bonjour/bonjour.c:676
+#: ../libpurple/protocols/gg/gg.c:487
 #: ../libpurple/protocols/jabber/jabber.c:932
-#: ../libpurple/protocols/silc/silc.c:770
-#: ../libpurple/protocols/silc/silc.c:1011
+#: ../libpurple/protocols/silc/silc.c:901
+#: ../libpurple/protocols/silc/silc.c:1142
 #: ../libpurple/protocols/silc10/silc.c:681
 #: ../libpurple/protocols/silc10/silc.c:922
 msgid "E-mail"
@@ -3606,38 +3682,38 @@
 msgid "Bonjour"
 msgstr "Bonjour"
 
-#: ../libpurple/protocols/bonjour/jabber.c:380
+#: ../libpurple/protocols/bonjour/jabber.c:381
 #, c-format
 msgid "%s has closed the conversation."
 msgstr "%s bezárta a társalgást."
 
-#: ../libpurple/protocols/bonjour/jabber.c:437
-#: ../libpurple/protocols/bonjour/jabber.c:660
-#: ../libpurple/protocols/bonjour/jabber.c:678
+#: ../libpurple/protocols/bonjour/jabber.c:439
+#: ../libpurple/protocols/bonjour/jabber.c:664
+#: ../libpurple/protocols/bonjour/jabber.c:682
 msgid "Unable to send the message, the conversation couldn't be started."
 msgstr "Nem küldhető el az üzenet, a társalgás nem kezdhető el."
 
-#: ../libpurple/protocols/bonjour/jabber.c:583
+#: ../libpurple/protocols/bonjour/jabber.c:587
 msgid "Cannot open socket"
 msgstr "Nem nyitható meg a foglalat"
 
-#: ../libpurple/protocols/bonjour/jabber.c:591
+#: ../libpurple/protocols/bonjour/jabber.c:595
 msgid "Error setting socket options"
 msgstr "Hiba a foglalat tulajdonságainak beállításakor"
 
-#: ../libpurple/protocols/bonjour/jabber.c:615
+#: ../libpurple/protocols/bonjour/jabber.c:619
 msgid "Could not bind socket to port"
 msgstr "Nem köthető a foglalat a porthoz"
 
-#: ../libpurple/protocols/bonjour/jabber.c:623
+#: ../libpurple/protocols/bonjour/jabber.c:627
 msgid "Could not listen on socket"
 msgstr "Nem lehet figyelni a foglalatot"
 
-#: ../libpurple/protocols/gg/gg.c:76 ../libpurple/proxy.c:1829
+#: ../libpurple/protocols/gg/gg.c:76 ../libpurple/proxy.c:1845
 msgid "Invalid proxy settings"
 msgstr "Érvénytelen proxybeállítások"
 
-#: ../libpurple/protocols/gg/gg.c:77 ../libpurple/proxy.c:1829
+#: ../libpurple/protocols/gg/gg.c:77 ../libpurple/proxy.c:1845
 msgid ""
 "Either the host name or port number specified for your given proxy type is "
 "invalid."
@@ -3655,7 +3731,7 @@
 msgid "Unable to fetch the token.\n"
 msgstr "Nem tölthető le a jelsor.\n"
 
-#: ../libpurple/protocols/gg/gg.c:269 ../libpurple/protocols/gg/gg.c:288
+#: ../libpurple/protocols/gg/gg.c:269 ../libpurple/protocols/gg/gg.c:294
 msgid "Save Buddylist..."
 msgstr "Partnerlista mentése..."
 
@@ -3667,89 +3743,95 @@
 msgid "Couldn't open file"
 msgstr "A fájl nem nyitható meg"
 
-#: ../libpurple/protocols/gg/gg.c:289
+#: ../libpurple/protocols/gg/gg.c:287
+#, c-format
+msgid "Couldn't write buddylist to %s"
+msgstr "Nem írható a partnerlista a következőre: %s"
+
+#: ../libpurple/protocols/gg/gg.c:295
 msgid "Buddylist saved successfully!"
 msgstr "A partnerlista mentése sikeres!"
 
-#: ../libpurple/protocols/gg/gg.c:307 ../libpurple/protocols/gg/gg.c:308
+#: ../libpurple/protocols/gg/gg.c:317 ../libpurple/protocols/gg/gg.c:318
 msgid "Couldn't load buddylist"
 msgstr "Nem tölthető be a partnerlista"
 
-#: ../libpurple/protocols/gg/gg.c:324
+#: ../libpurple/protocols/gg/gg.c:334
 msgid "Load Buddylist..."
 msgstr "Partnerlista betöltése..."
 
-#: ../libpurple/protocols/gg/gg.c:325
+#: ../libpurple/protocols/gg/gg.c:335
 msgid "Buddylist loaded successfully!"
 msgstr "A partnerlista betöltése sikeres!"
 
-#: ../libpurple/protocols/gg/gg.c:336
+#: ../libpurple/protocols/gg/gg.c:346
 msgid "Save buddylist..."
 msgstr "Partnerlista mentése..."
 
-#: ../libpurple/protocols/gg/gg.c:384
+#: ../libpurple/protocols/gg/gg.c:394
 msgid "Fill in the registration fields."
 msgstr "Töltse ki a regisztrációs mezőket."
 
-#: ../libpurple/protocols/gg/gg.c:389
+#: ../libpurple/protocols/gg/gg.c:399
 msgid "Passwords do not match."
 msgstr "A jelszavak nem egyeznek."
 
-#: ../libpurple/protocols/gg/gg.c:398
+#: ../libpurple/protocols/gg/gg.c:408
 msgid "Unable to register new account. Error occurred.\n"
 msgstr "Nem regisztrálható új fiók. Hiba történt.\n"
 
-#: ../libpurple/protocols/gg/gg.c:411
+#: ../libpurple/protocols/gg/gg.c:421
 msgid "New Gadu-Gadu Account Registered"
 msgstr "Az új Gadu-Gadu fiók regisztrálva"
 
-#: ../libpurple/protocols/gg/gg.c:412
+#: ../libpurple/protocols/gg/gg.c:422
 msgid "Registration completed successfully!"
 msgstr "A regisztráció sikeresen befejeződött!"
 
-#: ../libpurple/protocols/gg/gg.c:482 ../libpurple/protocols/gg/gg.c:775
+#: ../libpurple/protocols/gg/gg.c:492 ../libpurple/protocols/gg/gg.c:785
 #: ../libpurple/protocols/jabber/jabber.c:913
 #: ../libpurple/protocols/jabber/jabber.c:916
-#: ../libpurple/protocols/jabber/jabber.c:1722
+#: ../libpurple/protocols/jabber/jabber.c:1700
 msgid "Password"
 msgstr "Jelszó"
 
-#: ../libpurple/protocols/gg/gg.c:487 ../libpurple/protocols/gg/gg.c:780
+#: ../libpurple/protocols/gg/gg.c:497 ../libpurple/protocols/gg/gg.c:790
 msgid "Password (retype)"
 msgstr "Jelszó (megerősítés)"
 
-#: ../libpurple/protocols/gg/gg.c:492 ../libpurple/protocols/gg/gg.c:785
+#: ../libpurple/protocols/gg/gg.c:502 ../libpurple/protocols/gg/gg.c:795
 msgid "Enter current token"
 msgstr "Adja meg az aktuális jelsort"
 
-#: ../libpurple/protocols/gg/gg.c:498 ../libpurple/protocols/gg/gg.c:791
+#: ../libpurple/protocols/gg/gg.c:508 ../libpurple/protocols/gg/gg.c:801
 msgid "Current token"
 msgstr "Aktuális jelsor"
 
-#: ../libpurple/protocols/gg/gg.c:502 ../libpurple/protocols/gg/gg.c:503
+#: ../libpurple/protocols/gg/gg.c:512 ../libpurple/protocols/gg/gg.c:513
 msgid "Register New Gadu-Gadu Account"
 msgstr "Új Gadu-Gadu fiók regisztrálása"
 
-#: ../libpurple/protocols/gg/gg.c:504
+#: ../libpurple/protocols/gg/gg.c:514
 msgid "Please, fill in the following fields"
 msgstr "Töltse ki az alábbi mezőket"
 
-#: ../libpurple/protocols/gg/gg.c:642 ../libpurple/protocols/gg/gg.c:1054
-#: ../libpurple/protocols/gg/gg.c:1126
+#: ../libpurple/protocols/gg/gg.c:652 ../libpurple/protocols/gg/gg.c:1065
+#: ../libpurple/protocols/gg/gg.c:1137
 #: ../libpurple/protocols/jabber/jabber.c:957
-#: ../libpurple/protocols/oscar/oscar.c:3789
-#: ../libpurple/protocols/oscar/oscar.c:3802
+#: ../libpurple/protocols/oscar/oscar.c:3804
+#: ../libpurple/protocols/oscar/oscar.c:3817
 #: ../libpurple/protocols/qq/buddy_info.c:49
 msgid "City"
 msgstr "Város"
 
-#: ../libpurple/protocols/gg/gg.c:647
+#: ../libpurple/protocols/gg/gg.c:657
 msgid "Year of birth"
 msgstr "Születési év"
 
-#: ../libpurple/protocols/gg/gg.c:650 ../libpurple/protocols/msn/msn.c:1589
-#: ../libpurple/protocols/myspace/user.c:115
-#: ../libpurple/protocols/oscar/oscar.c:3732
+#: ../libpurple/protocols/gg/gg.c:660 ../libpurple/protocols/msn/msn.c:1735
+#: ../libpurple/protocols/msnp9/msn.c:1587
+#: ../libpurple/protocols/myspace/user.c:119
+#: ../libpurple/protocols/oscar/oscar.c:3747
 #: ../libpurple/protocols/qq/buddy_info.c:46
 #: ../libpurple/protocols/qq/qq.c:226 ../libpurple/protocols/qq/qq.c:229
 #: ../libpurple/protocols/qq/qq.c:232 ../libpurple/protocols/qq/qq.c:236
@@ -3757,243 +3839,248 @@
 msgid "Gender"
 msgstr "Nem"
 
-#: ../libpurple/protocols/gg/gg.c:651
+#: ../libpurple/protocols/gg/gg.c:661
 msgid "Male or female"
 msgstr "Férfi vagy nő"
 
-#: ../libpurple/protocols/gg/gg.c:652
-#: ../libpurple/protocols/oscar/oscar.c:3732
+#: ../libpurple/protocols/gg/gg.c:662
+#: ../libpurple/protocols/oscar/oscar.c:3747
 #: ../libpurple/protocols/qq/buddy_info.c:83
 #: ../libpurple/protocols/qq/qq.c:226
 msgid "Male"
 msgstr "Férfi"
 
-#: ../libpurple/protocols/gg/gg.c:653
-#: ../libpurple/protocols/oscar/oscar.c:3732
+#: ../libpurple/protocols/gg/gg.c:663
+#: ../libpurple/protocols/oscar/oscar.c:3747
 #: ../libpurple/protocols/qq/buddy_info.c:84
 #: ../libpurple/protocols/qq/qq.c:229
 msgid "Female"
 msgstr "Nő"
 
-#: ../libpurple/protocols/gg/gg.c:657
+#: ../libpurple/protocols/gg/gg.c:667
 msgid "Only online"
 msgstr "Csak elérhetők"
 
-#: ../libpurple/protocols/gg/gg.c:661 ../libpurple/protocols/gg/gg.c:662
+#: ../libpurple/protocols/gg/gg.c:671 ../libpurple/protocols/gg/gg.c:672
 msgid "Find buddies"
 msgstr "Partnerek keresése"
 
-#: ../libpurple/protocols/gg/gg.c:663
+#: ../libpurple/protocols/gg/gg.c:673
 msgid "Please, enter your search criteria below"
 msgstr "Adja meg alább a keresési feltételt"
 
-#: ../libpurple/protocols/gg/gg.c:701
+#: ../libpurple/protocols/gg/gg.c:711
 msgid "Fill in the fields."
 msgstr "Töltse ki a mezőket."
 
-#: ../libpurple/protocols/gg/gg.c:713
+#: ../libpurple/protocols/gg/gg.c:723
 msgid "Your current password is different from the one that you specified."
 msgstr "A jelenlegi jelszava eltér a megadottól."
 
-#: ../libpurple/protocols/gg/gg.c:727
+#: ../libpurple/protocols/gg/gg.c:737
 msgid "Unable to change password. Error occurred.\n"
 msgstr "A jelszó nem változtatható meg. Hiba történt.\n"
 
-#: ../libpurple/protocols/gg/gg.c:736
+#: ../libpurple/protocols/gg/gg.c:746
 msgid "Change password for the Gadu-Gadu account"
 msgstr "A Gadu-Gadu fiók jelszavának megváltoztatása"
 
-#: ../libpurple/protocols/gg/gg.c:737
+#: ../libpurple/protocols/gg/gg.c:747
 msgid "Password was changed successfully!"
 msgstr "A jelszó sikeresen megváltoztatva!"
 
-#: ../libpurple/protocols/gg/gg.c:770
+#: ../libpurple/protocols/gg/gg.c:780
 msgid "Current password"
 msgstr "Jelenlegi jelszó"
 
-#: ../libpurple/protocols/gg/gg.c:795
+#: ../libpurple/protocols/gg/gg.c:805
 msgid "Please, enter your current password and your new password for UIN: "
 msgstr "Adja meg a jelenlegi jelszavát és az új jelszót az UIM-hez: "
 
-#: ../libpurple/protocols/gg/gg.c:799 ../libpurple/protocols/gg/gg.c:800
+#: ../libpurple/protocols/gg/gg.c:809 ../libpurple/protocols/gg/gg.c:810
 msgid "Change Gadu-Gadu Password"
 msgstr "A Gadu-Gadu jelszó megváltoztatása"
 
-#: ../libpurple/protocols/gg/gg.c:876
+#: ../libpurple/protocols/gg/gg.c:887
 #, c-format
 msgid "Select a chat for buddy: %s"
 msgstr "Válasszon egy csevegést a következő partnerhez: %s"
 
-#: ../libpurple/protocols/gg/gg.c:879 ../libpurple/protocols/gg/gg.c:880
+#: ../libpurple/protocols/gg/gg.c:890 ../libpurple/protocols/gg/gg.c:891
 msgid "Add to chat..."
 msgstr "Felvétel csevegéshez..."
 
-#: ../libpurple/protocols/gg/gg.c:1008
-#: ../libpurple/protocols/jabber/buddy.c:2031
-#: ../libpurple/protocols/novell/novell.c:2828
+#: ../libpurple/protocols/gg/gg.c:1019
+#: ../libpurple/protocols/jabber/buddy.c:2034
+#: ../libpurple/protocols/novell/novell.c:2833
 #: ../libpurple/protocols/oscar/oscar.c:828
-#: ../libpurple/protocols/oscar/oscar.c:5604
+#: ../libpurple/protocols/oscar/oscar.c:5659
 #: ../libpurple/protocols/qq/qq.c:170 ../libpurple/protocols/qq/qq.c:177
 #: ../libpurple/protocols/qq/qq.c:292
-#: ../libpurple/protocols/yahoo/yahoo.c:3099 ../libpurple/status.c:154
-#: ../pidgin/gtkblist.c:3104 ../pidgin/gtkblist.c:3436
-#: ../pidgin/gtkdocklet.c:450 ../pidgin/gtkstatusbox.c:1061
+#: ../libpurple/protocols/yahoo/yahoo.c:3101 ../libpurple/status.c:154
+#: ../pidgin/gtkblist.c:3322 ../pidgin/gtkblist.c:3660
+#: ../pidgin/gtkdocklet.c:561 ../pidgin/gtkstatusbox.c:1061
 msgid "Offline"
 msgstr "Kilépett"
 
-#: ../libpurple/protocols/gg/gg.c:1011
-#: ../libpurple/protocols/jabber/buddy.c:2033
+#: ../libpurple/protocols/gg/gg.c:1022
+#: ../libpurple/protocols/jabber/buddy.c:2036
 #: ../libpurple/protocols/msn/state.c:29 ../libpurple/protocols/msn/state.c:30
 #: ../libpurple/protocols/msn/state.c:37 ../libpurple/protocols/msn/state.c:38
-#: ../libpurple/protocols/novell/novell.c:2816
+#: ../libpurple/protocols/msnp9/state.c:29
+#: ../libpurple/protocols/msnp9/state.c:30
+#: ../libpurple/protocols/msnp9/state.c:37
+#: ../libpurple/protocols/msnp9/state.c:38
+#: ../libpurple/protocols/novell/novell.c:2821
 #: ../libpurple/protocols/qq/qq.c:280
-#: ../libpurple/protocols/yahoo/yahoo.c:3101 ../libpurple/status.c:155
-#: ../pidgin/gtkdocklet.c:438 ../pidgin/gtkstatusbox.c:1057
+#: ../libpurple/protocols/yahoo/yahoo.c:3103 ../libpurple/status.c:155
+#: ../pidgin/gtkdocklet.c:545 ../pidgin/gtkstatusbox.c:1057
 msgid "Available"
 msgstr "Elérhető"
 
 #. get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for
 #. * the generic away state (YAHOO_STATUS_TYPE_AWAY) with no message
 #. Away stuff
-#: ../libpurple/protocols/gg/gg.c:1014 ../libpurple/protocols/irc/irc.c:528
+#: ../libpurple/protocols/gg/gg.c:1025 ../libpurple/protocols/irc/irc.c:528
 #: ../libpurple/protocols/irc/msgs.c:310
-#: ../libpurple/protocols/jabber/buddy.c:2037
-#: ../libpurple/protocols/novell/novell.c:2819
+#: ../libpurple/protocols/jabber/buddy.c:2040
+#: ../libpurple/protocols/novell/novell.c:2824
 #: ../libpurple/protocols/oscar/oscar.c:733
-#: ../libpurple/protocols/oscar/oscar.c:4547
-#: ../libpurple/protocols/oscar/oscar.c:5632
+#: ../libpurple/protocols/oscar/oscar.c:4562
+#: ../libpurple/protocols/oscar/oscar.c:5687
 #: ../libpurple/protocols/qq/qq.c:180 ../libpurple/protocols/qq/qq.c:284
-#: ../libpurple/protocols/silc/buddy.c:1476
-#: ../libpurple/protocols/silc10/buddy.c:1476
-#: ../libpurple/protocols/yahoo/yahoo.c:3653
-#: ../libpurple/protocols/yahoo/yahoo.c:3727 ../libpurple/status.c:158
-#: ../pidgin/gtkdocklet.c:442 ../pidgin/gtkprefs.c:1939
+#: ../libpurple/protocols/silc/buddy.c:1479
+#: ../libpurple/protocols/silc10/buddy.c:1479
+#: ../libpurple/protocols/yahoo/yahoo.c:3655
+#: ../libpurple/protocols/yahoo/yahoo.c:3729 ../libpurple/status.c:158
+#: ../pidgin/gtkdocklet.c:549 ../pidgin/gtkprefs.c:2040
 #: ../pidgin/gtkstatusbox.c:1058
 #, c-format
 msgid "Away"
 msgstr "Távol"
 
-#: ../libpurple/protocols/gg/gg.c:1043 ../libpurple/protocols/gg/gg.c:1117
-#: ../libpurple/protocols/oscar/oscar.c:2699
-#: ../libpurple/protocols/oscar/oscar.c:3699
+#: ../libpurple/protocols/gg/gg.c:1054 ../libpurple/protocols/gg/gg.c:1128
+#: ../libpurple/protocols/oscar/oscar.c:2714
+#: ../libpurple/protocols/oscar/oscar.c:3714
 msgid "UIN"
 msgstr "UIN"
 
-#: ../libpurple/protocols/gg/gg.c:1046 ../libpurple/protocols/gg/gg.c:1120
-#: ../libpurple/protocols/jabber/buddy.c:2210
-#: ../libpurple/protocols/jabber/buddy.c:2386
-#: ../libpurple/protocols/oscar/oscar.c:3710
+#: ../libpurple/protocols/gg/gg.c:1057 ../libpurple/protocols/gg/gg.c:1131
+#: ../libpurple/protocols/jabber/buddy.c:2213
+#: ../libpurple/protocols/jabber/buddy.c:2399
+#: ../libpurple/protocols/oscar/oscar.c:3725
 #: ../libpurple/protocols/silc/ops.c:990
 #: ../libpurple/protocols/silc10/ops.c:1024
 msgid "First Name"
 msgstr "Utónév"
 
-#: ../libpurple/protocols/gg/gg.c:1059 ../libpurple/protocols/gg/gg.c:1129
+#: ../libpurple/protocols/gg/gg.c:1070 ../libpurple/protocols/gg/gg.c:1140
 msgid "Birth Year"
 msgstr "Születési év"
 
-#: ../libpurple/protocols/gg/gg.c:1111 ../libpurple/protocols/gg/gg.c:1180
-#: ../libpurple/protocols/oscar/oscar.c:3911
+#: ../libpurple/protocols/gg/gg.c:1122 ../libpurple/protocols/gg/gg.c:1191
+#: ../libpurple/protocols/oscar/oscar.c:3926
 msgid "Unable to display the search results."
 msgstr "A keresés eredményei nem jeleníthetők meg."
 
-#: ../libpurple/protocols/gg/gg.c:1171
+#: ../libpurple/protocols/gg/gg.c:1182
 msgid "Gadu-Gadu Public Directory"
 msgstr "Gadu-Gadu nyilvános címtár"
 
-#: ../libpurple/protocols/gg/gg.c:1172
+#: ../libpurple/protocols/gg/gg.c:1183
 msgid "Search results"
 msgstr "Keresési eredmények"
 
-#: ../libpurple/protocols/gg/gg.c:1215
+#: ../libpurple/protocols/gg/gg.c:1226
 msgid "No matching users found"
 msgstr "Nem találhatók megfelelő felhasználók"
 
-#: ../libpurple/protocols/gg/gg.c:1216
+#: ../libpurple/protocols/gg/gg.c:1227
 msgid "There are no users matching your search criteria."
 msgstr "Nincsenek a keresési feltételnek megfelelő felhasználók."
 
-#: ../libpurple/protocols/gg/gg.c:1310 ../libpurple/protocols/gg/gg.c:1463
+#: ../libpurple/protocols/gg/gg.c:1321 ../libpurple/protocols/gg/gg.c:1474
 msgid "Unable to read socket"
 msgstr "A foglalatot nem lehet olvasni"
 
-#: ../libpurple/protocols/gg/gg.c:1395
+#: ../libpurple/protocols/gg/gg.c:1406
 msgid "Buddy list downloaded"
 msgstr "A partnerlista letöltve"
 
-#: ../libpurple/protocols/gg/gg.c:1396
+#: ../libpurple/protocols/gg/gg.c:1407
 msgid "Your buddy list was downloaded from the server."
 msgstr "A partnerlistája letöltve a kiszolgálóról."
 
-#: ../libpurple/protocols/gg/gg.c:1403
+#: ../libpurple/protocols/gg/gg.c:1414
 msgid "Buddy list uploaded"
 msgstr "A partnerlista feltöltve"
 
-#: ../libpurple/protocols/gg/gg.c:1404
+#: ../libpurple/protocols/gg/gg.c:1415
 msgid "Your buddy list was stored on the server."
 msgstr "A partnerlista tárolva a kiszolgálón."
 
-#: ../libpurple/protocols/gg/gg.c:1509 ../libpurple/protocols/gg/gg.c:1715
+#: ../libpurple/protocols/gg/gg.c:1520 ../libpurple/protocols/gg/gg.c:1726
 msgid "Connection failed."
 msgstr "A kapcsolódás meghiúsult."
 
-#: ../libpurple/protocols/gg/gg.c:1621 ../libpurple/protocols/msn/msn.c:559
+#: ../libpurple/protocols/gg/gg.c:1632 ../libpurple/protocols/msn/msn.c:664
+#: ../libpurple/protocols/msnp9/msn.c:563
 msgid "Blocked"
 msgstr "Tiltott"
 
-#: ../libpurple/protocols/gg/gg.c:1644
+#: ../libpurple/protocols/gg/gg.c:1655
 msgid "Add to chat"
 msgstr "Felvétel csevegéshez"
 
-#: ../libpurple/protocols/gg/gg.c:1653
+#: ../libpurple/protocols/gg/gg.c:1664
 msgid "Unblock"
 msgstr "Tiltás feloldása"
 
-#: ../libpurple/protocols/gg/gg.c:1657
+#: ../libpurple/protocols/gg/gg.c:1668
 msgid "Block"
 msgstr "Tiltás"
 
-#: ../libpurple/protocols/gg/gg.c:1674
+#: ../libpurple/protocols/gg/gg.c:1685
 msgid "Chat _name:"
 msgstr "Csevegés _neve:"
 
-#: ../libpurple/protocols/gg/gg.c:1914
+#: ../libpurple/protocols/gg/gg.c:1934
 msgid "Chat error"
 msgstr "Csevegéshiba"
 
-#: ../libpurple/protocols/gg/gg.c:1915
+#: ../libpurple/protocols/gg/gg.c:1935
 msgid "This chat name is already in use"
 msgstr "Ez a csevegésnév már használatban van"
 
-#: ../libpurple/protocols/gg/gg.c:1998
+#: ../libpurple/protocols/gg/gg.c:2018
 msgid "Not connected to the server."
 msgstr "Nincs kapcsolat a kiszolgálóval."
 
-#: ../libpurple/protocols/gg/gg.c:2021
+#: ../libpurple/protocols/gg/gg.c:2041
 msgid "Find buddies..."
 msgstr "Partnerek keresése..."
 
-#: ../libpurple/protocols/gg/gg.c:2027
+#: ../libpurple/protocols/gg/gg.c:2047
 msgid "Change password..."
 msgstr "Jelszó megváltoztatása..."
 
-#: ../libpurple/protocols/gg/gg.c:2033
+#: ../libpurple/protocols/gg/gg.c:2053
 msgid "Upload buddylist to Server"
 msgstr "Partnerlista feltöltése a kiszolgálóra"
 
-#: ../libpurple/protocols/gg/gg.c:2037
+#: ../libpurple/protocols/gg/gg.c:2057
 msgid "Download buddylist from Server"
 msgstr "Partnerlista letöltése a kiszolgálóról"
 
-#: ../libpurple/protocols/gg/gg.c:2041
+#: ../libpurple/protocols/gg/gg.c:2061
 msgid "Delete buddylist from Server"
 msgstr "Partnerlista törlése a kiszolgálóról"
 
-#: ../libpurple/protocols/gg/gg.c:2045
+#: ../libpurple/protocols/gg/gg.c:2065
 msgid "Save buddylist to file..."
 msgstr "Partnerlista mentése fájlba..."
 
-#: ../libpurple/protocols/gg/gg.c:2049
+#: ../libpurple/protocols/gg/gg.c:2069
 msgid "Load buddylist from file..."
 msgstr "Partnerlista betöltése fájlból..."
 
@@ -4008,38 +4095,38 @@
 #. id
 #. name
 #. version
-#: ../libpurple/protocols/gg/gg.c:2153
+#: ../libpurple/protocols/gg/gg.c:2173
 msgid "Gadu-Gadu Protocol Plugin"
 msgstr "Gadu-Gadu protokollbővítmény"
 
 #. summary
-#: ../libpurple/protocols/gg/gg.c:2154
+#: ../libpurple/protocols/gg/gg.c:2174
 msgid "Polish popular IM"
 msgstr "Népszerű lengyel azonnali üzenő"
 
-#: ../libpurple/protocols/gg/gg.c:2208
+#: ../libpurple/protocols/gg/gg.c:2228
 msgid "Gadu-Gadu User"
 msgstr "Gadu-Gadu felhasználó"
 
 #: ../libpurple/protocols/irc/cmds.c:43
-#: ../libpurple/protocols/silc/silc.c:1637
-#: ../libpurple/protocols/silc10/silc.c:1566
+#: ../libpurple/protocols/silc/silc.c:1768
+#: ../libpurple/protocols/silc10/silc.c:1569
 #, c-format
 msgid "Unknown command: %s"
 msgstr "Ismeretlen parancs: %s"
 
 #: ../libpurple/protocols/irc/cmds.c:503
 #: ../libpurple/protocols/jabber/chat.c:591
-#: ../libpurple/protocols/silc/silc.c:1345
-#: ../libpurple/protocols/silc10/silc.c:1274
+#: ../libpurple/protocols/silc/silc.c:1476
+#: ../libpurple/protocols/silc10/silc.c:1277
 #, c-format
 msgid "current topic is: %s"
 msgstr "a jelenlegi téma: %s"
 
 #: ../libpurple/protocols/irc/cmds.c:507
 #: ../libpurple/protocols/jabber/chat.c:595
-#: ../libpurple/protocols/silc/silc.c:1349
-#: ../libpurple/protocols/silc10/silc.c:1278
+#: ../libpurple/protocols/silc/silc.c:1480
+#: ../libpurple/protocols/silc10/silc.c:1281
 msgid "No topic is set"
 msgstr "Nincs beállítva téma"
 
@@ -4075,7 +4162,7 @@
 
 #: ../libpurple/protocols/irc/irc.c:127 ../libpurple/protocols/irc/irc.c:165
 #: ../libpurple/protocols/irc/irc.c:612 ../libpurple/protocols/irc/irc.c:637
-#: ../libpurple/protocols/myspace/myspace.c:2356
+#: ../libpurple/protocols/myspace/myspace.c:2361
 msgid "Server has disconnected"
 msgstr "A kiszolgáló bontotta a kapcsolatot"
 
@@ -4089,7 +4176,7 @@
 msgstr "Cs_atorna:"
 
 #: ../libpurple/protocols/irc/irc.c:267
-#: ../libpurple/protocols/jabber/chat.c:59 ../pidgin/gtkaccount.c:524
+#: ../libpurple/protocols/jabber/chat.c:59 ../pidgin/gtkaccount.c:527
 msgid "_Password:"
 msgstr "_Jelszó:"
 
@@ -4101,14 +4188,15 @@
 #. connect to the server
 #: ../libpurple/protocols/irc/irc.c:319
 #: ../libpurple/protocols/jabber/jabber.c:1280
-#: ../libpurple/protocols/msn/session.c:345
-#: ../libpurple/protocols/myspace/myspace.c:301
-#: ../libpurple/protocols/novell/novell.c:2182
-#: ../libpurple/protocols/oscar/oscar.c:1287
+#: ../libpurple/protocols/msn/session.c:394
+#: ../libpurple/protocols/msnp9/session.c:345
+#: ../libpurple/protocols/myspace/myspace.c:302
+#: ../libpurple/protocols/novell/novell.c:2187
+#: ../libpurple/protocols/oscar/oscar.c:1290
 #: ../libpurple/protocols/qq/qq.c:136
-#: ../libpurple/protocols/sametime/sametime.c:3723
-#: ../libpurple/protocols/simple/simple.c:1716
-#: ../libpurple/protocols/yahoo/yahoo.c:2939
+#: ../libpurple/protocols/sametime/sametime.c:3724
+#: ../libpurple/protocols/simple/simple.c:1871
+#: ../libpurple/protocols/yahoo/yahoo.c:2941
 #: ../libpurple/protocols/zephyr/zephyr.c:1621 ../pidgin/gtkstatusbox.c:662
 msgid "Connecting"
 msgstr "Kapcsolódás"
@@ -4122,34 +4210,34 @@
 #. TODO: try other ports if in auto mode, then save
 #. * working port and try that first next time.
 #: ../libpurple/protocols/irc/irc.c:338
-#: ../libpurple/protocols/myspace/myspace.c:317
-#: ../libpurple/protocols/simple/simple.c:464
-#: ../libpurple/protocols/simple/simple.c:1631
+#: ../libpurple/protocols/myspace/myspace.c:318
+#: ../libpurple/protocols/simple/simple.c:465
+#: ../libpurple/protocols/simple/simple.c:1786
 msgid "Couldn't create socket"
 msgstr "Nem sikerült létrehozni a foglalatot"
 
 #: ../libpurple/protocols/irc/irc.c:421
-#: ../libpurple/protocols/myspace/myspace.c:2469
-#: ../libpurple/protocols/oscar/oscar.c:1283
+#: ../libpurple/protocols/myspace/myspace.c:2474
+#: ../libpurple/protocols/oscar/oscar.c:1286
 msgid "Couldn't connect to host"
 msgstr "Nem sikerült kapcsolódni a kiszolgálóhoz"
 
 #: ../libpurple/protocols/irc/irc.c:609 ../libpurple/protocols/irc/irc.c:634
-#: ../libpurple/protocols/myspace/myspace.c:2352
+#: ../libpurple/protocols/myspace/myspace.c:2357
 msgid "Read error"
 msgstr "Olvasási hiba"
 
 #: ../libpurple/protocols/irc/irc.c:773
-#: ../libpurple/protocols/silc/chat.c:1412
+#: ../libpurple/protocols/silc/chat.c:1398
 #: ../libpurple/protocols/silc10/chat.c:1426
 #: ../libpurple/protocols/yahoo/yahoochat.c:1497
 msgid "Users"
 msgstr "Felhasználók"
 
 #: ../libpurple/protocols/irc/irc.c:776
-#: ../libpurple/protocols/sametime/sametime.c:3374
-#: ../libpurple/protocols/silc/chat.c:1415
-#: ../libpurple/protocols/silc/ops.c:1389
+#: ../libpurple/protocols/sametime/sametime.c:3375
+#: ../libpurple/protocols/silc/chat.c:1401
+#: ../libpurple/protocols/silc/ops.c:1393
 #: ../libpurple/protocols/silc10/chat.c:1429
 #: ../libpurple/protocols/silc10/ops.c:1382
 #: ../libpurple/protocols/yahoo/yahoochat.c:1506
@@ -4175,26 +4263,28 @@
 
 #. host to connect to
 #: ../libpurple/protocols/irc/irc.c:940 ../libpurple/protocols/irc/msgs.c:323
-#: ../libpurple/protocols/msn/msn.c:2185
-#: ../libpurple/protocols/oscar/oscar.c:6671
+#: ../libpurple/protocols/msn/msn.c:2333
+#: ../libpurple/protocols/msnp9/msn.c:2183
+#: ../libpurple/protocols/oscar/oscar.c:6726
 #: ../libpurple/protocols/qq/qq.c:755
-#: ../libpurple/protocols/sametime/sametime.c:5727
+#: ../libpurple/protocols/sametime/sametime.c:5728
 #: ../libpurple/protocols/silc/ops.c:1249
-#: ../libpurple/protocols/silc/ops.c:1341
+#: ../libpurple/protocols/silc/ops.c:1343
 #: ../libpurple/protocols/silc10/ops.c:1244
 #: ../libpurple/protocols/silc10/ops.c:1347
-#: ../libpurple/protocols/simple/simple.c:1896
+#: ../libpurple/protocols/simple/simple.c:2061
 #: ../libpurple/protocols/toc/toc.c:2327
 msgid "Server"
 msgstr "Kiszolgáló"
 
 #. port to connect to
-#: ../libpurple/protocols/irc/irc.c:943 ../libpurple/protocols/msn/msn.c:2190
-#: ../libpurple/protocols/oscar/oscar.c:6674
+#: ../libpurple/protocols/irc/irc.c:943 ../libpurple/protocols/msn/msn.c:2338
+#: ../libpurple/protocols/msnp9/msn.c:2188
+#: ../libpurple/protocols/oscar/oscar.c:6729
 #: ../libpurple/protocols/qq/qq.c:758
-#: ../libpurple/protocols/sametime/sametime.c:5732
-#: ../libpurple/protocols/silc/silc.c:1918
-#: ../libpurple/protocols/silc10/silc.c:1861
+#: ../libpurple/protocols/sametime/sametime.c:5733
+#: ../libpurple/protocols/silc/silc.c:2049
+#: ../libpurple/protocols/silc10/silc.c:1864
 #: ../libpurple/protocols/toc/toc.c:2331
 msgid "Port"
 msgstr "Port"
@@ -4206,13 +4296,13 @@
 #: ../libpurple/protocols/irc/irc.c:949 ../libpurple/protocols/irc/msgs.c:316
 #: ../libpurple/protocols/jabber/jabber.c:904
 #: ../libpurple/protocols/jabber/jabber.c:907
-#: ../libpurple/protocols/silc/buddy.c:1539
+#: ../libpurple/protocols/silc/buddy.c:1542
 #: ../libpurple/protocols/silc/ops.c:1197
 #: ../libpurple/protocols/silc/ops.c:1200
-#: ../libpurple/protocols/silc/ops.c:1334
-#: ../libpurple/protocols/silc/ops.c:1337
-#: ../libpurple/protocols/silc/silc.c:1005
-#: ../libpurple/protocols/silc10/buddy.c:1539
+#: ../libpurple/protocols/silc/ops.c:1336
+#: ../libpurple/protocols/silc/ops.c:1339
+#: ../libpurple/protocols/silc/silc.c:1136
+#: ../libpurple/protocols/silc10/buddy.c:1542
 #: ../libpurple/protocols/silc10/ops.c:1191
 #: ../libpurple/protocols/silc10/ops.c:1194
 #: ../libpurple/protocols/silc10/ops.c:1340
@@ -4222,7 +4312,7 @@
 msgstr "Felhasználónév"
 
 #: ../libpurple/protocols/irc/irc.c:952 ../libpurple/protocols/irc/msgs.c:317
-#: ../libpurple/protocols/silc/silc.c:1009
+#: ../libpurple/protocols/silc/silc.c:1140
 #: ../libpurple/protocols/silc10/silc.c:920
 msgid "Real name"
 msgstr "Valódi név"
@@ -4262,8 +4352,8 @@
 msgstr " <i>(azonosítva)</i>"
 
 #: ../libpurple/protocols/irc/msgs.c:303
-#: ../libpurple/protocols/oscar/oscar.c:3700
-#: ../libpurple/protocols/silc/ops.c:1418
+#: ../libpurple/protocols/oscar/oscar.c:3715
+#: ../libpurple/protocols/silc/ops.c:1422
 #: ../libpurple/protocols/silc10/ops.c:1414
 msgid "Nick"
 msgstr "Becenév"
@@ -4361,28 +4451,28 @@
 msgid "Invitation only"
 msgstr "Meghívásos"
 
-#: ../libpurple/protocols/irc/msgs.c:795
+#: ../libpurple/protocols/irc/msgs.c:798
 #, c-format
 msgid "You have been kicked by %s: (%s)"
 msgstr "%s kirúgta Önt: (%s)"
 
 #. Remove user from channel
-#: ../libpurple/protocols/irc/msgs.c:800 ../libpurple/protocols/silc/ops.c:699
+#: ../libpurple/protocols/irc/msgs.c:803 ../libpurple/protocols/silc/ops.c:699
 #: ../libpurple/protocols/silc10/ops.c:720
 #, c-format
 msgid "Kicked by %s (%s)"
 msgstr "%s kizárta (%s)"
 
-#: ../libpurple/protocols/irc/msgs.c:823
+#: ../libpurple/protocols/irc/msgs.c:826
 #, c-format
 msgid "mode (%s %s) by %s"
 msgstr "mód (%s %s) %s által"
 
-#: ../libpurple/protocols/irc/msgs.c:908 ../libpurple/protocols/irc/msgs.c:909
+#: ../libpurple/protocols/irc/msgs.c:911 ../libpurple/protocols/irc/msgs.c:912
 msgid "Invalid nickname"
 msgstr "Érvénytelen becenév"
 
-#: ../libpurple/protocols/irc/msgs.c:910
+#: ../libpurple/protocols/irc/msgs.c:913
 msgid ""
 "Your selected nickname was rejected by the server.  It probably contains "
 "invalid characters."
@@ -4390,7 +4480,7 @@
 "Az Ön által választott becenevet a kiszolgáló visszautasította. Valószínűleg "
 "érvénytelen karaktereket tartalmaz."
 
-#: ../libpurple/protocols/irc/msgs.c:915
+#: ../libpurple/protocols/irc/msgs.c:918
 msgid ""
 "Your selected account name was rejected by the server.  It probably contains "
 "invalid characters."
@@ -4398,44 +4488,44 @@
 "Az Ön által választott fióknevet a kiszolgáló visszautasította. Valószínűleg "
 "érvénytelen karaktereket tartalmaz."
 
-#: ../libpurple/protocols/irc/msgs.c:954
+#: ../libpurple/protocols/irc/msgs.c:957
 msgid "Cannot change nick"
 msgstr "A becenév nem változtatható meg"
 
-#: ../libpurple/protocols/irc/msgs.c:954
+#: ../libpurple/protocols/irc/msgs.c:957
 msgid "Could not change nick"
 msgstr "Nem sikerült megváltoztatni a becenevet"
 
-#: ../libpurple/protocols/irc/msgs.c:975
+#: ../libpurple/protocols/irc/msgs.c:978
 #, c-format
 msgid "You have parted the channel%s%s"
 msgstr "Elhagyta a(z) %s%s csatornát"
 
-#: ../libpurple/protocols/irc/msgs.c:1017
+#: ../libpurple/protocols/irc/msgs.c:1020
 msgid "Error: invalid PONG from server"
 msgstr "Hiba: érvénytelen PONG a kiszolgálótól"
 
-#: ../libpurple/protocols/irc/msgs.c:1019
+#: ../libpurple/protocols/irc/msgs.c:1022
 #, c-format
 msgid "PING reply -- Lag: %lu seconds"
 msgstr "PING válasz -- Késleltetés %lu másodperc"
 
-#: ../libpurple/protocols/irc/msgs.c:1110
+#: ../libpurple/protocols/irc/msgs.c:1113
 #, c-format
 msgid "Cannot join %s: Registration is required."
 msgstr "%s csatornához nem lehet csatlakozni: Regisztráció szükséges."
 
-#: ../libpurple/protocols/irc/msgs.c:1111
+#: ../libpurple/protocols/irc/msgs.c:1114
 #: ../libpurple/protocols/silc/ops.c:1093
 #: ../libpurple/protocols/silc10/ops.c:1128
 msgid "Cannot join channel"
 msgstr "Nem lehet csatlakozni a csatornához"
 
-#: ../libpurple/protocols/irc/msgs.c:1145
+#: ../libpurple/protocols/irc/msgs.c:1148
 msgid "Nick or channel is temporarily unavailable."
 msgstr "A becenév vagy csatorna átmenetileg nem érhető el."
 
-#: ../libpurple/protocols/irc/msgs.c:1157
+#: ../libpurple/protocols/irc/msgs.c:1160
 #, c-format
 msgid "Wallops from %s"
 msgstr "Ütések a következőtől: %s"
@@ -4545,7 +4635,7 @@
 msgstr "names [csatorna]:  Kilistázza a csatornán jelenlévő felhasználókat."
 
 #: ../libpurple/protocols/irc/parse.c:137
-#: ../libpurple/protocols/jabber/jabber.c:2261
+#: ../libpurple/protocols/jabber/jabber.c:2282
 msgid "nick &lt;new nickname&gt;:  Change your nickname."
 msgstr "nick &lt;új becenév&gt;:  Megváltoztatja a becenevét."
 
@@ -4621,8 +4711,7 @@
 
 #: ../libpurple/protocols/irc/parse.c:149
 msgid "topic [new topic]:  View or change the channel topic."
-msgstr ""
-"topic [új téma]:  A csatorna témájának megtekintése vagy megváltoztatása."
+msgstr "topic [új téma]:  A csatorna témájának megtekintése vagy megváltoztatása."
 
 #: ../libpurple/protocols/irc/parse.c:150
 msgid "umode &lt;+|-&gt;&lt;A-Za-z&gt;:  Set or unset a user mode."
@@ -4652,8 +4741,7 @@
 
 #: ../libpurple/protocols/irc/parse.c:154
 msgid "whois [server] &lt;nick&gt;:  Get information on a user."
-msgstr ""
-"whois [kiszolgáló] &lt;becenév&gt;:  Információk lekérése egy felhasználóról."
+msgstr "whois [kiszolgáló] &lt;becenév&gt;:  Információk lekérése egy felhasználóról."
 
 #: ../libpurple/protocols/irc/parse.c:155
 msgid "whowas &lt;nick&gt;: Get information on a user that has logged off."
@@ -4661,43 +4749,41 @@
 "whowas &lt;becenév&gt;: Információk lekérése egy kijelentkezett "
 "felhasználóról."
 
-#: ../libpurple/protocols/irc/parse.c:465
+#: ../libpurple/protocols/irc/parse.c:520
 #, c-format
 msgid "Reply time from %s: %lu seconds"
 msgstr "Válaszidő a következőtől: %s: %lu másodperc"
 
-#: ../libpurple/protocols/irc/parse.c:466
+#: ../libpurple/protocols/irc/parse.c:521
 msgid "PONG"
 msgstr "PONG"
 
-#: ../libpurple/protocols/irc/parse.c:466
+#: ../libpurple/protocols/irc/parse.c:521
 msgid "CTCP PING reply"
 msgstr "CTCP PING válasz"
 
-#: ../libpurple/protocols/irc/parse.c:577
-#: ../libpurple/protocols/irc/parse.c:581 ../libpurple/protocols/toc/toc.c:191
+#: ../libpurple/protocols/irc/parse.c:632
+#: ../libpurple/protocols/irc/parse.c:636 ../libpurple/protocols/toc/toc.c:191
 #: ../libpurple/protocols/toc/toc.c:694 ../libpurple/protocols/toc/toc.c:710
 #: ../libpurple/protocols/toc/toc.c:786
 msgid "Disconnected."
 msgstr "Kapcsolat bontva."
 
-#: ../libpurple/protocols/jabber/adhoccommands.c:137
+#: ../libpurple/protocols/jabber/adhoccommands.c:143
 #: ../libpurple/protocols/jabber/jabber.c:671
 #: ../libpurple/protocols/jabber/jabber.c:701
-#: ../libpurple/protocols/jabber/jabber.c:1887
+#: ../libpurple/protocols/jabber/jabber.c:1865
 msgid "Unknown Error"
 msgstr "Ismeretlen hiba"
 
-#: ../libpurple/protocols/jabber/adhoccommands.c:139
-#: ../libpurple/protocols/jabber/adhoccommands.c:140
-#, fuzzy
+#: ../libpurple/protocols/jabber/adhoccommands.c:145
+#: ../libpurple/protocols/jabber/adhoccommands.c:146
 msgid "Ad-Hoc Command Failed"
-msgstr "a blocklist parancs sikertelen"
-
-#: ../libpurple/protocols/jabber/adhoccommands.c:173
-#, fuzzy
+msgstr "Az eseti parancs meghiúsult"
+
+#: ../libpurple/protocols/jabber/adhoccommands.c:182
 msgid "execute"
-msgstr "Váratlan"
+msgstr "végrehajtás"
 
 #: ../libpurple/protocols/jabber/auth.c:53
 msgid "Server requires TLS/SSL for login.  No TLS/SSL support found."
@@ -4707,8 +4793,7 @@
 
 #: ../libpurple/protocols/jabber/auth.c:116
 msgid "Server requires plaintext authentication over an unencrypted stream"
-msgstr ""
-"A kiszolgáló szöveges hitelesítést követel meg egy nem titkosított csatornán"
+msgstr "A kiszolgáló szöveges hitelesítést követel meg egy nem titkosított csatornán"
 
 #: ../libpurple/protocols/jabber/auth.c:319
 #: ../libpurple/protocols/jabber/auth.c:508
@@ -4765,7 +4850,7 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:283
 #: ../libpurple/protocols/jabber/buddy.c:1219
-#: ../libpurple/protocols/sametime/sametime.c:4128
+#: ../libpurple/protocols/sametime/sametime.c:4129
 #: ../libpurple/protocols/silc/ops.c:986
 #: ../libpurple/protocols/silc10/ops.c:1020
 msgid "Full Name"
@@ -4815,7 +4900,7 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:293
 #: ../libpurple/protocols/jabber/buddy.c:1295
-#: ../libpurple/protocols/silc/silc.c:1015
+#: ../libpurple/protocols/silc/silc.c:1146
 #: ../libpurple/protocols/silc10/silc.c:926
 msgid "Country"
 msgstr "Ország"
@@ -4843,16 +4928,17 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:300
 #: ../libpurple/protocols/jabber/buddy.c:1250
-#: ../libpurple/protocols/msn/msn.c:1658
-#: ../libpurple/protocols/oscar/oscar.c:3749
+#: ../libpurple/protocols/msn/msn.c:1804
+#: ../libpurple/protocols/msnp9/msn.c:1656
+#: ../libpurple/protocols/oscar/oscar.c:3764
 msgid "Birthday"
 msgstr "Születésnap"
 
 #: ../libpurple/protocols/jabber/buddy.c:301
 #: ../libpurple/protocols/jabber/buddy.c:1365
 #: ../libpurple/protocols/jabber/chat.c:775
-#: ../libpurple/protocols/jabber/usermood.c:175 ../pidgin/gtkblist.c:3116
-#: ../pidgin/gtkprefs.c:739
+#: ../libpurple/protocols/jabber/usermood.c:193 ../pidgin/gtkblist.c:3334
+#: ../pidgin/gtkprefs.c:740
 msgid "Description"
 msgstr "Leírás"
 
@@ -4879,244 +4965,218 @@
 msgid "Operating System"
 msgstr "Operációs rendszer"
 
+# fixme: innentől egy jó darabon xmpp protokollkiegészítések nevei vannak, lásd: http://www.xmpp.org/extensions/
 #: ../libpurple/protocols/jabber/buddy.c:815
 #: ../libpurple/protocols/jabber/buddy.c:975
 msgid "Last Activity"
-msgstr ""
+msgstr "Utolsó művelet"
 
 #: ../libpurple/protocols/jabber/buddy.c:817
 #: ../libpurple/protocols/jabber/buddy.c:977
-#, fuzzy
 msgid "Service Discovery Info"
-msgstr "Könyvtárinformációk beállítása"
+msgstr "Szolgáltatásfeltérképezési információk"
 
 #: ../libpurple/protocols/jabber/buddy.c:819
 #: ../libpurple/protocols/jabber/buddy.c:979
 msgid "Service Discovery Items"
-msgstr ""
+msgstr "Szolgáltatásfeltérképezési elemek"
 
 #: ../libpurple/protocols/jabber/buddy.c:821
 #: ../libpurple/protocols/jabber/buddy.c:981
-#, fuzzy
 msgid "Extended Stanza Addressing"
-msgstr "További cím"
+msgstr "Kibővített kifejezéscímzés"
 
 #: ../libpurple/protocols/jabber/buddy.c:823
 #: ../libpurple/protocols/jabber/buddy.c:983
-#, fuzzy
 msgid "Multi-User Chat"
-msgstr "Csevegés álneve"
+msgstr "Többfelhasználós csevegés"
 
 #: ../libpurple/protocols/jabber/buddy.c:825
 #: ../libpurple/protocols/jabber/buddy.c:985
-#, fuzzy
 msgid "Multi-User Chat Extended Presence Information"
-msgstr "A felhasználó nem rendelkezik címtár-információkkal."
+msgstr "Többfelhasználós csevegés kibővített jelenlét-információi"
 
 #: ../libpurple/protocols/jabber/buddy.c:827
 #: ../libpurple/protocols/jabber/buddy.c:987
 msgid "In-Band Bytestreams"
-msgstr ""
+msgstr "Beágyazott bájtsorozat"
 
 #: ../libpurple/protocols/jabber/buddy.c:829
 #: ../libpurple/protocols/jabber/buddy.c:989
-#, fuzzy
 msgid "Ad-Hoc Commands"
-msgstr "Parancs"
+msgstr "Eseti parancsok"
 
 #: ../libpurple/protocols/jabber/buddy.c:831
 #: ../libpurple/protocols/jabber/buddy.c:991
 msgid "PubSub Service"
-msgstr ""
+msgstr "PubSub szolgáltatás"
 
 #: ../libpurple/protocols/jabber/buddy.c:833
 #: ../libpurple/protocols/jabber/buddy.c:993
 msgid "SOCKS5 Bytestreams"
-msgstr ""
+msgstr "SOCKS5 bájtsorozat"
 
 #: ../libpurple/protocols/jabber/buddy.c:835
 #: ../libpurple/protocols/jabber/buddy.c:995
 msgid "Out of Band Data"
-msgstr ""
+msgstr "Külső adatok"
 
 #: ../libpurple/protocols/jabber/buddy.c:837
 #: ../libpurple/protocols/jabber/buddy.c:997
-#, fuzzy
 msgid "XHTML-IM"
-msgstr "HTML"
-
+msgstr "XHTML-IM"
+
+# fixme: mi a rák ez?
 #: ../libpurple/protocols/jabber/buddy.c:839
 #: ../libpurple/protocols/jabber/buddy.c:999
-#, fuzzy
 msgid "In-Band Registration"
-msgstr "Regisztrációs hiba"
+msgstr "Beágyazott regisztráció"
 
 #: ../libpurple/protocols/jabber/buddy.c:841
 #: ../libpurple/protocols/jabber/buddy.c:1001
-#, fuzzy
 msgid "User Location"
-msgstr "Hely"
+msgstr "Felhasználó helye"
 
 #: ../libpurple/protocols/jabber/buddy.c:843
 #: ../libpurple/protocols/jabber/buddy.c:1003
-#, fuzzy
 msgid "User Avatar"
-msgstr "Felhasználó keresése"
+msgstr "Felhasználói avatar"
 
 #: ../libpurple/protocols/jabber/buddy.c:845
 #: ../libpurple/protocols/jabber/buddy.c:1005
-#, fuzzy
 msgid "Chat State Notifications"
-msgstr "Partnerállapot-értesítés"
+msgstr "Csevegésállapot-értesítések"
 
 #: ../libpurple/protocols/jabber/buddy.c:847
 #: ../libpurple/protocols/jabber/buddy.c:1007
-#, fuzzy
 msgid "Software Version"
-msgstr "Nem támogatott verzió"
+msgstr "Szoftververzió"
 
 #: ../libpurple/protocols/jabber/buddy.c:849
 #: ../libpurple/protocols/jabber/buddy.c:1009
-#, fuzzy
 msgid "Stream Initiation"
-msgstr "Tájolás"
+msgstr "Adatátvitel kezdeményezése"
 
 #: ../libpurple/protocols/jabber/buddy.c:851
 #: ../libpurple/protocols/jabber/buddy.c:1011
-#: ../libpurple/protocols/sametime/sametime.c:3235
+#: ../libpurple/protocols/sametime/sametime.c:3236
 msgid "File Transfer"
 msgstr "Fájlátvitel"
 
 #: ../libpurple/protocols/jabber/buddy.c:853
 #: ../libpurple/protocols/jabber/buddy.c:1013
-#, fuzzy
 msgid "User Mood"
-msgstr "Felhasználói módok"
+msgstr "Felhasználó hangulata"
 
 #: ../libpurple/protocols/jabber/buddy.c:855
 #: ../libpurple/protocols/jabber/buddy.c:1015
-#, fuzzy
 msgid "User Activity"
-msgstr "Felhasználók korlátozása"
+msgstr "Felhasználói tevékenység"
 
 #: ../libpurple/protocols/jabber/buddy.c:857
 #: ../libpurple/protocols/jabber/buddy.c:1017
-#, fuzzy
 msgid "Entity Capabilities"
-msgstr "Képességek"
+msgstr "Egyed képességei"
 
 #: ../libpurple/protocols/jabber/buddy.c:859
 #: ../libpurple/protocols/jabber/buddy.c:1019
 msgid "Encrypted Session Negotiations"
-msgstr ""
+msgstr "Titkosított munkamenet-egyeztetések"
 
 #: ../libpurple/protocols/jabber/buddy.c:861
 #: ../libpurple/protocols/jabber/buddy.c:1021
-#, fuzzy
 msgid "User Tune"
-msgstr "Felhasználónév"
+msgstr "Hallgatott zene"
 
 #: ../libpurple/protocols/jabber/buddy.c:863
 #: ../libpurple/protocols/jabber/buddy.c:1023
-#, fuzzy
 msgid "Roster Item Exchange"
-msgstr "Azonnali üzenet kulcscserével"
+msgstr "Partnerlista-elemek cseréje"
 
 #: ../libpurple/protocols/jabber/buddy.c:865
 #: ../libpurple/protocols/jabber/buddy.c:1025
-#, fuzzy
 msgid "Reachability Address"
-msgstr "E-mail cím"
+msgstr "Elérhetőségi cím"
 
 #: ../libpurple/protocols/jabber/buddy.c:867
 #: ../libpurple/protocols/jabber/buddy.c:1027
-#, fuzzy
 msgid "User Profile"
-msgstr "Profil"
+msgstr "Felhasználói profil"
 
 #: ../libpurple/protocols/jabber/buddy.c:869
 #: ../libpurple/protocols/jabber/buddy.c:1029
-#, fuzzy
 msgid "Jingle"
-msgstr "Csatlakozás"
+msgstr "Jingle"
 
 #: ../libpurple/protocols/jabber/buddy.c:871
 #: ../libpurple/protocols/jabber/buddy.c:1031
 msgid "Jingle Audio"
-msgstr ""
+msgstr "Jingle hang"
 
 #: ../libpurple/protocols/jabber/buddy.c:873
 #: ../libpurple/protocols/jabber/buddy.c:1033
-#, fuzzy
 msgid "User Nickname"
-msgstr "Felhasználónév"
+msgstr "Felhasználó beceneve"
 
 #: ../libpurple/protocols/jabber/buddy.c:875
 #: ../libpurple/protocols/jabber/buddy.c:1035
 msgid "Jingle ICE UDP"
-msgstr ""
+msgstr "Jingle ICE UDP"
 
 #: ../libpurple/protocols/jabber/buddy.c:877
 #: ../libpurple/protocols/jabber/buddy.c:1037
 msgid "Jingle ICE TCP"
-msgstr ""
+msgstr "Jingle ICE TCP"
 
 #: ../libpurple/protocols/jabber/buddy.c:879
 #: ../libpurple/protocols/jabber/buddy.c:1039
 msgid "Jingle Raw UDP"
-msgstr ""
+msgstr "Jingle Raw UDP"
 
 #: ../libpurple/protocols/jabber/buddy.c:881
 #: ../libpurple/protocols/jabber/buddy.c:1041
-#, fuzzy
 msgid "Jingle Video"
-msgstr "Élő videó"
+msgstr "Jingle videó"
 
 #: ../libpurple/protocols/jabber/buddy.c:883
 #: ../libpurple/protocols/jabber/buddy.c:1043
 msgid "Jingle DTMF"
-msgstr ""
+msgstr "Jingle DTMF"
 
 #: ../libpurple/protocols/jabber/buddy.c:885
 #: ../libpurple/protocols/jabber/buddy.c:1045
-#, fuzzy
 msgid "Message Receipts"
-msgstr "Üzenet fogadása"
+msgstr "Tértivevények"
 
 #: ../libpurple/protocols/jabber/buddy.c:887
 #: ../libpurple/protocols/jabber/buddy.c:1047
-#, fuzzy
 msgid "Public Key Publishing"
-msgstr "Nyilvános kulcs blablakódja"
+msgstr "Nyilvános kulcs közzététele"
 
 #: ../libpurple/protocols/jabber/buddy.c:889
 #: ../libpurple/protocols/jabber/buddy.c:1049
-#, fuzzy
 msgid "User Chatting"
-msgstr "Felhasználói beállítások"
+msgstr "Csevegőszobák"
 
 #: ../libpurple/protocols/jabber/buddy.c:891
 #: ../libpurple/protocols/jabber/buddy.c:1051
-#, fuzzy
 msgid "User Browsing"
-msgstr "Felhasználói módok"
+msgstr "Böngészett oldalak"
 
 #: ../libpurple/protocols/jabber/buddy.c:893
 #: ../libpurple/protocols/jabber/buddy.c:1053
-#, fuzzy
 msgid "User Gaming"
-msgstr "Felhasználónév"
+msgstr "Játékok"
 
 #: ../libpurple/protocols/jabber/buddy.c:895
 #: ../libpurple/protocols/jabber/buddy.c:1055
-#, fuzzy
 msgid "User Viewing"
-msgstr "Felhasználók korlátozása"
+msgstr "Videók"
 
 #: ../libpurple/protocols/jabber/buddy.c:897
 #: ../libpurple/protocols/jabber/buddy.c:1057
-#: ../libpurple/protocols/silc/ops.c:1596
-#: ../libpurple/protocols/silc/ops.c:1601
+#: ../libpurple/protocols/silc/ops.c:1600
+#: ../libpurple/protocols/silc/ops.c:1605
 #: ../libpurple/protocols/silc10/ops.c:1612
 #: ../libpurple/protocols/silc10/ops.c:1617
 msgid "Ping"
@@ -5124,63 +5184,63 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:899
 #: ../libpurple/protocols/jabber/buddy.c:1059
-#, fuzzy
 msgid "Stanza Encryption"
-msgstr "Trillian titkosítás"
+msgstr "Kifejezéstitkosítás"
 
 #: ../libpurple/protocols/jabber/buddy.c:901
 #: ../libpurple/protocols/jabber/buddy.c:1061
 msgid "Entity Time"
-msgstr ""
+msgstr "Helyi idő"
 
 #: ../libpurple/protocols/jabber/buddy.c:903
 #: ../libpurple/protocols/jabber/buddy.c:1063
 msgid "Delayed Delivery"
-msgstr ""
+msgstr "Késleltetett kézbesítés"
 
 #: ../libpurple/protocols/jabber/buddy.c:905
 #: ../libpurple/protocols/jabber/buddy.c:1065
 msgid "Collaborative Data Objects"
-msgstr ""
+msgstr "Együttműködési adatobjektumok"
 
 #: ../libpurple/protocols/jabber/buddy.c:907
 #: ../libpurple/protocols/jabber/buddy.c:1067
 msgid "File Repository and Sharing"
-msgstr ""
+msgstr "Fájllerakat és -megosztás"
 
 #: ../libpurple/protocols/jabber/buddy.c:909
 #: ../libpurple/protocols/jabber/buddy.c:1069
 msgid "STUN Service Discovery for Jingle"
-msgstr ""
+msgstr "STUN szolgáltatásfeltérképezés a Jingle-höz"
 
 #: ../libpurple/protocols/jabber/buddy.c:911
 #: ../libpurple/protocols/jabber/buddy.c:1071
 msgid "Simplified Encrypted Session Negotiation"
-msgstr ""
-
+msgstr "Egyszerűsített titkosított munkamenet-egyeztetés"
+
+# fixme: idáig egy jó darabon xmpp protokollkiegészítések nevei voltak, lásd: http://www.xmpp.org/extensions/
 #: ../libpurple/protocols/jabber/buddy.c:913
 #: ../libpurple/protocols/jabber/buddy.c:1073
 msgid "Hop Check"
-msgstr ""
+msgstr "Ugrásellenőrzés"
 
 #: ../libpurple/protocols/jabber/buddy.c:921
 #: ../libpurple/protocols/jabber/buddy.c:1081
-#: ../libpurple/protocols/oscar/oscar.c:2906
+#: ../libpurple/protocols/oscar/oscar.c:2921
 msgid "Capabilities"
 msgstr "Képességek"
 
 #: ../libpurple/protocols/jabber/buddy.c:933
-#: ../libpurple/protocols/jabber/libxmpp.c:206
+#: ../libpurple/protocols/jabber/libxmpp.c:209
 #: ../libpurple/protocols/jabber/si.c:859
 msgid "Resource"
 msgstr "Erőforrás"
 
 #: ../libpurple/protocols/jabber/buddy.c:935
-#: ../libpurple/protocols/jabber/jabber.c:1531
-#: ../libpurple/protocols/jabber/jabber.c:1554
-#: ../libpurple/protocols/jabber/jabber.c:1577
-#: ../libpurple/protocols/jabber/jabber.c:1600
-#: ../libpurple/protocols/jabber/jabber.c:1623
+#: ../libpurple/protocols/jabber/jabber.c:1538
+#: ../libpurple/protocols/jabber/jabber.c:1552
+#: ../libpurple/protocols/jabber/jabber.c:1566
+#: ../libpurple/protocols/jabber/jabber.c:1580
+#: ../libpurple/protocols/jabber/jabber.c:1594
 msgid "Priority"
 msgstr "Prioritás"
 
@@ -5192,8 +5252,8 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:1270
 #: ../libpurple/protocols/jabber/jabber.c:952
-#: ../libpurple/protocols/oscar/oscar.c:3788
-#: ../libpurple/protocols/oscar/oscar.c:3801
+#: ../libpurple/protocols/oscar/oscar.c:3803
+#: ../libpurple/protocols/oscar/oscar.c:3816
 #: ../libpurple/protocols/qq/buddy_info.c:56
 #: ../libpurple/protocols/silc/ops.c:1030
 #: ../libpurple/protocols/silc10/ops.c:1064
@@ -5212,74 +5272,72 @@
 msgid "Logo"
 msgstr "Logó"
 
-#: ../libpurple/protocols/jabber/buddy.c:1942
+#: ../libpurple/protocols/jabber/buddy.c:1945
 msgid "Un-hide From"
 msgstr "Rejtettség visszavonása"
 
-#: ../libpurple/protocols/jabber/buddy.c:1946
+#: ../libpurple/protocols/jabber/buddy.c:1949
 msgid "Temporarily Hide From"
 msgstr "Ideiglenesen elrejt"
 
 #. && NOT ME
-#: ../libpurple/protocols/jabber/buddy.c:1954
+#: ../libpurple/protocols/jabber/buddy.c:1957
 msgid "Cancel Presence Notification"
 msgstr "Jelenlét-értesítés törlése"
 
-#: ../libpurple/protocols/jabber/buddy.c:1961
+#: ../libpurple/protocols/jabber/buddy.c:1964
 msgid "(Re-)Request authorization"
 msgstr "Engedélyezés (újra)kérése"
 
 #. if(NOT ME)
 #. shouldn't this just happen automatically when the buddy is
 #. removed?
-#: ../libpurple/protocols/jabber/buddy.c:1970
+#: ../libpurple/protocols/jabber/buddy.c:1973
 msgid "Unsubscribe"
 msgstr "Leiratkozás"
 
-#: ../libpurple/protocols/jabber/buddy.c:1985
-#, fuzzy
+#: ../libpurple/protocols/jabber/buddy.c:1988
 msgid "Log In"
-msgstr "Bejelentkezve"
-
-#: ../libpurple/protocols/jabber/buddy.c:1989
-#, fuzzy
+msgstr "Bejelentkezés"
+
+#: ../libpurple/protocols/jabber/buddy.c:1992
 msgid "Log Out"
-msgstr "Csevegések naplózása"
-
-#: ../libpurple/protocols/jabber/buddy.c:2035
-#: ../libpurple/protocols/jabber/jabber.c:1553
+msgstr "Kijelentkezés"
+
+#: ../libpurple/protocols/jabber/buddy.c:2038
+#: ../libpurple/protocols/jabber/jabber.c:1551
 msgid "Chatty"
 msgstr "Beszédes"
 
-#: ../libpurple/protocols/jabber/buddy.c:2039
+#: ../libpurple/protocols/jabber/buddy.c:2042
 msgid "Extended Away"
 msgstr "Nem vagyok a gépnél"
 
-#: ../libpurple/protocols/jabber/buddy.c:2041
-#: ../libpurple/protocols/jabber/jabber.c:1622
+#: ../libpurple/protocols/jabber/buddy.c:2044
+#: ../libpurple/protocols/jabber/jabber.c:1593
 #: ../libpurple/protocols/oscar/oscar.c:727
-#: ../libpurple/protocols/oscar/oscar.c:5808
-#: ../libpurple/protocols/sametime/sametime.c:3297
+#: ../libpurple/protocols/oscar/oscar.c:5863
+#: ../libpurple/protocols/sametime/sametime.c:3298
 #, c-format
 msgid "Do Not Disturb"
 msgstr "Ne zavarjanak"
 
-#: ../libpurple/protocols/jabber/buddy.c:2208
+#: ../libpurple/protocols/jabber/buddy.c:2211
 msgid "JID"
 msgstr "JID"
 
-#: ../libpurple/protocols/jabber/buddy.c:2212
-#: ../libpurple/protocols/jabber/buddy.c:2391
-#: ../libpurple/protocols/oscar/oscar.c:3711
+#: ../libpurple/protocols/jabber/buddy.c:2215
+#: ../libpurple/protocols/jabber/buddy.c:2404
+#: ../libpurple/protocols/oscar/oscar.c:3726
 msgid "Last Name"
 msgstr "Vezetéknév"
 
-#: ../libpurple/protocols/jabber/buddy.c:2244
+#: ../libpurple/protocols/jabber/buddy.c:2247
 msgid "The following are the results of your search"
 msgstr "A keresés eredményei a következők"
 
 #. current comment from Jabber User Directory users.jabber.org
-#: ../libpurple/protocols/jabber/buddy.c:2319
+#: ../libpurple/protocols/jabber/buddy.c:2332
 msgid ""
 "Find a contact by entering the search criteria in the given fields. Note: "
 "Each field supports wild card searches (%)"
@@ -5287,69 +5345,68 @@
 "Kapcsolat keresése a keresési feltételek megadásával az adott mezőkben. Ne "
 "feledje, hogy minden mező támogatja a helyettesítő karakteres keresést (%)"
 
-#: ../libpurple/protocols/jabber/buddy.c:2339
+#: ../libpurple/protocols/jabber/buddy.c:2352
 msgid "Directory Query Failed"
 msgstr "A címtárlekérdezés sikertelen"
 
-#: ../libpurple/protocols/jabber/buddy.c:2340
+#: ../libpurple/protocols/jabber/buddy.c:2353
 msgid "Could not query the directory server."
 msgstr "A címtárkiszolgáló lekérdezése nem sikerült."
 
 #. Try to translate the message (see static message
 #. list in jabber_user_dir_comments[])
-#: ../libpurple/protocols/jabber/buddy.c:2374
+#: ../libpurple/protocols/jabber/buddy.c:2387
 #, c-format
 msgid "Server Instructions: %s"
 msgstr "Kiszolgálóutasítások: %s"
 
-#: ../libpurple/protocols/jabber/buddy.c:2381
+#: ../libpurple/protocols/jabber/buddy.c:2394
 msgid "Fill in one or more fields to search for any matching XMPP users."
-msgstr ""
-"Töltsön ki legalább egy mezőt a megfelelő XMPP felhasználók kereséséhez."
-
-#: ../libpurple/protocols/jabber/buddy.c:2401
-#: ../libpurple/protocols/novell/novell.c:1488
-#: ../libpurple/protocols/oscar/oscar.c:3714
-#: ../libpurple/protocols/oscar/oscar.c:3723
+msgstr "Töltsön ki legalább egy mezőt a megfelelő XMPP felhasználók kereséséhez."
+
+#: ../libpurple/protocols/jabber/buddy.c:2414
+#: ../libpurple/protocols/novell/novell.c:1490
+#: ../libpurple/protocols/oscar/oscar.c:3729
+#: ../libpurple/protocols/oscar/oscar.c:3738
 msgid "E-Mail Address"
 msgstr "E-mail cím"
 
-#: ../libpurple/protocols/jabber/buddy.c:2410
-#: ../libpurple/protocols/jabber/buddy.c:2411
+#: ../libpurple/protocols/jabber/buddy.c:2423
+#: ../libpurple/protocols/jabber/buddy.c:2424
 msgid "Search for XMPP users"
 msgstr "XMPP felhasználók keresése"
 
 #. "Search"
-#: ../libpurple/protocols/jabber/buddy.c:2412
+#: ../libpurple/protocols/jabber/buddy.c:2425
 #: ../libpurple/protocols/qq/group.c:123
 #: ../libpurple/protocols/qq/group_im.c:147
 #: ../libpurple/protocols/qq/sys_msg.c:174
 #: ../libpurple/protocols/qq/sys_msg.c:250
 #: ../libpurple/protocols/qq/sys_msg.c:268
-#: ../libpurple/protocols/sametime/sametime.c:5611
+#: ../libpurple/protocols/sametime/sametime.c:5612
 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:470
 #: ../pidgin/plugins/gevolution/assoc-buddy.c:356
 msgid "Search"
 msgstr "Keresés"
 
-#: ../libpurple/protocols/jabber/buddy.c:2427
+#: ../libpurple/protocols/jabber/buddy.c:2440
 msgid "Invalid Directory"
 msgstr "Érvénytelen címtár"
 
-#: ../libpurple/protocols/jabber/buddy.c:2444
+#: ../libpurple/protocols/jabber/buddy.c:2457
 msgid "Enter a User Directory"
 msgstr "Adjon meg egy felhasználói címtárat"
 
-#: ../libpurple/protocols/jabber/buddy.c:2445
+#: ../libpurple/protocols/jabber/buddy.c:2458
 msgid "Select a user directory to search"
 msgstr "Válasszon ki egy felhasználói címtárat a kereséshez"
 
-#: ../libpurple/protocols/jabber/buddy.c:2448
+#: ../libpurple/protocols/jabber/buddy.c:2461
 msgid "Search Directory"
 msgstr "Keresés a címtárban"
 
 #: ../libpurple/protocols/jabber/chat.c:41
-#: ../libpurple/protocols/oscar/oscar.c:5294
+#: ../libpurple/protocols/oscar/oscar.c:5347
 #: ../libpurple/protocols/yahoo/yahoochat.c:1048
 msgid "_Room:"
 msgstr "Sz_oba:"
@@ -5419,7 +5476,7 @@
 
 #: ../libpurple/protocols/jabber/chat.c:678
 #: ../libpurple/protocols/jabber/chat.c:689
-#: ../libpurple/protocols/silc/ops.c:1456
+#: ../libpurple/protocols/silc/ops.c:1460
 #: ../libpurple/protocols/silc10/ops.c:1451
 msgid "Error retrieving room list"
 msgstr "Hiba szobalista letöltése közben"
@@ -5446,7 +5503,7 @@
 
 #: ../libpurple/protocols/jabber/jabber.c:145
 msgid "You require encryption, but it is not available on this server."
-msgstr ""
+msgstr "Titkosítást igényel, de az nem áll rendelkezésre ezen a kiszolgálón."
 
 #: ../libpurple/protocols/jabber/jabber.c:259
 #: ../libpurple/protocols/jabber/jabber.c:312
@@ -5460,9 +5517,9 @@
 msgstr "Olvasási hiba"
 
 #: ../libpurple/protocols/jabber/jabber.c:482
-#: ../libpurple/protocols/oscar/flap_connection.c:394
-#: ../libpurple/protocols/yahoo/yahoo.c:2558
-#: ../libpurple/protocols/yahoo/yahoo.c:2590
+#: ../libpurple/protocols/oscar/flap_connection.c:396
+#: ../libpurple/protocols/yahoo/yahoo.c:2560
+#: ../libpurple/protocols/yahoo/yahoo.c:2592
 #, c-format
 msgid ""
 "Could not establish a connection with the server:\n"
@@ -5490,9 +5547,9 @@
 msgstr "%s@%s regisztrációja sikeres"
 
 #: ../libpurple/protocols/jabber/jabber.c:662
-#, fuzzy, c-format
+#, c-format
 msgid "Registration to %s successful"
-msgstr "%s@%s regisztrációja sikeres"
+msgstr "A regisztráció sikeres a következőre: %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:664
 #: ../libpurple/protocols/jabber/jabber.c:665
@@ -5505,21 +5562,19 @@
 msgstr "A regisztráció sikertelen"
 
 #: ../libpurple/protocols/jabber/jabber.c:692
-#, fuzzy, c-format
+#, c-format
 msgid "Registration from %s successfully removed"
-msgstr "%s@%s regisztrációja sikeres"
+msgstr "A regisztráció sikeresen megszüntetve a következőn: %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:694
 #: ../libpurple/protocols/jabber/jabber.c:695
-#, fuzzy
 msgid "Unregistration Successful"
-msgstr "A regisztráció sikeres"
+msgstr "A regisztráció megszüntetése sikeres"
 
 #: ../libpurple/protocols/jabber/jabber.c:703
 #: ../libpurple/protocols/jabber/jabber.c:704
-#, fuzzy
 msgid "Unregistration Failed"
-msgstr "A regisztráció sikertelen"
+msgstr "A regisztráció megszüntetése sikertelen"
 
 #: ../libpurple/protocols/jabber/jabber.c:864
 #: ../libpurple/protocols/jabber/jabber.c:865
@@ -5527,8 +5582,8 @@
 msgstr "Már regisztrálva van"
 
 #: ../libpurple/protocols/jabber/jabber.c:962
-#: ../libpurple/protocols/oscar/oscar.c:3790
-#: ../libpurple/protocols/oscar/oscar.c:3803
+#: ../libpurple/protocols/oscar/oscar.c:3805
+#: ../libpurple/protocols/oscar/oscar.c:3818
 msgid "State"
 msgstr "Állam"
 
@@ -5538,8 +5593,8 @@
 
 #: ../libpurple/protocols/jabber/jabber.c:972
 #: ../libpurple/protocols/silc/ops.c:1035
-#: ../libpurple/protocols/silc/silc.c:772
-#: ../libpurple/protocols/silc/util.c:557
+#: ../libpurple/protocols/silc/silc.c:903
+#: ../libpurple/protocols/silc/util.c:561
 #: ../libpurple/protocols/silc10/ops.c:1069
 #: ../libpurple/protocols/silc10/silc.c:683
 #: ../libpurple/protocols/silc10/util.c:553
@@ -5551,19 +5606,16 @@
 msgstr "Dátum"
 
 #: ../libpurple/protocols/jabber/jabber.c:987
-#, fuzzy
 msgid "Unregister"
-msgstr "Regisztráció"
+msgstr "Regisztráció megszüntetése"
 
 #: ../libpurple/protocols/jabber/jabber.c:994
-#, fuzzy
-msgid ""
-"Please fill out the information below to change your account registration."
-msgstr "Kérem adja meg a következő információkat az új fiók regisztrálásához."
+msgid "Please fill out the information below to change your account registration."
+msgstr "Adja meg a következő információkat a regisztrált fiók módosításához."
 
 #: ../libpurple/protocols/jabber/jabber.c:997
 msgid "Please fill out the information below to register your new account."
-msgstr "Kérem adja meg a következő információkat az új fiók regisztrálásához."
+msgstr "Adja meg a következő információkat az új fiók regisztrálásához."
 
 #: ../libpurple/protocols/jabber/jabber.c:1005
 #: ../libpurple/protocols/jabber/jabber.c:1006
@@ -5576,43 +5628,40 @@
 msgstr "Regisztráció"
 
 #: ../libpurple/protocols/jabber/jabber.c:1012
-#, fuzzy, c-format
+#, c-format
 msgid "Change Account Registration at %s"
-msgstr "Felhasználó-információk megváltoztatása %s számára"
+msgstr "A következőn regisztrált fiók módosítása: %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:1013
-#, fuzzy, c-format
+#, c-format
 msgid "Register New Account at %s"
-msgstr "Új XMPP fiók regisztrálása"
+msgstr "Új fiók regisztrálása a következőn: %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:1016
-#, fuzzy
 msgid "Change Registration"
-msgstr "Állapot megváltoztatása a következőre"
+msgstr "Regisztráció módosítása"
 
 #: ../libpurple/protocols/jabber/jabber.c:1120
 #: ../libpurple/protocols/jabber/jabber.c:1121
-#, fuzzy
 msgid "Error unregistering account"
-msgstr "Hiba a fiók információinak megváltoztatása közben"
+msgstr "Hiba a fiók regisztrációjának megszüntetése közben"
 
 #: ../libpurple/protocols/jabber/jabber.c:1126
 #: ../libpurple/protocols/jabber/jabber.c:1127
-#, fuzzy
 msgid "Account successfully unregistered"
-msgstr "Sikeresen létrehozott egy Qun-t"
+msgstr "A fiók regisztrációja sikeresen megszüntetve"
 
 #: ../libpurple/protocols/jabber/jabber.c:1284
 msgid "Initializing Stream"
 msgstr "Folyam inicializálása"
 
 #: ../libpurple/protocols/jabber/jabber.c:1289
-#, fuzzy
 msgid "Initializing SSL/TLS"
-msgstr "Folyam inicializálása"
+msgstr "SSL/TLS inicializálása"
 
 #: ../libpurple/protocols/jabber/jabber.c:1293
-#: ../libpurple/protocols/msn/session.c:351
+#: ../libpurple/protocols/msn/session.c:400
+#: ../libpurple/protocols/msnp9/session.c:351
 msgid "Authenticating"
 msgstr "Hitelesítés"
 
@@ -5621,475 +5670,455 @@
 msgstr "A folyam újrainicializálása"
 
 #: ../libpurple/protocols/jabber/jabber.c:1396
-#: ../libpurple/protocols/jabber/jabber.c:1865
-#: ../libpurple/protocols/jabber/jabber.c:1909
-#: ../libpurple/protocols/jabber/jabber.c:1945
+#: ../libpurple/protocols/jabber/jabber.c:1843
+#: ../libpurple/protocols/jabber/jabber.c:1887
+#: ../libpurple/protocols/jabber/jabber.c:1923
 #: ../libpurple/protocols/oscar/oscar.c:826
-#: ../libpurple/protocols/oscar/oscar.c:5602
+#: ../libpurple/protocols/oscar/oscar.c:5657
 msgid "Not Authorized"
 msgstr "Nem engedélyezett"
 
-#: ../libpurple/protocols/jabber/jabber.c:1442
+#: ../libpurple/protocols/jabber/jabber.c:1444
 msgid "Both"
 msgstr "Mindkettő"
 
-#: ../libpurple/protocols/jabber/jabber.c:1444
+#: ../libpurple/protocols/jabber/jabber.c:1446
 msgid "From (To pending)"
 msgstr "Feladó (Címzett függőben)"
 
-#: ../libpurple/protocols/jabber/jabber.c:1446
+#: ../libpurple/protocols/jabber/jabber.c:1448
 msgid "From"
 msgstr "Feladó"
 
-#: ../libpurple/protocols/jabber/jabber.c:1449
+#: ../libpurple/protocols/jabber/jabber.c:1451
 msgid "To"
 msgstr "Címzett"
 
-#: ../libpurple/protocols/jabber/jabber.c:1451
+#: ../libpurple/protocols/jabber/jabber.c:1453
 msgid "None (To pending)"
 msgstr "Senki (Címzett függőben)"
 
-#: ../libpurple/protocols/jabber/jabber.c:1453
+#: ../libpurple/protocols/jabber/jabber.c:1455
 #: ../pidgin/plugins/gevolution/eds-utils.c:73
 #: ../pidgin/plugins/gevolution/eds-utils.c:86
 msgid "None"
 msgstr "Nincs"
 
-#: ../libpurple/protocols/jabber/jabber.c:1456
+#: ../libpurple/protocols/jabber/jabber.c:1458
 msgid "Subscription"
 msgstr "Feliratkozás"
 
-#: ../libpurple/protocols/jabber/jabber.c:1466
-#: ../libpurple/protocols/jabber/jabber.c:1469
-#: ../libpurple/protocols/jabber/jabber.c:1533
-#: ../libpurple/protocols/jabber/jabber.c:1556
-#: ../libpurple/protocols/jabber/jabber.c:1579
-#: ../libpurple/protocols/jabber/jabber.c:1602
-#: ../libpurple/protocols/jabber/jabber.c:1625
-#: ../libpurple/protocols/jabber/usermood.c:166
-#: ../libpurple/protocols/silc/buddy.c:1557
+#: ../libpurple/protocols/jabber/jabber.c:1468
+#: ../libpurple/protocols/jabber/jabber.c:1471
+#: ../libpurple/protocols/jabber/jabber.c:1540
+#: ../libpurple/protocols/jabber/jabber.c:1554
+#: ../libpurple/protocols/jabber/jabber.c:1568
+#: ../libpurple/protocols/jabber/jabber.c:1582
+#: ../libpurple/protocols/jabber/jabber.c:1596
+#: ../libpurple/protocols/jabber/usermood.c:184
+#: ../libpurple/protocols/silc/buddy.c:1560
 #: ../libpurple/protocols/silc/ops.c:1212
-#: ../libpurple/protocols/silc10/buddy.c:1557
+#: ../libpurple/protocols/silc10/buddy.c:1560
 #: ../libpurple/protocols/silc10/ops.c:1207
 msgid "Mood"
 msgstr "Hangulat"
 
-#: ../libpurple/protocols/jabber/jabber.c:1534
-#: ../libpurple/protocols/jabber/jabber.c:1557
-#: ../libpurple/protocols/jabber/jabber.c:1580
-#: ../libpurple/protocols/jabber/jabber.c:1603
-#: ../libpurple/protocols/jabber/jabber.c:1626
-#, fuzzy
-msgid "Mood Text"
-msgstr "Vércsoport"
-
-#: ../libpurple/protocols/jabber/jabber.c:1535
-#: ../libpurple/protocols/jabber/jabber.c:1558
-#: ../libpurple/protocols/jabber/jabber.c:1581
-#: ../libpurple/protocols/jabber/jabber.c:1604
-#: ../libpurple/protocols/jabber/jabber.c:1627
-#, fuzzy
-msgid "Tune Artist"
-msgstr "Grafikusok"
-
-#: ../libpurple/protocols/jabber/jabber.c:1536
-#: ../libpurple/protocols/jabber/jabber.c:1559
-#: ../libpurple/protocols/jabber/jabber.c:1582
-#: ../libpurple/protocols/jabber/jabber.c:1605
-#: ../libpurple/protocols/jabber/jabber.c:1628
-#, fuzzy
-msgid "Tune Title"
-msgstr "Beosztás"
-
-#: ../libpurple/protocols/jabber/jabber.c:1537
-#: ../libpurple/protocols/jabber/jabber.c:1560
-#: ../libpurple/protocols/jabber/jabber.c:1583
-#: ../libpurple/protocols/jabber/jabber.c:1606
-#: ../libpurple/protocols/jabber/jabber.c:1629
-msgid "Tune Album"
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:1538
-#: ../libpurple/protocols/jabber/jabber.c:1561
-#: ../libpurple/protocols/jabber/jabber.c:1584
-#: ../libpurple/protocols/jabber/jabber.c:1607
-#: ../libpurple/protocols/jabber/jabber.c:1630
-msgid "Tune Genre"
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:1539
-#: ../libpurple/protocols/jabber/jabber.c:1562
-#: ../libpurple/protocols/jabber/jabber.c:1585
-#: ../libpurple/protocols/jabber/jabber.c:1608
-#: ../libpurple/protocols/jabber/jabber.c:1631
-#, fuzzy
-msgid "Tune Comment"
-msgstr "Partnermegjegyzés"
-
-#: ../libpurple/protocols/jabber/jabber.c:1540
-#: ../libpurple/protocols/jabber/jabber.c:1563
-#: ../libpurple/protocols/jabber/jabber.c:1586
-#: ../libpurple/protocols/jabber/jabber.c:1609
-#: ../libpurple/protocols/jabber/jabber.c:1632
-msgid "Tune Track"
-msgstr ""
+#: ../libpurple/protocols/jabber/jabber.c:1476
+#: ../libpurple/protocols/msn/msn.c:647
+msgid "Current media"
+msgstr "Aktuális adathordozó"
 
 #: ../libpurple/protocols/jabber/jabber.c:1541
-#: ../libpurple/protocols/jabber/jabber.c:1564
-#: ../libpurple/protocols/jabber/jabber.c:1587
-#: ../libpurple/protocols/jabber/jabber.c:1610
-#: ../libpurple/protocols/jabber/jabber.c:1633
-msgid "Tune Time"
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:1542
-#: ../libpurple/protocols/jabber/jabber.c:1565
-#: ../libpurple/protocols/jabber/jabber.c:1588
-#: ../libpurple/protocols/jabber/jabber.c:1611
-#: ../libpurple/protocols/jabber/jabber.c:1634
-msgid "Tune Year"
-msgstr ""
+#: ../libpurple/protocols/jabber/jabber.c:1555
+#: ../libpurple/protocols/jabber/jabber.c:1569
+#: ../libpurple/protocols/jabber/jabber.c:1583
+#: ../libpurple/protocols/jabber/jabber.c:1597
+msgid "Mood Text"
+msgstr "Hangulatszöveg"
 
 #: ../libpurple/protocols/jabber/jabber.c:1543
-#: ../libpurple/protocols/jabber/jabber.c:1566
-#: ../libpurple/protocols/jabber/jabber.c:1589
-#: ../libpurple/protocols/jabber/jabber.c:1612
-#: ../libpurple/protocols/jabber/jabber.c:1635
+#: ../libpurple/protocols/jabber/jabber.c:1557
+#: ../libpurple/protocols/jabber/jabber.c:1571
+#: ../libpurple/protocols/jabber/jabber.c:1585
+#: ../libpurple/protocols/jabber/jabber.c:1599
+msgid "Allow Buzz"
+msgstr "Csörgetés engedélyezése"
+
+#: ../libpurple/protocols/jabber/jabber.c:1617
+msgid "Tune Artist"
+msgstr "Dal előadója"
+
+#: ../libpurple/protocols/jabber/jabber.c:1618
+msgid "Tune Title"
+msgstr "Dal címe"
+
+#: ../libpurple/protocols/jabber/jabber.c:1619
+msgid "Tune Album"
+msgstr "Dal albuma"
+
+#: ../libpurple/protocols/jabber/jabber.c:1620
+msgid "Tune Genre"
+msgstr "Dal műfaja"
+
+#: ../libpurple/protocols/jabber/jabber.c:1621
+msgid "Tune Comment"
+msgstr "Dal megjegyzése"
+
+#: ../libpurple/protocols/jabber/jabber.c:1622
+msgid "Tune Track"
+msgstr "Dal sorszáma"
+
+#: ../libpurple/protocols/jabber/jabber.c:1623
+msgid "Tune Time"
+msgstr "Dal időtartama"
+
+#: ../libpurple/protocols/jabber/jabber.c:1624
+msgid "Tune Year"
+msgstr "Dal kiadási éve"
+
+#: ../libpurple/protocols/jabber/jabber.c:1625
 msgid "Tune URL"
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:1545
-#: ../libpurple/protocols/jabber/jabber.c:1568
-#: ../libpurple/protocols/jabber/jabber.c:1591
-#: ../libpurple/protocols/jabber/jabber.c:1614
-#: ../libpurple/protocols/jabber/jabber.c:1637
-#, fuzzy
-msgid "Allow Buzz"
-msgstr "Engedélyezés"
-
-#: ../libpurple/protocols/jabber/jabber.c:1665
+msgstr "Dal URL"
+
+#: ../libpurple/protocols/jabber/jabber.c:1641
 msgid "Password Changed"
 msgstr "Jelszó megváltoztatva"
 
-#: ../libpurple/protocols/jabber/jabber.c:1666
+#: ../libpurple/protocols/jabber/jabber.c:1642
 msgid "Your password has been changed."
 msgstr "A jelszava meg lett változtatva."
 
-#: ../libpurple/protocols/jabber/jabber.c:1670
-#: ../libpurple/protocols/jabber/jabber.c:1671
+#: ../libpurple/protocols/jabber/jabber.c:1648
+#: ../libpurple/protocols/jabber/jabber.c:1649
 msgid "Error changing password"
 msgstr "Hiba a jelszó megváltoztatásakor"
 
-#: ../libpurple/protocols/jabber/jabber.c:1728
+#: ../libpurple/protocols/jabber/jabber.c:1706
 msgid "Password (again)"
 msgstr "Jelszó (még egyszer)"
 
-#: ../libpurple/protocols/jabber/jabber.c:1734
-#: ../libpurple/protocols/jabber/jabber.c:1735
+#: ../libpurple/protocols/jabber/jabber.c:1712
+#: ../libpurple/protocols/jabber/jabber.c:1713
 msgid "Change XMPP Password"
 msgstr "XMPP jelszó megváltoztatása"
 
-#: ../libpurple/protocols/jabber/jabber.c:1735
+#: ../libpurple/protocols/jabber/jabber.c:1713
 msgid "Please enter your new password"
-msgstr "Kérem adja meg az új jelszavát"
-
-#: ../libpurple/protocols/jabber/jabber.c:1749
-#: ../libpurple/protocols/oscar/oscar.c:6388
-#: ../libpurple/protocols/silc/silc.c:1093
-#: ../libpurple/protocols/silc10/silc.c:1004
+msgstr "Adja meg az új jelszavát"
+
+#: ../libpurple/protocols/jabber/jabber.c:1727
+#: ../libpurple/protocols/oscar/oscar.c:6443
+#: ../libpurple/protocols/silc/silc.c:1224
+#: ../libpurple/protocols/silc10/silc.c:1007
 msgid "Set User Info..."
 msgstr "Felhasználói információk beállítása..."
 
 #. if (js->protocol_options & CHANGE_PASSWORD) {
-#: ../libpurple/protocols/jabber/jabber.c:1754
-#: ../libpurple/protocols/oscar/oscar.c:6399
-#: ../libpurple/protocols/silc/silc.c:1089
-#: ../libpurple/protocols/silc10/silc.c:1000
+#: ../libpurple/protocols/jabber/jabber.c:1732
+#: ../libpurple/protocols/oscar/oscar.c:6454
+#: ../libpurple/protocols/silc/silc.c:1220
+#: ../libpurple/protocols/silc10/silc.c:1003
 msgid "Change Password..."
 msgstr "Jelszó megváltoztatása..."
 
 #. }
-#: ../libpurple/protocols/jabber/jabber.c:1759
+#: ../libpurple/protocols/jabber/jabber.c:1737
 msgid "Search for Users..."
 msgstr "Felhasználók keresése..."
 
-#: ../libpurple/protocols/jabber/jabber.c:1845
+#: ../libpurple/protocols/jabber/jabber.c:1823
 msgid "Bad Request"
 msgstr "Hibás kérés"
 
-#: ../libpurple/protocols/jabber/jabber.c:1847
+#: ../libpurple/protocols/jabber/jabber.c:1825
 msgid "Conflict"
 msgstr "Ütközés"
 
-#: ../libpurple/protocols/jabber/jabber.c:1849
+#: ../libpurple/protocols/jabber/jabber.c:1827
 msgid "Feature Not Implemented"
 msgstr "A szolgáltatás nincs megvalósítva"
 
-#: ../libpurple/protocols/jabber/jabber.c:1851
+#: ../libpurple/protocols/jabber/jabber.c:1829
 msgid "Forbidden"
 msgstr "Tiltva"
 
-#: ../libpurple/protocols/jabber/jabber.c:1853
+#: ../libpurple/protocols/jabber/jabber.c:1831
 msgid "Gone"
 msgstr "Elment"
 
-#: ../libpurple/protocols/jabber/jabber.c:1855
-#: ../libpurple/protocols/jabber/jabber.c:1935
+#: ../libpurple/protocols/jabber/jabber.c:1833
+#: ../libpurple/protocols/jabber/jabber.c:1913
 msgid "Internal Server Error"
 msgstr "Belső kiszolgálóhiba"
 
-#: ../libpurple/protocols/jabber/jabber.c:1857
+#: ../libpurple/protocols/jabber/jabber.c:1835
 msgid "Item Not Found"
 msgstr "Az elem nem található"
 
-#: ../libpurple/protocols/jabber/jabber.c:1859
+#: ../libpurple/protocols/jabber/jabber.c:1837
 msgid "Malformed XMPP ID"
 msgstr "Rosszul formázott XMPP azonosító"
 
-#: ../libpurple/protocols/jabber/jabber.c:1861
+#: ../libpurple/protocols/jabber/jabber.c:1839
 msgid "Not Acceptable"
 msgstr "Nem fogadható el"
 
-#: ../libpurple/protocols/jabber/jabber.c:1863
+#: ../libpurple/protocols/jabber/jabber.c:1841
 msgid "Not Allowed"
 msgstr "Nem engedélyezett"
 
-#: ../libpurple/protocols/jabber/jabber.c:1867
+#: ../libpurple/protocols/jabber/jabber.c:1845
 msgid "Payment Required"
 msgstr "Fizetés szükséges"
 
-#: ../libpurple/protocols/jabber/jabber.c:1869
+#: ../libpurple/protocols/jabber/jabber.c:1847
 msgid "Recipient Unavailable"
 msgstr "A címzett nem érhető el"
 
-#: ../libpurple/protocols/jabber/jabber.c:1873
+#: ../libpurple/protocols/jabber/jabber.c:1851
 msgid "Registration Required"
 msgstr "Regisztráció szükséges"
 
-#: ../libpurple/protocols/jabber/jabber.c:1875
+#: ../libpurple/protocols/jabber/jabber.c:1853
 msgid "Remote Server Not Found"
 msgstr "A távoli kiszolgáló nem található"
 
-#: ../libpurple/protocols/jabber/jabber.c:1877
+#: ../libpurple/protocols/jabber/jabber.c:1855
 msgid "Remote Server Timeout"
 msgstr "Időtúllépés a távoli kiszolgálón"
 
-#: ../libpurple/protocols/jabber/jabber.c:1879
+#: ../libpurple/protocols/jabber/jabber.c:1857
 msgid "Server Overloaded"
 msgstr "A kiszolgáló túl van terhelve"
 
-#: ../libpurple/protocols/jabber/jabber.c:1881
+#: ../libpurple/protocols/jabber/jabber.c:1859
 msgid "Service Unavailable"
 msgstr "A szolgáltatás nem érhető el"
 
-#: ../libpurple/protocols/jabber/jabber.c:1883
+#: ../libpurple/protocols/jabber/jabber.c:1861
 msgid "Subscription Required"
 msgstr "Feliratkozás szükséges"
 
-#: ../libpurple/protocols/jabber/jabber.c:1885
+#: ../libpurple/protocols/jabber/jabber.c:1863
 msgid "Unexpected Request"
 msgstr "Váratlan kérés"
 
-#: ../libpurple/protocols/jabber/jabber.c:1892
+#: ../libpurple/protocols/jabber/jabber.c:1870
 msgid "Authorization Aborted"
 msgstr "Hitelesítés megszakítva"
 
-#: ../libpurple/protocols/jabber/jabber.c:1894
+#: ../libpurple/protocols/jabber/jabber.c:1872
 msgid "Incorrect encoding in authorization"
 msgstr "Hibás kódolás a hitelesítésben"
 
-#: ../libpurple/protocols/jabber/jabber.c:1897
+#: ../libpurple/protocols/jabber/jabber.c:1875
 msgid "Invalid authzid"
 msgstr "Érvénytelen authzid"
 
-#: ../libpurple/protocols/jabber/jabber.c:1900
+#: ../libpurple/protocols/jabber/jabber.c:1878
 msgid "Invalid Authorization Mechanism"
 msgstr "Érvénytelen hitelesítési eljárás"
 
-#: ../libpurple/protocols/jabber/jabber.c:1903
+#: ../libpurple/protocols/jabber/jabber.c:1881
 msgid "Authorization mechanism too weak"
 msgstr "A hitelesítési eljárás túl gyenge"
 
-#: ../libpurple/protocols/jabber/jabber.c:1911
+#: ../libpurple/protocols/jabber/jabber.c:1889
 msgid "Temporary Authentication Failure"
 msgstr "Átmeneti hitelesítési hiba"
 
-#: ../libpurple/protocols/jabber/jabber.c:1914
+#: ../libpurple/protocols/jabber/jabber.c:1892
 msgid "Authentication Failure"
 msgstr "Hitelesítési hiba"
 
-#: ../libpurple/protocols/jabber/jabber.c:1920
+#: ../libpurple/protocols/jabber/jabber.c:1898
 msgid "Bad Format"
 msgstr "Rossz formátum"
 
-#: ../libpurple/protocols/jabber/jabber.c:1922
+#: ../libpurple/protocols/jabber/jabber.c:1900
 msgid "Bad Namespace Prefix"
 msgstr "Rossz névtér-előtag"
 
-#: ../libpurple/protocols/jabber/jabber.c:1925
+#: ../libpurple/protocols/jabber/jabber.c:1903
 msgid "Resource Conflict"
 msgstr "Erőforrás-ütközés"
 
-#: ../libpurple/protocols/jabber/jabber.c:1927
-#: ../libpurple/protocols/silc/silc.c:244
+#: ../libpurple/protocols/jabber/jabber.c:1905
+#: ../libpurple/protocols/silc/silc.c:344
 #: ../libpurple/protocols/silc10/ops.c:1720
 msgid "Connection Timeout"
 msgstr "Időtúllépés miatt a kapcsolat megszakadt"
 
-#: ../libpurple/protocols/jabber/jabber.c:1929
+#: ../libpurple/protocols/jabber/jabber.c:1907
 msgid "Host Gone"
 msgstr "A gép eltűnt"
 
-#: ../libpurple/protocols/jabber/jabber.c:1931
+#: ../libpurple/protocols/jabber/jabber.c:1909
 msgid "Host Unknown"
 msgstr "Ismeretlen gép"
 
-#: ../libpurple/protocols/jabber/jabber.c:1933
+#: ../libpurple/protocols/jabber/jabber.c:1911
 msgid "Improper Addressing"
 msgstr "Hiányos címzés"
 
-#: ../libpurple/protocols/jabber/jabber.c:1937
+#: ../libpurple/protocols/jabber/jabber.c:1915
 msgid "Invalid ID"
 msgstr "Érvénytelen azonosító"
 
-#: ../libpurple/protocols/jabber/jabber.c:1939
+#: ../libpurple/protocols/jabber/jabber.c:1917
 msgid "Invalid Namespace"
 msgstr "Érvénytelen névtér"
 
-#: ../libpurple/protocols/jabber/jabber.c:1941
+#: ../libpurple/protocols/jabber/jabber.c:1919
 msgid "Invalid XML"
 msgstr "Érvénytelen XML"
 
-#: ../libpurple/protocols/jabber/jabber.c:1943
+#: ../libpurple/protocols/jabber/jabber.c:1921
 msgid "Non-matching Hosts"
 msgstr "Nem illeszkedő gépek"
 
-#: ../libpurple/protocols/jabber/jabber.c:1947
+#: ../libpurple/protocols/jabber/jabber.c:1925
 msgid "Policy Violation"
 msgstr "Szabályok megsértése"
 
-#: ../libpurple/protocols/jabber/jabber.c:1949
+#: ../libpurple/protocols/jabber/jabber.c:1927
 msgid "Remote Connection Failed"
 msgstr "Távoli kapcsolat sikertelen"
 
-#: ../libpurple/protocols/jabber/jabber.c:1951
+#: ../libpurple/protocols/jabber/jabber.c:1929
 msgid "Resource Constraint"
 msgstr "Erőforrás-megszorítás"
 
-#: ../libpurple/protocols/jabber/jabber.c:1953
+#: ../libpurple/protocols/jabber/jabber.c:1931
 msgid "Restricted XML"
 msgstr "Korlátozott XML"
 
-#: ../libpurple/protocols/jabber/jabber.c:1955
+#: ../libpurple/protocols/jabber/jabber.c:1933
 msgid "See Other Host"
 msgstr "Lásd a másik gépet"
 
-#: ../libpurple/protocols/jabber/jabber.c:1957
+#: ../libpurple/protocols/jabber/jabber.c:1935
 msgid "System Shutdown"
 msgstr "Rendszerleállítás"
 
-#: ../libpurple/protocols/jabber/jabber.c:1959
+#: ../libpurple/protocols/jabber/jabber.c:1937
 msgid "Undefined Condition"
 msgstr "Meghatározatlan feltétel"
 
-#: ../libpurple/protocols/jabber/jabber.c:1961
+#: ../libpurple/protocols/jabber/jabber.c:1939
 msgid "Unsupported Encoding"
 msgstr "Nem támogatott kódolás"
 
-#: ../libpurple/protocols/jabber/jabber.c:1963
+#: ../libpurple/protocols/jabber/jabber.c:1941
 msgid "Unsupported Stanza Type"
 msgstr "Nem támogatott Stanza típus"
 
-#: ../libpurple/protocols/jabber/jabber.c:1965
+#: ../libpurple/protocols/jabber/jabber.c:1943
 msgid "Unsupported Version"
 msgstr "Nem támogatott verzió"
 
-#: ../libpurple/protocols/jabber/jabber.c:1967
+#: ../libpurple/protocols/jabber/jabber.c:1945
 msgid "XML Not Well Formed"
 msgstr "Nem megfelelően formázott XML"
 
-#: ../libpurple/protocols/jabber/jabber.c:1969
+#: ../libpurple/protocols/jabber/jabber.c:1947
 msgid "Stream Error"
 msgstr "Folyamhiba"
 
-#: ../libpurple/protocols/jabber/jabber.c:2052
+#: ../libpurple/protocols/jabber/jabber.c:2030
 #, c-format
 msgid "Unable to ban user %s"
 msgstr "Nem lehet kitiltani %s felhasználót"
 
-#: ../libpurple/protocols/jabber/jabber.c:2072
+#: ../libpurple/protocols/jabber/jabber.c:2050
 #, c-format
 msgid "Unknown affiliation: \"%s\""
 msgstr "Ismeretlen kapcsolat: \"%s\""
 
-#: ../libpurple/protocols/jabber/jabber.c:2077
+#: ../libpurple/protocols/jabber/jabber.c:2055
 #, c-format
 msgid "Unable to affiliate user %s as \"%s\""
 msgstr "%s felhasználó kapcsolata nem állítható be a következőre: \"%s\""
 
-#: ../libpurple/protocols/jabber/jabber.c:2096
+#: ../libpurple/protocols/jabber/jabber.c:2074
 #, c-format
 msgid "Unknown role: \"%s\""
 msgstr "Ismeretlen szerep: \"%s\""
 
-#: ../libpurple/protocols/jabber/jabber.c:2101
+#: ../libpurple/protocols/jabber/jabber.c:2079
 #, c-format
 msgid "Unable to set role \"%s\" for user: %s"
 msgstr "A(z) \"%s\" szerep nem állítható be a következő felhasználónak: %s"
 
-#: ../libpurple/protocols/jabber/jabber.c:2154
+#: ../libpurple/protocols/jabber/jabber.c:2132
 #, c-format
 msgid "Unable to kick user %s"
 msgstr "Nem lehet kirúgni %s felhasználót"
 
-#: ../libpurple/protocols/jabber/jabber.c:2185
-#, fuzzy, c-format
+#: ../libpurple/protocols/jabber/jabber.c:2163
+#, c-format
 msgid "Unable to ping user %s"
-msgstr "Nem lehet kitiltani %s felhasználót"
-
-#: ../libpurple/protocols/jabber/jabber.c:2207
-#: ../libpurple/protocols/jabber/jabber.c:2217
+msgstr "%s felhasználó nem pingelhető"
+
+#: ../libpurple/protocols/jabber/jabber.c:2181
+#: ../libpurple/protocols/jabber/jabber.c:2192
 #, c-format
 msgid "Unable to buzz, because there is nothing known about user %s."
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:2213
+msgstr "Nem lehet csörgetni, mivel nem érhető el információ %s felhasználóról."
+
+#: ../libpurple/protocols/jabber/jabber.c:2187
 #, c-format
 msgid "Unable to buzz, because user %s might be offline."
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:2239
-#, fuzzy, c-format
+msgstr "Nem lehet csörgetni, mivel %s felhasználó kiléphetett."
+
+#: ../libpurple/protocols/jabber/jabber.c:2218
+#, c-format
 msgid "Unable to buzz, because the user %s does not support it."
-msgstr ""
-"Nem lehet fájlt küldeni a következőnek: %s, mert a felhasználó nem támogatja "
-"fájlok átvitelét"
-
-#: ../libpurple/protocols/jabber/jabber.c:2253
+msgstr "Nem lehet csörgetni, mivel %s felhasználó nem támogatja azt."
+
+#: ../libpurple/protocols/jabber/jabber.c:2240
+#: ../libpurple/protocols/yahoo/yahoo.c:4121
+msgid "Buzz"
+msgstr "Csörgetés"
+
+#: ../libpurple/protocols/jabber/jabber.c:2241
+#: ../libpurple/protocols/jabber/message.c:308
+#: ../libpurple/protocols/yahoo/yahoo.c:4122
+#, c-format
+msgid "%s has buzzed you!"
+msgstr "%s megcsörgette!"
+
+#: ../libpurple/protocols/jabber/jabber.c:2242
+#: ../libpurple/protocols/yahoo/yahoo.c:4123
+#, c-format
+msgid "Buzzing %s..."
+msgstr "%s csörgetése..."
+
+#: ../libpurple/protocols/jabber/jabber.c:2274
 msgid "config:  Configure a chat room."
 msgstr "config:   Csevegőszoba beállítása."
 
-#: ../libpurple/protocols/jabber/jabber.c:2257
+#: ../libpurple/protocols/jabber/jabber.c:2278
 msgid "configure:  Configure a chat room."
 msgstr "configure:  Csevegőszoba beállítása."
 
-#: ../libpurple/protocols/jabber/jabber.c:2266
+#: ../libpurple/protocols/jabber/jabber.c:2287
 msgid "part [room]:  Leave the room."
 msgstr "part [szoba]:  A szoba elhagyása."
 
-#: ../libpurple/protocols/jabber/jabber.c:2271
+#: ../libpurple/protocols/jabber/jabber.c:2292
 msgid "register:  Register with a chat room."
 msgstr "register:  Regisztráció csevegőszobánál."
 
-#: ../libpurple/protocols/jabber/jabber.c:2277
+#: ../libpurple/protocols/jabber/jabber.c:2298
 msgid "topic [new topic]:  View or change the topic."
 msgstr "topic [új téma]:  A téma megtekintése vagy megváltoztatása."
 
-#: ../libpurple/protocols/jabber/jabber.c:2283
+#: ../libpurple/protocols/jabber/jabber.c:2304
 msgid "ban &lt;user&gt; [room]:  Ban a user from the room."
 msgstr "ban &lt;felhasználó&gt; [szoba]:  Felhasználó kitiltása a szobából."
 
-#: ../libpurple/protocols/jabber/jabber.c:2289
+#: ../libpurple/protocols/jabber/jabber.c:2310
 msgid ""
 "affiliate &lt;user&gt; &lt;owner|admin|member|outcast|none&gt;: Set a user's "
 "affiliation with the room."
@@ -6097,7 +6126,7 @@
 "affiliate &lt;felhasználó&gt; &lt;owner|admin|member|outcast|none&gt;: Egy "
 "felhasználó a szobával fennálló kapcsolatának beállítása."
 
-#: ../libpurple/protocols/jabber/jabber.c:2295
+#: ../libpurple/protocols/jabber/jabber.c:2316
 msgid ""
 "role &lt;user&gt; &lt;moderator|participant|visitor|none&gt;: Set a user's "
 "role in the room."
@@ -6105,33 +6134,32 @@
 "role &lt;felhasználó&gt; &lt;moderator|participant|visitor|none&gt;: "
 "Beállítja a felhasználó szerepét a szobában."
 
-#: ../libpurple/protocols/jabber/jabber.c:2301
+#: ../libpurple/protocols/jabber/jabber.c:2322
 msgid "invite &lt;user&gt; [message]:  Invite a user to the room."
 msgstr "invite &lt;felhasználó&gt; [üzenet]:  Felhasználó meghívása a szobába."
 
-#: ../libpurple/protocols/jabber/jabber.c:2307
+#: ../libpurple/protocols/jabber/jabber.c:2328
 msgid "join: &lt;room&gt; [server]:  Join a chat on this server."
 msgstr ""
 "join: &lt;szoba&gt; [kiszolgáló]:  Csatlakozás csevegéshez a megadott "
 "kiszolgálón."
 
-#: ../libpurple/protocols/jabber/jabber.c:2313
+#: ../libpurple/protocols/jabber/jabber.c:2334
 msgid "kick &lt;user&gt; [room]:  Kick a user from the room."
 msgstr "kick &lt;felhasználó&gt; [szoba]:  Felhasználó kirúgása a szobából."
 
-#: ../libpurple/protocols/jabber/jabber.c:2318
-msgid ""
-"msg &lt;user&gt; &lt;message&gt;:  Send a private message to another user."
+#: ../libpurple/protocols/jabber/jabber.c:2339
+msgid "msg &lt;user&gt; &lt;message&gt;:  Send a private message to another user."
 msgstr ""
 "msg &lt;felhasználó&gt; &lt;üzenet&gt;:  Magánüzenet küldése másik "
 "felhasználónak."
 
-#: ../libpurple/protocols/jabber/jabber.c:2324
+#: ../libpurple/protocols/jabber/jabber.c:2345
 msgid "ping &lt;jid&gt;:\tPing a user/component/server."
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:2329
-#: ../libpurple/protocols/yahoo/yahoo.c:4145
+msgstr "ping &lt;azonosító&gt;:\tFelhasználó/összetevő/kiszolgáló pingelése"
+
+#: ../libpurple/protocols/jabber/jabber.c:2350
+#: ../libpurple/protocols/yahoo/yahoo.c:4147
 msgid "buzz: Buzz a user to get their attention"
 msgstr "buzz: Felhasználó megcsörgetése figyelemfelhívási céllal"
 
@@ -6151,35 +6179,35 @@
 msgstr "XMPP protokollbővítmény"
 
 #. Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im
-#: ../libpurple/protocols/jabber/libxmpp.c:202 ../pidgin/gtkaccount.c:506
+#: ../libpurple/protocols/jabber/libxmpp.c:205 ../pidgin/gtkaccount.c:509
 msgid "Domain"
 msgstr "Tartomány"
 
-#: ../libpurple/protocols/jabber/libxmpp.c:210
+#: ../libpurple/protocols/jabber/libxmpp.c:213
 msgid "Require SSL/TLS"
-msgstr ""
-
-#: ../libpurple/protocols/jabber/libxmpp.c:214
+msgstr "SSL/TLS megkövetelése"
+
+#: ../libpurple/protocols/jabber/libxmpp.c:217
 msgid "Force old (port 5223) SSL"
 msgstr "Régi (5223 port) SSL kényszerítése"
 
-#: ../libpurple/protocols/jabber/libxmpp.c:219
+#: ../libpurple/protocols/jabber/libxmpp.c:222
 msgid "Allow plaintext auth over unencrypted streams"
 msgstr "Egyszerű szöveges hitelesítés engedélyezése nem titkosított folyamokon"
 
-#: ../libpurple/protocols/jabber/libxmpp.c:224
-#: ../libpurple/protocols/myspace/myspace.c:3277
-#: ../libpurple/protocols/simple/simple.c:1902
+#: ../libpurple/protocols/jabber/libxmpp.c:227
+#: ../libpurple/protocols/myspace/myspace.c:3283
+#: ../libpurple/protocols/simple/simple.c:2067
 msgid "Connect port"
 msgstr "Kapcsolódási port"
 
 #. TODO: default to automatically try different ports. Make the user be
 #. * able to set the first port to try (like LastConnectedPort in Windows client).
 #. Account options
-#: ../libpurple/protocols/jabber/libxmpp.c:228
-#: ../libpurple/protocols/myspace/myspace.c:3274
-#: ../libpurple/protocols/silc/silc.c:1914
-#: ../libpurple/protocols/silc10/silc.c:1857 ../pidgin/gtkaccount.c:837
+#: ../libpurple/protocols/jabber/libxmpp.c:231
+#: ../libpurple/protocols/myspace/myspace.c:3280
+#: ../libpurple/protocols/silc/silc.c:2045
+#: ../libpurple/protocols/silc10/silc.c:1860 ../pidgin/gtkaccount.c:840
 msgid "Connect server"
 msgstr "Kapcsolatkiszolgáló"
 
@@ -6188,37 +6216,31 @@
 msgid "%s has left the conversation."
 msgstr "%s elhagyta a társalgást."
 
-#: ../libpurple/protocols/jabber/message.c:161
+#: ../libpurple/protocols/jabber/message.c:162
 #, c-format
 msgid "Message from %s"
 msgstr "%s üzenetet küldött"
 
-#: ../libpurple/protocols/jabber/message.c:225
+#: ../libpurple/protocols/jabber/message.c:226
 #, c-format
 msgid "%s has set the topic to: %s"
 msgstr "%s a következő témát állította be: %s"
 
-#: ../libpurple/protocols/jabber/message.c:227
+#: ../libpurple/protocols/jabber/message.c:228
 #, c-format
 msgid "The topic is: %s"
 msgstr "A téma: %s"
 
-#: ../libpurple/protocols/jabber/message.c:275
+#: ../libpurple/protocols/jabber/message.c:276
 #, c-format
 msgid "Message delivery to %s failed: %s"
 msgstr "Az üzenet eljuttatása a következőhöz: %s sikertelen: %s"
 
-#: ../libpurple/protocols/jabber/message.c:278
+#: ../libpurple/protocols/jabber/message.c:279
 msgid "XMPP Message Error"
 msgstr "XMPP üzenethiba"
 
-#: ../libpurple/protocols/jabber/message.c:307
-#: ../libpurple/protocols/yahoo/yahoo.c:4120
-#, fuzzy, c-format
-msgid "%s has buzzed you!"
-msgstr "%s belépett."
-
-#: ../libpurple/protocols/jabber/message.c:407
+#: ../libpurple/protocols/jabber/message.c:408
 #, c-format
 msgid " (Code %s)"
 msgstr " (%s kód)"
@@ -6227,16 +6249,16 @@
 msgid "XML Parse error"
 msgstr "XML elemzési hiba"
 
-#: ../libpurple/protocols/jabber/presence.c:427
+#: ../libpurple/protocols/jabber/presence.c:435
 msgid "Unknown Error in presence"
 msgstr "Ismeretlen hiba a jelenlétben"
 
-#: ../libpurple/protocols/jabber/presence.c:508
-#: ../libpurple/protocols/jabber/presence.c:509
+#: ../libpurple/protocols/jabber/presence.c:516
+#: ../libpurple/protocols/jabber/presence.c:517
 msgid "Create New Room"
 msgstr "Új szoba létrehozása"
 
-#: ../libpurple/protocols/jabber/presence.c:510
+#: ../libpurple/protocols/jabber/presence.c:518
 msgid ""
 "You are creating a new room.  Would you like to configure it, or accept the "
 "default settings?"
@@ -6244,20 +6266,20 @@
 "Új szobát hoz létre. Szeretné beállítani, vagy elfogadja az "
 "alapbeállításokat?"
 
-#: ../libpurple/protocols/jabber/presence.c:516
+#: ../libpurple/protocols/jabber/presence.c:524
 msgid "_Configure Room"
 msgstr "Sz_oba beállítása"
 
-#: ../libpurple/protocols/jabber/presence.c:517
+#: ../libpurple/protocols/jabber/presence.c:525
 msgid "_Accept Defaults"
 msgstr "Alapértel_mezések elfogadása"
 
-#: ../libpurple/protocols/jabber/presence.c:559
+#: ../libpurple/protocols/jabber/presence.c:567
 #, c-format
 msgid "Error in chat %s"
 msgstr "Hiba a(z) %s csevegésben"
 
-#: ../libpurple/protocols/jabber/presence.c:563
+#: ../libpurple/protocols/jabber/presence.c:571
 #, c-format
 msgid "Error joining chat %s"
 msgstr "Hiba a(z) %s csevegéshez csatlakozás közben"
@@ -6301,64 +6323,64 @@
 msgid "Select a Resource"
 msgstr "Válasszon erőforrást"
 
-#: ../libpurple/protocols/jabber/usermood.c:179
-#: ../libpurple/protocols/jabber/usermood.c:180
-#, fuzzy
+#: ../libpurple/protocols/jabber/usermood.c:197
+#: ../libpurple/protocols/jabber/usermood.c:198
 msgid "Edit User Mood"
-msgstr "Felhasználói módok"
-
-#: ../libpurple/protocols/jabber/usermood.c:181
+msgstr "Felhasználói hangulat szerkesztése"
+
+#: ../libpurple/protocols/jabber/usermood.c:199
 msgid "Please select your mood from the list."
-msgstr ""
-
-#: ../libpurple/protocols/jabber/usermood.c:183
+msgstr "Válassza ki a hangulatát a listából."
+
+#: ../libpurple/protocols/jabber/usermood.c:201
 #: ../libpurple/protocols/jabber/usernick.c:78
-#, fuzzy
 msgid "Set"
-msgstr "_Beállítás"
-
-#: ../libpurple/protocols/jabber/usermood.c:191
-#, fuzzy
+msgstr "Beállítás"
+
+#: ../libpurple/protocols/jabber/usermood.c:209
 msgid "Set Mood..."
-msgstr "Üzenet küldése..."
+msgstr "Hangulat beállítása..."
 
 #: ../libpurple/protocols/jabber/usernick.c:76
-#, fuzzy
 msgid "Set User Nickname"
-msgstr "Felhasználószám korlátozása"
+msgstr "Felhasználói becenév beállítása"
 
 #: ../libpurple/protocols/jabber/usernick.c:76
-#, fuzzy
 msgid "Please specify a new nickname for you."
-msgstr "Kérem adja meg új  %snevét"
+msgstr "Adja meg az új becenevét"
 
 #: ../libpurple/protocols/jabber/usernick.c:77
 msgid ""
 "This information is visible to all contacts on your contact list, so choose "
 "something appropriate."
 msgstr ""
-
-#: ../libpurple/protocols/jabber/usernick.c:99
-#, fuzzy
+"Ezen információk a partnerlistán lévő minden partner számára látható, "
+"válasszon ennek megfelelően."
+
+#: ../libpurple/protocols/jabber/usernick.c:100
 msgid "Set Nickname..."
-msgstr "Becenév"
+msgstr "Becenév beállítása..."
 
 #: ../libpurple/protocols/jabber/xdata.c:378
-#, fuzzy
 msgid "Actions"
-msgstr "Művelet"
+msgstr "Műveletek"
 
 #: ../libpurple/protocols/jabber/xdata.c:380
-#, fuzzy
 msgid "Select an action"
-msgstr "Fájl kiválasztása"
-
-#: ../libpurple/protocols/msn/dialog.c:110
+msgstr "Válasszon műveletet"
+
+#: ../libpurple/protocols/msn/contact.c:712
+msgid "Unable to retrieve MSN Address Book"
+msgstr "Az MSN címjegyzék nem kérhető le"
+
+#: ../libpurple/protocols/msn/dialog.c:118
+#: ../libpurple/protocols/msnp9/dialog.c:110
 #, c-format
 msgid "Buddy list synchronization issue in %s (%s)"
 msgstr "Partnerlista-szinkronizációs probléma itt: %s (%s)"
 
-#: ../libpurple/protocols/msn/dialog.c:116
+#: ../libpurple/protocols/msn/dialog.c:124
+#: ../libpurple/protocols/msnp9/dialog.c:116
 #, c-format
 msgid ""
 "%s on the local list is inside the group \"%s\" but not on the server list. "
@@ -6367,7 +6389,8 @@
 "%s a helyi listán a(z) %s csoport tagja, de a kiszolgáló listáján nem az. "
 "Szeretné ezt a partnert felvenni?"
 
-#: ../libpurple/protocols/msn/dialog.c:124
+#: ../libpurple/protocols/msn/dialog.c:132
+#: ../libpurple/protocols/msnp9/dialog.c:124
 #, c-format
 msgid ""
 "%s is on the local list but not on the server list. Do you want this buddy "
@@ -6377,163 +6400,195 @@
 "partnert felvenni?"
 
 #: ../libpurple/protocols/msn/error.c:36
+#: ../libpurple/protocols/msnp9/error.c:36
 #, c-format
 msgid "Unable to parse message"
 msgstr "Az üzenetet nem sikerült értelmezni"
 
 #: ../libpurple/protocols/msn/error.c:41
+#: ../libpurple/protocols/msnp9/error.c:41
 #, c-format
 msgid "Syntax Error (probably a client bug)"
 msgstr "Szintaktikai hiba (valószínűleg klienshiba)"
 
 #: ../libpurple/protocols/msn/error.c:46
+#: ../libpurple/protocols/msnp9/error.c:46
 #, c-format
 msgid "Invalid e-mail address"
 msgstr "Érvénytelen e-mail cím"
 
 #: ../libpurple/protocols/msn/error.c:49
+#: ../libpurple/protocols/msnp9/error.c:49
 #, c-format
 msgid "User does not exist"
 msgstr "A felhasználó nem létezik"
 
 #: ../libpurple/protocols/msn/error.c:53
+#: ../libpurple/protocols/msnp9/error.c:53
 #, c-format
 msgid "Fully qualified domain name missing"
 msgstr "A teljesen minősített tartománynév hiányzik"
 
 #: ../libpurple/protocols/msn/error.c:56
+#: ../libpurple/protocols/msnp9/error.c:56
 #, c-format
 msgid "Already logged in"
 msgstr "Már be van jelentkezve"
 
 #: ../libpurple/protocols/msn/error.c:59
+#: ../libpurple/protocols/msnp9/error.c:59
 #, c-format
 msgid "Invalid screen name"
 msgstr "Érvénytelen felhasználónév"
 
 #: ../libpurple/protocols/msn/error.c:62
+#: ../libpurple/protocols/msnp9/error.c:62
 #, c-format
 msgid "Invalid friendly name"
 msgstr "Érvénytelen becenév"
 
 #: ../libpurple/protocols/msn/error.c:65
+#: ../libpurple/protocols/msnp9/error.c:65
 #, c-format
 msgid "List full"
 msgstr "A lista megtelt"
 
 #: ../libpurple/protocols/msn/error.c:68
+#: ../libpurple/protocols/msnp9/error.c:68
 #, c-format
 msgid "Already there"
 msgstr "Már rajta van"
 
 #: ../libpurple/protocols/msn/error.c:72
+#: ../libpurple/protocols/msnp9/error.c:72
 #, c-format
 msgid "Not on list"
 msgstr "Nincs a listán"
 
 #: ../libpurple/protocols/msn/error.c:75
+#: ../libpurple/protocols/msnp9/error.c:75
 #: ../libpurple/protocols/zephyr/zephyr.c:756
 #, c-format
 msgid "User is offline"
 msgstr "A felhasználó nem érhető el"
 
 #: ../libpurple/protocols/msn/error.c:78
+#: ../libpurple/protocols/msnp9/error.c:78
 #, c-format
 msgid "Already in the mode"
 msgstr "Már be van állítva ez a mód"
 
 #: ../libpurple/protocols/msn/error.c:82
+#: ../libpurple/protocols/msnp9/error.c:82
 #, c-format
 msgid "Already in opposite list"
 msgstr "A másik listán már szerepel"
 
 #: ../libpurple/protocols/msn/error.c:86
+#: ../libpurple/protocols/msnp9/error.c:86
 #, c-format
 msgid "Too many groups"
 msgstr "Túl sok csoport"
 
 #: ../libpurple/protocols/msn/error.c:89
+#: ../libpurple/protocols/msnp9/error.c:89
 #, c-format
 msgid "Invalid group"
 msgstr "Érvénytelen csoport"
 
 #: ../libpurple/protocols/msn/error.c:92
+#: ../libpurple/protocols/msnp9/error.c:92
 #, c-format
 msgid "User not in group"
 msgstr "A felhasználó nincs a csoportban"
 
 #: ../libpurple/protocols/msn/error.c:95
+#: ../libpurple/protocols/msnp9/error.c:95
 #, c-format
 msgid "Group name too long"
 msgstr "A csoportnév túl hosszú"
 
 #: ../libpurple/protocols/msn/error.c:98
+#: ../libpurple/protocols/msnp9/error.c:98
 #, c-format
 msgid "Cannot remove group zero"
 msgstr "A nulla csoportot nem lehet eltávolítani"
 
 #: ../libpurple/protocols/msn/error.c:103
+#: ../libpurple/protocols/msnp9/error.c:103
 #, c-format
 msgid "Tried to add a user to a group that doesn't exist"
 msgstr "Nem létező csoporthoz próbált meg felvenni egy felhasználót"
 
 #: ../libpurple/protocols/msn/error.c:107
+#: ../libpurple/protocols/msnp9/error.c:107
 #, c-format
 msgid "Switchboard failed"
 msgstr "A közvetítés sikertelen"
 
 #: ../libpurple/protocols/msn/error.c:111
+#: ../libpurple/protocols/msnp9/error.c:111
 #, c-format
 msgid "Notify transfer failed"
 msgstr "A figyelmeztetés átvitele meghiúsult"
 
 #: ../libpurple/protocols/msn/error.c:116
+#: ../libpurple/protocols/msnp9/error.c:116
 #, c-format
 msgid "Required fields missing"
 msgstr "Szükséges mezők hiányoznak"
 
 #: ../libpurple/protocols/msn/error.c:120
+#: ../libpurple/protocols/msnp9/error.c:120
 #, c-format
 msgid "Too many hits to a FND"
 msgstr "Túl sok találat az FND-hez"
 
 #: ../libpurple/protocols/msn/error.c:124
+#: ../libpurple/protocols/msnp9/error.c:124
 #: ../libpurple/protocols/oscar/oscar.c:120
 #, c-format
 msgid "Not logged in"
 msgstr "Nincs bejelentkezve"
 
 #: ../libpurple/protocols/msn/error.c:128
+#: ../libpurple/protocols/msnp9/error.c:128
 #, c-format
 msgid "Service temporarily unavailable"
 msgstr "A szolgáltatás átmenetileg nem érhető el"
 
 #: ../libpurple/protocols/msn/error.c:131
+#: ../libpurple/protocols/msnp9/error.c:131
 #, c-format
 msgid "Database server error"
 msgstr "Adatbáziskiszolgáló-hiba"
 
 #: ../libpurple/protocols/msn/error.c:135
+#: ../libpurple/protocols/msnp9/error.c:135
 #, c-format
 msgid "Command disabled"
 msgstr "Parancs letiltva"
 
 #: ../libpurple/protocols/msn/error.c:139
+#: ../libpurple/protocols/msnp9/error.c:139
 #, c-format
 msgid "File operation error"
 msgstr "Fájlművelethiba"
 
 #: ../libpurple/protocols/msn/error.c:143
+#: ../libpurple/protocols/msnp9/error.c:143
 #, c-format
 msgid "Memory allocation error"
 msgstr "Memóriafoglalási hiba"
 
 #: ../libpurple/protocols/msn/error.c:147
+#: ../libpurple/protocols/msnp9/error.c:147
 #, c-format
 msgid "Wrong CHL value sent to server"
 msgstr "Hibás CHL érték lett küldve a kiszolgálónak"
 
 #: ../libpurple/protocols/msn/error.c:152
+#: ../libpurple/protocols/msnp9/error.c:152
 #, c-format
 msgid "Server busy"
 msgstr "A kiszolgáló foglalt"
@@ -6541,168 +6596,192 @@
 #: ../libpurple/protocols/msn/error.c:155
 #: ../libpurple/protocols/msn/error.c:170
 #: ../libpurple/protocols/msn/error.c:230
+#: ../libpurple/protocols/msnp9/error.c:155
+#: ../libpurple/protocols/msnp9/error.c:170
+#: ../libpurple/protocols/msnp9/error.c:230
 #, c-format
 msgid "Server unavailable"
 msgstr "A kiszolgáló nem érhető el"
 
 #: ../libpurple/protocols/msn/error.c:158
+#: ../libpurple/protocols/msnp9/error.c:158
 #, c-format
 msgid "Peer notification server down"
 msgstr "A partnerértesítő kiszolgáló nem üzemel"
 
 #: ../libpurple/protocols/msn/error.c:162
+#: ../libpurple/protocols/msnp9/error.c:162
 #, c-format
 msgid "Database connect error"
 msgstr "Adatbázis-kapcsolódási hiba"
 
 #: ../libpurple/protocols/msn/error.c:167
+#: ../libpurple/protocols/msnp9/error.c:167
 #, c-format
 msgid "Server is going down (abandon ship)"
 msgstr "A kiszolgáló leáll (jelentkezzen ki)"
 
 #: ../libpurple/protocols/msn/error.c:174
+#: ../libpurple/protocols/msnp9/error.c:174
 #, c-format
 msgid "Error creating connection"
 msgstr "Hiba a kapcsolat létrehozásakor"
 
 #: ../libpurple/protocols/msn/error.c:179
+#: ../libpurple/protocols/msnp9/error.c:179
 #, c-format
 msgid "CVR parameters are either unknown or not allowed"
 msgstr "Ismeretlen vagy nem engedélyezett CVR paraméterek"
 
 #: ../libpurple/protocols/msn/error.c:183
+#: ../libpurple/protocols/msnp9/error.c:183
 #, c-format
 msgid "Unable to write"
 msgstr "Nem lehet írni"
 
 #: ../libpurple/protocols/msn/error.c:186
+#: ../libpurple/protocols/msnp9/error.c:186
 #, c-format
 msgid "Session overload"
 msgstr "Folyamat túlterhelve"
 
 #: ../libpurple/protocols/msn/error.c:190
+#: ../libpurple/protocols/msnp9/error.c:190
 #, c-format
 msgid "User is too active"
 msgstr "A felhasználó túl aktív"
 
 #: ../libpurple/protocols/msn/error.c:193
+#: ../libpurple/protocols/msnp9/error.c:193
 #, c-format
 msgid "Too many sessions"
 msgstr "Túl sok folyamat"
 
 #: ../libpurple/protocols/msn/error.c:196
+#: ../libpurple/protocols/msnp9/error.c:196
 #, c-format
 msgid "Passport not verified"
 msgstr "Passport (MSN igazolvány) nincs ellenőrizve"
 
 #: ../libpurple/protocols/msn/error.c:199
+#: ../libpurple/protocols/msnp9/error.c:199
 #, c-format
 msgid "Bad friend file"
 msgstr "Hibás barát-fájl"
 
 #: ../libpurple/protocols/msn/error.c:203
+#: ../libpurple/protocols/msnp9/error.c:203
 #, c-format
 msgid "Not expected"
 msgstr "Váratlan"
 
 #: ../libpurple/protocols/msn/error.c:209
+#: ../libpurple/protocols/msnp9/error.c:209
 #, c-format
 msgid "Friendly name changes too rapidly"
 msgstr "A felhasználónév túl gyorsan változik"
 
 #: ../libpurple/protocols/msn/error.c:218
+#: ../libpurple/protocols/msnp9/error.c:218
 #, c-format
 msgid "Server too busy"
 msgstr "A kiszolgáló túl elfoglalt"
 
 #: ../libpurple/protocols/msn/error.c:222
-#: ../libpurple/protocols/oscar/oscar.c:1380
-#: ../libpurple/protocols/silc/silc.c:233
+#: ../libpurple/protocols/msnp9/error.c:222
+#: ../libpurple/protocols/oscar/oscar.c:1383
+#: ../libpurple/protocols/silc/silc.c:333
 #: ../libpurple/protocols/silc10/ops.c:1709
-#: ../libpurple/protocols/toc/toc.c:728 ../libpurple/proxy.c:1380
+#: ../libpurple/protocols/toc/toc.c:728 ../libpurple/proxy.c:1393
 #, c-format
 msgid "Authentication failed"
 msgstr "Hitelesítés sikertelen"
 
 #: ../libpurple/protocols/msn/error.c:225
+#: ../libpurple/protocols/msnp9/error.c:225
 #, c-format
 msgid "Not allowed when offline"
 msgstr "Nem engedélyezett kijelentkezett állapotban"
 
 #: ../libpurple/protocols/msn/error.c:233
+#: ../libpurple/protocols/msnp9/error.c:233
 #, c-format
 msgid "Not accepting new users"
 msgstr "Nem fogad új felhasználókat"
 
 #: ../libpurple/protocols/msn/error.c:237
+#: ../libpurple/protocols/msnp9/error.c:237
 #, c-format
 msgid "Kids Passport without parental consent"
 msgstr "Gyermekek Passport-ja (MSN igazolvány) szülői beleegyezés nélkül"
 
 #: ../libpurple/protocols/msn/error.c:241
+#: ../libpurple/protocols/msnp9/error.c:241
 #, c-format
 msgid "Passport account not yet verified"
 msgstr "Passport fiók (MSN igazolvány) még nincs ellenőrizve"
 
 #: ../libpurple/protocols/msn/error.c:244
+#: ../libpurple/protocols/msnp9/error.c:244
 #, c-format
 msgid "Bad ticket"
 msgstr "Rossz jegy"
 
 #: ../libpurple/protocols/msn/error.c:249
+#: ../libpurple/protocols/msnp9/error.c:249
 #, c-format
 msgid "Unknown Error Code %d"
 msgstr "Ismeretlen hibakód %d"
 
 #: ../libpurple/protocols/msn/error.c:263
+#: ../libpurple/protocols/msnp9/error.c:263
 #, c-format
 msgid "MSN Error: %s\n"
 msgstr "MSN hiba: %s\n"
 
-#: ../libpurple/protocols/msn/msn.c:130
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:130 ../libpurple/protocols/msnp9/msn.c:130
 msgid "Nudge"
-msgstr "bökés"
-
-#: ../libpurple/protocols/msn/msn.c:131
-#, fuzzy, c-format
+msgstr "Bökés"
+
+#: ../libpurple/protocols/msn/msn.c:131 ../libpurple/protocols/msnp9/msn.c:131
+#, c-format
 msgid "%s has nudged you!"
-msgstr "%s belépett."
-
-#: ../libpurple/protocols/msn/msn.c:132
-#, fuzzy, c-format
+msgstr "%s megbökte!"
+
+#: ../libpurple/protocols/msn/msn.c:132 ../libpurple/protocols/msnp9/msn.c:132
+#, c-format
 msgid "Nudging %s..."
-msgstr "Bökés"
-
-#: ../libpurple/protocols/msn/msn.c:174
+msgstr "%s bökése..."
+
+#: ../libpurple/protocols/msn/msn.c:174 ../libpurple/protocols/msnp9/msn.c:174
 msgid "Your new MSN friendly name is too long."
 msgstr "Az új MSN beceneve túl hosszú."
 
-#: ../libpurple/protocols/msn/msn.c:282
+#: ../libpurple/protocols/msn/msn.c:286 ../libpurple/protocols/msnp9/msn.c:282
 msgid "Set your friendly name."
 msgstr "Becenév beállítása."
 
-#: ../libpurple/protocols/msn/msn.c:283
+#: ../libpurple/protocols/msn/msn.c:287 ../libpurple/protocols/msnp9/msn.c:283
 msgid "This is the name that other MSN buddies will see you as."
 msgstr "Ezen a néven fogják látni az MSN partnerei."
 
-#: ../libpurple/protocols/msn/msn.c:301
+#: ../libpurple/protocols/msn/msn.c:305 ../libpurple/protocols/msnp9/msn.c:301
 msgid "Set your home phone number."
 msgstr "Otthoni telefonszám beállítása."
 
-#: ../libpurple/protocols/msn/msn.c:318
+#: ../libpurple/protocols/msn/msn.c:322 ../libpurple/protocols/msnp9/msn.c:318
 msgid "Set your work phone number."
 msgstr "Munkahelyi telefonszám beállítása."
 
-#: ../libpurple/protocols/msn/msn.c:335
+#: ../libpurple/protocols/msn/msn.c:339 ../libpurple/protocols/msnp9/msn.c:335
 msgid "Set your mobile phone number."
 msgstr "Mobiltelefonszám beállítása."
 
-#: ../libpurple/protocols/msn/msn.c:350
+#: ../libpurple/protocols/msn/msn.c:354 ../libpurple/protocols/msnp9/msn.c:350
 msgid "Allow MSN Mobile pages?"
 msgstr "Engedélyezi az MSN mobil oldalakat?"
 
-#: ../libpurple/protocols/msn/msn.c:351
+#: ../libpurple/protocols/msn/msn.c:355 ../libpurple/protocols/msnp9/msn.c:351
 msgid ""
 "Do you want to allow or disallow people on your buddy list to send you MSN "
 "Mobile pages to your cell phone or other mobile device?"
@@ -6710,323 +6789,392 @@
 "Engedélyezi vagy megtiltja a listán szereplő partnereinek, hogy mobil "
 "oldalakat küldjenek a mobiltelefonjára vagy más mobil eszközre?"
 
-#: ../libpurple/protocols/msn/msn.c:357
+#: ../libpurple/protocols/msn/msn.c:361 ../libpurple/protocols/msnp9/msn.c:357
 msgid "Allow"
 msgstr "Engedélyezés"
 
-#: ../libpurple/protocols/msn/msn.c:358
+#: ../libpurple/protocols/msn/msn.c:362 ../libpurple/protocols/msnp9/msn.c:358
 msgid "Disallow"
 msgstr "Tiltás"
 
-#: ../libpurple/protocols/msn/msn.c:374
+#: ../libpurple/protocols/msn/msn.c:378 ../libpurple/protocols/msnp9/msn.c:374
 msgid "This Hotmail account may not be active."
 msgstr "Lehetséges, hogy ez a Hotmail fiók nem aktív."
 
-#: ../libpurple/protocols/msn/msn.c:400
+#: ../libpurple/protocols/msn/msn.c:404 ../libpurple/protocols/msnp9/msn.c:400
 msgid "Send a mobile message."
 msgstr "Mobilüzenet küldése."
 
-#: ../libpurple/protocols/msn/msn.c:402
+#: ../libpurple/protocols/msn/msn.c:406 ../libpurple/protocols/msnp9/msn.c:402
 msgid "Page"
 msgstr "Oldal"
 
-#: ../libpurple/protocols/msn/msn.c:549
-msgid "Has you"
-msgstr "Szerepel-e a listáján"
-
-#: ../libpurple/protocols/msn/msn.c:579 ../libpurple/protocols/msn/state.c:33
-#: ../libpurple/protocols/yahoo/yahoo.c:3077
-#: ../libpurple/protocols/yahoo/yahoo.c:3761
+#: ../libpurple/protocols/msn/msn.c:688 ../libpurple/protocols/msn/state.c:33
+#: ../libpurple/protocols/msnp9/msn.c:583
+#: ../libpurple/protocols/msnp9/state.c:33
+#: ../libpurple/protocols/yahoo/yahoo.c:3079
+#: ../libpurple/protocols/yahoo/yahoo.c:3763
 msgid "Be Right Back"
 msgstr "Rögtön jövök"
 
-#: ../libpurple/protocols/msn/msn.c:583 ../libpurple/protocols/msn/state.c:31
-#: ../libpurple/protocols/novell/novell.c:2822
-#: ../libpurple/protocols/novell/novell.c:2952
-#: ../libpurple/protocols/silc/buddy.c:1480
+#: ../libpurple/protocols/msn/msn.c:694 ../libpurple/protocols/msn/state.c:31
+#: ../libpurple/protocols/msnp9/msn.c:587
+#: ../libpurple/protocols/msnp9/state.c:31
+#: ../libpurple/protocols/novell/novell.c:2827
+#: ../libpurple/protocols/novell/novell.c:2957
+#: ../libpurple/protocols/silc/buddy.c:1483
 #: ../libpurple/protocols/silc/silc.c:56
-#: ../libpurple/protocols/silc10/buddy.c:1480
+#: ../libpurple/protocols/silc10/buddy.c:1483
 #: ../libpurple/protocols/silc10/silc.c:47
-#: ../libpurple/protocols/yahoo/yahoo.c:3079
-#: ../libpurple/protocols/yahoo/yahoo.c:3764
+#: ../libpurple/protocols/yahoo/yahoo.c:3081
+#: ../libpurple/protocols/yahoo/yahoo.c:3766
 msgid "Busy"
 msgstr "Elfoglalt vagyok"
 
-#: ../libpurple/protocols/msn/msn.c:587
-#: ../libpurple/protocols/yahoo/yahoo.c:3087
-#: ../libpurple/protocols/yahoo/yahoo.c:3776
+#: ../libpurple/protocols/msn/msn.c:699 ../libpurple/protocols/msnp9/msn.c:591
+#: ../libpurple/protocols/yahoo/yahoo.c:3089
+#: ../libpurple/protocols/yahoo/yahoo.c:3778
 msgid "On the Phone"
 msgstr "Telefonálok"
 
-#: ../libpurple/protocols/msn/msn.c:591
-#: ../libpurple/protocols/yahoo/yahoo.c:3091
-#: ../libpurple/protocols/yahoo/yahoo.c:3782
+#: ../libpurple/protocols/msn/msn.c:704 ../libpurple/protocols/msnp9/msn.c:595
+#: ../libpurple/protocols/yahoo/yahoo.c:3093
+#: ../libpurple/protocols/yahoo/yahoo.c:3784
 msgid "Out to Lunch"
 msgstr "Ebédelni mentem"
 
-#: ../libpurple/protocols/msn/msn.c:619
+#: ../libpurple/protocols/msn/msn.c:723
+msgid "Artist"
+msgstr "Előadó"
+
+#: ../libpurple/protocols/msn/msn.c:724
+msgid "Album"
+msgstr "Album"
+
+#: ../libpurple/protocols/msn/msn.c:742 ../libpurple/protocols/msnp9/msn.c:623
 msgid "Set Friendly Name..."
 msgstr "Becenév beállítása..."
 
-#: ../libpurple/protocols/msn/msn.c:624
+#: ../libpurple/protocols/msn/msn.c:747 ../libpurple/protocols/msnp9/msn.c:628
 msgid "Set Home Phone Number..."
 msgstr "Otthoni telefonszám beállítása..."
 
-#: ../libpurple/protocols/msn/msn.c:628
+#: ../libpurple/protocols/msn/msn.c:751 ../libpurple/protocols/msnp9/msn.c:632
 msgid "Set Work Phone Number..."
 msgstr "Munkahelyi telefonszám beállítása..."
 
-#: ../libpurple/protocols/msn/msn.c:632
+#: ../libpurple/protocols/msn/msn.c:755 ../libpurple/protocols/msnp9/msn.c:636
 msgid "Set Mobile Phone Number..."
 msgstr "Mobiltelefonszám beállítása..."
 
-#: ../libpurple/protocols/msn/msn.c:638
+#: ../libpurple/protocols/msn/msn.c:761 ../libpurple/protocols/msnp9/msn.c:642
 msgid "Enable/Disable Mobile Devices..."
 msgstr "Mobileszközök engedélyezése/tiltása..."
 
-#: ../libpurple/protocols/msn/msn.c:643
+#: ../libpurple/protocols/msn/msn.c:766 ../libpurple/protocols/msnp9/msn.c:647
 msgid "Allow/Disallow Mobile Pages..."
 msgstr "Mobiloldalak engedélyezése/tiltása..."
 
-#: ../libpurple/protocols/msn/msn.c:654
+#: ../libpurple/protocols/msn/msn.c:777 ../libpurple/protocols/msnp9/msn.c:658
 msgid "Open Hotmail Inbox"
 msgstr "Hotmail bejövő levelek megnyitása"
 
-#: ../libpurple/protocols/msn/msn.c:678
+#: ../libpurple/protocols/msn/msn.c:801 ../libpurple/protocols/msnp9/msn.c:682
 msgid "Send to Mobile"
 msgstr "Küldés mobiltelefonra"
 
-#: ../libpurple/protocols/msn/msn.c:688
-#: ../libpurple/protocols/novell/novell.c:3408
+#: ../libpurple/protocols/msn/msn.c:811 ../libpurple/protocols/msnp9/msn.c:692
+#: ../libpurple/protocols/novell/novell.c:3413
 msgid "Initiate _Chat"
 msgstr "Csevegés ke_zdeményezése"
 
-#: ../libpurple/protocols/msn/msn.c:726
+#: ../libpurple/protocols/msn/msn.c:849 ../libpurple/protocols/msnp9/msn.c:730
 msgid "SSL support is needed for MSN. Please install a supported SSL library."
 msgstr ""
 "Az MSN használatához SSL támogatás szükséges. Telepítsen egy támogatott SSL "
 "könyvtárat."
 
-#: ../libpurple/protocols/msn/msn.c:754
+#: ../libpurple/protocols/msn/msn.c:877 ../libpurple/protocols/msnp9/msn.c:758
 msgid "Failed to connect to server."
 msgstr "Nem sikerült a kiszolgálóhoz kapcsolódni."
 
-#: ../libpurple/protocols/msn/msn.c:1510 ../libpurple/protocols/msn/msn.c:1858
+#: ../libpurple/protocols/msn/msn.c:1661 ../libpurple/protocols/msn/msn.c:2004
+#: ../libpurple/protocols/msnp9/msn.c:1513
+#: ../libpurple/protocols/msnp9/msn.c:1856
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:808
 msgid "Error retrieving profile"
 msgstr "Hiba a profil letöltése közben"
 
-#: ../libpurple/protocols/msn/msn.c:1581 ../pidgin/plugins/convcolors.c:309
-#: ../pidgin/plugins/pidginrc.c:366
+#: ../libpurple/protocols/msn/msn.c:1727
+#: ../libpurple/protocols/msnp9/msn.c:1579 ../pidgin/plugins/convcolors.c:309
+#: ../pidgin/plugins/pidginrc.c:360
 msgid "General"
 msgstr "Általános"
 
-#: ../libpurple/protocols/msn/msn.c:1588
-#: ../libpurple/protocols/myspace/user.c:110
-#: ../libpurple/protocols/oscar/oscar.c:3755
+#: ../libpurple/protocols/msn/msn.c:1734
+#: ../libpurple/protocols/msnp9/msn.c:1586
+#: ../libpurple/protocols/myspace/user.c:115
+#: ../libpurple/protocols/oscar/oscar.c:3770
 #: ../libpurple/protocols/qq/buddy_info.c:45
 #: ../libpurple/protocols/qq/qq.c:221
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1081
 msgid "Age"
 msgstr "Kor"
 
-#: ../libpurple/protocols/msn/msn.c:1590
+#: ../libpurple/protocols/msn/msn.c:1736
+#: ../libpurple/protocols/msnp9/msn.c:1588
 #: ../libpurple/protocols/qq/buddy_info.c:51
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1096
 msgid "Occupation"
 msgstr "Foglalkozás"
 
-#: ../libpurple/protocols/msn/msn.c:1591
-#: ../libpurple/protocols/myspace/user.c:119
-#: ../libpurple/protocols/novell/novell.c:1478
+#: ../libpurple/protocols/msn/msn.c:1737
+#: ../libpurple/protocols/msnp9/msn.c:1589
+#: ../libpurple/protocols/myspace/user.c:123
+#: ../libpurple/protocols/novell/novell.c:1480
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1076
 #: ../libpurple/protocols/zephyr/zephyr.c:798
 #: ../libpurple/protocols/zephyr/zephyr.c:1215
 msgid "Location"
 msgstr "Hely"
 
-#: ../libpurple/protocols/msn/msn.c:1596 ../libpurple/protocols/msn/msn.c:1788
-#: ../libpurple/protocols/msn/msn.c:1794 ../libpurple/protocols/msn/msn.c:1801
+#: ../libpurple/protocols/msn/msn.c:1742 ../libpurple/protocols/msn/msn.c:1934
+#: ../libpurple/protocols/msn/msn.c:1940 ../libpurple/protocols/msn/msn.c:1947
+#: ../libpurple/protocols/msnp9/msn.c:1594
+#: ../libpurple/protocols/msnp9/msn.c:1786
+#: ../libpurple/protocols/msnp9/msn.c:1792
+#: ../libpurple/protocols/msnp9/msn.c:1799
 msgid "Hobbies and Interests"
 msgstr "Hobbik és érdeklődési kör"
 
-#: ../libpurple/protocols/msn/msn.c:1602 ../libpurple/protocols/msn/msn.c:1722
-#: ../libpurple/protocols/msn/msn.c:1728 ../libpurple/protocols/msn/msn.c:1735
-#: ../libpurple/protocols/msn/msn.c:1743 ../libpurple/protocols/msn/msn.c:1750
+#: ../libpurple/protocols/msn/msn.c:1748 ../libpurple/protocols/msn/msn.c:1868
+#: ../libpurple/protocols/msn/msn.c:1874 ../libpurple/protocols/msn/msn.c:1881
+#: ../libpurple/protocols/msn/msn.c:1889 ../libpurple/protocols/msn/msn.c:1896
+#: ../libpurple/protocols/msnp9/msn.c:1600
+#: ../libpurple/protocols/msnp9/msn.c:1720
+#: ../libpurple/protocols/msnp9/msn.c:1726
+#: ../libpurple/protocols/msnp9/msn.c:1733
+#: ../libpurple/protocols/msnp9/msn.c:1741
+#: ../libpurple/protocols/msnp9/msn.c:1748
 msgid "A Little About Me"
 msgstr "Magamról röviden"
 
-#: ../libpurple/protocols/msn/msn.c:1619
+#: ../libpurple/protocols/msn/msn.c:1765
+#: ../libpurple/protocols/msnp9/msn.c:1617
 msgid "Social"
 msgstr "Társadalmi"
 
-#: ../libpurple/protocols/msn/msn.c:1621
+#: ../libpurple/protocols/msn/msn.c:1767
+#: ../libpurple/protocols/msnp9/msn.c:1619
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1086
 msgid "Marital Status"
 msgstr "Családi állapot"
 
-#: ../libpurple/protocols/msn/msn.c:1622
+#: ../libpurple/protocols/msn/msn.c:1768
+#: ../libpurple/protocols/msnp9/msn.c:1620
 msgid "Interests"
 msgstr "Érdeklődési kör"
 
-#: ../libpurple/protocols/msn/msn.c:1623
+#: ../libpurple/protocols/msn/msn.c:1769
+#: ../libpurple/protocols/msnp9/msn.c:1621
 msgid "Pets"
 msgstr "Állatok"
 
-#: ../libpurple/protocols/msn/msn.c:1624
+#: ../libpurple/protocols/msn/msn.c:1770
+#: ../libpurple/protocols/msnp9/msn.c:1622
 msgid "Hometown"
 msgstr "Szülőváros"
 
-#: ../libpurple/protocols/msn/msn.c:1625
+#: ../libpurple/protocols/msn/msn.c:1771
+#: ../libpurple/protocols/msnp9/msn.c:1623
 msgid "Places Lived"
 msgstr "Lakóhelyek"
 
-#: ../libpurple/protocols/msn/msn.c:1626
+#: ../libpurple/protocols/msn/msn.c:1772
+#: ../libpurple/protocols/msnp9/msn.c:1624
 msgid "Fashion"
 msgstr "Divat"
 
-#: ../libpurple/protocols/msn/msn.c:1627
+#: ../libpurple/protocols/msn/msn.c:1773
+#: ../libpurple/protocols/msnp9/msn.c:1625
 msgid "Humor"
 msgstr "Humor"
 
-#: ../libpurple/protocols/msn/msn.c:1628
+#: ../libpurple/protocols/msn/msn.c:1774
+#: ../libpurple/protocols/msnp9/msn.c:1626
 msgid "Music"
 msgstr "Zene"
 
-#: ../libpurple/protocols/msn/msn.c:1629 ../libpurple/protocols/msn/msn.c:1810
-#: ../libpurple/protocols/msn/msn.c:1816
+#: ../libpurple/protocols/msn/msn.c:1775 ../libpurple/protocols/msn/msn.c:1956
+#: ../libpurple/protocols/msn/msn.c:1962
+#: ../libpurple/protocols/msnp9/msn.c:1627
+#: ../libpurple/protocols/msnp9/msn.c:1808
+#: ../libpurple/protocols/msnp9/msn.c:1814
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1138
 msgid "Favorite Quote"
 msgstr "Kedvenc idézet"
 
-#: ../libpurple/protocols/msn/msn.c:1646
+#: ../libpurple/protocols/msn/msn.c:1792
+#: ../libpurple/protocols/msnp9/msn.c:1644
 msgid "Contact Info"
 msgstr "Kapcsolatinformációk"
 
-#: ../libpurple/protocols/msn/msn.c:1647
+#: ../libpurple/protocols/msn/msn.c:1793
+#: ../libpurple/protocols/msnp9/msn.c:1645
 msgid "Personal"
 msgstr "Személyes"
 
-#: ../libpurple/protocols/msn/msn.c:1650
+#: ../libpurple/protocols/msn/msn.c:1796
+#: ../libpurple/protocols/msnp9/msn.c:1648
 msgid "Significant Other"
 msgstr "Társ"
 
-#: ../libpurple/protocols/msn/msn.c:1651
+#: ../libpurple/protocols/msn/msn.c:1797
+#: ../libpurple/protocols/msnp9/msn.c:1649
 msgid "Home Phone"
 msgstr "Otthoni telefon"
 
-#: ../libpurple/protocols/msn/msn.c:1652
+#: ../libpurple/protocols/msn/msn.c:1798
+#: ../libpurple/protocols/msnp9/msn.c:1650
 msgid "Home Phone 2"
 msgstr "2. otthoni telefon"
 
-#: ../libpurple/protocols/msn/msn.c:1653
-#: ../libpurple/protocols/oscar/oscar.c:3793
+#: ../libpurple/protocols/msn/msn.c:1799
+#: ../libpurple/protocols/msnp9/msn.c:1651
+#: ../libpurple/protocols/oscar/oscar.c:3808
 msgid "Home Address"
 msgstr "Otthoni cím"
 
-#: ../libpurple/protocols/msn/msn.c:1654
+#: ../libpurple/protocols/msn/msn.c:1800
+#: ../libpurple/protocols/msnp9/msn.c:1652
 msgid "Personal Mobile"
 msgstr "Személyes mobil"
 
-#: ../libpurple/protocols/msn/msn.c:1655
+#: ../libpurple/protocols/msn/msn.c:1801
+#: ../libpurple/protocols/msnp9/msn.c:1653
 msgid "Home Fax"
 msgstr "Otthoni fax"
 
-#: ../libpurple/protocols/msn/msn.c:1656
+#: ../libpurple/protocols/msn/msn.c:1802
+#: ../libpurple/protocols/msnp9/msn.c:1654
 msgid "Personal E-Mail"
 msgstr "Saját e-mail"
 
-#: ../libpurple/protocols/msn/msn.c:1657
+#: ../libpurple/protocols/msn/msn.c:1803
+#: ../libpurple/protocols/msnp9/msn.c:1655
 msgid "Personal IM"
 msgstr "Saját azonnali üzenő"
 
-#: ../libpurple/protocols/msn/msn.c:1659
+#: ../libpurple/protocols/msn/msn.c:1805
+#: ../libpurple/protocols/msnp9/msn.c:1657
 msgid "Anniversary"
 msgstr "Évforduló"
 
 #. Business
-#: ../libpurple/protocols/msn/msn.c:1675
+#: ../libpurple/protocols/msn/msn.c:1821
+#: ../libpurple/protocols/msnp9/msn.c:1673
 msgid "Work"
 msgstr "Munka"
 
-#: ../libpurple/protocols/msn/msn.c:1677
+#: ../libpurple/protocols/msn/msn.c:1823
+#: ../libpurple/protocols/msnp9/msn.c:1675
 #: ../libpurple/protocols/silc/ops.c:1010
 #: ../libpurple/protocols/silc10/ops.c:1044
 msgid "Job Title"
 msgstr "Beosztás"
 
-#: ../libpurple/protocols/msn/msn.c:1678
-#: ../libpurple/protocols/oscar/oscar.c:3814
+#: ../libpurple/protocols/msn/msn.c:1824
+#: ../libpurple/protocols/msnp9/msn.c:1676
+#: ../libpurple/protocols/oscar/oscar.c:3829
 msgid "Company"
 msgstr "Cég"
 
-#: ../libpurple/protocols/msn/msn.c:1679
-#: ../libpurple/protocols/novell/novell.c:1480
+#: ../libpurple/protocols/msn/msn.c:1825
+#: ../libpurple/protocols/msnp9/msn.c:1677
+#: ../libpurple/protocols/novell/novell.c:1482
 msgid "Department"
 msgstr "Részleg"
 
-#: ../libpurple/protocols/msn/msn.c:1680
+#: ../libpurple/protocols/msn/msn.c:1826
+#: ../libpurple/protocols/msnp9/msn.c:1678
 msgid "Profession"
 msgstr "Foglalkozás"
 
-#: ../libpurple/protocols/msn/msn.c:1681
+#: ../libpurple/protocols/msn/msn.c:1827
+#: ../libpurple/protocols/msnp9/msn.c:1679
 msgid "Work Phone"
 msgstr "Munkahelyi telefon"
 
-#: ../libpurple/protocols/msn/msn.c:1682
+#: ../libpurple/protocols/msn/msn.c:1828
+#: ../libpurple/protocols/msnp9/msn.c:1680
 msgid "Work Phone 2"
 msgstr "2. munkahelyi telefon"
 
-#: ../libpurple/protocols/msn/msn.c:1683
-#: ../libpurple/protocols/oscar/oscar.c:3806
+#: ../libpurple/protocols/msn/msn.c:1829
+#: ../libpurple/protocols/msnp9/msn.c:1681
+#: ../libpurple/protocols/oscar/oscar.c:3821
 msgid "Work Address"
 msgstr "Munkahelyi cím"
 
-#: ../libpurple/protocols/msn/msn.c:1684
+#: ../libpurple/protocols/msn/msn.c:1830
+#: ../libpurple/protocols/msnp9/msn.c:1682
 msgid "Work Mobile"
 msgstr "Munkahelyi mobil"
 
-#: ../libpurple/protocols/msn/msn.c:1685
+#: ../libpurple/protocols/msn/msn.c:1831
+#: ../libpurple/protocols/msnp9/msn.c:1683
 msgid "Work Pager"
 msgstr "Munkahelyi személyhívó"
 
-#: ../libpurple/protocols/msn/msn.c:1686
+#: ../libpurple/protocols/msn/msn.c:1832
+#: ../libpurple/protocols/msnp9/msn.c:1684
 msgid "Work Fax"
 msgstr "Munkahelyi fax"
 
-#: ../libpurple/protocols/msn/msn.c:1687
+#: ../libpurple/protocols/msn/msn.c:1833
+#: ../libpurple/protocols/msnp9/msn.c:1685
 msgid "Work E-Mail"
 msgstr "Munkahelyi e-mail"
 
-#: ../libpurple/protocols/msn/msn.c:1688
+#: ../libpurple/protocols/msn/msn.c:1834
+#: ../libpurple/protocols/msnp9/msn.c:1686
 msgid "Work IM"
 msgstr "Munkahelyi azonnali üzenő"
 
-#: ../libpurple/protocols/msn/msn.c:1689
+#: ../libpurple/protocols/msn/msn.c:1835
+#: ../libpurple/protocols/msnp9/msn.c:1687
 msgid "Start Date"
 msgstr "Kezdés dátuma"
 
-#: ../libpurple/protocols/msn/msn.c:1759 ../libpurple/protocols/msn/msn.c:1765
-#: ../libpurple/protocols/msn/msn.c:1772 ../libpurple/protocols/msn/msn.c:1779
+#: ../libpurple/protocols/msn/msn.c:1905 ../libpurple/protocols/msn/msn.c:1911
+#: ../libpurple/protocols/msn/msn.c:1918 ../libpurple/protocols/msn/msn.c:1925
+#: ../libpurple/protocols/msnp9/msn.c:1757
+#: ../libpurple/protocols/msnp9/msn.c:1763
+#: ../libpurple/protocols/msnp9/msn.c:1770
+#: ../libpurple/protocols/msnp9/msn.c:1777
 msgid "Favorite Things"
 msgstr "Kedvenc dolgok"
 
-#: ../libpurple/protocols/msn/msn.c:1824
+#: ../libpurple/protocols/msn/msn.c:1970
+#: ../libpurple/protocols/msnp9/msn.c:1822
 msgid "Last Updated"
 msgstr "Utoljára frissítve"
 
-#: ../libpurple/protocols/msn/msn.c:1835
+#: ../libpurple/protocols/msn/msn.c:1981
+#: ../libpurple/protocols/msnp9/msn.c:1833
 #: ../libpurple/protocols/qq/buddy_info.c:60
 #: ../libpurple/protocols/silc/ops.c:1026
 #: ../libpurple/protocols/silc10/ops.c:1060
 msgid "Homepage"
 msgstr "Honlap"
 
-#: ../libpurple/protocols/msn/msn.c:1859
+#: ../libpurple/protocols/msn/msn.c:2005
+#: ../libpurple/protocols/msnp9/msn.c:1857
 msgid "The user has not created a public profile."
 msgstr "A felhasználó nem hozott létre nyilvános profilt."
 
-#: ../libpurple/protocols/msn/msn.c:1860
+#: ../libpurple/protocols/msn/msn.c:2006
+#: ../libpurple/protocols/msnp9/msn.c:1858
 msgid ""
 "MSN reported not being able to find the user's profile. This either means "
 "that the user does not exist, or that the user exists but has not created a "
@@ -7036,7 +7184,8 @@
 "felhasználó nem létezik, vagy azt, hogy bár létezik, még nem hozott létre "
 "nyilvános profilt."
 
-#: ../libpurple/protocols/msn/msn.c:1864
+#: ../libpurple/protocols/msn/msn.c:2010
+#: ../libpurple/protocols/msnp9/msn.c:1862
 msgid ""
 "Could not find any information in the user's profile. The user most likely "
 "does not exist."
@@ -7044,7 +7193,8 @@
 "Nem találhatók információk a felhasználó profiljában. A felhasználó "
 "valószínűleg nem létezik."
 
-#: ../libpurple/protocols/msn/msn.c:1872
+#: ../libpurple/protocols/msn/msn.c:2018
+#: ../libpurple/protocols/msnp9/msn.c:1870
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1240
 msgid "Profile URL"
 msgstr "Profil URL-je"
@@ -7059,101 +7209,128 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/msn/msn.c:2158 ../libpurple/protocols/msn/msn.c:2160
-msgid "MSN Protocol Plugin"
-msgstr "MSN protokollbővítmény"
-
-#: ../libpurple/protocols/msn/msn.c:2194
+#: ../libpurple/protocols/msn/msn.c:2305 ../libpurple/protocols/msn/msn.c:2307
+msgid "Windows Live Messenger Protocol Plugin"
+msgstr "Windows Live Messenger protokollbővítmény"
+
+#: ../libpurple/protocols/msn/msn.c:2342
+#: ../libpurple/protocols/msnp9/msn.c:2192
 msgid "Use HTTP Method"
 msgstr "HTTP eljárás használata"
 
-#: ../libpurple/protocols/msn/msn.c:2199
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:2347
+#: ../libpurple/protocols/msnp9/msn.c:2197
 msgid "HTTP Method Server"
-msgstr "IPC tesztkiszolgáló"
-
-#: ../libpurple/protocols/msn/msn.c:2204
+msgstr "HTTP eljáráskiszolgáló"
+
+#: ../libpurple/protocols/msn/msn.c:2352
+#: ../libpurple/protocols/msnp9/msn.c:2202
 msgid "Show custom smileys"
 msgstr "Egyéni hangulatjelek megjelenítése"
 
-#: ../libpurple/protocols/msn/msn.c:2212
+#: ../libpurple/protocols/msn/msn.c:2360
+#: ../libpurple/protocols/msnp9/msn.c:2210
 msgid "nudge: nudge a user to get their attention"
 msgstr "nudge: felhasználó megbökése figyelemfelhívási céllal"
 
-#: ../libpurple/protocols/msn/nexus.c:146
-#: ../libpurple/protocols/msn/servconn.c:135
-#: ../libpurple/protocols/qq/qq_proxy.c:242
-#: ../libpurple/protocols/qq/qq_proxy.c:321
-#: ../libpurple/protocols/qq/qq_proxy.c:366
-#: ../libpurple/protocols/qq/qq_proxy.c:399
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:63
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:163
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:187
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:200
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:229
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:243
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:268
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:302
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:332
-#: ../libpurple/protocols/yahoo/yahoochat.c:1416
-#: ../libpurple/protocols/yahoo/yahoochat.c:1442
-msgid "Unable to connect"
-msgstr "Nem lehet kapcsolódni"
-
-#: ../libpurple/protocols/msn/notification.c:178
+#: ../libpurple/protocols/msn/nexus.c:70
+msgid "Windows Live ID authentication:Unable to connect"
+msgstr "Windows Live azonosító hitelesítése: nem lehet kapcsolódni"
+
+#. we must have failed!
+#: ../libpurple/protocols/msn/nexus.c:126
+msgid ""
+"Windows Live ID authentication: cannot find authenticate token in server "
+"response"
+msgstr "Windows Live azonosító hitelesítése: nem található hitelesítési jelsor a kiszolgáló válaszában"
+
+#: ../libpurple/protocols/msn/nexus.c:172
+msgid "Windows Live ID authentication Failed"
+msgstr "Windows Live azonosító hitelesítése meghiúsult"
+
+#: ../libpurple/protocols/msn/notification.c:185
+#: ../libpurple/protocols/msnp9/notification.c:178
 #, c-format
 msgid "%s is not a valid group."
 msgstr "%s érvénytelen csoport."
 
-#: ../libpurple/protocols/msn/notification.c:184
-#: ../libpurple/protocols/msn/notification.c:532
-#: ../libpurple/protocols/msn/session.c:330
+#: ../libpurple/protocols/msn/notification.c:191
+#: ../libpurple/protocols/msn/notification.c:931
+#: ../libpurple/protocols/msn/session.c:379
+#: ../libpurple/protocols/msnp9/notification.c:184
+#: ../libpurple/protocols/msnp9/notification.c:532
+#: ../libpurple/protocols/msnp9/session.c:330
 msgid "Unknown error."
 msgstr "Ismeretlen hiba."
 
-#: ../libpurple/protocols/msn/notification.c:187
+#: ../libpurple/protocols/msn/notification.c:194
+#: ../libpurple/protocols/msnp9/notification.c:187
 #, c-format
 msgid "%s on %s (%s)"
 msgstr "%s ezen: %s (%s)"
 
-#: ../libpurple/protocols/msn/notification.c:498
+#: ../libpurple/protocols/msn/notification.c:509
+#, c-format
+msgid "%s just sent you a Nudge!"
+msgstr "%s megbökte!"
+
+#: ../libpurple/protocols/msn/notification.c:836
+#, c-format
+msgid "Unknown error (%d)"
+msgstr "Ismeretlen hiba (%d)"
+
+#: ../libpurple/protocols/msn/notification.c:837
+#: ../libpurple/protocols/sametime/sametime.c:4426
+msgid "Unable to add user"
+msgstr "Nem vehető fel a felhasználó"
+
+#: ../libpurple/protocols/msn/notification.c:897
+#: ../libpurple/protocols/msnp9/notification.c:498
 #, c-format
 msgid "Unable to add user on %s (%s)"
 msgstr "Nem lehet felhasználót felvenni ehhez: %s (%s)"
 
-#: ../libpurple/protocols/msn/notification.c:502
+#: ../libpurple/protocols/msn/notification.c:901
+#: ../libpurple/protocols/msnp9/notification.c:502
 #, c-format
 msgid "Unable to block user on %s (%s)"
 msgstr "Nem lehet letiltani a felhasználót ezen: %s (%s)"
 
-#: ../libpurple/protocols/msn/notification.c:506
+#: ../libpurple/protocols/msn/notification.c:905
+#: ../libpurple/protocols/msnp9/notification.c:506
 #, c-format
 msgid "Unable to permit user on %s (%s)"
 msgstr "Nem lehet engedélyezni a felhasználót ezen: %s (%s)"
 
-#: ../libpurple/protocols/msn/notification.c:514
+#: ../libpurple/protocols/msn/notification.c:913
+#: ../libpurple/protocols/msnp9/notification.c:514
 #, c-format
 msgid "%s could not be added because your buddy list is full."
 msgstr "%s nem adható hozzá, mert a partnerlista tele van."
 
-#: ../libpurple/protocols/msn/notification.c:523
+#: ../libpurple/protocols/msn/notification.c:922
+#: ../libpurple/protocols/msnp9/notification.c:523
 #, c-format
 msgid "%s is not a valid passport account."
 msgstr "%s érvénytelen passport fiók."
 
-#: ../libpurple/protocols/msn/notification.c:528
+#: ../libpurple/protocols/msn/notification.c:927
+#: ../libpurple/protocols/msnp9/notification.c:528
 msgid "Service Temporarily Unavailable."
 msgstr "A szolgáltatás átmenetileg nem érhető el."
 
-#: ../libpurple/protocols/msn/notification.c:851
+#: ../libpurple/protocols/msn/notification.c:1263
+#: ../libpurple/protocols/msnp9/notification.c:851
 msgid "Unable to rename group"
 msgstr "Nem lehet átnevezni a csoportot"
 
-#: ../libpurple/protocols/msn/notification.c:906
+#: ../libpurple/protocols/msn/notification.c:1318
+#: ../libpurple/protocols/msnp9/notification.c:906
 msgid "Unable to delete group"
 msgstr "Nem lehet törölni a csoportot"
 
-#: ../libpurple/protocols/msn/notification.c:1325
+#: ../libpurple/protocols/msn/notification.c:1931
+#: ../libpurple/protocols/msnp9/notification.c:1325
 #, c-format
 msgid ""
 "The MSN server will shut down for maintenance in %d minute. You will "
@@ -7182,15 +7359,39 @@
 "\n"
 "A karbantartás befejeződése után sikeresen be tud majd jelentkezni."
 
+#: ../libpurple/protocols/msn/servconn.c:135
+#: ../libpurple/protocols/msnp9/nexus.c:146
+#: ../libpurple/protocols/msnp9/servconn.c:133
+#: ../libpurple/protocols/qq/qq_proxy.c:242
+#: ../libpurple/protocols/qq/qq_proxy.c:324
+#: ../libpurple/protocols/qq/qq_proxy.c:369
+#: ../libpurple/protocols/qq/qq_proxy.c:402
+#: ../libpurple/protocols/qq/udp_proxy_s5.c:64
+#: ../libpurple/protocols/qq/udp_proxy_s5.c:167
+#: ../libpurple/protocols/qq/udp_proxy_s5.c:191
+#: ../libpurple/protocols/qq/udp_proxy_s5.c:204
+#: ../libpurple/protocols/qq/udp_proxy_s5.c:233
+#: ../libpurple/protocols/qq/udp_proxy_s5.c:247
+#: ../libpurple/protocols/qq/udp_proxy_s5.c:272
+#: ../libpurple/protocols/qq/udp_proxy_s5.c:307
+#: ../libpurple/protocols/qq/udp_proxy_s5.c:338
+#: ../libpurple/protocols/yahoo/yahoochat.c:1416
+#: ../libpurple/protocols/yahoo/yahoochat.c:1442
+msgid "Unable to connect"
+msgstr "Nem lehet kapcsolódni"
+
 #: ../libpurple/protocols/msn/servconn.c:137
+#: ../libpurple/protocols/msnp9/servconn.c:135
 msgid "Writing error"
 msgstr "Írási hiba"
 
 #: ../libpurple/protocols/msn/servconn.c:139
+#: ../libpurple/protocols/msnp9/servconn.c:137
 msgid "Reading error"
 msgstr "Olvasási hiba"
 
 #: ../libpurple/protocols/msn/servconn.c:146
+#: ../libpurple/protocols/msnp9/servconn.c:144
 #, c-format
 msgid ""
 "Connection error from %s server:\n"
@@ -7199,97 +7400,117 @@
 "Kapcsolódási hiba a(z) %s kiszolgálótól:\n"
 "%s"
 
-#: ../libpurple/protocols/msn/session.c:299
+#: ../libpurple/protocols/msn/session.c:346
+#: ../libpurple/protocols/msnp9/session.c:299
 msgid "Our protocol is not supported by the server."
 msgstr "A protokollt nem támogatja a kiszolgáló."
 
-#: ../libpurple/protocols/msn/session.c:303
+#: ../libpurple/protocols/msn/session.c:350
+#: ../libpurple/protocols/msnp9/session.c:303
 msgid "Error parsing HTTP."
 msgstr "Hiba a HTTP feldolgozása közben."
 
-#: ../libpurple/protocols/msn/session.c:307
+#: ../libpurple/protocols/msn/session.c:354
+#: ../libpurple/protocols/msnp9/session.c:307
 #: ../libpurple/protocols/oscar/flap_connection.c:384
-#: ../libpurple/protocols/yahoo/yahoo.c:205
+#: ../libpurple/protocols/yahoo/yahoo.c:207
 msgid "You have signed on from another location."
 msgstr "Bejelentkezett egy másik helyről."
 
-#: ../libpurple/protocols/msn/session.c:310
+#: ../libpurple/protocols/msn/session.c:359
+#: ../libpurple/protocols/msnp9/session.c:310
 msgid "The MSN servers are temporarily unavailable. Please wait and try again."
 msgstr ""
-"Az MSN kiszolgálók átmenetileg nem érhetőek el. Kérem várjon és próbálja "
+"Az MSN kiszolgálók átmenetileg nem érhetők el. Kérem várjon és próbálja "
 "újra később."
 
-#: ../libpurple/protocols/msn/session.c:315
+#: ../libpurple/protocols/msn/session.c:364
+#: ../libpurple/protocols/msnp9/session.c:315
 msgid "The MSN servers are going down temporarily."
 msgstr "Az MSN kiszolgálók átmenetileg leállnak."
 
-#: ../libpurple/protocols/msn/session.c:320
+#: ../libpurple/protocols/msn/session.c:369
+#: ../libpurple/protocols/msnp9/session.c:320
 #, c-format
 msgid "Unable to authenticate: %s"
 msgstr "Nem sikerült a hitelesítés: %s"
 
-#: ../libpurple/protocols/msn/session.c:325
-msgid ""
-"Your MSN buddy list is temporarily unavailable. Please wait and try again."
+#: ../libpurple/protocols/msn/session.c:374
+#: ../libpurple/protocols/msnp9/session.c:325
+msgid "Your MSN buddy list is temporarily unavailable. Please wait and try again."
 msgstr ""
 "Az Ön MSN partnerlistája átmenetileg nem érhető el. Kérem várjon és próbálja "
 "újra később."
 
-#: ../libpurple/protocols/msn/session.c:346
-#: ../libpurple/protocols/msn/session.c:348
+#: ../libpurple/protocols/msn/session.c:395
+#: ../libpurple/protocols/msn/session.c:397
+#: ../libpurple/protocols/msnp9/session.c:346
+#: ../libpurple/protocols/msnp9/session.c:348
 msgid "Handshaking"
 msgstr "Kézfogás"
 
-#: ../libpurple/protocols/msn/session.c:349
+#: ../libpurple/protocols/msn/session.c:398
+#: ../libpurple/protocols/msnp9/session.c:349
 msgid "Starting authentication"
 msgstr "Hitelesítés megkezdése"
 
-#: ../libpurple/protocols/msn/session.c:350
+#: ../libpurple/protocols/msn/session.c:399
+#: ../libpurple/protocols/msnp9/session.c:350
 msgid "Getting cookie"
 msgstr "Süti letöltése"
 
-#: ../libpurple/protocols/msn/session.c:352
+#: ../libpurple/protocols/msn/session.c:401
+#: ../libpurple/protocols/msnp9/session.c:352
 msgid "Sending cookie"
 msgstr "Süti küldése"
 
-#: ../libpurple/protocols/msn/session.c:353
+#: ../libpurple/protocols/msn/session.c:402
+#: ../libpurple/protocols/msnp9/session.c:353
 msgid "Retrieving buddy list"
 msgstr "Partnerlista fogadása"
 
 #: ../libpurple/protocols/msn/state.c:34
+#: ../libpurple/protocols/msnp9/state.c:34
 msgid "Away From Computer"
 msgstr "Nem vagyok a gépnél"
 
 #: ../libpurple/protocols/msn/state.c:35
+#: ../libpurple/protocols/msnp9/state.c:35
 msgid "On The Phone"
 msgstr "Telefonálok"
 
 #: ../libpurple/protocols/msn/state.c:36
+#: ../libpurple/protocols/msnp9/state.c:36
 msgid "Out To Lunch"
 msgstr "Ebédelni mentem"
 
-#: ../libpurple/protocols/msn/switchboard.c:400
+#: ../libpurple/protocols/msn/switchboard.c:398
+#: ../libpurple/protocols/msnp9/switchboard.c:400
 msgid "Message may have not been sent because a timeout occurred:"
-msgstr ""
-"Időtúllépés következett be, emiatt az üzenet lehet, hogy nem lett elküldve:"
-
-#: ../libpurple/protocols/msn/switchboard.c:408
+msgstr "Időtúllépés következett be, emiatt az üzenet lehet, hogy nem lett elküldve:"
+
+#: ../libpurple/protocols/msn/switchboard.c:406
+#: ../libpurple/protocols/msnp9/switchboard.c:408
 msgid "Message could not be sent, not allowed while invisible:"
 msgstr "Az üzenet nem küldhető el, láthatatlan módban nem engedélyezett:"
 
-#: ../libpurple/protocols/msn/switchboard.c:412
+#: ../libpurple/protocols/msn/switchboard.c:410
+#: ../libpurple/protocols/msnp9/switchboard.c:412
 msgid "Message could not be sent because the user is offline:"
 msgstr "Az üzenet nem küldhető el, mivel a felhasználó kijelentkezett:"
 
-#: ../libpurple/protocols/msn/switchboard.c:416
+#: ../libpurple/protocols/msn/switchboard.c:414
+#: ../libpurple/protocols/msnp9/switchboard.c:416
 msgid "Message could not be sent because a connection error occurred:"
 msgstr "Az üzenet kapcsolódási hiba miatt nem küldhető el:"
 
-#: ../libpurple/protocols/msn/switchboard.c:420
+#: ../libpurple/protocols/msn/switchboard.c:418
+#: ../libpurple/protocols/msnp9/switchboard.c:420
 msgid "Message could not be sent because we are sending too quickly:"
 msgstr "Az üzenet nem küldhető el, mivel túl gyorsan küldi:"
 
-#: ../libpurple/protocols/msn/switchboard.c:424
+#: ../libpurple/protocols/msn/switchboard.c:422
+#: ../libpurple/protocols/msnp9/switchboard.c:424
 msgid ""
 "Message could not be sent because we were unable to establish a session with "
 "the server. This is likely a server problem, try again in a few minutes:"
@@ -7298,34 +7519,61 @@
 "kiszolgálóval. Ez valószínűleg kiszolgálóhiba, pár perc múlva próbálkozzon "
 "újra."
 
-#: ../libpurple/protocols/msn/switchboard.c:431
-msgid ""
-"Message could not be sent because an error with the switchboard occurred:"
+#: ../libpurple/protocols/msn/switchboard.c:429
+#: ../libpurple/protocols/msnp9/switchboard.c:431
+msgid "Message could not be sent because an error with the switchboard occurred:"
 msgstr "Az üzenet nem küldhető el, mivel hiba lépett fel a közvetítés közben:"
 
-#: ../libpurple/protocols/msn/switchboard.c:439
+#: ../libpurple/protocols/msn/switchboard.c:437
+#: ../libpurple/protocols/msnp9/switchboard.c:439
 msgid "Message may have not been sent because an unknown error occurred:"
 msgstr "Az üzenet ismeretlen hiba miatt lehet, hogy nem lett elküldve:"
 
-#: ../libpurple/protocols/msn/userlist.c:252
+#: ../libpurple/protocols/msn/userlist.c:243
+#: ../libpurple/protocols/msnp9/userlist.c:252
 #, c-format
 msgid "%s has added you to his or her buddy list."
 msgstr "%s felvette Önt a partnerlistájára."
 
-#: ../libpurple/protocols/msn/userlist.c:321
+#: ../libpurple/protocols/msn/userlist.c:312
+#: ../libpurple/protocols/msnp9/userlist.c:321
 #, c-format
 msgid "%s has removed you from his or her buddy list."
 msgstr "%s eltávolította Önt a partnerlistájáról."
 
-#: ../libpurple/protocols/msn/userlist.c:643
+#. only notify the user about problems adding to the friends list
+#. * maybe we should do something else for other lists, but it probably
+#. * won't cause too many problems if we just ignore it
+#: ../libpurple/protocols/msn/userlist.c:693
+#: ../libpurple/protocols/msnp9/userlist.c:643
 #, c-format
 msgid "Unable to add \"%s\"."
 msgstr "Nem lehet hozzáadni a következőt: \"%s\"."
 
-#: ../libpurple/protocols/msn/userlist.c:645
+#: ../libpurple/protocols/msn/userlist.c:696
+#: ../libpurple/protocols/msnp9/userlist.c:645
 msgid "The screen name specified is invalid."
 msgstr "A megadott felhasználónév érvénytelen."
 
+#: ../libpurple/protocols/msnp9/msn.c:549
+msgid "Has you"
+msgstr "Szerepel-e a listáján"
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+#: ../libpurple/protocols/msnp9/msn.c:2156
+#: ../libpurple/protocols/msnp9/msn.c:2158
+msgid "MSN Protocol Plugin"
+msgstr "MSN protokollbővítmény"
+
 #: ../libpurple/protocols/myspace/myspace.c:111
 msgid "Missing Cipher"
 msgstr "Hiányzó titkosító"
@@ -7353,23 +7601,23 @@
 
 #. Notify an error message also, because this is important!
 #: ../libpurple/protocols/myspace/myspace.c:292
-#: ../libpurple/protocols/myspace/myspace.c:1801
+#: ../libpurple/protocols/myspace/myspace.c:1810
 msgid "MySpaceIM Error"
 msgstr "MySpaceIM hiba"
 
-#: ../libpurple/protocols/myspace/myspace.c:349
+#: ../libpurple/protocols/myspace/myspace.c:350
 msgid "Reading challenge"
 msgstr "Hívás olvasása"
 
-#: ../libpurple/protocols/myspace/myspace.c:355
+#: ../libpurple/protocols/myspace/myspace.c:356
 msgid "Unexpected challenge length from server"
 msgstr "Váratlan híváshossz a kiszolgálótól"
 
-#: ../libpurple/protocols/myspace/myspace.c:359
+#: ../libpurple/protocols/myspace/myspace.c:360
 msgid "Logging in"
 msgstr "Bejelentkezés"
 
-#: ../libpurple/protocols/myspace/myspace.c:1286
+#: ../libpurple/protocols/myspace/myspace.c:1293
 #, c-format
 msgid "Connection to server lost (no data received within %d seconds)"
 msgstr ""
@@ -7377,44 +7625,44 @@
 "belül)"
 
 #. Can't write _()'d strings in array initializers. Workaround.
-#: ../libpurple/protocols/myspace/myspace.c:1328
+#: ../libpurple/protocols/myspace/myspace.c:1335
 msgid "New mail messages"
 msgstr "Új levelek"
 
-#: ../libpurple/protocols/myspace/myspace.c:1329
+#: ../libpurple/protocols/myspace/myspace.c:1336
 msgid "New blog comments"
 msgstr "Új bloghozzászólások"
 
-#: ../libpurple/protocols/myspace/myspace.c:1330
+#: ../libpurple/protocols/myspace/myspace.c:1337
 msgid "New profile comments"
 msgstr "Új profilhozzászólások"
 
-#: ../libpurple/protocols/myspace/myspace.c:1331
+#: ../libpurple/protocols/myspace/myspace.c:1338
 msgid "New friend requests!"
 msgstr "Új barátkérések!"
 
-#: ../libpurple/protocols/myspace/myspace.c:1332
+#: ../libpurple/protocols/myspace/myspace.c:1339
 msgid "New picture comments"
-msgstr "Új képhosszászólások"
-
-#: ../libpurple/protocols/myspace/myspace.c:1360
+msgstr "Új képhozzászólások"
+
+#: ../libpurple/protocols/myspace/myspace.c:1367
 msgid "MySpace"
 msgstr "MySpace"
 
 #. The session is now set up, ready to be connected. This emits the
 #. * signedOn signal, so clients can now do anything with msimprpl, and
 #. * we're ready for it (session key, userid, username all setup).
-#: ../libpurple/protocols/myspace/myspace.c:1543
+#: ../libpurple/protocols/myspace/myspace.c:1550
 #: ../libpurple/protocols/sametime/sametime.c:1544
 msgid "Connected"
 msgstr "Kapcsolódva"
 
-#: ../libpurple/protocols/myspace/myspace.c:1554
-#: ../libpurple/protocols/myspace/myspace.c:1556
+#: ../libpurple/protocols/myspace/myspace.c:1561
+#: ../libpurple/protocols/myspace/myspace.c:1563
 msgid "No username set"
 msgstr "Nincs beállítva felhasználónév"
 
-#: ../libpurple/protocols/myspace/myspace.c:1555
+#: ../libpurple/protocols/myspace/myspace.c:1562
 msgid ""
 "Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile."
 "username and choose a username and try to login again."
@@ -7423,72 +7671,72 @@
 "felhasználónév oldalt és válasszon egy felhasználónevet, majd próbáljon meg "
 "újra bejelentkezni."
 
-#: ../libpurple/protocols/myspace/myspace.c:1782
+#: ../libpurple/protocols/myspace/myspace.c:1789
 #, c-format
 msgid "Protocol error, code %d: %s"
 msgstr "Protokollhiba, %d. kód: %s"
 
-#: ../libpurple/protocols/myspace/myspace.c:1972
-#: ../libpurple/protocols/myspace/myspace.c:2006
+#: ../libpurple/protocols/myspace/myspace.c:1981
+#: ../libpurple/protocols/myspace/myspace.c:2015
 msgid "Failed to add buddy"
 msgstr "A partner felvétele sikertelen"
 
-#: ../libpurple/protocols/myspace/myspace.c:1972
+#: ../libpurple/protocols/myspace/myspace.c:1981
 msgid "'addbuddy' command failed."
 msgstr "az \"addbuddy\" parancs sikertelen."
 
-#: ../libpurple/protocols/myspace/myspace.c:2006
-#: ../libpurple/protocols/myspace/myspace.c:2247
+#: ../libpurple/protocols/myspace/myspace.c:2015
+#: ../libpurple/protocols/myspace/myspace.c:2252
 msgid "persist command failed"
 msgstr "A tárolás parancs sikertelen"
 
-#: ../libpurple/protocols/myspace/myspace.c:2115
+#: ../libpurple/protocols/myspace/myspace.c:2120
 #, c-format
 msgid "No such user: %s"
 msgstr "Nincs ilyen felhasználó: %s"
 
-#: ../libpurple/protocols/myspace/myspace.c:2116
+#: ../libpurple/protocols/myspace/myspace.c:2121
 msgid "User lookup"
 msgstr "Felhasználókeresés"
 
-#: ../libpurple/protocols/myspace/myspace.c:2228
-#: ../libpurple/protocols/myspace/myspace.c:2247
-#: ../libpurple/protocols/myspace/myspace.c:2269
+#: ../libpurple/protocols/myspace/myspace.c:2233
+#: ../libpurple/protocols/myspace/myspace.c:2252
+#: ../libpurple/protocols/myspace/myspace.c:2274
 msgid "Failed to remove buddy"
 msgstr "A partner eltávolítása sikertelen"
 
-#: ../libpurple/protocols/myspace/myspace.c:2228
+#: ../libpurple/protocols/myspace/myspace.c:2233
 msgid "'delbuddy' command failed"
 msgstr "a \"delbuddy parancs sikertelen"
 
-#: ../libpurple/protocols/myspace/myspace.c:2269
+#: ../libpurple/protocols/myspace/myspace.c:2274
 msgid "blocklist command failed"
 msgstr "a blocklist parancs sikertelen"
 
-#: ../libpurple/protocols/myspace/myspace.c:2315
+#: ../libpurple/protocols/myspace/myspace.c:2320
 msgid "Invalid input condition"
 msgstr "Érvénytelen bemeneti feltétel"
 
 #. TODO: g_realloc like msn, yahoo, irc, jabber?
-#: ../libpurple/protocols/myspace/myspace.c:2333
-#: ../libpurple/protocols/myspace/myspace.c:2364
+#: ../libpurple/protocols/myspace/myspace.c:2338
+#: ../libpurple/protocols/myspace/myspace.c:2369
 msgid "Read buffer full"
 msgstr "Az olvasási puffer megtelt"
 
-#: ../libpurple/protocols/myspace/myspace.c:2402
+#: ../libpurple/protocols/myspace/myspace.c:2407
 msgid "Unparseable message"
 msgstr "Értelmezhetetlen üzenet"
 
-#: ../libpurple/protocols/myspace/myspace.c:2471
+#: ../libpurple/protocols/myspace/myspace.c:2476
 #, c-format
 msgid "Couldn't connect to host: %s (%d)"
 msgstr "Nem sikerült kapcsolódni a kiszolgálóhoz: %s (%d)"
 
-#: ../libpurple/protocols/myspace/myspace.c:2642
+#: ../libpurple/protocols/myspace/myspace.c:2647
 msgid "IM Friends"
 msgstr "IM barátok"
 
-#: ../libpurple/protocols/myspace/myspace.c:2741
+#: ../libpurple/protocols/myspace/myspace.c:2747
 #, c-format
 msgid ""
 "%d buddies were added or updated from the server (including buddies already "
@@ -7497,57 +7745,57 @@
 "%d partner került felvételre vagy frissítésre a kiszolgálóról (beleértve a "
 "kiszolgálóoldali listán már jelen lévő partnereket)"
 
-#: ../libpurple/protocols/myspace/myspace.c:2742
+#: ../libpurple/protocols/myspace/myspace.c:2748
 msgid "Add contacts from server"
 msgstr "Kapcsolatok felvétele a kiszolgálóról."
 
-#: ../libpurple/protocols/myspace/myspace.c:2794
-#: ../libpurple/protocols/myspace/myspace.c:2859
+#: ../libpurple/protocols/myspace/myspace.c:2800
+#: ../libpurple/protocols/myspace/myspace.c:2865
 msgid "Add friends from MySpace.com"
 msgstr "Barátok felvétele a MySpace.com-ról"
 
-#: ../libpurple/protocols/myspace/myspace.c:2795
+#: ../libpurple/protocols/myspace/myspace.c:2801
 msgid "Importing friends failed"
 msgstr "A barátok importálása sikertelen"
 
 #. TODO: find out how
-#: ../libpurple/protocols/myspace/myspace.c:2851
+#: ../libpurple/protocols/myspace/myspace.c:2857
 msgid "Find people..."
 msgstr "Emberek keresése..."
 
-#: ../libpurple/protocols/myspace/myspace.c:2854
+#: ../libpurple/protocols/myspace/myspace.c:2860
 msgid "Change IM name..."
 msgstr "IM név megváltoztatása..."
 
-#: ../libpurple/protocols/myspace/myspace.c:3156
+#: ../libpurple/protocols/myspace/myspace.c:3162
 msgid "myim URL handler"
 msgstr "myim URL kezelő"
 
-#: ../libpurple/protocols/myspace/myspace.c:3157
+#: ../libpurple/protocols/myspace/myspace.c:3163
 msgid "No suitable MySpaceIM account could be found to open this myim URL."
 msgstr "Nem található megfelelő MySpaceIM fiók ezen myim URL megnyitásához."
 
-#: ../libpurple/protocols/myspace/myspace.c:3158
+#: ../libpurple/protocols/myspace/myspace.c:3164
 msgid "Enable the proper MySpaceIM account and try again."
 msgstr "Engedélyezze a megfelelő MySpaceIM fiókot és próbálkozzon újra."
 
-#: ../libpurple/protocols/myspace/myspace.c:3281
+#: ../libpurple/protocols/myspace/myspace.c:3287
 msgid "Show display name in status text"
 msgstr "A megjelenő név megjelenítése az állapotszövegben"
 
-#: ../libpurple/protocols/myspace/myspace.c:3284
+#: ../libpurple/protocols/myspace/myspace.c:3290
 msgid "Show headline in status text"
 msgstr "Fejléc megjelenítése az állapotszövegben"
 
-#: ../libpurple/protocols/myspace/myspace.c:3289
+#: ../libpurple/protocols/myspace/myspace.c:3295
 msgid "Send emoticons"
 msgstr "Hangulatjelek küldése"
 
-#: ../libpurple/protocols/myspace/myspace.c:3294
+#: ../libpurple/protocols/myspace/myspace.c:3300
 msgid "Screen resolution (dots per inch)"
 msgstr "Képernyőfelbontás (pont/hüvelyk)"
 
-#: ../libpurple/protocols/myspace/myspace.c:3297
+#: ../libpurple/protocols/myspace/myspace.c:3303
 msgid "Base font size (points)"
 msgstr "Alap betűkészletméret (pont)"
 
@@ -7557,178 +7805,199 @@
 msgid "User"
 msgstr "Felhasználó"
 
-#. TODO: link to username, if available
-#: ../libpurple/protocols/myspace/user.c:102
-#: ../libpurple/protocols/oscar/oscar.c:2964
+#: ../libpurple/protocols/myspace/user.c:105
+#: ../libpurple/protocols/oscar/oscar.c:2979
 msgid "Profile"
 msgstr "Profil"
 
-#: ../libpurple/protocols/myspace/user.c:124
-#, fuzzy
+# fixme: talán ez...
+#: ../libpurple/protocols/myspace/user.c:128
 msgid "Headline"
-msgstr "A_zonosító:"
-
-#: ../libpurple/protocols/myspace/user.c:129
-#, fuzzy
+msgstr "Mottó"
+
+#: ../libpurple/protocols/myspace/user.c:133
 msgid "Song"
-msgstr "Hangok"
-
-#: ../libpurple/protocols/myspace/user.c:134
-#, fuzzy
+msgstr "Dal"
+
+#: ../libpurple/protocols/myspace/user.c:141
 msgid "Total Friends"
-msgstr "IM barátok"
-
-#: ../libpurple/protocols/myspace/user.c:145
-#: ../libpurple/protocols/myspace/user.c:148
-#: ../libpurple/protocols/myspace/user.c:151
-#, fuzzy
+msgstr "Barátok összesen"
+
+#: ../libpurple/protocols/myspace/user.c:159
 msgid "Client Version"
-msgstr "Társalgás bezárása"
-
+msgstr "Kliensverzió"
+
+# fixme: valami ilyesmi...
 #. TODO: icons for each zap
-#: ../libpurple/protocols/myspace/zap.c:44
-#: ../libpurple/protocols/myspace/zap.c:177
+#. Lots of comments for translators:
+#. Zap means "to strike suddenly and forcefully as if with a
+#. * projectile or weapon."  This term often has an electrical
+#. * connotation, for example, "he was zapped by electricity when
+#. * he put a fork in the toaster."
+#: ../libpurple/protocols/myspace/zap.c:51
+#: ../libpurple/protocols/myspace/zap.c:214
 msgid "Zap"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:44
-#, fuzzy, c-format
+msgstr "Ütés"
+
+#: ../libpurple/protocols/myspace/zap.c:51
+#, c-format
 msgid "%s has zapped you!"
-msgstr "%s belépett."
-
-#: ../libpurple/protocols/myspace/zap.c:44
+msgstr "%s megütötte!"
+
+#: ../libpurple/protocols/myspace/zap.c:51
 #, c-format
 msgid "Zapping %s..."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:45
+msgstr "%s megütése..."
+
+# fixme: valami ilyesmi...
+#. Whack means "to hit or strike someone with a sharp blow"
+#: ../libpurple/protocols/myspace/zap.c:54
 msgid "Whack"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:45
-#, fuzzy, c-format
+msgstr "Lecsapás"
+
+#: ../libpurple/protocols/myspace/zap.c:54
+#, c-format
 msgid "%s has whacked you!"
-msgstr "A felhasználó letiltotta Önt"
-
-#: ../libpurple/protocols/myspace/zap.c:45
+msgstr "%s lecsapta!"
+
+#: ../libpurple/protocols/myspace/zap.c:54
 #, c-format
 msgid "Whacking %s..."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:46
-#, fuzzy
+msgstr "%s lecsapása..."
+
+#. Torch means "to set on fire."  Don't worry, this doesn't
+#. * make a whole lot of sense in English, either.  Feel free
+#. * to translate it literally.
+#: ../libpurple/protocols/myspace/zap.c:59
 msgid "Torch"
-msgstr "Téma"
-
-#: ../libpurple/protocols/myspace/zap.c:46
-#, fuzzy, c-format
+msgstr "Égetés"
+
+#: ../libpurple/protocols/myspace/zap.c:59
+#, c-format
 msgid "%s has torched you!"
-msgstr "A felhasználó letiltotta Önt"
-
-#: ../libpurple/protocols/myspace/zap.c:46
+msgstr "%s leégette!"
+
+#: ../libpurple/protocols/myspace/zap.c:59
 #, c-format
 msgid "Torching %s..."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:47
+msgstr "%s égetése..."
+
+#. Smooch means "to kiss someone, often enthusiastically"
+#: ../libpurple/protocols/myspace/zap.c:62
 msgid "Smooch"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:47
-#, fuzzy, c-format
+msgstr "Csók"
+
+#: ../libpurple/protocols/myspace/zap.c:62
+#, c-format
 msgid "%s has smooched you!"
-msgstr "%s belépett."
-
-#: ../libpurple/protocols/myspace/zap.c:47
+msgstr "%s megcsókolta!"
+
+#: ../libpurple/protocols/myspace/zap.c:62
 #, c-format
 msgid "Smooching %s..."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:48
+msgstr "%s megcsókolása..."
+
+#. A hug is a display of affection; wrapping your arms around someone
+#: ../libpurple/protocols/myspace/zap.c:65
 msgid "Hug"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:48
-#, fuzzy, c-format
+msgstr "Ölelés"
+
+#: ../libpurple/protocols/myspace/zap.c:65
+#, c-format
 msgid "%s has hugged you!"
-msgstr "%s belépett."
-
-#: ../libpurple/protocols/myspace/zap.c:48
+msgstr "%s megölelte!"
+
+#: ../libpurple/protocols/myspace/zap.c:65
 #, c-format
 msgid "Hugging %s..."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:49
-#, fuzzy
+msgstr "%s ölelése..."
+
+#. Slap means "to hit someone with an open/flat hand"
+#: ../libpurple/protocols/myspace/zap.c:68
 msgid "Slap"
-msgstr "Álmos"
-
-#: ../libpurple/protocols/myspace/zap.c:49
-#, fuzzy, c-format
+msgstr "Pofon"
+
+#: ../libpurple/protocols/myspace/zap.c:68
+#, c-format
 msgid "%s has slapped you!"
-msgstr "%s belépett."
-
-#: ../libpurple/protocols/myspace/zap.c:49
+msgstr "%s egy pofont küld!"
+
+#: ../libpurple/protocols/myspace/zap.c:68
 #, c-format
 msgid "Slapping %s..."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:50
-#, fuzzy
+msgstr "%s pofozása..."
+
+# fixme: hát ez ezt jelenti ;)
+#. Goose means "to pinch someone on their butt"
+#: ../libpurple/protocols/myspace/zap.c:71
 msgid "Goose"
-msgstr "Elment"
-
-#: ../libpurple/protocols/myspace/zap.c:50
-#, fuzzy, c-format
+msgstr "Seggberúgás"
+
+#: ../libpurple/protocols/myspace/zap.c:71
+#, c-format
 msgid "%s has goosed you!"
-msgstr "%s elment."
-
-#: ../libpurple/protocols/myspace/zap.c:50
-#, fuzzy, c-format
+msgstr "%s seggberúgta!"
+
+#: ../libpurple/protocols/myspace/zap.c:71
+#, c-format
 msgid "Goosing %s..."
-msgstr "%s keresése"
-
-#: ../libpurple/protocols/myspace/zap.c:51
+msgstr "%s seggberúgása..."
+
+#. A high-five is when two people's hands slap each other
+#. * in the air above their heads.  It is done to celebrate
+#. * something, often a victory, or to congratulate someone.
+#: ../libpurple/protocols/myspace/zap.c:76
 msgid "High-five"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:51
-#, fuzzy, c-format
+msgstr "Ötös"
+
+#: ../libpurple/protocols/myspace/zap.c:76
+#, c-format
 msgid "%s has high-fived you!"
-msgstr "%s belépett."
-
-#: ../libpurple/protocols/myspace/zap.c:51
+msgstr "%s egy ötöst ad!"
+
+#: ../libpurple/protocols/myspace/zap.c:76
 #, c-format
 msgid "High-fiving %s..."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:52
+msgstr "%s ötöst kap..."
+
+#. We're not entirely sure what the MySpace people mean by
+#. * this... but we think it's the equivalent of "prank."  Or, for
+#. * someone to perform a mischievous trick or practical joke.
+#: ../libpurple/protocols/myspace/zap.c:81
 msgid "Punk"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:52
-#, fuzzy, c-format
+msgstr "Tréfa"
+
+#: ../libpurple/protocols/myspace/zap.c:81
+#, c-format
 msgid "%s has punk'd you!"
-msgstr "%s belépett."
-
-#: ../libpurple/protocols/myspace/zap.c:52
+msgstr "%s megtréfálta!"
+
+#: ../libpurple/protocols/myspace/zap.c:81
 #, c-format
 msgid "Punking %s..."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:53
+msgstr "%s megtréfálása..."
+
+# fixme: elvileg ezt jelenti...
+#. Raspberry is a slang term for the vibrating sound made
+#. * when you stick your tongue out of your mouth with your
+#. * lips closed and blow.  It is typically done when
+#. * gloating or bragging.  Nowadays it's a pretty silly
+#. * gesture, so it does not carry a harsh negative
+#. * connotation.  It is generally used in a playful tone
+#. * with friends.
+#: ../libpurple/protocols/myspace/zap.c:90
 msgid "Raspberry"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/zap.c:53
-#, fuzzy, c-format
+msgstr "Nyelvöltés"
+
+#: ../libpurple/protocols/myspace/zap.c:90
+#, c-format
 msgid "%s has raspberried you!"
-msgstr "%s belépett."
-
-#: ../libpurple/protocols/myspace/zap.c:53
+msgstr "%s nyelvet öltött!"
+
+#: ../libpurple/protocols/myspace/zap.c:90
 #, c-format
 msgid "Raspberrying %s..."
-msgstr ""
+msgstr "Nyelvöltés erre: %s..."
 
 #: ../libpurple/protocols/novell/nmuser.c:1864
 msgid "Required parameters not passed in"
@@ -7844,8 +8113,7 @@
 msgid ""
 "This evaluation version does not allow more than ten users to log in at one "
 "time"
-msgstr ""
-"Ez a próbaverzió nem engedélyezi tíznél több felhasználó egyidejű belépését"
+msgstr "Ez a próbaverzió nem engedélyezi tíznél több felhasználó egyidejű belépését"
 
 #: ../libpurple/protocols/novell/nmuser.c:1953
 msgid "The user is either offline or you are blocked"
@@ -7861,44 +8129,43 @@
 msgid "Login failed (%s)."
 msgstr "A bejelentkezés sikertelen (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:247
+#: ../libpurple/protocols/novell/novell.c:249
 #, c-format
 msgid "Unable to send message. Could not get details for user (%s)."
 msgstr ""
 "Az üzenetet nem lehet elküldeni. A felhasználó részletei nem kérhetőek le (%"
 "s)."
 
-#: ../libpurple/protocols/novell/novell.c:396
+#: ../libpurple/protocols/novell/novell.c:398
 #, c-format
 msgid "Unable to add %s to your buddy list (%s)."
 msgstr "Nem lehet \"%s\"-t felvenni az Ön partnerlistájára (%s)."
 
 #. TODO: Improve this! message to who or for what conference?
-#: ../libpurple/protocols/novell/novell.c:422
+#: ../libpurple/protocols/novell/novell.c:424
 #, c-format
 msgid "Unable to send message (%s)."
 msgstr "Az üzenetet nem lehet elküldeni (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:493
-#: ../libpurple/protocols/novell/novell.c:985
+#: ../libpurple/protocols/novell/novell.c:495
+#: ../libpurple/protocols/novell/novell.c:987
 #, c-format
 msgid "Unable to invite user (%s)."
 msgstr "Nem lehet meghívni a felhasználót (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:532
+#: ../libpurple/protocols/novell/novell.c:534
 #, c-format
 msgid "Unable to send message to %s. Could not create the conference (%s)."
 msgstr ""
 "Az üzenetet nem lehet elküldeni a következőnek: %s. Nem sikerült létrehozni "
 "a konferenciát (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:537
+#: ../libpurple/protocols/novell/novell.c:539
 #, c-format
 msgid "Unable to send message. Could not create the conference (%s)."
-msgstr ""
-"Az üzenetet nem lehet elküldeni. Nem sikerült létrehozni a konferenciát (%s)."
-
-#: ../libpurple/protocols/novell/novell.c:584
+msgstr "Az üzenetet nem lehet elküldeni. Nem sikerült létrehozni a konferenciát (%s)."
+
+#: ../libpurple/protocols/novell/novell.c:586
 #, c-format
 msgid ""
 "Unable to move user %s to folder %s in the server side list. Error while "
@@ -7907,7 +8174,7 @@
 "Nem lehet %s felhasználót a(z) %s mappába mozgatni a kiszolgálóoldali "
 "listán. Hiba a mappa létrehozása közben (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:632
+#: ../libpurple/protocols/novell/novell.c:634
 #, c-format
 msgid ""
 "Unable to add %s to your buddy list. Error creating folder in server side "
@@ -7916,63 +8183,62 @@
 "Nem lehet %s felhasználót felvenni a partnerlistára. Hiba a mappa "
 "létrehozása közben a kiszolgálóoldali listában (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:705
+#: ../libpurple/protocols/novell/novell.c:707
 #, c-format
 msgid "Could not get details for user %s (%s)."
 msgstr "Nem sikerült %s felhasználó részleteit lekérni (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:751
-#: ../libpurple/protocols/novell/novell.c:897
+#: ../libpurple/protocols/novell/novell.c:753
+#: ../libpurple/protocols/novell/novell.c:899
 #, c-format
 msgid "Unable to add user to privacy list (%s)."
 msgstr "Nem lehet a felhasználót felvenni a magánszféra-listára (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:798
+#: ../libpurple/protocols/novell/novell.c:800
 #, c-format
 msgid "Unable to add %s to deny list (%s)."
 msgstr "Nem lehet %s felhasználót felvenni a tiltólistára (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:851
+#: ../libpurple/protocols/novell/novell.c:853
 #, c-format
 msgid "Unable to add %s to permit list (%s)."
 msgstr "Nem lehet %s felhasználót felvenni az engedélyezési listára (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:919
+#: ../libpurple/protocols/novell/novell.c:921
 #, c-format
 msgid "Unable to remove %s from privacy list (%s)."
 msgstr "Nem lehet %s felhasználót eltávolítani a magánszféra-listáról (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:942
-#: ../libpurple/protocols/novell/novell.c:1647
+#: ../libpurple/protocols/novell/novell.c:944
+#: ../libpurple/protocols/novell/novell.c:1649
 #, c-format
 msgid "Unable to change server side privacy settings (%s)."
-msgstr ""
-"Nem lehet megváltoztatni a kiszolgálóoldali magánszféra-beállításokat (%s)."
-
-#: ../libpurple/protocols/novell/novell.c:1012
+msgstr "Nem lehet megváltoztatni a kiszolgálóoldali magánszféra-beállításokat (%s)."
+
+#: ../libpurple/protocols/novell/novell.c:1014
 #, c-format
 msgid "Unable to create conference (%s)."
 msgstr "Nem lehet konferenciát létrehozni (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:1121
-#: ../libpurple/protocols/novell/novell.c:1692
+#: ../libpurple/protocols/novell/novell.c:1123
+#: ../libpurple/protocols/novell/novell.c:1694
 msgid "Error communicating with server. Closing connection."
 msgstr "Hiba a kiszolgálóval végzett kommunikációban, a kapcsolat lezárása."
 
-#: ../libpurple/protocols/novell/novell.c:1476
+#: ../libpurple/protocols/novell/novell.c:1478
 msgid "Telephone Number"
 msgstr "Telefonszám"
 
-#: ../libpurple/protocols/novell/novell.c:1482
+#: ../libpurple/protocols/novell/novell.c:1484
 msgid "Personal Title"
 msgstr "Saját cím"
 
-#: ../libpurple/protocols/novell/novell.c:1486
+#: ../libpurple/protocols/novell/novell.c:1488
 msgid "Mailstop"
 msgstr "Postacím"
 
-#: ../libpurple/protocols/novell/novell.c:1502
-#: ../libpurple/protocols/sametime/sametime.c:4122
+#: ../libpurple/protocols/novell/novell.c:1504
+#: ../libpurple/protocols/sametime/sametime.c:4123
 msgid "User ID"
 msgstr "Felhasználóazonosító"
 
@@ -7982,41 +8248,41 @@
 #. purple_notify_user_info_add_pair(user_info, tag, value);
 #. }
 #.
-#: ../libpurple/protocols/novell/novell.c:1515
+#: ../libpurple/protocols/novell/novell.c:1517
 msgid "Full name"
 msgstr "Teljes név"
 
-#: ../libpurple/protocols/novell/novell.c:1637
+#: ../libpurple/protocols/novell/novell.c:1639
 #, c-format
 msgid "GroupWise Conference %d"
 msgstr "GroupWise konferencia %d"
 
-#: ../libpurple/protocols/novell/novell.c:1668
+#: ../libpurple/protocols/novell/novell.c:1670
 msgid "Unable to make SSL connection to server."
 msgstr "Nem lehet SSL kapcsolatot létrehozni a kiszolgálóhoz."
 
-#: ../libpurple/protocols/novell/novell.c:1720
+#: ../libpurple/protocols/novell/novell.c:1722
 msgid "Authenticating..."
 msgstr "Hitelesítés..."
 
-#: ../libpurple/protocols/novell/novell.c:1732
+#: ../libpurple/protocols/novell/novell.c:1734
 msgid "Unable to connect to server."
 msgstr "Nem lehet a kiszolgálóhoz kapcsolódni."
 
-#: ../libpurple/protocols/novell/novell.c:1735
+#: ../libpurple/protocols/novell/novell.c:1737
 msgid "Waiting for response..."
 msgstr "Várakozás válaszra..."
 
-#: ../libpurple/protocols/novell/novell.c:1870
+#: ../libpurple/protocols/novell/novell.c:1872
 #, c-format
 msgid "%s has been invited to this conversation."
 msgstr "%s meghívva erre a társalgásra."
 
-#: ../libpurple/protocols/novell/novell.c:1898
+#: ../libpurple/protocols/novell/novell.c:1900
 msgid "Invitation to Conversation"
 msgstr "Meghívás társalgásra"
 
-#: ../libpurple/protocols/novell/novell.c:1899
+#: ../libpurple/protocols/novell/novell.c:1901
 #, c-format
 msgid ""
 "Invitation from: %s\n"
@@ -8027,27 +8293,24 @@
 "\n"
 "Elküldve: %s"
 
-#: ../libpurple/protocols/novell/novell.c:1901
+#: ../libpurple/protocols/novell/novell.c:1903
 msgid "Would you like to join the conversation?"
 msgstr "Szeretne csatlakozni a társalgáshoz?"
 
-#. we don't want to reconnect in this case
-#: ../libpurple/protocols/novell/novell.c:2012
+#: ../libpurple/protocols/novell/novell.c:2017
 msgid "You have been logged out because you logged in at another workstation."
-msgstr ""
-"Ki lett jelentkeztetve, mivel bejelentkezett egy másik munkaállomásról."
-
-#: ../libpurple/protocols/novell/novell.c:2069
-#, c-format
-msgid ""
-"%s appears to be offline and did not receive the message that you just sent."
+msgstr "Ki lett jelentkeztetve, mivel bejelentkezett egy másik munkaállomásról."
+
+#: ../libpurple/protocols/novell/novell.c:2074
+#, c-format
+msgid "%s appears to be offline and did not receive the message that you just sent."
 msgstr "Úgy tűnik, %s kilépett, és nem kapta meg az utoljára küldött üzenetet."
 
 #. TODO: Would be nice to prompt if not set!
-#. *  purple_request_fields(gc, _("Server Address"),...);
+#. *  purple_request_fields_with_hint(gc, _("Server Address"),...);
 #.
 #. ...but for now just error out with a nice message.
-#: ../libpurple/protocols/novell/novell.c:2167
+#: ../libpurple/protocols/novell/novell.c:2172
 msgid ""
 "Unable to connect to server. Please enter the address of the server you wish "
 "to connect to."
@@ -8055,11 +8318,11 @@
 "Nem lehet kapcsolódni a kiszolgálóhoz. Kérem adja meg a kiszolgáló címét, "
 "amelyikhez kapcsolódni szeretne."
 
-#: ../libpurple/protocols/novell/novell.c:2195
+#: ../libpurple/protocols/novell/novell.c:2200
 msgid "Error. SSL support is not installed."
 msgstr "Hiba: az SSL támogatás nincs telepítve."
 
-#: ../libpurple/protocols/novell/novell.c:2504
+#: ../libpurple/protocols/novell/novell.c:2509
 #, c-format
 msgid "This conference has been closed. No more messages can be sent."
 msgstr "Ez a konferencia le lett zárva. További üzenetek már nem küldhetőek."
@@ -8074,33 +8337,33 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/novell/novell.c:3518
-#: ../libpurple/protocols/novell/novell.c:3520
+#: ../libpurple/protocols/novell/novell.c:3523
+#: ../libpurple/protocols/novell/novell.c:3525
 msgid "Novell GroupWise Messenger Protocol Plugin"
 msgstr "Novell GroupWise Messenger protokollbővítmény"
 
-#: ../libpurple/protocols/novell/novell.c:3545
+#: ../libpurple/protocols/novell/novell.c:3550
 msgid "Server address"
 msgstr "Kiszolgáló címe"
 
-#: ../libpurple/protocols/novell/novell.c:3549
+#: ../libpurple/protocols/novell/novell.c:3554
 msgid "Server port"
 msgstr "Kiszolgáló portja"
 
-#: ../libpurple/protocols/oscar/flap_connection.c:387
-#: ../libpurple/protocols/yahoo/yahoo.c:2469
-#: ../libpurple/protocols/yahoo/yahoo.c:2636
-#: ../libpurple/protocols/yahoo/ycht.c:481 ../libpurple/proxy.c:581
-#: ../libpurple/proxy.c:1116 ../libpurple/proxy.c:1225
-#: ../libpurple/proxy.c:1325 ../libpurple/proxy.c:1453
+#: ../libpurple/protocols/oscar/flap_connection.c:389
+#: ../libpurple/protocols/yahoo/yahoo.c:2471
+#: ../libpurple/protocols/yahoo/yahoo.c:2638
+#: ../libpurple/protocols/yahoo/ycht.c:481 ../libpurple/proxy.c:584
+#: ../libpurple/proxy.c:1129 ../libpurple/proxy.c:1238
+#: ../libpurple/proxy.c:1338 ../libpurple/proxy.c:1466
 msgid "Server closed the connection."
 msgstr "A kiszolgáló lezárta a kapcsolatot."
 
-#: ../libpurple/protocols/oscar/flap_connection.c:389
-#: ../libpurple/protocols/yahoo/yahoo.c:2463
-#: ../libpurple/protocols/yahoo/yahoo.c:2630 ../libpurple/proxy.c:593
-#: ../libpurple/proxy.c:1128 ../libpurple/proxy.c:1237
-#: ../libpurple/proxy.c:1337 ../libpurple/proxy.c:1465
+#: ../libpurple/protocols/oscar/flap_connection.c:391
+#: ../libpurple/protocols/yahoo/yahoo.c:2465
+#: ../libpurple/protocols/yahoo/yahoo.c:2632 ../libpurple/proxy.c:596
+#: ../libpurple/proxy.c:1141 ../libpurple/proxy.c:1250
+#: ../libpurple/proxy.c:1350 ../libpurple/proxy.c:1478
 #, c-format
 msgid ""
 "Lost connection with server:\n"
@@ -8109,10 +8372,10 @@
 "Elveszett a kapcsolat a kiszolgálóhoz:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/flap_connection.c:392
-#: ../libpurple/proxy.c:1145 ../libpurple/proxy.c:1250
-#: ../libpurple/proxy.c:1349 ../libpurple/proxy.c:1421
-#: ../libpurple/proxy.c:1478
+#: ../libpurple/protocols/oscar/flap_connection.c:394
+#: ../libpurple/proxy.c:1158 ../libpurple/proxy.c:1263
+#: ../libpurple/proxy.c:1362 ../libpurple/proxy.c:1434
+#: ../libpurple/proxy.c:1491
 msgid "Received invalid data on connection with server."
 msgstr "Érvénytelen adatok érkeztek a kapcsolaton a kiszolgálótól."
 
@@ -8147,36 +8410,45 @@
 msgstr "ICQ protokollbővítmény"
 
 #: ../libpurple/protocols/oscar/libicq.c:147
-#: ../libpurple/protocols/yahoo/yahoo.c:4410
+#: ../libpurple/protocols/yahoo/yahoo.c:4412
 #: ../libpurple/protocols/zephyr/zephyr.c:2997
 msgid "Encoding"
 msgstr "Kódolás"
 
-#: ../libpurple/protocols/oscar/odc.c:40
+#: ../libpurple/protocols/oscar/odc.c:42
 msgid "The remote user has closed the connection."
 msgstr "A távoli felhasználó lezárta a kapcsolatot."
 
-#: ../libpurple/protocols/oscar/odc.c:42
+#: ../libpurple/protocols/oscar/odc.c:44
 msgid "The remote user has declined your request."
 msgstr "A távoli felhasználó visszautasította a kérését."
 
-#: ../libpurple/protocols/oscar/odc.c:44
+#: ../libpurple/protocols/oscar/odc.c:46
 #, c-format
 msgid "Lost connection with the remote user:<br>%s"
 msgstr "A távoli felhasználóhoz elveszett a kapcsolat:<br>%s"
 
-#: ../libpurple/protocols/oscar/odc.c:47
+#: ../libpurple/protocols/oscar/odc.c:49
 msgid "Received invalid data on connection with remote user."
 msgstr "Érvénytelen adatok érkeztek a kapcsolaton a távoli felhasználótól."
 
-#: ../libpurple/protocols/oscar/odc.c:49
+#: ../libpurple/protocols/oscar/odc.c:51
 msgid "Could not establish a connection with the remote user."
 msgstr "Nem hozható létre kapcsolat a távoli felhasználóval."
 
-#: ../libpurple/protocols/oscar/odc.c:560
+#: ../libpurple/protocols/oscar/odc.c:562
 msgid "Direct IM established"
 msgstr "A közvetlen kapcsolat létrejött"
 
+#: ../libpurple/protocols/oscar/odc.c:600
+#, c-format
+msgid ""
+"%s tried to send you a %s file, but we only allow files up to %s over Direct "
+"IM.  Try using file transfer instead.\n"
+msgstr ""
+"%s egy %s fájlt próbált küldeni, de közvetlen kapcsolatban legfeljebb csak %"
+"s méretű fájl küldhető. Próbálkozzon inkább a fájlátvitellel.\n"
+
 #: ../libpurple/protocols/oscar/oft.c:656
 #, c-format
 msgid "File %s is %s, which is larger than the maximum size of %s."
@@ -8300,8 +8572,8 @@
 "kódolást használnak, vagy %s hibás klienst használ.)"
 
 #. Label
-#: ../libpurple/protocols/oscar/oscar.c:639 ../pidgin/gtkutils.c:2387
-#: ../pidgin/gtkutils.c:2417
+#: ../libpurple/protocols/oscar/oscar.c:639 ../pidgin/gtkutils.c:2391
+#: ../pidgin/gtkutils.c:2421
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:332
 msgid "Buddy Icon"
 msgstr "Partnerikon"
@@ -8315,15 +8587,15 @@
 msgstr "AIM közvetlen azonnali üzenetek"
 
 #: ../libpurple/protocols/oscar/oscar.c:648
-#: ../libpurple/protocols/silc/silc.c:768
-#: ../libpurple/protocols/silc/util.c:553
+#: ../libpurple/protocols/silc/silc.c:899
+#: ../libpurple/protocols/silc/util.c:557
 #: ../libpurple/protocols/silc10/silc.c:679
 #: ../libpurple/protocols/silc10/util.c:549
 msgid "Chat"
 msgstr "Csevegés"
 
 #: ../libpurple/protocols/oscar/oscar.c:651
-#: ../libpurple/protocols/oscar/oscar.c:6010
+#: ../libpurple/protocols/oscar/oscar.c:6065
 msgid "Get File"
 msgstr "Fájl letöltése"
 
@@ -8396,19 +8668,19 @@
 msgstr "Fényképezőgép"
 
 #: ../libpurple/protocols/oscar/oscar.c:725
-#: ../libpurple/protocols/oscar/oscar.c:5780
+#: ../libpurple/protocols/oscar/oscar.c:5835
 #, c-format
 msgid "Free For Chat"
 msgstr "Ráérek csevegni"
 
 #: ../libpurple/protocols/oscar/oscar.c:729
-#: ../libpurple/protocols/oscar/oscar.c:5815
+#: ../libpurple/protocols/oscar/oscar.c:5870
 #, c-format
 msgid "Not Available"
 msgstr "Nem érhető el"
 
 #: ../libpurple/protocols/oscar/oscar.c:731
-#: ../libpurple/protocols/oscar/oscar.c:5801
+#: ../libpurple/protocols/oscar/oscar.c:5856
 #, c-format
 msgid "Occupied"
 msgstr "Elfoglalt"
@@ -8420,8 +8692,8 @@
 
 #: ../libpurple/protocols/oscar/oscar.c:737 ../libpurple/protocols/qq/qq.c:183
 #: ../libpurple/protocols/qq/qq.c:288
-#: ../libpurple/protocols/yahoo/yahoo.c:3095 ../libpurple/status.c:157
-#: ../pidgin/gtkdocklet.c:446 ../pidgin/gtkstatusbox.c:1060
+#: ../libpurple/protocols/yahoo/yahoo.c:3097 ../libpurple/status.c:157
+#: ../pidgin/gtkdocklet.c:557 ../pidgin/gtkstatusbox.c:1060
 #, c-format
 msgid "Invisible"
 msgstr "Láthatatlan"
@@ -8432,13 +8704,13 @@
 msgstr "Elérhető"
 
 #: ../libpurple/protocols/oscar/oscar.c:838
-#: ../libpurple/protocols/oscar/oscar.c:3707
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:721 ../pidgin/gtkprefs.c:1126
+#: ../libpurple/protocols/oscar/oscar.c:3722
+#: ../libpurple/protocols/yahoo/yahoo_profile.c:721 ../pidgin/gtkprefs.c:1156
 msgid "IP Address"
 msgstr "IP cím"
 
 #: ../libpurple/protocols/oscar/oscar.c:845
-#: ../libpurple/protocols/oscar/oscar.c:2891
+#: ../libpurple/protocols/oscar/oscar.c:2906
 msgid "Warning Level"
 msgstr "Figyelmeztetési szint"
 
@@ -8477,7 +8749,7 @@
 msgid "Finalizing connection"
 msgstr "Kapcsolódás befejezése"
 
-#: ../libpurple/protocols/oscar/oscar.c:1260
+#: ../libpurple/protocols/oscar/oscar.c:1262
 #, c-format
 msgid ""
 "Unable to login: Could not sign on as %s because the screen name is "
@@ -8489,29 +8761,29 @@
 "betűvel kell kezdődniük és betűket, számokat, szóközöket, vagy csak számokat "
 "tartalmazhatnak."
 
-#: ../libpurple/protocols/oscar/oscar.c:1345
-#: ../libpurple/protocols/yahoo/yahoo.c:2105
+#: ../libpurple/protocols/oscar/oscar.c:1348
+#: ../libpurple/protocols/yahoo/yahoo.c:2107
 msgid "Invalid screen name."
 msgstr "Érvénytelen felhasználónév."
 
-#: ../libpurple/protocols/oscar/oscar.c:1352
-#: ../libpurple/protocols/qq/login_logout.c:483
-#: ../libpurple/protocols/simple/simple.c:1045
-#: ../libpurple/protocols/yahoo/yahoo.c:2126
+#: ../libpurple/protocols/oscar/oscar.c:1355
+#: ../libpurple/protocols/qq/login_logout.c:485
+#: ../libpurple/protocols/simple/simple.c:1108
+#: ../libpurple/protocols/yahoo/yahoo.c:2128
 msgid "Incorrect password."
 msgstr "Helytelen jelszó."
 
-#: ../libpurple/protocols/oscar/oscar.c:1357
+#: ../libpurple/protocols/oscar/oscar.c:1360
 msgid "Your account is currently suspended."
 msgstr "A fiókja jelenleg fel van függesztve."
 
 #. service temporarily unavailable
-#: ../libpurple/protocols/oscar/oscar.c:1361
+#: ../libpurple/protocols/oscar/oscar.c:1364
 msgid "The AOL Instant Messenger service is temporarily unavailable."
 msgstr "Az AOL azonnali üzenő szolgáltatás átmenetileg nem érhető el."
 
-#: ../libpurple/protocols/oscar/oscar.c:1366
-#: ../libpurple/protocols/oscar/oscar.c:1377
+#: ../libpurple/protocols/oscar/oscar.c:1369
+#: ../libpurple/protocols/oscar/oscar.c:1380
 msgid ""
 "You have been connecting and disconnecting too frequently. Wait ten minutes "
 "and try again. If you continue to try, you will need to wait even longer."
@@ -8519,46 +8791,54 @@
 "Ön túl gyakran jelentkezik ki/be. Várjon tíz percet és próbálja meg újra. Ha "
 "tovább folytatja, még többet kell majd várnia."
 
-#: ../libpurple/protocols/oscar/oscar.c:1371
+#: ../libpurple/protocols/oscar/oscar.c:1374
 #, c-format
 msgid "The client version you are using is too old. Please upgrade at %s"
 msgstr ""
 "A használt kliensprogram verziója túl régi. Kérem töltse le a frissítést a "
 "következő helyről: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:1410
+#: ../libpurple/protocols/oscar/oscar.c:1413
 msgid "Could Not Connect"
 msgstr "Nem sikerült kapcsolódni"
 
-#: ../libpurple/protocols/oscar/oscar.c:1414
+#: ../libpurple/protocols/oscar/oscar.c:1417
 msgid "Received authorization"
 msgstr "A hitelesítés fogadva"
 
-#: ../libpurple/protocols/oscar/oscar.c:1436
+#: ../libpurple/protocols/oscar/oscar.c:1439
 msgid "The SecurID key entered is invalid."
 msgstr "A megadott SecurID kulcs érvénytelen."
 
-#: ../libpurple/protocols/oscar/oscar.c:1449
+#: ../libpurple/protocols/oscar/oscar.c:1452
 msgid "Enter SecurID"
 msgstr "Adja meg a SecurID-t"
 
-#: ../libpurple/protocols/oscar/oscar.c:1450
+#: ../libpurple/protocols/oscar/oscar.c:1453
 msgid "Enter the 6 digit number from the digital display."
 msgstr "Írja be a hatjegyű számot a digitális képernyőről."
 
 #. *
 #. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
+#. *
+#. * @since 2.3.0
 #.
-#: ../libpurple/protocols/oscar/oscar.c:1452
-#: ../libpurple/protocols/oscar/oscar.c:2232
-#: ../libpurple/protocols/oscar/oscar.c:2281
-#: ../libpurple/protocols/oscar/oscar.c:5885
-#: ../libpurple/protocols/oscar/oscar.c:6166 ../libpurple/request.h:1388
+#. *
+#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
+#. *
+#. * @deprecated Please use purple_request_ok_cancel_with_hint instead.
+#.
+#: ../libpurple/protocols/oscar/oscar.c:1455
+#: ../libpurple/protocols/oscar/oscar.c:2247
+#: ../libpurple/protocols/oscar/oscar.c:2296
+#: ../libpurple/protocols/oscar/oscar.c:5940
+#: ../libpurple/protocols/oscar/oscar.c:6221 ../libpurple/request.h:1828
+#: ../libpurple/request.h:1841
 msgid "_OK"
 msgstr "_OK"
 
-#: ../libpurple/protocols/oscar/oscar.c:1491
-#: ../libpurple/protocols/oscar/oscar.c:1534
+#: ../libpurple/protocols/oscar/oscar.c:1494
+#: ../libpurple/protocols/oscar/oscar.c:1537
 #, c-format
 msgid ""
 "You may be disconnected shortly.  You may want to use TOC until this is "
@@ -8567,55 +8847,55 @@
 "Hamarosan megszakad a kapcsolat. A helyreállításig használja a TOC-ot. "
 "Frissítésekért keresse fel a következő címet: %s."
 
-#: ../libpurple/protocols/oscar/oscar.c:1494
-#: ../libpurple/protocols/oscar/oscar.c:1537
+#: ../libpurple/protocols/oscar/oscar.c:1497
+#: ../libpurple/protocols/oscar/oscar.c:1540
 msgid "Unable to get a valid AIM login hash."
 msgstr "Nem kérhető le érvényes AIM belépő hash."
 
-#: ../libpurple/protocols/oscar/oscar.c:1622
+#: ../libpurple/protocols/oscar/oscar.c:1625
 #, c-format
 msgid "You may be disconnected shortly.  Check %s for updates."
 msgstr ""
 "Hamarosan megszakad a kapcsolat. Frissítésekért keresse fel a következő "
 "címet: %s."
 
-#: ../libpurple/protocols/oscar/oscar.c:1625
+#: ../libpurple/protocols/oscar/oscar.c:1628
 msgid "Unable to get a valid login hash."
 msgstr "Nem kérhető le érvényes belépő hash."
 
-#: ../libpurple/protocols/oscar/oscar.c:1655
+#: ../libpurple/protocols/oscar/oscar.c:1658
 msgid "Password sent"
 msgstr "Jelszó elküldve"
 
-#: ../libpurple/protocols/oscar/oscar.c:1711
+#: ../libpurple/protocols/oscar/oscar.c:1714
 msgid "Unable to initialize connection"
 msgstr "A kapcsolat nem inicializálható"
 
-#: ../libpurple/protocols/oscar/oscar.c:2202
+#: ../libpurple/protocols/oscar/oscar.c:2205
 msgid "Please authorize me so I can add you to my buddy list."
 msgstr "Kérem engedélyezze, hogy felvehessem a partnereim közé."
 
-#: ../libpurple/protocols/oscar/oscar.c:2230
+#: ../libpurple/protocols/oscar/oscar.c:2245
 msgid "Authorization Request Message:"
 msgstr "Engedélyezést kérő üzenet:"
 
-#: ../libpurple/protocols/oscar/oscar.c:2231
+#: ../libpurple/protocols/oscar/oscar.c:2246
 msgid "Please authorize me!"
 msgstr "Kérem engedélyezze, hogy felvegyem!"
 
-#: ../libpurple/protocols/oscar/oscar.c:2272
-#: ../libpurple/protocols/oscar/oscar.c:2280
-#: ../libpurple/protocols/oscar/oscar.c:2407
-#: ../libpurple/protocols/oscar/oscar.c:5263
-#: ../libpurple/protocols/yahoo/yahoo.c:1030
+#: ../libpurple/protocols/oscar/oscar.c:2287
+#: ../libpurple/protocols/oscar/oscar.c:2295
+#: ../libpurple/protocols/oscar/oscar.c:2422
+#: ../libpurple/protocols/oscar/oscar.c:5316
+#: ../libpurple/protocols/yahoo/yahoo.c:1032
 msgid "No reason given."
 msgstr "Nincs ok megadva."
 
-#: ../libpurple/protocols/oscar/oscar.c:2279
+#: ../libpurple/protocols/oscar/oscar.c:2294
 msgid "Authorization Denied Message:"
 msgstr "Engedélyezést elutasító üzenet:"
 
-#: ../libpurple/protocols/oscar/oscar.c:2407
+#: ../libpurple/protocols/oscar/oscar.c:2422
 #, c-format
 msgid ""
 "The user %u has denied your request to add them to your buddy list for the "
@@ -8626,18 +8906,17 @@
 "következő indoklással:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2408
+#: ../libpurple/protocols/oscar/oscar.c:2423
 msgid "ICQ authorization denied."
 msgstr "ICQ engedélyezés elutasítva."
 
 #. Someone has granted you authorization
-#: ../libpurple/protocols/oscar/oscar.c:2415
+#: ../libpurple/protocols/oscar/oscar.c:2430
 #, c-format
 msgid "The user %u has granted your request to add them to your buddy list."
-msgstr ""
-"%u felhasználó elfogadta a kérését, így felveheti őt a partnerlistájára."
-
-#: ../libpurple/protocols/oscar/oscar.c:2423
+msgstr "%u felhasználó elfogadta a kérését, így felveheti őt a partnerlistájára."
+
+#: ../libpurple/protocols/oscar/oscar.c:2438
 #, c-format
 msgid ""
 "You have received a special message\n"
@@ -8650,7 +8929,7 @@
 "Feladó: %s [%s]\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2431
+#: ../libpurple/protocols/oscar/oscar.c:2446
 #, c-format
 msgid ""
 "You have received an ICQ page\n"
@@ -8663,7 +8942,7 @@
 "Feladó: %s [%s]\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2439
+#: ../libpurple/protocols/oscar/oscar.c:2454
 #, c-format
 msgid ""
 "You have received an ICQ e-mail from %s [%s]\n"
@@ -8676,50 +8955,44 @@
 "Az üzenet:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2460
+#: ../libpurple/protocols/oscar/oscar.c:2475
 #, c-format
 msgid "ICQ user %u has sent you a buddy: %s (%s)"
 msgstr "%u ICQ felhasználó küldött Önnek egy partnert: %s (%s)"
 
-#: ../libpurple/protocols/oscar/oscar.c:2466
+#: ../libpurple/protocols/oscar/oscar.c:2481
 msgid "Do you want to add this buddy to your buddy list?"
 msgstr "Fel kívánja venni ezt a partnert a listájára?"
 
-#: ../libpurple/protocols/oscar/oscar.c:2471 ../pidgin/gtkroomlist.c:309
+#: ../libpurple/protocols/oscar/oscar.c:2486 ../pidgin/gtkroomlist.c:309
 msgid "_Add"
 msgstr "Hozzá_adás"
 
-#: ../libpurple/protocols/oscar/oscar.c:2472
+#: ../libpurple/protocols/oscar/oscar.c:2487
 msgid "_Decline"
 msgstr "_Elutasítás"
 
-#: ../libpurple/protocols/oscar/oscar.c:2596
+#: ../libpurple/protocols/oscar/oscar.c:2611
 #, c-format
 msgid "You missed %hu message from %s because it was invalid."
 msgid_plural "You missed %hu messages from %s because they were invalid."
-msgstr[0] ""
-"Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt."
-msgstr[1] ""
-"Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt."
-
-#: ../libpurple/protocols/oscar/oscar.c:2605
+msgstr[0] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt."
+msgstr[1] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt."
+
+#: ../libpurple/protocols/oscar/oscar.c:2620
 #, c-format
 msgid "You missed %hu message from %s because it was too large."
 msgid_plural "You missed %hu messages from %s because they were too large."
-msgstr[0] ""
-"Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt."
-msgstr[1] ""
-"Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt."
+msgstr[0] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt."
+msgstr[1] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt."
 
 # #: ../src/protocols/oscar/oscar.c:1605
 # #, c-format
 # msgid "You missed %d message from %s because the rate limit has been exceeded."
-#: ../libpurple/protocols/oscar/oscar.c:2614
-#, c-format
-msgid ""
-"You missed %hu message from %s because the rate limit has been exceeded."
-msgid_plural ""
-"You missed %hu messages from %s because the rate limit has been exceeded."
+#: ../libpurple/protocols/oscar/oscar.c:2629
+#, c-format
+msgid "You missed %hu message from %s because the rate limit has been exceeded."
+msgid_plural "You missed %hu messages from %s because the rate limit has been exceeded."
 msgstr[0] ""
 "Nem kapott meg %hu üzenetet a következőtől: %s, mert túllépte a küldés "
 "gyakoriságának a korlátját."
@@ -8727,7 +9000,7 @@
 "Nem kapott meg %hu üzenetet a következőtől: %s, mert túllépte a küldés "
 "gyakoriságának a korlátját."
 
-#: ../libpurple/protocols/oscar/oscar.c:2623
+#: ../libpurple/protocols/oscar/oscar.c:2638
 #, c-format
 msgid "You missed %hu message from %s because he/she was too evil."
 msgid_plural "You missed %hu messages from %s because he/she was too evil."
@@ -8738,7 +9011,7 @@
 "Nem kapott meg %hu üzenetet a következőtől: %s, mert a feladó túl "
 "rosszindulatú volt."
 
-#: ../libpurple/protocols/oscar/oscar.c:2632
+#: ../libpurple/protocols/oscar/oscar.c:2647
 #, c-format
 msgid "You missed %hu message from %s because you are too evil."
 msgid_plural "You missed %hu messages from %s because you are too evil."
@@ -8749,7 +9022,7 @@
 "Nem kapott meg %hu üzenetet a következőtől: %s, mert Ön túl rosszindulatú "
 "volt."
 
-#: ../libpurple/protocols/oscar/oscar.c:2641
+#: ../libpurple/protocols/oscar/oscar.c:2656
 #, c-format
 msgid "You missed %hu message from %s for an unknown reason."
 msgid_plural "You missed %hu messages from %s for an unknown reason."
@@ -8757,47 +9030,47 @@
 msgstr[1] "Nem kapott meg %hu üzenetet a következőtől: %s, ismeretlen okból."
 
 #. Data is assumed to be the destination sn
-#: ../libpurple/protocols/oscar/oscar.c:2796
+#: ../libpurple/protocols/oscar/oscar.c:2811
 #, c-format
 msgid "Unable to send message: %s"
 msgstr "Az üzenetet nem lehet elküldeni: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2796
-#: ../libpurple/protocols/oscar/oscar.c:2801
-#: ../libpurple/protocols/oscar/oscar.c:2865
+#: ../libpurple/protocols/oscar/oscar.c:2811
+#: ../libpurple/protocols/oscar/oscar.c:2816
+#: ../libpurple/protocols/oscar/oscar.c:2880
 msgid "Unknown reason."
 msgstr "Ismeretlen ok."
 
-#: ../libpurple/protocols/oscar/oscar.c:2799
-#: ../libpurple/protocols/sametime/sametime.c:2409
+#: ../libpurple/protocols/oscar/oscar.c:2814
+#: ../libpurple/protocols/sametime/sametime.c:2410
 #, c-format
 msgid "Unable to send message to %s:"
 msgstr "Az üzenetet nem lehet elküldeni a következőnek: %s:"
 
-#: ../libpurple/protocols/oscar/oscar.c:2865
+#: ../libpurple/protocols/oscar/oscar.c:2880
 #, c-format
 msgid "User information not available: %s"
 msgstr "A felhasználó információi nem érhetőek el: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2896
+#: ../libpurple/protocols/oscar/oscar.c:2911
 msgid "Online Since"
 msgstr "Kapcsolódva ezóta"
 
-#: ../libpurple/protocols/oscar/oscar.c:2901
+#: ../libpurple/protocols/oscar/oscar.c:2916
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1185
 msgid "Member Since"
-msgstr "Tag ezóta"
-
-#: ../libpurple/protocols/oscar/oscar.c:2936
+msgstr "Tagság kezdete"
+
+#: ../libpurple/protocols/oscar/oscar.c:2951
 msgid "Available Message"
 msgstr "Elérhetőségi üzenet"
 
-#: ../libpurple/protocols/oscar/oscar.c:3044
+#: ../libpurple/protocols/oscar/oscar.c:3059
 msgid "Your AIM connection may be lost."
 msgstr "Az AIM kapcsolata megszakadhatott."
 
 #. The conversion failed!
-#: ../libpurple/protocols/oscar/oscar.c:3232
+#: ../libpurple/protocols/oscar/oscar.c:3247
 msgid ""
 "[Unable to display a message from this user because it contained invalid "
 "characters.]"
@@ -8805,7 +9078,7 @@
 "[Nem lehet megjeleníteni az üzenetet ettől a felhasználótól, mert az "
 "érvénytelen karaktereket tartalmazott.]"
 
-#: ../libpurple/protocols/oscar/oscar.c:3396
+#: ../libpurple/protocols/oscar/oscar.c:3411
 msgid ""
 "The last action you attempted could not be performed because you are over "
 "the rate limit. Please wait 10 seconds and try again."
@@ -8813,83 +9086,83 @@
 "Az utolsó művelet nem hajtható végre, mert a túllépte a sebességkorlátot. "
 "Kérem várjon 10 másodpercet és próbálja meg újra."
 
-#: ../libpurple/protocols/oscar/oscar.c:3479
+#: ../libpurple/protocols/oscar/oscar.c:3494
 #: ../libpurple/protocols/toc/toc.c:977
 #, c-format
 msgid "You have been disconnected from chat room %s."
 msgstr "Kilépett a(z) %s csevegőszobából."
 
-#: ../libpurple/protocols/oscar/oscar.c:3729
-#: ../libpurple/protocols/silc/util.c:585
+#: ../libpurple/protocols/oscar/oscar.c:3744
+#: ../libpurple/protocols/silc/util.c:589
 #: ../libpurple/protocols/silc10/util.c:581
 msgid "Mobile Phone"
 msgstr "Mobiltelefon"
 
-#: ../libpurple/protocols/oscar/oscar.c:3759
+#: ../libpurple/protocols/oscar/oscar.c:3774
 msgid "Personal Web Page"
 msgstr "Saját weboldal"
 
-#: ../libpurple/protocols/oscar/oscar.c:3783
+#: ../libpurple/protocols/oscar/oscar.c:3798
 #: ../libpurple/protocols/qq/buddy_info.c:40
 msgid "Additional Information"
 msgstr "További információ"
 
-#: ../libpurple/protocols/oscar/oscar.c:3791
-#: ../libpurple/protocols/oscar/oscar.c:3804
+#: ../libpurple/protocols/oscar/oscar.c:3806
+#: ../libpurple/protocols/oscar/oscar.c:3819
 msgid "Zip Code"
 msgstr "Irányítószám"
 
-#: ../libpurple/protocols/oscar/oscar.c:3815
+#: ../libpurple/protocols/oscar/oscar.c:3830
 msgid "Division"
 msgstr "Részleg"
 
-#: ../libpurple/protocols/oscar/oscar.c:3816
+#: ../libpurple/protocols/oscar/oscar.c:3831
 msgid "Position"
 msgstr "Pozíció"
 
-#: ../libpurple/protocols/oscar/oscar.c:3818
+#: ../libpurple/protocols/oscar/oscar.c:3833
 msgid "Web Page"
 msgstr "Weboldal"
 
-#: ../libpurple/protocols/oscar/oscar.c:3821
+#: ../libpurple/protocols/oscar/oscar.c:3836
 msgid "Work Information"
 msgstr "Munkahelyi adatok"
 
-#: ../libpurple/protocols/oscar/oscar.c:3877
+#: ../libpurple/protocols/oscar/oscar.c:3892
 msgid "Pop-Up Message"
 msgstr "Felbukkanó üzenet"
 
-#: ../libpurple/protocols/oscar/oscar.c:3917
+#: ../libpurple/protocols/oscar/oscar.c:3932
 #, c-format
 msgid "The following screen name is associated with %s"
 msgid_plural "The following screen names are associated with %s"
 msgstr[0] "A következő felhasználónév a következőhöz van rendelve: %s"
 msgstr[1] "A következő felhasználónevek a következőhöz vannak rendelve: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:3922
+#: ../libpurple/protocols/oscar/oscar.c:3937
 msgid "Screen name"
 msgstr "Felhasználónév"
 
-#: ../libpurple/protocols/oscar/oscar.c:3948
+#: ../libpurple/protocols/oscar/oscar.c:3963
 #, c-format
 msgid "No results found for e-mail address %s"
 msgstr "Nem található eredmény a(z) %s e-mail címre"
 
-#: ../libpurple/protocols/oscar/oscar.c:3969
+#: ../libpurple/protocols/oscar/oscar.c:3984
 #, c-format
 msgid "You should receive an e-mail asking to confirm %s."
 msgstr "Kapnia kell egy %s jóváhagyását kérő levelet."
 
-#: ../libpurple/protocols/oscar/oscar.c:3971
+#: ../libpurple/protocols/oscar/oscar.c:3986
 msgid "Account Confirmation Requested"
 msgstr "Fiókjóváhagyás megkérve"
 
-#: ../libpurple/protocols/oscar/oscar.c:4002
+#: ../libpurple/protocols/oscar/oscar.c:4017
 #, c-format
 msgid "Error Changing Account Info"
 msgstr "Hiba a fiók információinak megváltoztatása közben"
 
-#: ../libpurple/protocols/oscar/oscar.c:4005
+#: ../libpurple/protocols/oscar/oscar.c:4020
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to format screen name because the requested screen name "
@@ -8898,14 +9171,14 @@
 "Hiba 0x%04x: Nem sikerült a felhasználónevet megformázni, mert a kért "
 "felhasználónév eltér az eredetitől."
 
-#: ../libpurple/protocols/oscar/oscar.c:4008
+#: ../libpurple/protocols/oscar/oscar.c:4023
 #, c-format
 msgid "Error 0x%04x: Unable to format screen name because it is invalid."
 msgstr ""
 "Hiba 0x%04x: Nem sikerült a felhasználónevet megformázni, mivel az "
 "érvénytelen."
 
-#: ../libpurple/protocols/oscar/oscar.c:4011
+#: ../libpurple/protocols/oscar/oscar.c:4026
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to format screen name because the requested screen name "
@@ -8914,7 +9187,7 @@
 "Hiba 0x%04x: Nem sikerült a felhasználónevet megformázni, mert a kért "
 "felhasználónév túl hosszú."
 
-#: ../libpurple/protocols/oscar/oscar.c:4014
+#: ../libpurple/protocols/oscar/oscar.c:4029
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to change e-mail address because there is already a "
@@ -8923,7 +9196,7 @@
 "Hiba 0x%04x: Nem sikerült megváltoztatni az e-mail címet, mert egy kérés már "
 "függőben van erre a felhasználónévre."
 
-#: ../libpurple/protocols/oscar/oscar.c:4017
+#: ../libpurple/protocols/oscar/oscar.c:4032
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to change e-mail address because the given address has "
@@ -8932,7 +9205,7 @@
 "Hiba 0x%04x: Nem sikerült megváltoztatni az e-mail címet, mert a megadott "
 "cím túl sok felhasználónévhez van társítva."
 
-#: ../libpurple/protocols/oscar/oscar.c:4020
+#: ../libpurple/protocols/oscar/oscar.c:4035
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to change e-mail address because the given address is "
@@ -8941,32 +9214,31 @@
 "Hiba 0x%04x: Nem sikerült megváltoztatni az e-mail címet, mert a megadott "
 "cím érvénytelen."
 
-#: ../libpurple/protocols/oscar/oscar.c:4023
+#: ../libpurple/protocols/oscar/oscar.c:4038
 #, c-format
 msgid "Error 0x%04x: Unknown error."
 msgstr "Hiba 0x%04x: Ismeretlen hiba."
 
-#: ../libpurple/protocols/oscar/oscar.c:4033
+#: ../libpurple/protocols/oscar/oscar.c:4048
 #, c-format
 msgid "The e-mail address for %s is %s"
 msgstr "%s e-mail címe a következő: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:4035
+#: ../libpurple/protocols/oscar/oscar.c:4050
 msgid "Account Info"
 msgstr "Fiókinformációk"
 
-#: ../libpurple/protocols/oscar/oscar.c:4218
-msgid ""
-"Your IM Image was not sent. You must be Direct Connected to send IM Images."
+#: ../libpurple/protocols/oscar/oscar.c:4233
+msgid "Your IM Image was not sent. You must be Direct Connected to send IM Images."
 msgstr ""
 "Az Ön IM képe nem lett elküldve. IM képek küldéséhez közvetlen kapcsolatban "
 "kell lennie."
 
-#: ../libpurple/protocols/oscar/oscar.c:4489
+#: ../libpurple/protocols/oscar/oscar.c:4504
 msgid "Unable to set AIM profile."
 msgstr "Nem lehet beállítani az AIM profilt."
 
-#: ../libpurple/protocols/oscar/oscar.c:4490
+#: ../libpurple/protocols/oscar/oscar.c:4505
 msgid ""
 "You have probably requested to set your profile before the login procedure "
 "completed.  Your profile remains unset; try setting it again when you are "
@@ -8976,7 +9248,7 @@
 "beállítani a profilt. Próbálja újra beállítani, ha a bejelentkezés már "
 "megtörtént."
 
-#: ../libpurple/protocols/oscar/oscar.c:4504
+#: ../libpurple/protocols/oscar/oscar.c:4519
 #, c-format
 msgid ""
 "The maximum profile length of %d byte has been exceeded.  It has been "
@@ -8984,16 +9256,14 @@
 msgid_plural ""
 "The maximum profile length of %d bytes has been exceeded.  It has been "
 "truncated for you."
-msgstr[0] ""
-"A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került."
-msgstr[1] ""
-"A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került."
-
-#: ../libpurple/protocols/oscar/oscar.c:4509
+msgstr[0] "A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került."
+msgstr[1] "A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került."
+
+#: ../libpurple/protocols/oscar/oscar.c:4524
 msgid "Profile too long."
 msgstr "A profil túl hosszú."
 
-#: ../libpurple/protocols/oscar/oscar.c:4554
+#: ../libpurple/protocols/oscar/oscar.c:4569
 #, c-format
 msgid ""
 "The maximum away message length of %d byte has been exceeded.  It has been "
@@ -9008,11 +9278,11 @@
 "A távollét üzenet hossza túllépte a maximális %d bájtot. Ez csonkításra "
 "került."
 
-#: ../libpurple/protocols/oscar/oscar.c:4559
+#: ../libpurple/protocols/oscar/oscar.c:4574
 msgid "Away message too long."
 msgstr "A távollét-üzenet túl hosszú."
 
-#: ../libpurple/protocols/oscar/oscar.c:4628
+#: ../libpurple/protocols/oscar/oscar.c:4647
 #, c-format
 msgid ""
 "Could not add the buddy %s because the screen name is invalid.  Screen names "
@@ -9024,34 +9294,34 @@
 "kezdődniük, és betűket, számokat és szóközöket, vagy csak számokból "
 "állhatnak."
 
-#: ../libpurple/protocols/oscar/oscar.c:4630
-#: ../libpurple/protocols/oscar/oscar.c:5060
-#: ../libpurple/protocols/oscar/oscar.c:5075
+#: ../libpurple/protocols/oscar/oscar.c:4649
+#: ../libpurple/protocols/oscar/oscar.c:5102
+#: ../libpurple/protocols/oscar/oscar.c:5117
 msgid "Unable To Add"
 msgstr "Nem sikerült felvenni"
 
-#: ../libpurple/protocols/oscar/oscar.c:4739
+#: ../libpurple/protocols/oscar/oscar.c:4768
 msgid "Unable To Retrieve Buddy List"
 msgstr "Nem lehet lekérni a partnerek listáját"
 
-#: ../libpurple/protocols/oscar/oscar.c:4740
+#: ../libpurple/protocols/oscar/oscar.c:4769
 msgid ""
 "The AIM servers were temporarily unable to send your buddy list.  Your buddy "
-"list is not lost, and will probably become available in a few hours."
+"list is not lost, and will probably become available in a few minutes."
 msgstr ""
 "Az AIM kiszolgálók ideiglenesen nem tudták elküldeni a partnerlistáját. A "
-"partnerlistája nem veszett el és néhány órán belül valószínűleg elérhetővé "
+"partnerlistája nem veszett el és néhány percen belül valószínűleg elérhetővé "
 "válik."
 
-#: ../libpurple/protocols/oscar/oscar.c:4922
-#: ../libpurple/protocols/oscar/oscar.c:4924
-#: ../libpurple/protocols/oscar/oscar.c:5140
-#: ../libpurple/protocols/oscar/oscar.c:5141
-#: ../libpurple/protocols/oscar/oscar.c:5146
+#: ../libpurple/protocols/oscar/oscar.c:4952
+#: ../libpurple/protocols/oscar/oscar.c:4954
+#: ../libpurple/protocols/oscar/oscar.c:5182
+#: ../libpurple/protocols/oscar/oscar.c:5183
+#: ../libpurple/protocols/oscar/oscar.c:5188
 msgid "Orphans"
 msgstr "Árvák"
 
-#: ../libpurple/protocols/oscar/oscar.c:5058
+#: ../libpurple/protocols/oscar/oscar.c:5100
 #, c-format
 msgid ""
 "Could not add the buddy %s because you have too many buddies in your buddy "
@@ -9060,17 +9330,17 @@
 "%s partnert nem lehet felvenni, mert túl sok partner van a partnerlistáján. "
 "Kérem töröljön egyet közülük és próbálja meg újra."
 
-#: ../libpurple/protocols/oscar/oscar.c:5058
-#: ../libpurple/protocols/oscar/oscar.c:5073
+#: ../libpurple/protocols/oscar/oscar.c:5100
+#: ../libpurple/protocols/oscar/oscar.c:5115
 msgid "(no name)"
 msgstr "(nincs név)"
 
-#: ../libpurple/protocols/oscar/oscar.c:5072
+#: ../libpurple/protocols/oscar/oscar.c:5114
 #, c-format
 msgid "Could not add the buddy %s for an unknown reason."
 msgstr "A(z) %s partner ismeretlen ok miatt nem adható hozzá."
 
-#: ../libpurple/protocols/oscar/oscar.c:5178
+#: ../libpurple/protocols/oscar/oscar.c:5231
 #, c-format
 msgid ""
 "The user %s has given you permission to add you to their buddy list.  Do you "
@@ -9079,22 +9349,22 @@
 "%s felhasználó megadta az engedélyt, hogy felvegye őt a partnerei közé. Fel "
 "akarja venni őt?"
 
-#: ../libpurple/protocols/oscar/oscar.c:5186
+#: ../libpurple/protocols/oscar/oscar.c:5239
 msgid "Authorization Given"
 msgstr "Engedély megadva"
 
 #. Granted
-#: ../libpurple/protocols/oscar/oscar.c:5259
+#: ../libpurple/protocols/oscar/oscar.c:5312
 #, c-format
 msgid "The user %s has granted your request to add them to your buddy list."
 msgstr "%s felhasználó engedélyezi, hogy felvegye őt a partnerei közé."
 
-#: ../libpurple/protocols/oscar/oscar.c:5260
+#: ../libpurple/protocols/oscar/oscar.c:5313
 msgid "Authorization Granted"
 msgstr "Engedély kiadva"
 
 #. Denied
-#: ../libpurple/protocols/oscar/oscar.c:5263
+#: ../libpurple/protocols/oscar/oscar.c:5316
 #, c-format
 msgid ""
 "The user %s has denied your request to add them to your buddy list for the "
@@ -9105,52 +9375,51 @@
 "következő indoklással:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:5264
+#: ../libpurple/protocols/oscar/oscar.c:5317
 msgid "Authorization Denied"
 msgstr "Engedély elutasítva"
 
-#: ../libpurple/protocols/oscar/oscar.c:5300
+#: ../libpurple/protocols/oscar/oscar.c:5353
 #: ../libpurple/protocols/toc/toc.c:1371
 msgid "_Exchange:"
 msgstr "_Váltás:"
 
-#: ../libpurple/protocols/oscar/oscar.c:5340
+#: ../libpurple/protocols/oscar/oscar.c:5393
 msgid "Invalid chat name specified."
 msgstr "A megadott csevegésnév érvénytelen."
 
-#: ../libpurple/protocols/oscar/oscar.c:5409
+#: ../libpurple/protocols/oscar/oscar.c:5462
 msgid "Your IM Image was not sent. You cannot send IM Images in AIM chats."
-msgstr ""
-"Az Ön IM képe nem lett elküldve. Nem küldhet IM képeket AIM csevegésekbe."
-
-#: ../libpurple/protocols/oscar/oscar.c:5569
-#: ../libpurple/protocols/oscar/oscar.c:5574
+msgstr "Az Ön IM képe nem lett elküldve. Nem küldhet IM képeket AIM csevegésekbe."
+
+#: ../libpurple/protocols/oscar/oscar.c:5624
+#: ../libpurple/protocols/oscar/oscar.c:5629
 msgid "Away Message"
 msgstr "Távol üzenet"
 
-#: ../libpurple/protocols/oscar/oscar.c:5574
+#: ../libpurple/protocols/oscar/oscar.c:5629
 msgid "<i>(retrieving)</i>"
 msgstr "<i>(lekérés)</i>"
 
-#: ../libpurple/protocols/oscar/oscar.c:5774
+#: ../libpurple/protocols/oscar/oscar.c:5829
 msgid "iTunes Music Store Link"
 msgstr "iTunes zenebolt hivatkozás"
 
-#: ../libpurple/protocols/oscar/oscar.c:5882
+#: ../libpurple/protocols/oscar/oscar.c:5937
 #, c-format
 msgid "Buddy Comment for %s"
 msgstr "%s partnermegjegyzése"
 
-#: ../libpurple/protocols/oscar/oscar.c:5883
+#: ../libpurple/protocols/oscar/oscar.c:5938
 msgid "Buddy Comment:"
 msgstr "Partnermegjegyzés:"
 
-#: ../libpurple/protocols/oscar/oscar.c:5930
+#: ../libpurple/protocols/oscar/oscar.c:5985
 #, c-format
 msgid "You have selected to open a Direct IM connection with %s."
 msgstr "Közvetlen kapcsolat nyitását választotta %s partnerrel."
 
-#: ../libpurple/protocols/oscar/oscar.c:5934
+#: ../libpurple/protocols/oscar/oscar.c:5989
 msgid ""
 "Because this reveals your IP address, it may be considered a security risk.  "
 "Do you wish to continue?"
@@ -9158,66 +9427,66 @@
 "Mivel ezzel láthatóvá válik az IP címe, ez kezelhető biztonsági "
 "kockázatként. Folytatni kívánja?"
 
-#: ../libpurple/protocols/oscar/oscar.c:5940
-#: ../libpurple/protocols/oscar/peer.c:1045
+#: ../libpurple/protocols/oscar/oscar.c:5995
+#: ../libpurple/protocols/oscar/peer.c:1047
 msgid "C_onnect"
 msgstr "Kapcs_olódás"
 
-#: ../libpurple/protocols/oscar/oscar.c:5975
+#: ../libpurple/protocols/oscar/oscar.c:6030
 msgid "Get AIM Info"
 msgstr "AIM információk lekérése"
 
-#: ../libpurple/protocols/oscar/oscar.c:5981
+#: ../libpurple/protocols/oscar/oscar.c:6036
 msgid "Edit Buddy Comment"
 msgstr "Partnermegjegyzés szerkesztése"
 
-#: ../libpurple/protocols/oscar/oscar.c:5989
+#: ../libpurple/protocols/oscar/oscar.c:6044
 msgid "Get Status Msg"
 msgstr "Állapotüzenet lekérése"
 
-#: ../libpurple/protocols/oscar/oscar.c:6002
+#: ../libpurple/protocols/oscar/oscar.c:6057
 msgid "Direct IM"
 msgstr "Közvetlen IM"
 
-#: ../libpurple/protocols/oscar/oscar.c:6024
+#: ../libpurple/protocols/oscar/oscar.c:6079
 msgid "Re-request Authorization"
 msgstr "Engedélyezés újrakérése"
 
-#: ../libpurple/protocols/oscar/oscar.c:6083
+#: ../libpurple/protocols/oscar/oscar.c:6138
 msgid "Require authorization"
 msgstr "Engedélyezés kérése"
 
-#: ../libpurple/protocols/oscar/oscar.c:6086
+#: ../libpurple/protocols/oscar/oscar.c:6141
 msgid "Web aware (enabling this will cause you to receive SPAM!)"
 msgstr "A weben ismert (ennek engedélyezése után SPAM-et fog kapni!)"
 
-#: ../libpurple/protocols/oscar/oscar.c:6091
+#: ../libpurple/protocols/oscar/oscar.c:6146
 msgid "ICQ Privacy Options"
 msgstr "ICQ magánszféra beállításai"
 
-#: ../libpurple/protocols/oscar/oscar.c:6110
+#: ../libpurple/protocols/oscar/oscar.c:6165
 msgid "The new formatting is invalid."
 msgstr "Az új formázás érvénytelen."
 
-#: ../libpurple/protocols/oscar/oscar.c:6111
+#: ../libpurple/protocols/oscar/oscar.c:6166
 msgid "Screen name formatting can change only capitalization and whitespace."
 msgstr ""
 "A felhasználónév formázása csak a kis/nagybetűsséget és az üreshely "
 "karaktereket változtathatja meg."
 
-#: ../libpurple/protocols/oscar/oscar.c:6164
+#: ../libpurple/protocols/oscar/oscar.c:6219
 msgid "Change Address To:"
 msgstr "Cím megváltoztatása a következőre:"
 
-#: ../libpurple/protocols/oscar/oscar.c:6210
+#: ../libpurple/protocols/oscar/oscar.c:6265
 msgid "<i>you are not waiting for authorization</i>"
 msgstr "<i>Ön nem vár engedélyezésre</i>"
 
-#: ../libpurple/protocols/oscar/oscar.c:6213
+#: ../libpurple/protocols/oscar/oscar.c:6268
 msgid "You are awaiting authorization from the following buddies"
 msgstr "A következő partnerektől vár engedélyezésre"
 
-#: ../libpurple/protocols/oscar/oscar.c:6214
+#: ../libpurple/protocols/oscar/oscar.c:6269
 msgid ""
 "You can re-request authorization from these buddies by right-clicking on "
 "them and selecting \"Re-request Authorization.\""
@@ -9225,73 +9494,73 @@
 "Újra kérheti engedélyezést ezektől a partnerektől a jobb egérgombbal "
 "kattintva a nevükön, és az \"Engedélyezés újra kérése\" választásával"
 
-#: ../libpurple/protocols/oscar/oscar.c:6231
+#: ../libpurple/protocols/oscar/oscar.c:6286
 msgid "Find Buddy by E-Mail"
 msgstr "Partnerek keresése e-mail cím szerint"
 
-#: ../libpurple/protocols/oscar/oscar.c:6232
+#: ../libpurple/protocols/oscar/oscar.c:6287
 msgid "Search for a buddy by e-mail address"
 msgstr "Partner keresése e-mail cím alapján"
 
-#: ../libpurple/protocols/oscar/oscar.c:6233
+#: ../libpurple/protocols/oscar/oscar.c:6288
 msgid "Type the e-mail address of the buddy you are searching for."
 msgstr "Adja meg annak a partnernek az e-mail címét, akit keres."
 
-#: ../libpurple/protocols/oscar/oscar.c:6236
+#: ../libpurple/protocols/oscar/oscar.c:6291
 msgid "_Search"
 msgstr "_Keresés"
 
-#: ../libpurple/protocols/oscar/oscar.c:6394
+#: ../libpurple/protocols/oscar/oscar.c:6449
 msgid "Set User Info (URL)..."
 msgstr "Felhasználói információk beállítása (URL)..."
 
-#: ../libpurple/protocols/oscar/oscar.c:6405
+#: ../libpurple/protocols/oscar/oscar.c:6460
 msgid "Change Password (URL)"
 msgstr "Jelszó megváltoztatása (URL)"
 
-#: ../libpurple/protocols/oscar/oscar.c:6409
+#: ../libpurple/protocols/oscar/oscar.c:6464
 msgid "Configure IM Forwarding (URL)"
 msgstr "Üzenettovábbítás beállítása (URL)"
 
 #. ICQ actions
-#: ../libpurple/protocols/oscar/oscar.c:6419
+#: ../libpurple/protocols/oscar/oscar.c:6474
 msgid "Set Privacy Options..."
 msgstr "Magánszféra-beállítások..."
 
 #. AIM actions
-#: ../libpurple/protocols/oscar/oscar.c:6426
+#: ../libpurple/protocols/oscar/oscar.c:6481
 msgid "Confirm Account"
 msgstr "Fiók jóváhagyása"
 
-#: ../libpurple/protocols/oscar/oscar.c:6430
+#: ../libpurple/protocols/oscar/oscar.c:6485
 msgid "Display Currently Registered E-Mail Address"
 msgstr "A jelenleg regisztrált e-mail cím megjelenítése"
 
-#: ../libpurple/protocols/oscar/oscar.c:6434
+#: ../libpurple/protocols/oscar/oscar.c:6489
 msgid "Change Currently Registered E-Mail Address..."
 msgstr "A jelenleg regisztrált e-mail cím megváltoztatása..."
 
-#: ../libpurple/protocols/oscar/oscar.c:6441
+#: ../libpurple/protocols/oscar/oscar.c:6496
 msgid "Show Buddies Awaiting Authorization"
 msgstr "Engedélyezésre váró partnerek megjelenítése"
 
-#: ../libpurple/protocols/oscar/oscar.c:6447
+#: ../libpurple/protocols/oscar/oscar.c:6502
 msgid "Search for Buddy by E-Mail Address..."
 msgstr "Partner keresése e-mail cím szerint..."
 
-#: ../libpurple/protocols/oscar/oscar.c:6452
+#: ../libpurple/protocols/oscar/oscar.c:6507
 msgid "Search for Buddy by Information"
 msgstr "Partner keresése információ alapján"
 
-#: ../libpurple/protocols/oscar/oscar.c:6520
+#: ../libpurple/protocols/oscar/oscar.c:6575
 msgid "Use recent buddies group"
 msgstr "A legutóbbi partnerek csoport használata"
 
-#: ../libpurple/protocols/oscar/oscar.c:6523
+#: ../libpurple/protocols/oscar/oscar.c:6578
 msgid "Show how long you have been idle"
 msgstr "Megjeleníti, meddig volt inaktív"
 
-#: ../libpurple/protocols/oscar/oscar.c:6678
+#: ../libpurple/protocols/oscar/oscar.c:6733
 msgid ""
 "Always use ICQ proxy server for file transfers\n"
 "(slower, but does not reveal your IP address)"
@@ -9299,28 +9568,27 @@
 "Mindig az ICQ proxy kiszolgáló használata fájlátvitelhez\n"
 "(lassabb, de nem jeleníti meg az IP címet)"
 
-#: ../libpurple/protocols/oscar/peer.c:697
+#: ../libpurple/protocols/oscar/peer.c:699
 #, c-format
 msgid "Asking %s to connect to us at %s:%hu for Direct IM."
-msgstr ""
-"%s felkérése, hogy kapcsolódjon hozzánk ezen: %s:%hu közvetlen kapcsolattal."
-
-#: ../libpurple/protocols/oscar/peer.c:782
+msgstr "%s felkérése, hogy kapcsolódjon hozzánk ezen: %s:%hu közvetlen kapcsolattal."
+
+#: ../libpurple/protocols/oscar/peer.c:784
 #, c-format
 msgid "Attempting to connect to %s:%hu."
 msgstr "Kapcsolódási kísérlet a következőhöz: %s:%hu."
 
-#: ../libpurple/protocols/oscar/peer.c:856
+#: ../libpurple/protocols/oscar/peer.c:858
 #, c-format
 msgid "Attempting to connect via proxy server."
 msgstr "Kapcsolódási kísérlet proxy kiszolgálón keresztül."
 
-#: ../libpurple/protocols/oscar/peer.c:1033
+#: ../libpurple/protocols/oscar/peer.c:1035
 #, c-format
 msgid "%s has just asked to directly connect to %s"
 msgstr "%s felkérte a közvetlen kapcsolatra a következőhöz: %s"
 
-#: ../libpurple/protocols/oscar/peer.c:1037
+#: ../libpurple/protocols/oscar/peer.c:1039
 msgid ""
 "This requires a direct connection between the two computers and is necessary "
 "for IM Images.  Because your IP address will be revealed, this may be "
@@ -9482,20 +9750,20 @@
 msgid "Other"
 msgstr "Egyéb"
 
-#: ../libpurple/protocols/qq/buddy_info.c:481
-#: ../libpurple/protocols/qq/buddy_info.c:482
+#: ../libpurple/protocols/qq/buddy_info.c:522
+#: ../libpurple/protocols/qq/buddy_info.c:523
 msgid "Modify my information"
 msgstr "Információk módosítása"
 
-#: ../libpurple/protocols/qq/buddy_info.c:483
+#: ../libpurple/protocols/qq/buddy_info.c:524
 msgid "Update my information"
 msgstr "Információk frissítése"
 
-#: ../libpurple/protocols/qq/buddy_info.c:507
+#: ../libpurple/protocols/qq/buddy_info.c:548
 msgid "Your information has been updated"
 msgstr "Információi frissítve lettek"
 
-#: ../libpurple/protocols/qq/buddy_info.c:560
+#: ../libpurple/protocols/qq/buddy_info.c:601
 #, c-format
 msgid ""
 "Setting custom faces is not currently supported. Please choose an image from "
@@ -9504,8 +9772,8 @@
 "Az egyéni arcképek beállítása jelenleg nem támogatott. Válasszon egy képet "
 "innen: %s."
 
-#: ../libpurple/protocols/qq/buddy_info.c:577
-#: ../libpurple/protocols/qq/buddy_info.c:590
+#: ../libpurple/protocols/qq/buddy_info.c:618
+#: ../libpurple/protocols/qq/buddy_info.c:631
 msgid "Invalid QQ Face"
 msgstr "Érvénytelen QQ arckép"
 
@@ -9776,7 +10044,7 @@
 msgid "Error requesting login token"
 msgstr "Hiba a bejelentkezési jelsor lekérésekor"
 
-#: ../libpurple/protocols/qq/login_logout.c:486
+#: ../libpurple/protocols/qq/login_logout.c:488
 msgid "Unable to login, check debug log"
 msgstr "Nem lehet bejelentkezni, nézze meg a hibakeresési naplót"
 
@@ -10034,8 +10302,7 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:1645
 #, c-format
-msgid ""
-"A Sametime administrator has issued the following announcement on server %s"
+msgid "A Sametime administrator has issued the following announcement on server %s"
 msgstr ""
 "Egy Sametime adminisztrátor a következő bejelentést adta ki a(z) %s "
 "kiszolgálón"
@@ -10048,61 +10315,61 @@
 msgid "Connection reset"
 msgstr "Kapcsolat visszaállítva"
 
-#: ../libpurple/protocols/sametime/sametime.c:1709
+#: ../libpurple/protocols/sametime/sametime.c:1710
 #, c-format
 msgid "Error reading from socket: %s"
 msgstr "Hiba a foglalatból olvasás közben: %s"
 
 #. this is a regular connect, error out
-#: ../libpurple/protocols/sametime/sametime.c:1732
-#: ../libpurple/protocols/sametime/sametime.c:3726
+#: ../libpurple/protocols/sametime/sametime.c:1733
+#: ../libpurple/protocols/sametime/sametime.c:3727
 msgid "Unable to connect to host"
 msgstr "Nem lehet a kiszolgálóhoz kapcsolódni."
 
-#: ../libpurple/protocols/sametime/sametime.c:1770
+#: ../libpurple/protocols/sametime/sametime.c:1771
 #, c-format
 msgid "Announcement from %s"
 msgstr "Bejelentés a következőtől: %s"
 
-#: ../libpurple/protocols/sametime/sametime.c:1944
+#: ../libpurple/protocols/sametime/sametime.c:1945
 msgid "Conference Closed"
 msgstr "A konferencia lezárva"
 
-#: ../libpurple/protocols/sametime/sametime.c:2403
+#: ../libpurple/protocols/sametime/sametime.c:2404
 msgid "Unable to send message: "
 msgstr "Az üzenet nem küldhető el: "
 
-#: ../libpurple/protocols/sametime/sametime.c:2959
+#: ../libpurple/protocols/sametime/sametime.c:2960
 msgid "Place Closed"
 msgstr "Hely lezárva"
 
-#: ../libpurple/protocols/sametime/sametime.c:3229
+#: ../libpurple/protocols/sametime/sametime.c:3230
 msgid "Microphone"
 msgstr "Mikrofon"
 
-#: ../libpurple/protocols/sametime/sametime.c:3230
+#: ../libpurple/protocols/sametime/sametime.c:3231
 msgid "Speakers"
 msgstr "Hangszórók"
 
-#: ../libpurple/protocols/sametime/sametime.c:3231
+#: ../libpurple/protocols/sametime/sametime.c:3232
 msgid "Video Camera"
 msgstr "Videokamera"
 
-#: ../libpurple/protocols/sametime/sametime.c:3269
-#: ../libpurple/protocols/sametime/sametime.c:4145
+#: ../libpurple/protocols/sametime/sametime.c:3270
+#: ../libpurple/protocols/sametime/sametime.c:4146
 msgid "Supports"
 msgstr "Támogatja"
 
-#: ../libpurple/protocols/sametime/sametime.c:3274
-#: ../libpurple/protocols/sametime/sametime.c:4119
+#: ../libpurple/protocols/sametime/sametime.c:3275
+#: ../libpurple/protocols/sametime/sametime.c:4120
 msgid "External User"
 msgstr "Külső felhasználó"
 
-#: ../libpurple/protocols/sametime/sametime.c:3380
+#: ../libpurple/protocols/sametime/sametime.c:3381
 msgid "Create conference with user"
 msgstr "Konferencia létrehozása a következő felhasználóval"
 
-#: ../libpurple/protocols/sametime/sametime.c:3381
+#: ../libpurple/protocols/sametime/sametime.c:3382
 #, c-format
 msgid ""
 "Please enter a topic for the new conference, and an invitation message to be "
@@ -10111,27 +10378,27 @@
 "Adja meg az új konferencia témáját és a(z) %s számára elküldendő "
 "meghívóüzenetet."
 
-#: ../libpurple/protocols/sametime/sametime.c:3385
+#: ../libpurple/protocols/sametime/sametime.c:3386
 msgid "New Conference"
 msgstr "Új konferencia"
 
-#: ../libpurple/protocols/sametime/sametime.c:3387
+#: ../libpurple/protocols/sametime/sametime.c:3388
 msgid "Create"
 msgstr "Létrehozás"
 
-#: ../libpurple/protocols/sametime/sametime.c:3452
+#: ../libpurple/protocols/sametime/sametime.c:3453
 msgid "Available Conferences"
 msgstr "Elérhető konferenciák"
 
-#: ../libpurple/protocols/sametime/sametime.c:3458
+#: ../libpurple/protocols/sametime/sametime.c:3459
 msgid "Create New Conference..."
 msgstr "Új konferencia létrehozása..."
 
-#: ../libpurple/protocols/sametime/sametime.c:3465
+#: ../libpurple/protocols/sametime/sametime.c:3466
 msgid "Invite user to a conference"
 msgstr "Felhasználó meghívása konferenciára"
 
-#: ../libpurple/protocols/sametime/sametime.c:3466
+#: ../libpurple/protocols/sametime/sametime.c:3467
 #, c-format
 msgid ""
 "Select a conference from the list below to send an invite to user %s. Select "
@@ -10142,27 +10409,27 @@
 "felhasználónak. Válassza az \"Új konferencia létrehozása\" gombot, ha új "
 "konferenciát kíván létrehozni, amelyre meghívja a felhasználót."
 
-#: ../libpurple/protocols/sametime/sametime.c:3471
+#: ../libpurple/protocols/sametime/sametime.c:3472
 msgid "Invite to Conference"
 msgstr "Meghívás konferenciára"
 
-#: ../libpurple/protocols/sametime/sametime.c:3562
+#: ../libpurple/protocols/sametime/sametime.c:3563
 msgid "Invite to Conference..."
 msgstr "Meghívás konferenciára..."
 
-#: ../libpurple/protocols/sametime/sametime.c:3567
+#: ../libpurple/protocols/sametime/sametime.c:3568
 msgid "Send TEST Announcement"
 msgstr "TESZT bejelentés küldése"
 
-#: ../libpurple/protocols/sametime/sametime.c:3586 ../pidgin/gtkconv.c:4354
+#: ../libpurple/protocols/sametime/sametime.c:3587 ../pidgin/gtkconv.c:4437
 msgid "Topic:"
 msgstr "Téma:"
 
-#: ../libpurple/protocols/sametime/sametime.c:3614
+#: ../libpurple/protocols/sametime/sametime.c:3615
 msgid "No Sametime Community Server specified"
 msgstr "Nincs megadva Sametime közösségi kiszolgáló"
 
-#: ../libpurple/protocols/sametime/sametime.c:3636
+#: ../libpurple/protocols/sametime/sametime.c:3637
 #, c-format
 msgid ""
 "No host or IP address has been configured for the Meanwhile account %s. "
@@ -10171,42 +10438,42 @@
 "Nincs gép vagy IP cím megadva a(z) %s Meanwhile fiókhoz. A bejelentkezés "
 "folytatásához adjon meg egyet alább."
 
-#: ../libpurple/protocols/sametime/sametime.c:3641
+#: ../libpurple/protocols/sametime/sametime.c:3642
 msgid "Meanwhile Connection Setup"
 msgstr "Meanwhile kapcsolat beállítása"
 
-#: ../libpurple/protocols/sametime/sametime.c:3642
+#: ../libpurple/protocols/sametime/sametime.c:3643
 msgid "No Sametime Community Server Specified"
 msgstr "Nincs megadva Sametime közösségi kiszolgáló"
 
-#: ../libpurple/protocols/sametime/sametime.c:3644 ../pidgin/gtkblist.c:4041
+#: ../libpurple/protocols/sametime/sametime.c:3645 ../pidgin/gtkblist.c:4389
 msgid "Connect"
 msgstr "Kapcsolódás"
 
-#: ../libpurple/protocols/sametime/sametime.c:4135
+#: ../libpurple/protocols/sametime/sametime.c:4136
 #, c-format
 msgid "Unknown (0x%04x)<br>"
 msgstr "Ismeretlen (0x%04x)<br>"
 
-#: ../libpurple/protocols/sametime/sametime.c:4137
+#: ../libpurple/protocols/sametime/sametime.c:4138
 msgid "Last Known Client"
 msgstr "Utolsó ismert kliens"
 
-#: ../libpurple/protocols/sametime/sametime.c:4301
-#: ../libpurple/protocols/sametime/sametime.c:5506
+#: ../libpurple/protocols/sametime/sametime.c:4302
+#: ../libpurple/protocols/sametime/sametime.c:5507
 msgid "User Name"
 msgstr "Felhasználónév"
 
-#: ../libpurple/protocols/sametime/sametime.c:4304
-#: ../libpurple/protocols/sametime/sametime.c:5509
+#: ../libpurple/protocols/sametime/sametime.c:4305
+#: ../libpurple/protocols/sametime/sametime.c:5510
 msgid "Sametime ID"
 msgstr "Sametime azonosító"
 
-#: ../libpurple/protocols/sametime/sametime.c:4328
+#: ../libpurple/protocols/sametime/sametime.c:4329
 msgid "An ambiguous user ID was entered"
 msgstr "Kétértelmű felhasználói azonosító került megadásra"
 
-#: ../libpurple/protocols/sametime/sametime.c:4329
+#: ../libpurple/protocols/sametime/sametime.c:4330
 #, c-format
 msgid ""
 "The identifier '%s' may possibly refer to any of the following users. Please "
@@ -10215,15 +10482,15 @@
 "A(z) %s azonosító az alábbi felhasználók bármelyikére hivatkozhat. Válassza "
 "ki a partnerlistához adandó megfelelő felhasználót az alábbi listából."
 
-#: ../libpurple/protocols/sametime/sametime.c:4334
+#: ../libpurple/protocols/sametime/sametime.c:4335
 msgid "Select User"
 msgstr "Válasszon felhasználót"
 
-#: ../libpurple/protocols/sametime/sametime.c:4418
+#: ../libpurple/protocols/sametime/sametime.c:4419
 msgid "Unable to add user: user not found"
 msgstr "A felhasználó nem vehető fel: a felhasználó nem található"
 
-#: ../libpurple/protocols/sametime/sametime.c:4420
+#: ../libpurple/protocols/sametime/sametime.c:4421
 #, c-format
 msgid ""
 "The identifier '%s' did not match any users in your Sametime community. This "
@@ -10232,11 +10499,7 @@
 "A(z) \"%s\" azonosító nem található meg a Sametime közösségben. Ez a "
 "bejegyzés eltávolításra került a partnerlistájából."
 
-#: ../libpurple/protocols/sametime/sametime.c:4425
-msgid "Unable to add user"
-msgstr "Nem vehető fel a felhasználó"
-
-#: ../libpurple/protocols/sametime/sametime.c:5011
+#: ../libpurple/protocols/sametime/sametime.c:5012
 #, c-format
 msgid ""
 "Error reading file %s: \n"
@@ -10245,63 +10508,63 @@
 "Hiba a(z) %s fájl olvasásakor: \n"
 "%s.\n"
 
-#: ../libpurple/protocols/sametime/sametime.c:5146
+#: ../libpurple/protocols/sametime/sametime.c:5147
 msgid "Remotely Stored Buddy List"
 msgstr "Távol tárolt partnerlista"
 
-#: ../libpurple/protocols/sametime/sametime.c:5151
+#: ../libpurple/protocols/sametime/sametime.c:5152
 msgid "Buddy List Storage Mode"
 msgstr "Partnerlista tárolási módja"
 
-#: ../libpurple/protocols/sametime/sametime.c:5154
+#: ../libpurple/protocols/sametime/sametime.c:5155
 msgid "Local Buddy List Only"
 msgstr "Csak helyi partnerlista"
 
-#: ../libpurple/protocols/sametime/sametime.c:5156
+#: ../libpurple/protocols/sametime/sametime.c:5157
 msgid "Merge List from Server"
 msgstr "Partnerlista összefésülése a kiszolgálóról"
 
-#: ../libpurple/protocols/sametime/sametime.c:5158
+#: ../libpurple/protocols/sametime/sametime.c:5159
 msgid "Merge and Save List to Server"
 msgstr "Lista összefésülése a kiszolgálóról és mentés oda"
 
-#: ../libpurple/protocols/sametime/sametime.c:5160
+#: ../libpurple/protocols/sametime/sametime.c:5161
 msgid "Synchronize List with Server"
 msgstr "Lista szinkronizálása a kiszolgálóval"
 
-#: ../libpurple/protocols/sametime/sametime.c:5215
+#: ../libpurple/protocols/sametime/sametime.c:5216
 #, c-format
 msgid "Import Sametime List for Account %s"
 msgstr "A(z) %s fiók Sametime listájának importálása"
 
-#: ../libpurple/protocols/sametime/sametime.c:5255
+#: ../libpurple/protocols/sametime/sametime.c:5256
 #, c-format
 msgid "Export Sametime List for Account %s"
 msgstr "A(z) %s fiók Sametime listájának exportálása"
 
-#: ../libpurple/protocols/sametime/sametime.c:5309
+#: ../libpurple/protocols/sametime/sametime.c:5310
 msgid "Unable to add group: group exists"
 msgstr "A csoport nem vehető fel: a csoport már létezik"
 
-#: ../libpurple/protocols/sametime/sametime.c:5310
+#: ../libpurple/protocols/sametime/sametime.c:5311
 #, c-format
 msgid "A group named '%s' already exists in your buddy list."
 msgstr "Már létezik \"%s\" nevű csoport a partnerlistán."
 
-#: ../libpurple/protocols/sametime/sametime.c:5313
-#: ../libpurple/protocols/sametime/sametime.c:5443
+#: ../libpurple/protocols/sametime/sametime.c:5314
+#: ../libpurple/protocols/sametime/sametime.c:5444
 msgid "Unable to add group"
 msgstr "Nem vehető fel a csoport"
 
-#: ../libpurple/protocols/sametime/sametime.c:5372
+#: ../libpurple/protocols/sametime/sametime.c:5373
 msgid "Possible Matches"
 msgstr "Lehetséges találatok"
 
-#: ../libpurple/protocols/sametime/sametime.c:5388
+#: ../libpurple/protocols/sametime/sametime.c:5389
 msgid "Notes Address Book group results"
 msgstr "Notes címjegyzék csoporteredmények"
 
-#: ../libpurple/protocols/sametime/sametime.c:5389
+#: ../libpurple/protocols/sametime/sametime.c:5390
 #, c-format
 msgid ""
 "The identifier '%s' may possibly refer to any of the following Notes Address "
@@ -10312,15 +10575,15 @@
 "hivatkozhat. Válassza ki a partnerlistához adandó megfelelő csoportot az "
 "alábbi listából."
 
-#: ../libpurple/protocols/sametime/sametime.c:5394
+#: ../libpurple/protocols/sametime/sametime.c:5395
 msgid "Select Notes Address Book"
 msgstr "Válasszon Notes címjegyzéket"
 
-#: ../libpurple/protocols/sametime/sametime.c:5437
+#: ../libpurple/protocols/sametime/sametime.c:5438
 msgid "Unable to add group: group not found"
 msgstr "Nem vehető fel a csoport: a csoport nem található"
 
-#: ../libpurple/protocols/sametime/sametime.c:5439
+#: ../libpurple/protocols/sametime/sametime.c:5440
 #, c-format
 msgid ""
 "The identifier '%s' did not match any Notes Address Book groups in your "
@@ -10329,11 +10592,11 @@
 "A(z) \"%s\" azonosító a Sametime közösség egyetlen Notes "
 "címjegyzékcsoportjának sem felelt meg."
 
-#: ../libpurple/protocols/sametime/sametime.c:5480
+#: ../libpurple/protocols/sametime/sametime.c:5481
 msgid "Notes Address Book Group"
 msgstr "Notes címjegyzékcsoport"
 
-#: ../libpurple/protocols/sametime/sametime.c:5481
+#: ../libpurple/protocols/sametime/sametime.c:5482
 msgid ""
 "Enter the name of a Notes Address Book group in the field below to add the "
 "group and its members to your buddy list."
@@ -10341,12 +10604,12 @@
 "Az alábbi mezőben adja meg a Notes címjegyzékcsoport nevét, amelyet "
 "tagjaival együtt fel kíván venni a partnerlistájára."
 
-#: ../libpurple/protocols/sametime/sametime.c:5530
+#: ../libpurple/protocols/sametime/sametime.c:5531
 #, c-format
 msgid "Search results for '%s'"
 msgstr "\"%s\" keresésének eredménye"
 
-#: ../libpurple/protocols/sametime/sametime.c:5531
+#: ../libpurple/protocols/sametime/sametime.c:5532
 #, c-format
 msgid ""
 "The identifier '%s' may possibly refer to any of the following users. You "
@@ -10357,30 +10620,30 @@
 "partnerlistájára ezeket felhasználókat, vagy üzeneteket küldhet nekik az "
 "alábbi műveletgombokkal."
 
-#: ../libpurple/protocols/sametime/sametime.c:5538 ../pidgin/gtknotify.c:756
+#: ../libpurple/protocols/sametime/sametime.c:5539 ../pidgin/gtknotify.c:763
 msgid "Search Results"
 msgstr "A keresés eredménye"
 
-#: ../libpurple/protocols/sametime/sametime.c:5563
+#: ../libpurple/protocols/sametime/sametime.c:5564
 msgid "No matches"
 msgstr "Nincs találat"
 
-#: ../libpurple/protocols/sametime/sametime.c:5564
+#: ../libpurple/protocols/sametime/sametime.c:5565
 #, c-format
 msgid "The identifier '%s' did not match any users in your Sametime community."
 msgstr ""
 "Nem található a(z) \"%s\" azonosítónak megfelelő felhasználó a Sametime "
 "közösségben."
 
-#: ../libpurple/protocols/sametime/sametime.c:5568
+#: ../libpurple/protocols/sametime/sametime.c:5569
 msgid "No Matches"
 msgstr "Nincs találat"
 
-#: ../libpurple/protocols/sametime/sametime.c:5605
+#: ../libpurple/protocols/sametime/sametime.c:5606
 msgid "Search for a user"
 msgstr "Felhasználó keresése"
 
-#: ../libpurple/protocols/sametime/sametime.c:5606
+#: ../libpurple/protocols/sametime/sametime.c:5607
 msgid ""
 "Enter a name or partial ID in the field below to search for matching users "
 "in your Sametime community."
@@ -10388,32 +10651,32 @@
 "Az alábbi mezőben adjon meg egy nevet vagy részleges azonosítót, amelyhez "
 "felhasználókat keres a Sametime közösségben."
 
-#: ../libpurple/protocols/sametime/sametime.c:5609
+#: ../libpurple/protocols/sametime/sametime.c:5610
 msgid "User Search"
 msgstr "Felhasználó keresése"
 
-#: ../libpurple/protocols/sametime/sametime.c:5622
+#: ../libpurple/protocols/sametime/sametime.c:5623
 msgid "Import Sametime List..."
 msgstr "Sametime lista importálása..."
 
-#: ../libpurple/protocols/sametime/sametime.c:5626
+#: ../libpurple/protocols/sametime/sametime.c:5627
 msgid "Export Sametime List..."
 msgstr "Sametime lista exportálása..."
 
-#: ../libpurple/protocols/sametime/sametime.c:5630
+#: ../libpurple/protocols/sametime/sametime.c:5631
 msgid "Add Notes Address Book Group..."
 msgstr "Notes címjegyzékcsoport hozzáadása..."
 
-#: ../libpurple/protocols/sametime/sametime.c:5634
+#: ../libpurple/protocols/sametime/sametime.c:5635
 msgid "User Search..."
 msgstr "Felhasználó keresése..."
 
-#: ../libpurple/protocols/sametime/sametime.c:5740
+#: ../libpurple/protocols/sametime/sametime.c:5741
 msgid "Force login (ignore server redirects)"
 msgstr "Bejelentkezés kényszerítése (kiszolgáló átirányítások mellőzése)"
 
 #. pretend to be Sametime Connect
-#: ../libpurple/protocols/sametime/sametime.c:5750
+#: ../libpurple/protocols/sametime/sametime.c:5751
 msgid "Hide client identity"
 msgstr "Kliens azonosságának elrejtése"
 
@@ -10544,8 +10807,8 @@
 #: ../libpurple/protocols/silc/buddy.c:496
 #: ../libpurple/protocols/silc/buddy.c:507
 #: ../libpurple/protocols/silc/buddy.c:540
-#: ../libpurple/protocols/silc/ops.c:1499
-#: ../libpurple/protocols/silc/ops.c:1510
+#: ../libpurple/protocols/silc/ops.c:1503
+#: ../libpurple/protocols/silc/ops.c:1514
 #: ../libpurple/protocols/silc10/buddy.c:513
 #: ../libpurple/protocols/silc10/buddy.c:548
 #: ../libpurple/protocols/silc10/ops.c:1494
@@ -10554,8 +10817,8 @@
 msgstr "Nyilvános kulcs lekérése"
 
 #: ../libpurple/protocols/silc/buddy.c:541
-#: ../libpurple/protocols/silc/ops.c:1500
-#: ../libpurple/protocols/silc/ops.c:1511
+#: ../libpurple/protocols/silc/ops.c:1504
+#: ../libpurple/protocols/silc/ops.c:1515
 #: ../libpurple/protocols/silc10/buddy.c:549
 #: ../libpurple/protocols/silc10/ops.c:1495
 #: ../libpurple/protocols/silc10/ops.c:1506
@@ -10563,17 +10826,17 @@
 msgstr "A nyilvános kulcs nem tölthető le"
 
 #: ../libpurple/protocols/silc/buddy.c:622
-#: ../libpurple/protocols/silc/buddy.c:1655
+#: ../libpurple/protocols/silc/buddy.c:1658
 #: ../libpurple/protocols/silc10/buddy.c:635
-#: ../libpurple/protocols/silc10/buddy.c:1654
+#: ../libpurple/protocols/silc10/buddy.c:1657
 msgid "Show Public Key"
 msgstr "Nyilvános kulcs megjelenítése"
 
 #: ../libpurple/protocols/silc/buddy.c:623
-#: ../libpurple/protocols/silc/buddy.c:1027
-#: ../libpurple/protocols/silc/chat.c:237
+#: ../libpurple/protocols/silc/buddy.c:1030
+#: ../libpurple/protocols/silc/chat.c:239
 #: ../libpurple/protocols/silc10/buddy.c:636
-#: ../libpurple/protocols/silc10/buddy.c:1033
+#: ../libpurple/protocols/silc10/buddy.c:1036
 #: ../libpurple/protocols/silc10/chat.c:237
 msgid "Could not load public key"
 msgstr "Nem sikerült a nyilvános kulcsot betölteni"
@@ -10581,9 +10844,9 @@
 #: ../libpurple/protocols/silc/buddy.c:701
 #: ../libpurple/protocols/silc/ops.c:1053
 #: ../libpurple/protocols/silc/ops.c:1168
-#: ../libpurple/protocols/silc/ops.c:1288
-#: ../libpurple/protocols/silc/ops.c:1289
-#: ../libpurple/protocols/silc/ops.c:1307
+#: ../libpurple/protocols/silc/ops.c:1290
+#: ../libpurple/protocols/silc/ops.c:1291
+#: ../libpurple/protocols/silc/ops.c:1309
 #: ../libpurple/protocols/silc10/buddy.c:713
 #: ../libpurple/protocols/silc10/ops.c:1087
 #: ../libpurple/protocols/silc10/ops.c:1159
@@ -10595,7 +10858,7 @@
 
 #: ../libpurple/protocols/silc/buddy.c:702
 #: ../libpurple/protocols/silc/ops.c:1169
-#: ../libpurple/protocols/silc/ops.c:1308
+#: ../libpurple/protocols/silc/ops.c:1310
 #: ../libpurple/protocols/silc10/buddy.c:714
 #: ../libpurple/protocols/silc10/ops.c:1160
 #: ../libpurple/protocols/silc10/ops.c:1314
@@ -10619,19 +10882,19 @@
 "töltheti le."
 
 #. Open file selector to select the public key.
-#: ../libpurple/protocols/silc/buddy.c:1059
-#: ../libpurple/protocols/silc10/buddy.c:1067
+#: ../libpurple/protocols/silc/buddy.c:1062
+#: ../libpurple/protocols/silc10/buddy.c:1070
 msgid "Open..."
 msgstr "Megnyitás..."
 
-#: ../libpurple/protocols/silc/buddy.c:1070
-#: ../libpurple/protocols/silc10/buddy.c:1078
+#: ../libpurple/protocols/silc/buddy.c:1073
+#: ../libpurple/protocols/silc10/buddy.c:1081
 #, c-format
 msgid "The %s buddy is not present in the network"
 msgstr "%s partner nincs jelen a hálózatban"
 
-#: ../libpurple/protocols/silc/buddy.c:1073
-#: ../libpurple/protocols/silc10/buddy.c:1081
+#: ../libpurple/protocols/silc/buddy.c:1076
+#: ../libpurple/protocols/silc10/buddy.c:1084
 msgid ""
 "To add the buddy you must import his/her public key. Press Import to import "
 "a public key."
@@ -10639,18 +10902,18 @@
 "Partner hozzáadásához importálnia kell a nyilvános kulcsát, ehhez kattintson "
 "az Importálásra."
 
-#: ../libpurple/protocols/silc/buddy.c:1077
-#: ../libpurple/protocols/silc10/buddy.c:1085
+#: ../libpurple/protocols/silc/buddy.c:1080
+#: ../libpurple/protocols/silc10/buddy.c:1088
 msgid "_Import..."
 msgstr "_Importálás..."
 
-#: ../libpurple/protocols/silc/buddy.c:1183
-#: ../libpurple/protocols/silc10/buddy.c:1181
+#: ../libpurple/protocols/silc/buddy.c:1186
+#: ../libpurple/protocols/silc10/buddy.c:1184
 msgid "Select correct user"
 msgstr "Megfelelő felhasználó kiválasztása"
 
-#: ../libpurple/protocols/silc/buddy.c:1185
-#: ../libpurple/protocols/silc10/buddy.c:1183
+#: ../libpurple/protocols/silc/buddy.c:1188
+#: ../libpurple/protocols/silc10/buddy.c:1186
 msgid ""
 "More than one user was found with the same public key. Select the correct "
 "user from the list to add to the buddy list."
@@ -10658,8 +10921,8 @@
 "Több felhasználó található ugyanazzal a nyilvános kulccsal. Válassza ki a "
 "partnerlistához adandó megfelelő felhasználót a listából."
 
-#: ../libpurple/protocols/silc/buddy.c:1187
-#: ../libpurple/protocols/silc10/buddy.c:1185
+#: ../libpurple/protocols/silc/buddy.c:1190
+#: ../libpurple/protocols/silc10/buddy.c:1188
 msgid ""
 "More than one user was found with the same name. Select the correct user "
 "from the list to add to the buddy list."
@@ -10667,208 +10930,208 @@
 "Több felhasználó található ugyanazzal a névvel. Válassza ki a "
 "partnerlistához adandó megfelelő felhasználót a listából."
 
-#: ../libpurple/protocols/silc/buddy.c:1474
-#: ../libpurple/protocols/silc10/buddy.c:1474
+#: ../libpurple/protocols/silc/buddy.c:1477
+#: ../libpurple/protocols/silc10/buddy.c:1477
 msgid "Detached"
 msgstr "Leválasztott"
 
-#: ../libpurple/protocols/silc/buddy.c:1478
+#: ../libpurple/protocols/silc/buddy.c:1481
 #: ../libpurple/protocols/silc/silc.c:58
-#: ../libpurple/protocols/silc10/buddy.c:1478
+#: ../libpurple/protocols/silc10/buddy.c:1481
 #: ../libpurple/protocols/silc10/silc.c:49
 msgid "Indisposed"
 msgstr "Gyengélkedik"
 
-#: ../libpurple/protocols/silc/buddy.c:1482
+#: ../libpurple/protocols/silc/buddy.c:1485
 #: ../libpurple/protocols/silc/silc.c:60
-#: ../libpurple/protocols/silc10/buddy.c:1482
+#: ../libpurple/protocols/silc10/buddy.c:1485
 #: ../libpurple/protocols/silc10/silc.c:51
 msgid "Wake Me Up"
 msgstr "Ébresszen fel"
 
-#: ../libpurple/protocols/silc/buddy.c:1484
+#: ../libpurple/protocols/silc/buddy.c:1487
 #: ../libpurple/protocols/silc/silc.c:52
-#: ../libpurple/protocols/silc10/buddy.c:1484
+#: ../libpurple/protocols/silc10/buddy.c:1487
 #: ../libpurple/protocols/silc10/silc.c:43
 msgid "Hyper Active"
 msgstr "Hiperaktív"
 
-#: ../libpurple/protocols/silc/buddy.c:1486
-#: ../libpurple/protocols/silc10/buddy.c:1486
+#: ../libpurple/protocols/silc/buddy.c:1489
+#: ../libpurple/protocols/silc10/buddy.c:1489
 msgid "Robot"
 msgstr "Robot"
 
-#: ../libpurple/protocols/silc/buddy.c:1493
-#: ../libpurple/protocols/silc/silc.c:743
-#: ../libpurple/protocols/silc/util.c:516
-#: ../libpurple/protocols/silc10/buddy.c:1493
+#: ../libpurple/protocols/silc/buddy.c:1496
+#: ../libpurple/protocols/silc/silc.c:874
+#: ../libpurple/protocols/silc/util.c:520
+#: ../libpurple/protocols/silc10/buddy.c:1496
 #: ../libpurple/protocols/silc10/silc.c:654
 #: ../libpurple/protocols/silc10/util.c:512
 msgid "Happy"
 msgstr "Boldog"
 
-#: ../libpurple/protocols/silc/buddy.c:1495
-#: ../libpurple/protocols/silc/silc.c:745
-#: ../libpurple/protocols/silc/util.c:518
-#: ../libpurple/protocols/silc10/buddy.c:1495
+#: ../libpurple/protocols/silc/buddy.c:1498
+#: ../libpurple/protocols/silc/silc.c:876
+#: ../libpurple/protocols/silc/util.c:522
+#: ../libpurple/protocols/silc10/buddy.c:1498
 #: ../libpurple/protocols/silc10/silc.c:656
 #: ../libpurple/protocols/silc10/util.c:514
 msgid "Sad"
 msgstr "Szomorú"
 
-#: ../libpurple/protocols/silc/buddy.c:1497
-#: ../libpurple/protocols/silc/silc.c:747
-#: ../libpurple/protocols/silc/util.c:520
-#: ../libpurple/protocols/silc10/buddy.c:1497
+#: ../libpurple/protocols/silc/buddy.c:1500
+#: ../libpurple/protocols/silc/silc.c:878
+#: ../libpurple/protocols/silc/util.c:524
+#: ../libpurple/protocols/silc10/buddy.c:1500
 #: ../libpurple/protocols/silc10/silc.c:658
 #: ../libpurple/protocols/silc10/util.c:516
 msgid "Angry"
 msgstr "Dühös"
 
-#: ../libpurple/protocols/silc/buddy.c:1499
-#: ../libpurple/protocols/silc/silc.c:749
-#: ../libpurple/protocols/silc/util.c:522
-#: ../libpurple/protocols/silc10/buddy.c:1499
+#: ../libpurple/protocols/silc/buddy.c:1502
+#: ../libpurple/protocols/silc/silc.c:880
+#: ../libpurple/protocols/silc/util.c:526
+#: ../libpurple/protocols/silc10/buddy.c:1502
 #: ../libpurple/protocols/silc10/silc.c:660
 #: ../libpurple/protocols/silc10/util.c:518
 msgid "Jealous"
 msgstr "Féltékeny"
 
-#: ../libpurple/protocols/silc/buddy.c:1501
-#: ../libpurple/protocols/silc/silc.c:751
-#: ../libpurple/protocols/silc/util.c:524
-#: ../libpurple/protocols/silc10/buddy.c:1501
+#: ../libpurple/protocols/silc/buddy.c:1504
+#: ../libpurple/protocols/silc/silc.c:882
+#: ../libpurple/protocols/silc/util.c:528
+#: ../libpurple/protocols/silc10/buddy.c:1504
 #: ../libpurple/protocols/silc10/silc.c:662
 #: ../libpurple/protocols/silc10/util.c:520
 msgid "Ashamed"
 msgstr "Megszégyenült"
 
-#: ../libpurple/protocols/silc/buddy.c:1503
-#: ../libpurple/protocols/silc/silc.c:753
-#: ../libpurple/protocols/silc/util.c:526
-#: ../libpurple/protocols/silc10/buddy.c:1503
+#: ../libpurple/protocols/silc/buddy.c:1506
+#: ../libpurple/protocols/silc/silc.c:884
+#: ../libpurple/protocols/silc/util.c:530
+#: ../libpurple/protocols/silc10/buddy.c:1506
 #: ../libpurple/protocols/silc10/silc.c:664
 #: ../libpurple/protocols/silc10/util.c:522
 msgid "Invincible"
 msgstr "Legyőzhetetlen"
 
-#: ../libpurple/protocols/silc/buddy.c:1505
-#: ../libpurple/protocols/silc/util.c:528
-#: ../libpurple/protocols/silc10/buddy.c:1505
+#: ../libpurple/protocols/silc/buddy.c:1508
+#: ../libpurple/protocols/silc/util.c:532
+#: ../libpurple/protocols/silc10/buddy.c:1508
 #: ../libpurple/protocols/silc10/util.c:524
 msgid "In Love"
 msgstr "Szerelmes"
 
-#: ../libpurple/protocols/silc/buddy.c:1507
-#: ../libpurple/protocols/silc/silc.c:757
-#: ../libpurple/protocols/silc/util.c:530
-#: ../libpurple/protocols/silc10/buddy.c:1507
+#: ../libpurple/protocols/silc/buddy.c:1510
+#: ../libpurple/protocols/silc/silc.c:888
+#: ../libpurple/protocols/silc/util.c:534
+#: ../libpurple/protocols/silc10/buddy.c:1510
 #: ../libpurple/protocols/silc10/silc.c:668
 #: ../libpurple/protocols/silc10/util.c:526
 msgid "Sleepy"
 msgstr "Álmos"
 
-#: ../libpurple/protocols/silc/buddy.c:1509
-#: ../libpurple/protocols/silc/silc.c:759
-#: ../libpurple/protocols/silc/util.c:532
-#: ../libpurple/protocols/silc10/buddy.c:1509
+#: ../libpurple/protocols/silc/buddy.c:1512
+#: ../libpurple/protocols/silc/silc.c:890
+#: ../libpurple/protocols/silc/util.c:536
+#: ../libpurple/protocols/silc10/buddy.c:1512
 #: ../libpurple/protocols/silc10/silc.c:670
 #: ../libpurple/protocols/silc10/util.c:528
 msgid "Bored"
 msgstr "Unott"
 
-#: ../libpurple/protocols/silc/buddy.c:1511
-#: ../libpurple/protocols/silc/silc.c:761
-#: ../libpurple/protocols/silc/util.c:534
-#: ../libpurple/protocols/silc10/buddy.c:1511
+#: ../libpurple/protocols/silc/buddy.c:1514
+#: ../libpurple/protocols/silc/silc.c:892
+#: ../libpurple/protocols/silc/util.c:538
+#: ../libpurple/protocols/silc10/buddy.c:1514
 #: ../libpurple/protocols/silc10/silc.c:672
 #: ../libpurple/protocols/silc10/util.c:530
 msgid "Excited"
 msgstr "Érdeklődő"
 
-#: ../libpurple/protocols/silc/buddy.c:1513
-#: ../libpurple/protocols/silc/silc.c:763
-#: ../libpurple/protocols/silc/util.c:536
-#: ../libpurple/protocols/silc10/buddy.c:1513
+#: ../libpurple/protocols/silc/buddy.c:1516
+#: ../libpurple/protocols/silc/silc.c:894
+#: ../libpurple/protocols/silc/util.c:540
+#: ../libpurple/protocols/silc10/buddy.c:1516
 #: ../libpurple/protocols/silc10/silc.c:674
 #: ../libpurple/protocols/silc10/util.c:532
 msgid "Anxious"
 msgstr "Nyugtalan"
 
-#: ../libpurple/protocols/silc/buddy.c:1545
+#: ../libpurple/protocols/silc/buddy.c:1548
 #: ../libpurple/protocols/silc/ops.c:1207
-#: ../libpurple/protocols/silc10/buddy.c:1545
+#: ../libpurple/protocols/silc10/buddy.c:1548
 #: ../libpurple/protocols/silc10/ops.c:1202
 msgid "User Modes"
 msgstr "Felhasználói módok"
 
-#: ../libpurple/protocols/silc/buddy.c:1562
+#: ../libpurple/protocols/silc/buddy.c:1565
 #: ../libpurple/protocols/silc/ops.c:1224
-#: ../libpurple/protocols/silc10/buddy.c:1562
+#: ../libpurple/protocols/silc10/buddy.c:1565
 #: ../libpurple/protocols/silc10/ops.c:1219
 msgid "Preferred Contact"
 msgstr "Előnyben részesített kapcsolat"
 
-#: ../libpurple/protocols/silc/buddy.c:1567
+#: ../libpurple/protocols/silc/buddy.c:1570
 #: ../libpurple/protocols/silc/ops.c:1229
-#: ../libpurple/protocols/silc10/buddy.c:1567
+#: ../libpurple/protocols/silc10/buddy.c:1570
 #: ../libpurple/protocols/silc10/ops.c:1224
 msgid "Preferred Language"
 msgstr "Előnyben részesített nyelv"
 
-#: ../libpurple/protocols/silc/buddy.c:1572
+#: ../libpurple/protocols/silc/buddy.c:1575
 #: ../libpurple/protocols/silc/ops.c:1234
-#: ../libpurple/protocols/silc10/buddy.c:1572
+#: ../libpurple/protocols/silc10/buddy.c:1575
 #: ../libpurple/protocols/silc10/ops.c:1229
 msgid "Device"
 msgstr "Eszköz"
 
-#: ../libpurple/protocols/silc/buddy.c:1577
+#: ../libpurple/protocols/silc/buddy.c:1580
 #: ../libpurple/protocols/silc/ops.c:1239
-#: ../libpurple/protocols/silc10/buddy.c:1577
+#: ../libpurple/protocols/silc10/buddy.c:1580
 #: ../libpurple/protocols/silc10/ops.c:1234
 #: ../libpurple/protocols/silc10/silc.c:722
 #: ../libpurple/protocols/silc10/silc.c:724
 msgid "Timezone"
 msgstr "Időzóna"
 
-#: ../libpurple/protocols/silc/buddy.c:1582
+#: ../libpurple/protocols/silc/buddy.c:1585
 #: ../libpurple/protocols/silc/ops.c:1244
-#: ../libpurple/protocols/silc10/buddy.c:1582
+#: ../libpurple/protocols/silc10/buddy.c:1585
 #: ../libpurple/protocols/silc10/ops.c:1239
 msgid "Geolocation"
 msgstr "Földrajzi hely"
 
-#: ../libpurple/protocols/silc/buddy.c:1638
-#: ../libpurple/protocols/silc10/buddy.c:1636
+#: ../libpurple/protocols/silc/buddy.c:1641
+#: ../libpurple/protocols/silc10/buddy.c:1639
 msgid "Reset IM Key"
 msgstr "Azonnali üzenőkulcs visszaállítása"
 
-#: ../libpurple/protocols/silc/buddy.c:1643
-#: ../libpurple/protocols/silc10/buddy.c:1642
+#: ../libpurple/protocols/silc/buddy.c:1646
+#: ../libpurple/protocols/silc10/buddy.c:1645
 msgid "IM with Key Exchange"
 msgstr "Azonnali üzenet kulcscserével"
 
-#: ../libpurple/protocols/silc/buddy.c:1648
-#: ../libpurple/protocols/silc10/buddy.c:1647
+#: ../libpurple/protocols/silc/buddy.c:1651
+#: ../libpurple/protocols/silc10/buddy.c:1650
 msgid "IM with Password"
 msgstr "Azonnali üzenet jelszóval"
 
-#: ../libpurple/protocols/silc/buddy.c:1661
-#: ../libpurple/protocols/silc10/buddy.c:1660
+#: ../libpurple/protocols/silc/buddy.c:1664
+#: ../libpurple/protocols/silc10/buddy.c:1663
 msgid "Get Public Key..."
 msgstr "Nyilvános kulcs letöltése..."
 
-#: ../libpurple/protocols/silc/buddy.c:1668
-#: ../libpurple/protocols/silc/ops.c:1608
-#: ../libpurple/protocols/silc10/buddy.c:1667
+#: ../libpurple/protocols/silc/buddy.c:1671
+#: ../libpurple/protocols/silc/ops.c:1612
+#: ../libpurple/protocols/silc10/buddy.c:1670
 #: ../libpurple/protocols/silc10/ops.c:1624
 msgid "Kill User"
 msgstr "Felhasználó kidobása"
 
-#: ../libpurple/protocols/silc/buddy.c:1678
-#: ../libpurple/protocols/silc/chat.c:993
-#: ../libpurple/protocols/silc10/buddy.c:1677
+#: ../libpurple/protocols/silc/buddy.c:1681
+#: ../libpurple/protocols/silc/chat.c:997
+#: ../libpurple/protocols/silc10/buddy.c:1680
 #: ../libpurple/protocols/silc10/chat.c:977
 msgid "Draw On Whiteboard"
 msgstr "Rajzolás a rajzlapra"
@@ -10885,7 +11148,7 @@
 msgstr "A(z) %s csatorna nem létezik a hálózatban"
 
 #: ../libpurple/protocols/silc/chat.c:81
-#: ../libpurple/protocols/silc/chat.c:175
+#: ../libpurple/protocols/silc/chat.c:177
 #: ../libpurple/protocols/silc10/chat.c:81
 #: ../libpurple/protocols/silc10/chat.c:174
 msgid "Channel Information"
@@ -10939,40 +11202,40 @@
 msgid "<br><b>Channel Modes:</b> "
 msgstr "<br><b>Csatorna módjai:</b> "
 
-#: ../libpurple/protocols/silc/chat.c:166
+#: ../libpurple/protocols/silc/chat.c:167
 #: ../libpurple/protocols/silc10/chat.c:165
 #, c-format
 msgid "<br><b>Founder Key Fingerprint:</b><br>%s"
 msgstr "<br><b>Alapító kulcsának ujjlenyomata:</b><br> %s"
 
-#: ../libpurple/protocols/silc/chat.c:167
+#: ../libpurple/protocols/silc/chat.c:168
 #: ../libpurple/protocols/silc10/chat.c:166
 #, c-format
 msgid "<br><b>Founder Key Babbleprint:</b><br>%s"
 msgstr "<br><b>Alapító kulcsának blablakódja:</b><br> %s"
 
-#: ../libpurple/protocols/silc/chat.c:236
+#: ../libpurple/protocols/silc/chat.c:238
 #: ../libpurple/protocols/silc10/chat.c:236
 msgid "Add Channel Public Key"
 msgstr "Csatorna nyilvános kulcsának hozzáadása"
 
 #. Add new public key
-#: ../libpurple/protocols/silc/chat.c:304
+#: ../libpurple/protocols/silc/chat.c:306
 #: ../libpurple/protocols/silc10/chat.c:291
 msgid "Open Public Key..."
 msgstr "Nyilvános kulcs megnyitása..."
 
-#: ../libpurple/protocols/silc/chat.c:423
+#: ../libpurple/protocols/silc/chat.c:425
 #: ../libpurple/protocols/silc10/chat.c:401
 msgid "Channel Passphrase"
 msgstr "Csatorna jelmondata"
 
-#: ../libpurple/protocols/silc/chat.c:430
+#: ../libpurple/protocols/silc/chat.c:432
 #: ../libpurple/protocols/silc10/chat.c:408
 msgid "Channel Public Keys List"
 msgstr "Csatorna nyilvános kulcsainak listája"
 
-#: ../libpurple/protocols/silc/chat.c:435
+#: ../libpurple/protocols/silc/chat.c:437
 #: ../libpurple/protocols/silc10/chat.c:413
 #, c-format
 msgid ""
@@ -10988,11 +11251,11 @@
 "szükséges. Ha a csatorna nyilvános kulcsai vannak beállítva, akkor csak azok "
 "a felhasználók csatlakozhatnak, akiknek a nyilvános kulcsa fel van sorolva."
 
-#: ../libpurple/protocols/silc/chat.c:444
-#: ../libpurple/protocols/silc/chat.c:445
-#: ../libpurple/protocols/silc/chat.c:479
-#: ../libpurple/protocols/silc/chat.c:480
-#: ../libpurple/protocols/silc/chat.c:927
+#: ../libpurple/protocols/silc/chat.c:446
+#: ../libpurple/protocols/silc/chat.c:447
+#: ../libpurple/protocols/silc/chat.c:483
+#: ../libpurple/protocols/silc/chat.c:484
+#: ../libpurple/protocols/silc/chat.c:931
 #: ../libpurple/protocols/silc10/chat.c:422
 #: ../libpurple/protocols/silc10/chat.c:423
 #: ../libpurple/protocols/silc10/chat.c:461
@@ -11001,28 +11264,28 @@
 msgid "Channel Authentication"
 msgstr "Csatornahitelesítés"
 
-#: ../libpurple/protocols/silc/chat.c:446
-#: ../libpurple/protocols/silc/chat.c:481
+#: ../libpurple/protocols/silc/chat.c:448
+#: ../libpurple/protocols/silc/chat.c:485
 #: ../libpurple/protocols/silc10/chat.c:424
 #: ../libpurple/protocols/silc10/chat.c:463
 msgid "Add / Remove"
 msgstr "Hozzáadás / Eltávolítás"
 
-#: ../libpurple/protocols/silc/chat.c:597
+#: ../libpurple/protocols/silc/chat.c:601
 #: ../libpurple/protocols/silc10/chat.c:581
 msgid "Group Name"
 msgstr "Csoportnév"
 
-#: ../libpurple/protocols/silc/chat.c:601
-#: ../libpurple/protocols/silc/ops.c:1813
-#: ../libpurple/protocols/silc/silc.c:1020
+#: ../libpurple/protocols/silc/chat.c:605
+#: ../libpurple/protocols/silc/ops.c:1817
+#: ../libpurple/protocols/silc/silc.c:1151
 #: ../libpurple/protocols/silc10/chat.c:585
 #: ../libpurple/protocols/silc10/ops.c:1901
 #: ../libpurple/protocols/silc10/silc.c:931
 msgid "Passphrase"
 msgstr "Jelmondat"
 
-#: ../libpurple/protocols/silc/chat.c:612
+#: ../libpurple/protocols/silc/chat.c:616
 #: ../libpurple/protocols/silc10/chat.c:596
 #, c-format
 msgid "Please enter the %s channel private group name and passphrase."
@@ -11030,120 +11293,119 @@
 "Adja meg a(z) %s csatornához felvenni kívánt magáncsoport nevét és "
 "jelmondatát."
 
-#: ../libpurple/protocols/silc/chat.c:614
+#: ../libpurple/protocols/silc/chat.c:618
 #: ../libpurple/protocols/silc10/chat.c:598
 msgid "Add Channel Private Group"
 msgstr "Csatorna magáncsoport felvétele"
 
-#: ../libpurple/protocols/silc/chat.c:742
+#: ../libpurple/protocols/silc/chat.c:746
 #: ../libpurple/protocols/silc10/chat.c:726
 msgid "User Limit"
 msgstr "Felhasználók korlátozása"
 
-#: ../libpurple/protocols/silc/chat.c:743
+#: ../libpurple/protocols/silc/chat.c:747
 #: ../libpurple/protocols/silc10/chat.c:727
 msgid "Set user limit on channel. Set to zero to reset user limit."
 msgstr ""
 "A csatorna legnagyobb felhasználószámának beállítása. A felhasználószám-"
 "korlátozás feloldásához állítsa nullára."
 
-#: ../libpurple/protocols/silc/chat.c:907
+#: ../libpurple/protocols/silc/chat.c:911
 #: ../libpurple/protocols/silc10/chat.c:891
 msgid "Invite List"
 msgstr "Meghívási lista"
 
-#: ../libpurple/protocols/silc/chat.c:912
+#: ../libpurple/protocols/silc/chat.c:916
 #: ../libpurple/protocols/silc10/chat.c:896
 msgid "Ban List"
 msgstr "Kitiltási lista"
 
-#: ../libpurple/protocols/silc/chat.c:920
+#: ../libpurple/protocols/silc/chat.c:924
 #: ../libpurple/protocols/silc10/chat.c:904
 msgid "Add Private Group"
 msgstr "Magáncsoport felvétele"
 
-#: ../libpurple/protocols/silc/chat.c:933
+#: ../libpurple/protocols/silc/chat.c:937
 #: ../libpurple/protocols/silc10/chat.c:917
 msgid "Reset Permanent"
 msgstr "Állandóság visszavonása"
 
-#: ../libpurple/protocols/silc/chat.c:938
+#: ../libpurple/protocols/silc/chat.c:942
 #: ../libpurple/protocols/silc10/chat.c:922
 msgid "Set Permanent"
 msgstr "Állandóság beállítása"
 
-#: ../libpurple/protocols/silc/chat.c:946
+#: ../libpurple/protocols/silc/chat.c:950
 #: ../libpurple/protocols/silc10/chat.c:930
 msgid "Set User Limit"
 msgstr "Felhasználószám korlátozása"
 
-#: ../libpurple/protocols/silc/chat.c:952
+#: ../libpurple/protocols/silc/chat.c:956
 #: ../libpurple/protocols/silc10/chat.c:936
 msgid "Reset Topic Restriction"
 msgstr "Témamegszorítás visszavonása"
 
-#: ../libpurple/protocols/silc/chat.c:957
+#: ../libpurple/protocols/silc/chat.c:961
 #: ../libpurple/protocols/silc10/chat.c:941
 msgid "Set Topic Restriction"
 msgstr "Témamegszorítás beállítása"
 
-#: ../libpurple/protocols/silc/chat.c:964
+#: ../libpurple/protocols/silc/chat.c:968
 #: ../libpurple/protocols/silc10/chat.c:948
 msgid "Reset Private Channel"
 msgstr "Magáncsatorna visszavonása"
 
-#: ../libpurple/protocols/silc/chat.c:969
+#: ../libpurple/protocols/silc/chat.c:973
 #: ../libpurple/protocols/silc10/chat.c:953
 msgid "Set Private Channel"
 msgstr "Magáncsatorna beállítása"
 
-#: ../libpurple/protocols/silc/chat.c:976
+#: ../libpurple/protocols/silc/chat.c:980
 #: ../libpurple/protocols/silc10/chat.c:960
 msgid "Reset Secret Channel"
 msgstr "Titkos csatorna visszavonása"
 
-#: ../libpurple/protocols/silc/chat.c:981
+#: ../libpurple/protocols/silc/chat.c:985
 #: ../libpurple/protocols/silc10/chat.c:965
 msgid "Set Secret Channel"
 msgstr "Titkos csatorna beállítása"
 
-#: ../libpurple/protocols/silc/chat.c:1045
+#: ../libpurple/protocols/silc/chat.c:1046
 #: ../libpurple/protocols/silc10/chat.c:1102
 #, c-format
-msgid ""
-"You have to join the %s channel before you are able to join the private group"
+msgid "You have to join the %s channel before you are able to join the private group"
 msgstr ""
 "Mielőtt csatlakozhatna a magáncsoporthoz, csatlakoznia kell a(z) %s "
 "csatornához"
 
-#: ../libpurple/protocols/silc/chat.c:1047
+#: ../libpurple/protocols/silc/chat.c:1048
 #: ../libpurple/protocols/silc10/chat.c:1104
 msgid "Join Private Group"
 msgstr "Kapcsolódás magáncsoporthoz"
 
-#: ../libpurple/protocols/silc/chat.c:1048
+#: ../libpurple/protocols/silc/chat.c:1049
 #: ../libpurple/protocols/silc10/chat.c:1105
 msgid "Cannot join private group"
 msgstr "Nem lehet kapcsolódni a magáncsoporthoz"
 
-#: ../libpurple/protocols/silc/chat.c:1260
-#: ../libpurple/protocols/silc/silc.c:1217
+#: ../libpurple/protocols/silc/chat.c:1245
+#: ../libpurple/protocols/silc/silc.c:1348
 #: ../libpurple/protocols/silc10/chat.c:1299
-#: ../libpurple/protocols/silc10/silc.c:1137
+#: ../libpurple/protocols/silc10/silc.c:1140
 msgid "Call Command"
 msgstr "Hívás parancsa"
 
-#: ../libpurple/protocols/silc/chat.c:1260
-#: ../libpurple/protocols/silc/silc.c:1218
+#: ../libpurple/protocols/silc/chat.c:1245
+#: ../libpurple/protocols/silc/silc.c:1349
 #: ../libpurple/protocols/silc10/chat.c:1299
-#: ../libpurple/protocols/silc10/silc.c:1137
+#: ../libpurple/protocols/silc10/silc.c:1140
 msgid "Cannot call command"
 msgstr "Nem lehet meghívni a parancsot"
 
-#: ../libpurple/protocols/silc/chat.c:1261
-#: ../libpurple/protocols/silc/silc.c:1219
+#: ../libpurple/protocols/silc/chat.c:1246
+#: ../libpurple/protocols/silc/silc.c:1350
 #: ../libpurple/protocols/silc10/chat.c:1300
-#: ../libpurple/protocols/silc10/silc.c:1138
+#: ../libpurple/protocols/silc10/silc.c:1141
 msgid "Unknown command"
 msgstr "Ismeretlen parancs"
 
@@ -11236,8 +11498,7 @@
 #: ../libpurple/protocols/silc10/ops.c:638
 #, c-format
 msgid "<I>%s</I> set channel <I>%s</I> modes to: %s"
-msgstr ""
-"<I>%s</I> átállította a(z) <I>%s</I> csatorna üzemmódjait a következőkre: %s"
+msgstr "<I>%s</I> átállította a(z) <I>%s</I> csatorna üzemmódjait a következőkre: %s"
 
 #: ../libpurple/protocols/silc/ops.c:621
 #: ../libpurple/protocols/silc10/ops.c:642
@@ -11302,7 +11563,7 @@
 msgstr "Pozíció"
 
 #: ../libpurple/protocols/silc/ops.c:1018
-#: ../libpurple/protocols/silc/silc.c:1013
+#: ../libpurple/protocols/silc/silc.c:1144
 #: ../libpurple/protocols/silc10/ops.c:1052
 #: ../libpurple/protocols/silc10/silc.c:924
 msgid "Organization"
@@ -11336,7 +11597,7 @@
 msgstr "A csatornaalapító a következőn: <I>%s</I>: <I>%s</I>"
 
 #: ../libpurple/protocols/silc/ops.c:1190
-#: ../libpurple/protocols/silc/ops.c:1326
+#: ../libpurple/protocols/silc/ops.c:1328
 #: ../libpurple/protocols/silc10/ops.c:1183
 #: ../libpurple/protocols/silc10/ops.c:1332
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1071
@@ -11348,90 +11609,90 @@
 msgid "Status Text"
 msgstr "Állapotszöveg"
 
-#: ../libpurple/protocols/silc/ops.c:1279
-#: ../libpurple/protocols/silc/ops.c:1351
+#: ../libpurple/protocols/silc/ops.c:1280
+#: ../libpurple/protocols/silc/ops.c:1354
 #: ../libpurple/protocols/silc10/ops.c:1285
 #: ../libpurple/protocols/silc10/ops.c:1357
 msgid "Public Key Fingerprint"
 msgstr "Nyilvános kulcs ujjlenyomata"
 
-#: ../libpurple/protocols/silc/ops.c:1280
-#: ../libpurple/protocols/silc/ops.c:1352
+#: ../libpurple/protocols/silc/ops.c:1281
+#: ../libpurple/protocols/silc/ops.c:1355
 #: ../libpurple/protocols/silc10/ops.c:1286
 #: ../libpurple/protocols/silc10/ops.c:1358
 msgid "Public Key Babbleprint"
 msgstr "Nyilvános kulcs blablakódja"
 
-#: ../libpurple/protocols/silc/ops.c:1292
+#: ../libpurple/protocols/silc/ops.c:1294
 #: ../libpurple/protocols/silc10/ops.c:1298
 msgid "_More..."
 msgstr "_Több..."
 
-#: ../libpurple/protocols/silc/ops.c:1369
-#: ../libpurple/protocols/silc/silc.c:1077
+#: ../libpurple/protocols/silc/ops.c:1373
+#: ../libpurple/protocols/silc/silc.c:1208
 #: ../libpurple/protocols/silc10/ops.c:1371
-#: ../libpurple/protocols/silc10/silc.c:988
+#: ../libpurple/protocols/silc10/silc.c:991
 msgid "Detach From Server"
 msgstr "Leválás a kiszolgálóról"
 
-#: ../libpurple/protocols/silc/ops.c:1369
+#: ../libpurple/protocols/silc/ops.c:1373
 #: ../libpurple/protocols/silc10/ops.c:1371
 msgid "Cannot detach"
 msgstr "Nem lehet leválni"
 
-#: ../libpurple/protocols/silc/ops.c:1389
+#: ../libpurple/protocols/silc/ops.c:1393
 #: ../libpurple/protocols/silc10/ops.c:1382
 msgid "Cannot set topic"
 msgstr "Nem lehet beállítani a témát"
 
-#: ../libpurple/protocols/silc/ops.c:1418
+#: ../libpurple/protocols/silc/ops.c:1422
 #: ../libpurple/protocols/silc10/ops.c:1414
 msgid "Failed to change nickname"
 msgstr "Nem sikerült a becenevet megváltoztatni"
 
-#: ../libpurple/protocols/silc/ops.c:1467
+#: ../libpurple/protocols/silc/ops.c:1471
 #: ../libpurple/protocols/silc10/ops.c:1462
 msgid "Roomlist"
 msgstr "Szobalista"
 
-#: ../libpurple/protocols/silc/ops.c:1467
+#: ../libpurple/protocols/silc/ops.c:1471
 #: ../libpurple/protocols/silc10/ops.c:1462
 msgid "Cannot get room list"
 msgstr "Nem sikerült lekérni a szobalistát"
 
-#: ../libpurple/protocols/silc/ops.c:1468
+#: ../libpurple/protocols/silc/ops.c:1472
 msgid "Network is empty"
 msgstr "A hálózat üres"
 
-#: ../libpurple/protocols/silc/ops.c:1512
+#: ../libpurple/protocols/silc/ops.c:1516
 #: ../libpurple/protocols/silc10/ops.c:1507
 msgid "No public key was received"
 msgstr "Nem érkezett nyilvános kulcs"
 
-#: ../libpurple/protocols/silc/ops.c:1524
-#: ../libpurple/protocols/silc/ops.c:1537
+#: ../libpurple/protocols/silc/ops.c:1528
+#: ../libpurple/protocols/silc/ops.c:1541
 #: ../libpurple/protocols/silc10/ops.c:1519
 #: ../libpurple/protocols/silc10/ops.c:1532
 msgid "Server Information"
 msgstr "Kiszolgálóinformációk"
 
-#: ../libpurple/protocols/silc/ops.c:1525
+#: ../libpurple/protocols/silc/ops.c:1529
 #: ../libpurple/protocols/silc10/ops.c:1520
 msgid "Cannot get server information"
 msgstr "Nem lehet lekérni a kiszolgálóinformációkat"
 
-#: ../libpurple/protocols/silc/ops.c:1548
+#: ../libpurple/protocols/silc/ops.c:1552
 #: ../libpurple/protocols/silc10/ops.c:1549
 #: ../libpurple/protocols/silc10/ops.c:1558
 msgid "Server Statistics"
 msgstr "Kiszolgálóstatisztikák"
 
-#: ../libpurple/protocols/silc/ops.c:1549
+#: ../libpurple/protocols/silc/ops.c:1553
 #: ../libpurple/protocols/silc10/ops.c:1550
 msgid "Cannot get server statistics"
 msgstr "Nem lehet lekérni a kiszolgálóstatisztikákat"
 
-#: ../libpurple/protocols/silc/ops.c:1556
+#: ../libpurple/protocols/silc/ops.c:1560
 #: ../libpurple/protocols/silc10/ops.c:1581
 #, c-format
 msgid ""
@@ -11467,54 +11728,54 @@
 "Kiszolgáló-operátorok összesen: %d\n"
 "Útválasztó-operátorok összesen: %d\n"
 
-#: ../libpurple/protocols/silc/ops.c:1588
+#: ../libpurple/protocols/silc/ops.c:1592
 #: ../libpurple/protocols/silc10/ops.c:1604
 msgid "Network Statistics"
 msgstr "Hálózati statisztika"
 
-#: ../libpurple/protocols/silc/ops.c:1596
+#: ../libpurple/protocols/silc/ops.c:1600
 #: ../libpurple/protocols/silc10/ops.c:1612
 msgid "Ping failed"
 msgstr "Ping sikertelen"
 
-#: ../libpurple/protocols/silc/ops.c:1601
+#: ../libpurple/protocols/silc/ops.c:1605
 #: ../libpurple/protocols/silc10/ops.c:1617
 msgid "Ping reply received from server"
 msgstr "Ping válasz érkezett a kiszolgálótól"
 
-#: ../libpurple/protocols/silc/ops.c:1609
+#: ../libpurple/protocols/silc/ops.c:1613
 #: ../libpurple/protocols/silc10/ops.c:1625
 msgid "Could not kill user"
 msgstr "Nem sikerült kidobni a felhasználót"
 
-#: ../libpurple/protocols/silc/ops.c:1648
+#: ../libpurple/protocols/silc/ops.c:1652
 msgid "WATCH"
 msgstr "FIGYELÉS"
 
-#: ../libpurple/protocols/silc/ops.c:1648
+#: ../libpurple/protocols/silc/ops.c:1652
 msgid "Cannot watch user"
 msgstr "A felhasználó nem figyelhető"
 
-#: ../libpurple/protocols/silc/ops.c:1724
-#: ../libpurple/protocols/silc/ops.c:1775
-#: ../libpurple/protocols/silc/silc.c:277
+#: ../libpurple/protocols/silc/ops.c:1728
+#: ../libpurple/protocols/silc/ops.c:1779
+#: ../libpurple/protocols/silc/silc.c:377
 #: ../libpurple/protocols/silc10/ops.c:1811
 #: ../libpurple/protocols/silc10/ops.c:1858
 #: ../libpurple/protocols/silc10/silc.c:190
 msgid "Resuming session"
 msgstr "Folyamat folytatása"
 
-#: ../libpurple/protocols/silc/ops.c:1726
+#: ../libpurple/protocols/silc/ops.c:1730
 #: ../libpurple/protocols/silc10/ops.c:1813
 msgid "Authenticating connection"
 msgstr "Kapcsolat hitelesítése"
 
-#: ../libpurple/protocols/silc/ops.c:1777
+#: ../libpurple/protocols/silc/ops.c:1781
 #: ../libpurple/protocols/silc10/ops.c:1860
 msgid "Verifying server public key"
 msgstr "Kiszolgáló nyilvános kulcsának ellenőrzése"
 
-#: ../libpurple/protocols/silc/ops.c:1814
+#: ../libpurple/protocols/silc/ops.c:1818
 #: ../libpurple/protocols/silc10/ops.c:1902
 msgid "Passphrase required"
 msgstr "Jelmondat szükséges"
@@ -11531,8 +11792,7 @@
 #: ../libpurple/protocols/silc/pk.c:103 ../libpurple/protocols/silc10/pk.c:109
 #, c-format
 msgid "Received %s's public key. Would you like to accept this public key?"
-msgstr ""
-"%s nyilvános kulcsa megérkezett. El kívánja fogadni ezt a nyilvános kulcsot?"
+msgstr "%s nyilvános kulcsa megérkezett. El kívánja fogadni ezt a nyilvános kulcsot?"
 
 #: ../libpurple/protocols/silc/pk.c:107 ../libpurple/protocols/silc10/pk.c:113
 #, c-format
@@ -11561,87 +11821,86 @@
 msgid "Unsupported public key type"
 msgstr "Nem támogatott típusú nyilvános kulcs"
 
-#: ../libpurple/protocols/silc/silc.c:217
+#: ../libpurple/protocols/silc/silc.c:317
 #: ../libpurple/protocols/silc10/ops.c:1749
 msgid "Disconnected by server"
 msgstr "A kiszolgáló bontotta a kapcsolatot"
 
-#: ../libpurple/protocols/silc/silc.c:224
+#: ../libpurple/protocols/silc/silc.c:324
 #: ../libpurple/protocols/silc10/ops.c:1700
 msgid "Error during connecting to SILC Server"
 msgstr "Hiba a SILC kiszolgálóhoz kapcsolódás közben"
 
-#: ../libpurple/protocols/silc/silc.c:229
+#: ../libpurple/protocols/silc/silc.c:329
 #: ../libpurple/protocols/silc10/ops.c:1705
 msgid "Key Exchange failed"
 msgstr "Kulcscsere sikertelen"
 
-#: ../libpurple/protocols/silc/silc.c:238
+#: ../libpurple/protocols/silc/silc.c:338
 #: ../libpurple/protocols/silc10/ops.c:1714
-msgid ""
-"Resuming detached session failed. Press Reconnect to create new connection."
+msgid "Resuming detached session failed. Press Reconnect to create new connection."
 msgstr ""
 "A leválasztott folyamat folytatása sikertelen. Kattintson az Újrakapcsolódás "
 "gombra egy új kapcsolat létrehozásához."
 
-#: ../libpurple/protocols/silc/silc.c:265
-#: ../libpurple/protocols/silc/silc.c:311
+#: ../libpurple/protocols/silc/silc.c:365
+#: ../libpurple/protocols/silc/silc.c:411
 #: ../libpurple/protocols/silc10/silc.c:161
 msgid "Connection failed"
 msgstr "Kapcsolódás sikertelen"
 
-#: ../libpurple/protocols/silc/silc.c:280
+#: ../libpurple/protocols/silc/silc.c:380
 #: ../libpurple/protocols/silc10/silc.c:193
 msgid "Performing key exchange"
 msgstr "Kulcscsere elvégzése"
 
 #. Progress
-#: ../libpurple/protocols/silc/silc.c:343
+#: ../libpurple/protocols/silc/silc.c:435
 #: ../libpurple/protocols/silc10/silc.c:325
 msgid "Connecting to SILC Server"
 msgstr "Kapcsolódás a SILC kiszolgálóhoz"
 
-#: ../libpurple/protocols/silc/silc.c:352
+#: ../libpurple/protocols/silc/silc.c:444
 #, c-format
 msgid "Could not load SILC key pair"
 msgstr "Nem sikerült a SILC kulcspárt betölteni"
 
-#: ../libpurple/protocols/silc/silc.c:366
+#: ../libpurple/protocols/silc/silc.c:458
 #: ../libpurple/protocols/silc10/silc.c:355
 msgid "Unable to create connection"
 msgstr "Nem hozható létre kapcsolat"
 
-#: ../libpurple/protocols/silc/silc.c:395
+#: ../libpurple/protocols/silc/silc.c:487
 #: ../libpurple/protocols/silc10/silc.c:267
 msgid "Out of memory"
 msgstr "Elfogyott a memória"
 
-#: ../libpurple/protocols/silc/silc.c:438
+#: ../libpurple/protocols/silc/silc.c:538
 #: ../libpurple/protocols/silc10/silc.c:313
 msgid "Cannot initialize SILC protocol"
 msgstr "Nem lehet inicializálni a SILC protokollt"
 
-#: ../libpurple/protocols/silc/silc.c:445
+#: ../libpurple/protocols/silc/silc.c:547
 msgid "Error loading SILC key pair"
 msgstr "Hiba a SILC kulcspár betöltésekor"
 
-#: ../libpurple/protocols/silc/silc.c:739
+#: ../libpurple/protocols/silc/silc.c:870
 #: ../libpurple/protocols/silc10/silc.c:650
 msgid "Your Current Mood"
 msgstr "Az Ön jelenlegi hangulata"
 
-#: ../libpurple/protocols/silc/silc.c:741
-#: ../libpurple/protocols/silc10/silc.c:652 ../pidgin/gtkprefs.c:1641
+#: ../libpurple/protocols/silc/silc.c:872
+#: ../libpurple/protocols/silc10/silc.c:652 ../pidgin/gtkprefs.c:1741
 #, c-format
 msgid "Normal"
 msgstr "Normál"
 
-#: ../libpurple/protocols/silc/silc.c:755
+#: ../libpurple/protocols/silc/silc.c:886
 #: ../libpurple/protocols/silc10/silc.c:666
 msgid "In love"
 msgstr "Szerelmes"
 
-#: ../libpurple/protocols/silc/silc.c:766
+#: ../libpurple/protocols/silc/silc.c:897
 #: ../libpurple/protocols/silc10/silc.c:677
 msgid ""
 "\n"
@@ -11650,62 +11909,62 @@
 "\n"
 "Az előnyben részesített kapcsolatfelvételi módszerek"
 
-#: ../libpurple/protocols/silc/silc.c:774
-#: ../libpurple/protocols/silc/util.c:561
+#: ../libpurple/protocols/silc/silc.c:905
+#: ../libpurple/protocols/silc/util.c:565
 #: ../libpurple/protocols/silc10/silc.c:685
 #: ../libpurple/protocols/silc10/util.c:557
 msgid "SMS"
 msgstr "SMS"
 
-#: ../libpurple/protocols/silc/silc.c:776
-#: ../libpurple/protocols/silc/util.c:563
+#: ../libpurple/protocols/silc/silc.c:907
+#: ../libpurple/protocols/silc/util.c:567
 #: ../libpurple/protocols/silc10/silc.c:687
 #: ../libpurple/protocols/silc10/util.c:559
 msgid "MMS"
 msgstr "MMS"
 
-#: ../libpurple/protocols/silc/silc.c:778
+#: ../libpurple/protocols/silc/silc.c:909
 #: ../libpurple/protocols/silc10/silc.c:689
 msgid "Video conferencing"
 msgstr "Videokonferencia"
 
-#: ../libpurple/protocols/silc/silc.c:783
+#: ../libpurple/protocols/silc/silc.c:914
 #: ../libpurple/protocols/silc10/silc.c:694
 msgid "Your Current Status"
 msgstr "Az Ön jelenlegi állapota"
 
-#: ../libpurple/protocols/silc/silc.c:790
+#: ../libpurple/protocols/silc/silc.c:921
 #: ../libpurple/protocols/silc10/silc.c:701
 msgid "Online Services"
 msgstr "Elérhető szolgáltatások"
 
-#: ../libpurple/protocols/silc/silc.c:793
+#: ../libpurple/protocols/silc/silc.c:924
 #: ../libpurple/protocols/silc10/silc.c:704
 msgid "Let others see what services you are using"
 msgstr "Mások láthatják milyen szolgáltatásokat használ"
 
-#: ../libpurple/protocols/silc/silc.c:799
+#: ../libpurple/protocols/silc/silc.c:930
 #: ../libpurple/protocols/silc10/silc.c:710
 msgid "Let others see what computer you are using"
 msgstr "Mások láthatják milyen számítógépet használ"
 
-#: ../libpurple/protocols/silc/silc.c:806
+#: ../libpurple/protocols/silc/silc.c:937
 #: ../libpurple/protocols/silc10/silc.c:717
 msgid "Your VCard File"
 msgstr "Az Ön VCard fájlja"
 
-#: ../libpurple/protocols/silc/silc.c:812
+#: ../libpurple/protocols/silc/silc.c:943
 msgid "Timezone (UTC)"
 msgstr "Időzóna (UTC)"
 
-#: ../libpurple/protocols/silc/silc.c:816
-#: ../libpurple/protocols/silc/silc.c:817
+#: ../libpurple/protocols/silc/silc.c:947
+#: ../libpurple/protocols/silc/silc.c:948
 #: ../libpurple/protocols/silc10/silc.c:729
 #: ../libpurple/protocols/silc10/silc.c:730
 msgid "User Online Status Attributes"
 msgstr "Felhasználó online állapotattribútumai"
 
-#: ../libpurple/protocols/silc/silc.c:818
+#: ../libpurple/protocols/silc/silc.c:949
 #: ../libpurple/protocols/silc10/silc.c:731
 msgid ""
 "You can let other users see your online status information and your personal "
@@ -11716,31 +11975,31 @@
 "személyes információit. Kérem töltse ki azokat az információkat, amelyeket "
 "más felhasználók láthatnak Önről."
 
-#: ../libpurple/protocols/silc/silc.c:859
-#: ../libpurple/protocols/silc/silc.c:865
-#: ../libpurple/protocols/silc/silc.c:1486
+#: ../libpurple/protocols/silc/silc.c:990
+#: ../libpurple/protocols/silc/silc.c:996
+#: ../libpurple/protocols/silc/silc.c:1617
 #: ../libpurple/protocols/silc10/silc.c:772
 #: ../libpurple/protocols/silc10/silc.c:778
-#: ../libpurple/protocols/silc10/silc.c:1415
+#: ../libpurple/protocols/silc10/silc.c:1418
 msgid "Message of the Day"
 msgstr "A nap üzenete"
 
-#: ../libpurple/protocols/silc/silc.c:859
+#: ../libpurple/protocols/silc/silc.c:990
 #: ../libpurple/protocols/silc10/silc.c:772
 msgid "No Message of the Day available"
 msgstr "Nem érhető el a nap üzenete"
 
-#: ../libpurple/protocols/silc/silc.c:860
-#: ../libpurple/protocols/silc/silc.c:1481
+#: ../libpurple/protocols/silc/silc.c:991
+#: ../libpurple/protocols/silc/silc.c:1612
 #: ../libpurple/protocols/silc10/silc.c:773
-#: ../libpurple/protocols/silc10/silc.c:1410
+#: ../libpurple/protocols/silc10/silc.c:1413
 msgid "There is no Message of the Day associated with this connection"
 msgstr "Nincs \"nap üzenete\" hozzárendelve ehhez a kapcsolathoz"
 
-#: ../libpurple/protocols/silc/silc.c:911
-#: ../libpurple/protocols/silc/silc.c:957
-#: ../libpurple/protocols/silc/silc.c:1028
-#: ../libpurple/protocols/silc/silc.c:1029
+#: ../libpurple/protocols/silc/silc.c:1042
+#: ../libpurple/protocols/silc/silc.c:1088
+#: ../libpurple/protocols/silc/silc.c:1159
+#: ../libpurple/protocols/silc/silc.c:1160
 #: ../libpurple/protocols/silc10/silc.c:824
 #: ../libpurple/protocols/silc10/silc.c:868
 #: ../libpurple/protocols/silc10/silc.c:939
@@ -11748,191 +12007,190 @@
 msgid "Create New SILC Key Pair"
 msgstr "Új SILC kulcspár létrehozása"
 
-#: ../libpurple/protocols/silc/silc.c:911
+#: ../libpurple/protocols/silc/silc.c:1042
 #: ../libpurple/protocols/silc10/silc.c:824
 msgid "Passphrases do not match"
 msgstr "A jelmondatok nem egyeznek"
 
-#: ../libpurple/protocols/silc/silc.c:957
+#: ../libpurple/protocols/silc/silc.c:1088
 #: ../libpurple/protocols/silc10/silc.c:868
 msgid "Key Pair Generation failed"
 msgstr "A kulcselőállítás meghiúsult"
 
-#: ../libpurple/protocols/silc/silc.c:996
+#: ../libpurple/protocols/silc/silc.c:1127
 #: ../libpurple/protocols/silc10/silc.c:907
 msgid "Key length"
 msgstr "Kulcs hossza"
 
-#: ../libpurple/protocols/silc/silc.c:998
+#: ../libpurple/protocols/silc/silc.c:1129
 #: ../libpurple/protocols/silc10/silc.c:909
 msgid "Public key file"
 msgstr "Nyilvános kulcs fájlja"
 
-#: ../libpurple/protocols/silc/silc.c:1000
+#: ../libpurple/protocols/silc/silc.c:1131
 #: ../libpurple/protocols/silc10/silc.c:911
 msgid "Private key file"
 msgstr "Személyes kulcs fájlja"
 
-#: ../libpurple/protocols/silc/silc.c:1023
+#: ../libpurple/protocols/silc/silc.c:1154
 #: ../libpurple/protocols/silc10/silc.c:934
 msgid "Passphrase (retype)"
 msgstr "Jelmondat (megerősítés)"
 
-#: ../libpurple/protocols/silc/silc.c:1030
+#: ../libpurple/protocols/silc/silc.c:1161
 #: ../libpurple/protocols/silc10/silc.c:941
 msgid "Generate Key Pair"
 msgstr "Kulcspár előállítása"
 
-#: ../libpurple/protocols/silc/silc.c:1073
-#: ../libpurple/protocols/silc10/silc.c:984
+#: ../libpurple/protocols/silc/silc.c:1204
+#: ../libpurple/protocols/silc10/silc.c:987
 msgid "Online Status"
 msgstr "Elérhető állapot"
 
-#: ../libpurple/protocols/silc/silc.c:1081
-#: ../libpurple/protocols/silc10/silc.c:992
+#: ../libpurple/protocols/silc/silc.c:1212
+#: ../libpurple/protocols/silc10/silc.c:995
 msgid "View Message of the Day"
 msgstr "A nap üzenetének megtekintése"
 
-#: ../libpurple/protocols/silc/silc.c:1085
-#: ../libpurple/protocols/silc10/silc.c:996
+#: ../libpurple/protocols/silc/silc.c:1216
+#: ../libpurple/protocols/silc10/silc.c:999
 msgid "Create SILC Key Pair..."
 msgstr "SILC kulcspár létrehozása..."
 
-#: ../libpurple/protocols/silc/silc.c:1177
-#: ../libpurple/protocols/silc10/silc.c:1095
+#: ../libpurple/protocols/silc/silc.c:1308
+#: ../libpurple/protocols/silc10/silc.c:1098
 #, c-format
 msgid "User <I>%s</I> is not present in the network"
 msgstr "<I>%s</I> felhasználó nincs jelen a hálózatban"
 
-#: ../libpurple/protocols/silc/silc.c:1357
-#: ../libpurple/protocols/silc10/silc.c:1286
+#: ../libpurple/protocols/silc/silc.c:1488
+#: ../libpurple/protocols/silc10/silc.c:1289
 msgid "Topic too long"
 msgstr "A téma túl hosszú"
 
-#: ../libpurple/protocols/silc/silc.c:1438
-#: ../libpurple/protocols/silc10/silc.c:1367
+#: ../libpurple/protocols/silc/silc.c:1569
+#: ../libpurple/protocols/silc10/silc.c:1370
 msgid "You must specify a nick"
 msgstr "Meg kell adnia egy becenevet"
 
-#: ../libpurple/protocols/silc/silc.c:1540
-#: ../libpurple/protocols/silc10/silc.c:1469
+#: ../libpurple/protocols/silc/silc.c:1671
+#: ../libpurple/protocols/silc10/silc.c:1472
 #, c-format
 msgid "channel %s not found"
 msgstr "%s csatorna nem található"
 
-#: ../libpurple/protocols/silc/silc.c:1545
-#: ../libpurple/protocols/silc10/silc.c:1474
+#: ../libpurple/protocols/silc/silc.c:1676
+#: ../libpurple/protocols/silc10/silc.c:1477
 #, c-format
 msgid "channel modes for %s: %s"
 msgstr "csatorna üzemmódok a következőhöz: %s: %s"
 
-#: ../libpurple/protocols/silc/silc.c:1547
-#: ../libpurple/protocols/silc10/silc.c:1476
+#: ../libpurple/protocols/silc/silc.c:1678
+#: ../libpurple/protocols/silc10/silc.c:1479
 #, c-format
 msgid "no channel modes are set on %s"
 msgstr "nincsenek csatorna üzemmódok beállítva a következőn: %s"
 
-#: ../libpurple/protocols/silc/silc.c:1560
-#: ../libpurple/protocols/silc10/silc.c:1489
+#: ../libpurple/protocols/silc/silc.c:1691
+#: ../libpurple/protocols/silc10/silc.c:1492
 #, c-format
 msgid "Failed to set cmodes for %s"
 msgstr "Nem sikerült beállítani a csatorna üzemmódokat a következőhöz: %s"
 
-#: ../libpurple/protocols/silc/silc.c:1590
-#: ../libpurple/protocols/silc10/silc.c:1519
+#: ../libpurple/protocols/silc/silc.c:1721
+#: ../libpurple/protocols/silc10/silc.c:1522
 #, c-format
 msgid "Unknown command: %s, (may be a client bug)"
 msgstr "Ismeretlen parancs: %s, (talán klienshiba)"
 
-#: ../libpurple/protocols/silc/silc.c:1653
-#: ../libpurple/protocols/silc10/silc.c:1582
+#: ../libpurple/protocols/silc/silc.c:1784
+#: ../libpurple/protocols/silc10/silc.c:1585
 msgid "part [channel]:  Leave the chat"
 msgstr "part [csatorna]:  A csevegés elhagyása"
 
-#: ../libpurple/protocols/silc/silc.c:1657
-#: ../libpurple/protocols/silc10/silc.c:1586
+#: ../libpurple/protocols/silc/silc.c:1788
+#: ../libpurple/protocols/silc10/silc.c:1589
 msgid "leave [channel]:  Leave the chat"
 msgstr "leave [csatorna]:  A csevegés elhagyása"
 
-#: ../libpurple/protocols/silc/silc.c:1661
-#: ../libpurple/protocols/silc10/silc.c:1590
+#: ../libpurple/protocols/silc/silc.c:1792
+#: ../libpurple/protocols/silc10/silc.c:1593
 msgid "topic [&lt;new topic&gt;]:  View or change the topic"
 msgstr "topic [&lt;új téma&gt;]:  A téma megtekintése vagy módosítása"
 
-#: ../libpurple/protocols/silc/silc.c:1666
-#: ../libpurple/protocols/silc10/silc.c:1595
+#: ../libpurple/protocols/silc/silc.c:1797
+#: ../libpurple/protocols/silc10/silc.c:1598
 msgid "join &lt;channel&gt; [&lt;password&gt;]:  Join a chat on this network"
 msgstr ""
 "join &lt;csatorna&gt; [&lt;jelszó&gt;]:  Csatlakozás csatornához ezen a "
 "hálózaton"
 
-#: ../libpurple/protocols/silc/silc.c:1670
-#: ../libpurple/protocols/silc10/silc.c:1599
+#: ../libpurple/protocols/silc/silc.c:1801
+#: ../libpurple/protocols/silc10/silc.c:1602
 msgid "list:  List channels on this network"
 msgstr "list:  Csatornák listázása ezen a hálózaton"
 
-#: ../libpurple/protocols/silc/silc.c:1674
-#: ../libpurple/protocols/silc10/silc.c:1603
+#: ../libpurple/protocols/silc/silc.c:1805
+#: ../libpurple/protocols/silc10/silc.c:1606
 msgid "whois &lt;nick&gt;:  View nick's information"
 msgstr "whois &lt;becenév&gt;:  A becenévhez tartozó információk megjelenítése"
 
-#: ../libpurple/protocols/silc/silc.c:1678
-#: ../libpurple/protocols/silc10/silc.c:1607
+#: ../libpurple/protocols/silc/silc.c:1809
+#: ../libpurple/protocols/silc10/silc.c:1610
 #: ../libpurple/protocols/zephyr/zephyr.c:2685
 msgid "msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user"
-msgstr ""
-"msg &lt;becenév&gt; &lt;message&gt;:  Magánüzenet küldése a felhasználónak"
-
-#: ../libpurple/protocols/silc/silc.c:1682
-#: ../libpurple/protocols/silc10/silc.c:1611
+msgstr "msg &lt;becenév&gt; &lt;message&gt;:  Magánüzenet küldése a felhasználónak"
+
+#: ../libpurple/protocols/silc/silc.c:1813
+#: ../libpurple/protocols/silc10/silc.c:1614
 msgid "query &lt;nick&gt; [&lt;message&gt;]:  Send a private message to a user"
 msgstr ""
 "query &lt;becenév&gt; [&lt;message&gt;]:  Magánüzenet küldése a "
 "felhasználónak"
 
-#: ../libpurple/protocols/silc/silc.c:1686
-#: ../libpurple/protocols/silc10/silc.c:1615
+#: ../libpurple/protocols/silc/silc.c:1817
+#: ../libpurple/protocols/silc10/silc.c:1618
 msgid "motd:  View the server's Message Of The Day"
 msgstr "motd:  A kiszolgáló napi üzenetének megjelenítése"
 
-#: ../libpurple/protocols/silc/silc.c:1690
-#: ../libpurple/protocols/silc10/silc.c:1619
+#: ../libpurple/protocols/silc/silc.c:1821
+#: ../libpurple/protocols/silc10/silc.c:1622
 msgid "detach:  Detach this session"
 msgstr "detach:  Ezen folyamat leválasztása"
 
-#: ../libpurple/protocols/silc/silc.c:1694
-#: ../libpurple/protocols/silc10/silc.c:1623
+#: ../libpurple/protocols/silc/silc.c:1825
+#: ../libpurple/protocols/silc10/silc.c:1626
 msgid "quit [message]:  Disconnect from the server, with an optional message"
 msgstr ""
 "quit [message]:  Kapcsolat bontása a kiszolgálóval, egy opcionális üzenet "
 "kíséretében"
 
-#: ../libpurple/protocols/silc/silc.c:1698
-#: ../libpurple/protocols/silc10/silc.c:1627
+#: ../libpurple/protocols/silc/silc.c:1829
+#: ../libpurple/protocols/silc10/silc.c:1630
 msgid "call &lt;command&gt;:  Call any silc client command"
 msgstr "call &lt;command&gt;:  Egy silc kliensparancs meghívása"
 
-#: ../libpurple/protocols/silc/silc.c:1704
-#: ../libpurple/protocols/silc10/silc.c:1633
+#: ../libpurple/protocols/silc/silc.c:1835
+#: ../libpurple/protocols/silc10/silc.c:1636
 msgid "kill &lt;nick&gt; [-pubkey|&lt;reason&gt;]:  Kill nick"
 msgstr ""
 "kill &lt;becenév&gt; [-pubkey|&lt;ok&gt;]:  A \"becenév\" nevű felhasználó "
 "kidobása"
 
-#: ../libpurple/protocols/silc/silc.c:1708
-#: ../libpurple/protocols/silc10/silc.c:1637
+#: ../libpurple/protocols/silc/silc.c:1839
+#: ../libpurple/protocols/silc10/silc.c:1640
 msgid "nick &lt;newnick&gt;:  Change your nickname"
 msgstr "nick &lt;új becenév&gt;:  A becenevének megváltoztatása"
 
-#: ../libpurple/protocols/silc/silc.c:1712
-#: ../libpurple/protocols/silc10/silc.c:1641
+#: ../libpurple/protocols/silc/silc.c:1843
+#: ../libpurple/protocols/silc10/silc.c:1644
 msgid "whowas &lt;nick&gt;:  View nick's information"
 msgstr ""
 "whowas &lt;becenév&gt;:  A becenév nevű felhasználó információinak "
 "megjelenítése"
 
-#: ../libpurple/protocols/silc/silc.c:1716
-#: ../libpurple/protocols/silc10/silc.c:1645
+#: ../libpurple/protocols/silc/silc.c:1847
+#: ../libpurple/protocols/silc10/silc.c:1648
 msgid ""
 "cmode &lt;channel&gt; [+|-&lt;modes&gt;] [arguments]:  Change or display "
 "channel modes"
@@ -11940,8 +12198,8 @@
 "cmode &lt;csatorna&gt; [+|-&lt;módok&gt;] [paraméterek]:  Csatorna "
 "üzemmódjainak megjelenítése vagy megváltoztatása"
 
-#: ../libpurple/protocols/silc/silc.c:1720
-#: ../libpurple/protocols/silc10/silc.c:1649
+#: ../libpurple/protocols/silc/silc.c:1851
+#: ../libpurple/protocols/silc10/silc.c:1652
 msgid ""
 "cumode &lt;channel&gt; +|-&lt;modes&gt; &lt;nick&gt;:  Change nick's modes "
 "on channel"
@@ -11949,20 +12207,20 @@
 "cumode &lt;csatorna&gt; +|-&lt;modes&gt; &lt;becenév&gt;:  A becenév "
 "módjainak megváltoztatása a csatornán"
 
-#: ../libpurple/protocols/silc/silc.c:1724
-#: ../libpurple/protocols/silc10/silc.c:1653
+#: ../libpurple/protocols/silc/silc.c:1855
+#: ../libpurple/protocols/silc10/silc.c:1656
 msgid "umode &lt;usermodes&gt;:  Set your modes in the network"
 msgstr ""
 "umode &lt;felhasználói módok&gt;:  A felhasználói módjainak beállítása a "
 "hálózaton"
 
-#: ../libpurple/protocols/silc/silc.c:1728
-#: ../libpurple/protocols/silc10/silc.c:1657
+#: ../libpurple/protocols/silc/silc.c:1859
+#: ../libpurple/protocols/silc10/silc.c:1660
 msgid "oper &lt;nick&gt; [-pubkey]:  Get server operator privileges"
 msgstr "oper &lt;becenév&gt; [-pubkey]:  Kiszolgáló-operátori jogok kérése"
 
-#: ../libpurple/protocols/silc/silc.c:1732
-#: ../libpurple/protocols/silc10/silc.c:1661
+#: ../libpurple/protocols/silc/silc.c:1863
+#: ../libpurple/protocols/silc10/silc.c:1664
 msgid ""
 "invite &lt;channel&gt; [-|+]&lt;nick&gt;:  invite nick or add/remove from "
 "channel invite list"
@@ -11970,49 +12228,47 @@
 "invite &lt;csatorna&gt; [-|+]&lt;becenév&gt;:  A becenév nevű felhasználó "
 "meghívása vagy a csatorna meghívási listájához/ról hozzáadása/eltávolítása"
 
-#: ../libpurple/protocols/silc/silc.c:1736
-#: ../libpurple/protocols/silc10/silc.c:1665
+#: ../libpurple/protocols/silc/silc.c:1867
+#: ../libpurple/protocols/silc10/silc.c:1668
 msgid "kick &lt;channel&gt; &lt;nick&gt; [comment]:  Kick client from channel"
 msgstr ""
 "kick &lt;csatorna&gt; &lt;becenév&gt; [megjegyzés]:  Kliens kirúgása a "
 "csatornáról"
 
-#: ../libpurple/protocols/silc/silc.c:1740
-#: ../libpurple/protocols/silc10/silc.c:1669
+#: ../libpurple/protocols/silc/silc.c:1871
+#: ../libpurple/protocols/silc10/silc.c:1672
 msgid "info [server]:  View server administrative details"
-msgstr ""
-"info [kiszolgáló]:  A kiszolgáló adminisztrációs részleteinek megjelenítése"
-
-#: ../libpurple/protocols/silc/silc.c:1744
-#: ../libpurple/protocols/silc10/silc.c:1673
+msgstr "info [kiszolgáló]:  A kiszolgáló adminisztrációs részleteinek megjelenítése"
+
+#: ../libpurple/protocols/silc/silc.c:1875
+#: ../libpurple/protocols/silc10/silc.c:1676
 msgid "ban [&lt;channel&gt; +|-&lt;nick&gt;]:  Ban client from channel"
-msgstr ""
-"ban [&lt;csatorna&gt; +|-&lt;becenév&gt;]:  Kliens kitiltása a csatornáról"
-
-#: ../libpurple/protocols/silc/silc.c:1748
-#: ../libpurple/protocols/silc10/silc.c:1677
+msgstr "ban [&lt;csatorna&gt; +|-&lt;becenév&gt;]:  Kliens kitiltása a csatornáról"
+
+#: ../libpurple/protocols/silc/silc.c:1879
+#: ../libpurple/protocols/silc10/silc.c:1680
 msgid "getkey &lt;nick|server&gt;:  Retrieve client's or server's public key"
 msgstr ""
 "getkey &lt;becenév|kiszolgáló&gt;:  A kliens vagy a kiszolgáló nyilvános "
 "kulcsának letöltése"
 
-#: ../libpurple/protocols/silc/silc.c:1752
-#: ../libpurple/protocols/silc10/silc.c:1681
+#: ../libpurple/protocols/silc/silc.c:1883
+#: ../libpurple/protocols/silc10/silc.c:1684
 msgid "stats:  View server and network statistics"
 msgstr "stats:  A kiszolgáló és a hálózat statisztikáinak megjelenítése"
 
-#: ../libpurple/protocols/silc/silc.c:1756
-#: ../libpurple/protocols/silc10/silc.c:1685
+#: ../libpurple/protocols/silc/silc.c:1887
+#: ../libpurple/protocols/silc10/silc.c:1688
 msgid "ping:  Send PING to the connected server"
 msgstr "ping:  PING küldése a kapcsolódott kiszolgálónak"
 
-#: ../libpurple/protocols/silc/silc.c:1761
-#: ../libpurple/protocols/silc10/silc.c:1690
+#: ../libpurple/protocols/silc/silc.c:1892
+#: ../libpurple/protocols/silc10/silc.c:1693
 msgid "users &lt;channel&gt;:  List users in channel"
 msgstr "users &lt;csatorna&gt;:  Egy csatorna felhasználóit listázza ki"
 
-#: ../libpurple/protocols/silc/silc.c:1765
-#: ../libpurple/protocols/silc10/silc.c:1694
+#: ../libpurple/protocols/silc/silc.c:1896
+#: ../libpurple/protocols/silc10/silc.c:1697
 msgid ""
 "names [-count|-ops|-halfops|-voices|-normal] &lt;channel(s)&gt;:  List "
 "specific users in channel(s)"
@@ -12029,68 +12285,68 @@
 #. *< name
 #. *< version
 #. *  summary
-#: ../libpurple/protocols/silc/silc.c:1876
-#: ../libpurple/protocols/silc10/silc.c:1819
+#: ../libpurple/protocols/silc/silc.c:2007
+#: ../libpurple/protocols/silc10/silc.c:1822
 msgid "SILC Protocol Plugin"
 msgstr "SILC protokollbővítmény"
 
 #. *  description
-#: ../libpurple/protocols/silc/silc.c:1878
-#: ../libpurple/protocols/silc10/silc.c:1821
+#: ../libpurple/protocols/silc/silc.c:2009
+#: ../libpurple/protocols/silc10/silc.c:1824
 msgid "Secure Internet Live Conferencing (SILC) Protocol"
 msgstr "Secure Internet Live Conferencing (SILC) protokoll"
 
-#: ../libpurple/protocols/silc/silc.c:1910
-#: ../libpurple/protocols/silc10/silc.c:1853 ../pidgin/gtkprefs.c:2036
+#: ../libpurple/protocols/silc/silc.c:2041
+#: ../libpurple/protocols/silc10/silc.c:1856 ../pidgin/gtkprefs.c:2138
 msgid "Network"
 msgstr "Hálózat"
 
-#: ../libpurple/protocols/silc/silc.c:1921
-#: ../libpurple/protocols/silc10/silc.c:1864
+#: ../libpurple/protocols/silc/silc.c:2052
+#: ../libpurple/protocols/silc10/silc.c:1867
 msgid "Public Key file"
 msgstr "Nyilvános kulcs fájlja"
 
-#: ../libpurple/protocols/silc/silc.c:1925
-#: ../libpurple/protocols/silc10/silc.c:1868
+#: ../libpurple/protocols/silc/silc.c:2056
+#: ../libpurple/protocols/silc10/silc.c:1871
 msgid "Private Key file"
 msgstr "Személyes kulcs fájlja"
 
-#: ../libpurple/protocols/silc/silc.c:1935
-#: ../libpurple/protocols/silc10/silc.c:1878
+#: ../libpurple/protocols/silc/silc.c:2066
+#: ../libpurple/protocols/silc10/silc.c:1881
 msgid "Cipher"
 msgstr "Titkosító"
 
-#: ../libpurple/protocols/silc/silc.c:1945
-#: ../libpurple/protocols/silc10/silc.c:1888
+#: ../libpurple/protocols/silc/silc.c:2076
+#: ../libpurple/protocols/silc10/silc.c:1891
 msgid "HMAC"
 msgstr "HMAC"
 
-#: ../libpurple/protocols/silc/silc.c:1948
+#: ../libpurple/protocols/silc/silc.c:2079
 msgid "Use Perfect Forward Secrecy"
 msgstr "Tökéletes továbbítási titkosság használata"
 
-#: ../libpurple/protocols/silc/silc.c:1952
-#: ../libpurple/protocols/silc10/silc.c:1891
+#: ../libpurple/protocols/silc/silc.c:2083
+#: ../libpurple/protocols/silc10/silc.c:1894
 msgid "Public key authentication"
 msgstr "Nyilvános kulcs hitelesítése"
 
-#: ../libpurple/protocols/silc/silc.c:1955
-#: ../libpurple/protocols/silc10/silc.c:1894
+#: ../libpurple/protocols/silc/silc.c:2086
+#: ../libpurple/protocols/silc10/silc.c:1897
 msgid "Block IMs without Key Exchange"
 msgstr "Kulcscsere nélküli azonnali üzenetváltások tiltása"
 
-#: ../libpurple/protocols/silc/silc.c:1958
-#: ../libpurple/protocols/silc10/silc.c:1897
+#: ../libpurple/protocols/silc/silc.c:2089
+#: ../libpurple/protocols/silc10/silc.c:1900
 msgid "Block messages to whiteboard"
 msgstr "Üzenetek tiltása a rajzlapra"
 
-#: ../libpurple/protocols/silc/silc.c:1961
-#: ../libpurple/protocols/silc10/silc.c:1900
+#: ../libpurple/protocols/silc/silc.c:2092
+#: ../libpurple/protocols/silc10/silc.c:1903
 msgid "Automatically open whiteboard"
 msgstr "Rajzlap automatikus megnyitása"
 
-#: ../libpurple/protocols/silc/silc.c:1964
-#: ../libpurple/protocols/silc10/silc.c:1903
+#: ../libpurple/protocols/silc/silc.c:2095
+#: ../libpurple/protocols/silc10/silc.c:1906
 msgid "Digitally sign and verify all messages"
 msgstr "Minden üzenet digitális aláírása és ellenőrzése"
 
@@ -12109,60 +12365,60 @@
 #. Hint for translators: Please check the tabulator width here and in
 #. the next strings (short strings: 2 tabs, longer strings 1 tab,
 #. sum: 3 tabs or 24 characters)
-#: ../libpurple/protocols/silc/util.c:358
+#: ../libpurple/protocols/silc/util.c:362
 #: ../libpurple/protocols/silc10/util.c:355
 #, c-format
 msgid "Real Name: \t%s\n"
 msgstr "Valódi név: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:360
+#: ../libpurple/protocols/silc/util.c:364
 #: ../libpurple/protocols/silc10/util.c:357
 #, c-format
 msgid "User Name: \t%s\n"
 msgstr "Felhasználónév: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:362
+#: ../libpurple/protocols/silc/util.c:366
 #: ../libpurple/protocols/silc10/util.c:359
 #, c-format
 msgid "E-Mail: \t\t%s\n"
 msgstr "E-mail: \t\t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:364
+#: ../libpurple/protocols/silc/util.c:368
 #: ../libpurple/protocols/silc10/util.c:361
 #, c-format
 msgid "Host Name: \t%s\n"
 msgstr "Kiszolgálónév: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:366
+#: ../libpurple/protocols/silc/util.c:370
 #: ../libpurple/protocols/silc10/util.c:363
 #, c-format
 msgid "Organization: \t%s\n"
 msgstr "Szervezet: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:368
+#: ../libpurple/protocols/silc/util.c:372
 #: ../libpurple/protocols/silc10/util.c:365
 #, c-format
 msgid "Country: \t%s\n"
 msgstr "Ország: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:369
+#: ../libpurple/protocols/silc/util.c:373
 #: ../libpurple/protocols/silc10/util.c:366
 #, c-format
 msgid "Algorithm: \t%s\n"
 msgstr "Algoritmus: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:370
+#: ../libpurple/protocols/silc/util.c:374
 #: ../libpurple/protocols/silc10/util.c:367
 #, c-format
 msgid "Key Length: \t%d bits\n"
 msgstr "Kulcs hossza: \t%d bit\n"
 
-#: ../libpurple/protocols/silc/util.c:372
+#: ../libpurple/protocols/silc/util.c:376
 #, c-format
 msgid "Version: \t%s\n"
 msgstr "Verzió: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:374
+#: ../libpurple/protocols/silc/util.c:378
 #: ../libpurple/protocols/silc10/util.c:369
 #, c-format
 msgid ""
@@ -12174,7 +12430,7 @@
 "%s\n"
 "\n"
 
-#: ../libpurple/protocols/silc/util.c:375
+#: ../libpurple/protocols/silc/util.c:379
 #: ../libpurple/protocols/silc10/util.c:370
 #, c-format
 msgid ""
@@ -12184,44 +12440,44 @@
 "Nyilvános kulcs blablakódja:\n"
 "%s"
 
-#: ../libpurple/protocols/silc/util.c:379
-#: ../libpurple/protocols/silc/util.c:380
+#: ../libpurple/protocols/silc/util.c:383
+#: ../libpurple/protocols/silc/util.c:384
 #: ../libpurple/protocols/silc10/util.c:374
 #: ../libpurple/protocols/silc10/util.c:375
 msgid "Public Key Information"
 msgstr "Nyilvános kulcs információi"
 
-#: ../libpurple/protocols/silc/util.c:559
+#: ../libpurple/protocols/silc/util.c:563
 #: ../libpurple/protocols/silc10/util.c:555
 msgid "Paging"
 msgstr "Lapozás"
 
-#: ../libpurple/protocols/silc/util.c:565
+#: ../libpurple/protocols/silc/util.c:569
 #: ../libpurple/protocols/silc10/util.c:561
 msgid "Video Conferencing"
 msgstr "Videokonferencia"
 
-#: ../libpurple/protocols/silc/util.c:583
+#: ../libpurple/protocols/silc/util.c:587
 #: ../libpurple/protocols/silc10/util.c:579
 msgid "Computer"
 msgstr "Számítógép"
 
-#: ../libpurple/protocols/silc/util.c:587
+#: ../libpurple/protocols/silc/util.c:591
 #: ../libpurple/protocols/silc10/util.c:583
 msgid "PDA"
 msgstr "PDA"
 
-#: ../libpurple/protocols/silc/util.c:589
+#: ../libpurple/protocols/silc/util.c:593
 #: ../libpurple/protocols/silc10/util.c:585
 msgid "Terminal"
 msgstr "Terminál"
 
-#: ../libpurple/protocols/silc/wb.c:284 ../libpurple/protocols/silc10/wb.c:284
+#: ../libpurple/protocols/silc/wb.c:288 ../libpurple/protocols/silc10/wb.c:287
 #, c-format
 msgid "%s sent message to whiteboard. Would you like to open the whiteboard?"
 msgstr "%s üzenetet küldött a rajzlapra. Meg kívánja nyitni a rajzlapot?"
 
-#: ../libpurple/protocols/silc/wb.c:288 ../libpurple/protocols/silc10/wb.c:288
+#: ../libpurple/protocols/silc/wb.c:292 ../libpurple/protocols/silc10/wb.c:291
 #, c-format
 msgid ""
 "%s sent message to whiteboard on %s channel. Would you like to open the "
@@ -12230,7 +12486,7 @@
 "%s üzenetet küldött a rajzlapra a(z) %s csatornán. Meg kívánja nyitni a "
 "rajzlapot?"
 
-#: ../libpurple/protocols/silc/wb.c:302 ../libpurple/protocols/silc10/wb.c:302
+#: ../libpurple/protocols/silc/wb.c:306 ../libpurple/protocols/silc10/wb.c:305
 msgid "Whiteboard"
 msgstr "Rajzlap"
 
@@ -12246,8 +12502,7 @@
 #: ../libpurple/protocols/silc10/ops.c:1934
 #, c-format
 msgid "Failure: Remote does not trust/support your public key"
-msgstr ""
-"Hiba: A távoli fél nem bízik meg vagy nem támogatja az Ön nyilvános kulcsát"
+msgstr "Hiba: A távoli fél nem bízik meg vagy nem támogatja az Ön nyilvános kulcsát"
 
 #: ../libpurple/protocols/silc10/ops.c:1937
 #, c-format
@@ -12307,36 +12562,35 @@
 msgstr "Nem sikerült a SILC kulcspárt betölteni: %s"
 
 #. TODO: do we really want to disconnect on a failure to write?
-#: ../libpurple/protocols/simple/simple.c:416
+#: ../libpurple/protocols/simple/simple.c:417
 msgid "Could not write"
 msgstr "Nem sikerült az írás"
 
-#: ../libpurple/protocols/simple/simple.c:438
-#: ../libpurple/protocols/simple/simple.c:1529
+#: ../libpurple/protocols/simple/simple.c:439
+#: ../libpurple/protocols/simple/simple.c:1684
 msgid "Could not connect"
 msgstr "Nem sikerült kapcsolódni"
 
-#: ../libpurple/protocols/simple/simple.c:1059
-#, fuzzy
+#: ../libpurple/protocols/simple/simple.c:1122
 msgid "Unknown server response."
-msgstr "Ismeretlen ok."
-
-#: ../libpurple/protocols/simple/simple.c:1563
-#: ../libpurple/protocols/simple/simple.c:1605
-#: ../libpurple/protocols/simple/simple.c:1618
-#: ../libpurple/protocols/simple/simple.c:1669
+msgstr "Ismeretlen kiszolgálóválasz."
+
+#: ../libpurple/protocols/simple/simple.c:1718
+#: ../libpurple/protocols/simple/simple.c:1760
+#: ../libpurple/protocols/simple/simple.c:1773
+#: ../libpurple/protocols/simple/simple.c:1824
 msgid "Could not create listen socket"
 msgstr "Nem sikerült létrehozni a figyelő foglalatot"
 
-#: ../libpurple/protocols/simple/simple.c:1586
+#: ../libpurple/protocols/simple/simple.c:1741
 msgid "Couldn't resolve host"
 msgstr "Nem sikerült a kiszolgáló feloldása"
 
-#: ../libpurple/protocols/simple/simple.c:1677
+#: ../libpurple/protocols/simple/simple.c:1832
 msgid "Could not resolve hostname"
 msgstr "A gépnév nem oldható fel"
 
-#: ../libpurple/protocols/simple/simple.c:1694
+#: ../libpurple/protocols/simple/simple.c:1849
 msgid "SIP screen names may not contain whitespaces or @ symbols"
 msgstr "A SIP felhasználónevek nem tartalmazhatnak szóközt vagy @ szimbólumot"
 
@@ -12348,36 +12602,36 @@
 #. *< id
 #. *< name
 #. *< version
-#: ../libpurple/protocols/simple/simple.c:1870
+#: ../libpurple/protocols/simple/simple.c:2035
 msgid "SIP/SIMPLE Protocol Plugin"
 msgstr "SIP/SIMPLE protokollbővítmény"
 
 #. *  summary
-#: ../libpurple/protocols/simple/simple.c:1871
+#: ../libpurple/protocols/simple/simple.c:2036
 msgid "The SIP/SIMPLE Protocol Plugin"
 msgstr "A SIP/SIMPLE protokollbővítmény"
 
-#: ../libpurple/protocols/simple/simple.c:1899
+#: ../libpurple/protocols/simple/simple.c:2064
 msgid "Publish status (note: everyone may watch you)"
 msgstr "Állapot közzététele (megjegyzés: mindenki figyelheti)"
 
-#: ../libpurple/protocols/simple/simple.c:1905
+#: ../libpurple/protocols/simple/simple.c:2070
 msgid "Use UDP"
 msgstr "UDP használata"
 
-#: ../libpurple/protocols/simple/simple.c:1907
+#: ../libpurple/protocols/simple/simple.c:2072
 msgid "Use proxy"
 msgstr "Proxy használata"
 
-#: ../libpurple/protocols/simple/simple.c:1909
+#: ../libpurple/protocols/simple/simple.c:2074
 msgid "Proxy"
 msgstr "Proxy"
 
-#: ../libpurple/protocols/simple/simple.c:1911
+#: ../libpurple/protocols/simple/simple.c:2076
 msgid "Auth User"
 msgstr "Felhasználó hitelesítése"
 
-#: ../libpurple/protocols/simple/simple.c:1913
+#: ../libpurple/protocols/simple/simple.c:2078
 msgid "Auth Domain"
 msgstr "Tartomány hitelesítése"
 
@@ -12424,8 +12678,7 @@
 #: ../libpurple/protocols/toc/toc.c:503
 #, c-format
 msgid "A message has been dropped, you are exceeding the server speed limit."
-msgstr ""
-"Egy üzenet el lett dobva, Ön túllépte a kiszolgáló átviteli sebességhatárát."
+msgstr "Egy üzenet el lett dobva, Ön túllépte a kiszolgáló átviteli sebességhatárát."
 
 #: ../libpurple/protocols/toc/toc.c:506
 #, c-format
@@ -12553,8 +12806,8 @@
 msgid "Password Change Successful"
 msgstr "Jelszó sikeresen megváltoztatva"
 
-#: ../libpurple/protocols/toc/toc.c:1366 ../pidgin/gtkblist.c:5582
-#: ../pidgin/gtkblist.c:5932
+#: ../libpurple/protocols/toc/toc.c:1366 ../pidgin/gtkblist.c:5948
+#: ../pidgin/gtkblist.c:6306
 msgid "_Group:"
 msgstr "_Csoport:"
 
@@ -12614,25 +12867,25 @@
 msgid "TOC Protocol Plugin"
 msgstr "TOC protokollbővítmény"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:782
+#: ../libpurple/protocols/yahoo/yahoo.c:784
 #, c-format
 msgid "%s has sent you a webcam invite, which is not yet supported."
 msgstr "%s webkamera-meghívást küldött, ami még nem támogatott."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:838
+#: ../libpurple/protocols/yahoo/yahoo.c:840
 msgid "Your Yahoo! message did not get sent."
 msgstr "Az Ön Yahoo! üzenete nem lett elküldve."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:960
+#: ../libpurple/protocols/yahoo/yahoo.c:962
 #, c-format
 msgid "Yahoo! system message for %s:"
 msgstr "Yahoo! rendszerüzenet %s számára:"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1029
+#: ../libpurple/protocols/yahoo/yahoo.c:1031
 msgid "Authorization denied message:"
 msgstr "Hozzáférés elutasítva üzenet:"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1047
+#: ../libpurple/protocols/yahoo/yahoo.c:1049
 #, c-format
 msgid ""
 "%s has (retroactively) denied your request to add them to your list for the "
@@ -12641,18 +12894,18 @@
 "%s visszamenőlegesen megtagadta az engedélyt, hogy felvegye őt a partnerei "
 "közé, a következő magyarázattal: %s."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1050
+#: ../libpurple/protocols/yahoo/yahoo.c:1052
 #, c-format
 msgid "%s has (retroactively) denied your request to add them to your list."
 msgstr ""
 "%s visszamenőlegesen megtagadta az engedélyt, hogy felvegye őt a partnerei "
 "közé."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1052
+#: ../libpurple/protocols/yahoo/yahoo.c:1054
 msgid "Add buddy rejected"
 msgstr "Partner felvétele megtagadva"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1994
+#: ../libpurple/protocols/yahoo/yahoo.c:1996
 #, c-format
 msgid ""
 "The Yahoo server has requested the use of an unrecognized authentication "
@@ -12663,11 +12916,11 @@
 "Valószínűleg nem fog tudni sikeresen bejelentkezni. Keressen esetleges "
 "frissítéseket a következő helyen: %s."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1997
+#: ../libpurple/protocols/yahoo/yahoo.c:1999
 msgid "Failed Yahoo! Authentication"
 msgstr "Yahoo! hitelesítés sikertelen"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2063
+#: ../libpurple/protocols/yahoo/yahoo.c:2065
 #, c-format
 msgid ""
 "You have tried to ignore %s, but the user is on your buddy list.  Clicking "
@@ -12677,52 +12930,52 @@
 "az \"Igen\"-re kattint, eltávolítja a listáról és mellőzni fogja a "
 "felhasználót."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2066
+#: ../libpurple/protocols/yahoo/yahoo.c:2068
 msgid "Ignore buddy?"
 msgstr "Mellőzi a partnert?"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2129
+#: ../libpurple/protocols/yahoo/yahoo.c:2131
 msgid "Your account is locked, please log in to the Yahoo! website."
 msgstr "A fiókja zárolva van, kérem jelentkezzen be a Yahoo! weboldalára."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2132
+#: ../libpurple/protocols/yahoo/yahoo.c:2134
 #, c-format
 msgid "Unknown error number %d. Logging into the Yahoo! website may fix this."
 msgstr ""
 "Ismeretlen hibaszám: %d. A Yahoo! weboldalára bejelentkezve talán "
 "megoldhatja ezt a problémát."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2186
+#: ../libpurple/protocols/yahoo/yahoo.c:2188
 #, c-format
 msgid "Could not add buddy %s to group %s to the server list on account %s."
 msgstr ""
 "Nem sikerült a(z) %s partner hozzáadása a(z) %s csoporthoz, a(z) %s fiókhoz "
 "tartozó kiszolgálóoldali listán."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2189
+#: ../libpurple/protocols/yahoo/yahoo.c:2191
 msgid "Could not add buddy to server list"
 msgstr "Nem sikerült a partnert hozzáadni a kiszolgálóoldali listához"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2308
+#: ../libpurple/protocols/yahoo/yahoo.c:2310
 #, c-format
 msgid "[ Audible %s/%s/%s.swf ] %s"
 msgstr "[ Hallható %s/%s/%s.swf ] %s"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2651
+#: ../libpurple/protocols/yahoo/yahoo.c:2653
 msgid "Received unexpected HTTP response from server."
 msgstr "Váratlan HTTP válasz érkezett a kiszolgálótól."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2675
-#: ../libpurple/protocols/yahoo/yahoo.c:2861
-#: ../libpurple/protocols/yahoo/yahoo.c:2964
-#: ../libpurple/protocols/yahoo/yahoo.c:2974
+#: ../libpurple/protocols/yahoo/yahoo.c:2677
+#: ../libpurple/protocols/yahoo/yahoo.c:2863
+#: ../libpurple/protocols/yahoo/yahoo.c:2966
+#: ../libpurple/protocols/yahoo/yahoo.c:2976
 #: ../libpurple/protocols/yahoo/yahoochat.c:1514
 #: ../libpurple/protocols/yahoo/yahoochat.c:1584
 #: ../libpurple/protocols/yahoo/ycht.c:585
 msgid "Connection problem"
 msgstr "Kapcsolathiba"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2701
+#: ../libpurple/protocols/yahoo/yahoo.c:2703
 #, c-format
 msgid ""
 "Lost connection with %s:\n"
@@ -12731,7 +12984,7 @@
 "Elveszett a kapcsolat a következővel: %s:\n"
 "%s"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2726
+#: ../libpurple/protocols/yahoo/yahoo.c:2728
 #, c-format
 msgid ""
 "Could not establish a connection with %s:\n"
@@ -12740,113 +12993,103 @@
 "Nem hozható létre kapcsolat a következővel: %s:\n"
 "%s"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3081
-#: ../libpurple/protocols/yahoo/yahoo.c:3767
+#: ../libpurple/protocols/yahoo/yahoo.c:3083
+#: ../libpurple/protocols/yahoo/yahoo.c:3769
 msgid "Not at Home"
 msgstr "Nem vagyok itthon"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3083
-#: ../libpurple/protocols/yahoo/yahoo.c:3770
-msgid "Not at Desk"
-msgstr "Nem vagyok az asztalnál"
-
 #: ../libpurple/protocols/yahoo/yahoo.c:3085
-#: ../libpurple/protocols/yahoo/yahoo.c:3773
+#: ../libpurple/protocols/yahoo/yahoo.c:3772
+msgid "Not at Desk"
+msgstr "Nem vagyok az asztalnál"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:3087
+#: ../libpurple/protocols/yahoo/yahoo.c:3775
 msgid "Not in Office"
 msgstr "Nem vagyok a munkahelyemen"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3089
-#: ../libpurple/protocols/yahoo/yahoo.c:3779
+#: ../libpurple/protocols/yahoo/yahoo.c:3091
+#: ../libpurple/protocols/yahoo/yahoo.c:3781
 msgid "On Vacation"
 msgstr "Nyaralok"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3093
-#: ../libpurple/protocols/yahoo/yahoo.c:3785
+#: ../libpurple/protocols/yahoo/yahoo.c:3095
+#: ../libpurple/protocols/yahoo/yahoo.c:3787
 msgid "Stepped Out"
 msgstr "Kilépett"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3186
-#: ../libpurple/protocols/yahoo/yahoo.c:3216
+#: ../libpurple/protocols/yahoo/yahoo.c:3188
+#: ../libpurple/protocols/yahoo/yahoo.c:3218
 msgid "Not on server list"
 msgstr "Nincs a szerverlistán"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3233
-#: ../libpurple/protocols/yahoo/yahoo.c:3291
+#: ../libpurple/protocols/yahoo/yahoo.c:3235
+#: ../libpurple/protocols/yahoo/yahoo.c:3293
 msgid "Appear Online"
 msgstr "Belépettként látszik"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3236
-#: ../libpurple/protocols/yahoo/yahoo.c:3312
+#: ../libpurple/protocols/yahoo/yahoo.c:3238
+#: ../libpurple/protocols/yahoo/yahoo.c:3314
 msgid "Appear Permanently Offline"
 msgstr "Tartósan kilépettként látszik"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3254
+#: ../libpurple/protocols/yahoo/yahoo.c:3256
 msgid "Presence"
 msgstr "Jelenlét"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3297
+#: ../libpurple/protocols/yahoo/yahoo.c:3299
 msgid "Appear Offline"
 msgstr "Kilépettként látszik"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3306
+#: ../libpurple/protocols/yahoo/yahoo.c:3308
 msgid "Don't Appear Permanently Offline"
 msgstr "Ne látsszon tartósan kilépettként"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3354
+#: ../libpurple/protocols/yahoo/yahoo.c:3356
 msgid "Join in Chat"
 msgstr "Csatlakozás a csevegéshez"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3360
+#: ../libpurple/protocols/yahoo/yahoo.c:3362
 msgid "Initiate Conference"
 msgstr "Konferencia kezdeményezése"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3388
+#: ../libpurple/protocols/yahoo/yahoo.c:3390
 msgid "Presence Settings"
 msgstr "Jelenlét beállításai"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3394
+#: ../libpurple/protocols/yahoo/yahoo.c:3396
 msgid "Start Doodling"
 msgstr "Firkálás megkezdése"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3495
+#: ../libpurple/protocols/yahoo/yahoo.c:3497
 msgid "Activate which ID?"
 msgstr "Melyik azonosítót aktiválja?"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3506
-msgid "Join whom in chat?"
+#: ../libpurple/protocols/yahoo/yahoo.c:3508
+msgid "Join who in chat?"
 msgstr "Kihez csatlakozik a csevegésben?"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3518
+#: ../libpurple/protocols/yahoo/yahoo.c:3520
 msgid "Activate ID..."
 msgstr "Azonosító aktiválása..."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3522
+#: ../libpurple/protocols/yahoo/yahoo.c:3524
 msgid "Join User in Chat..."
 msgstr "Felhasználó csatlakoztatása csevegéshez..."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3527
+#: ../libpurple/protocols/yahoo/yahoo.c:3529
 msgid "Open Inbox"
 msgstr "Bejövő levelek megnyitása"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4119
-#, fuzzy
-msgid "Buzz"
-msgstr "csörgetés"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4121
-#, fuzzy, c-format
-msgid "Buzzing %s..."
-msgstr "Csörgetés"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4136
+#: ../libpurple/protocols/yahoo/yahoo.c:4138
 msgid "join &lt;room&gt;:  Join a chat room on the Yahoo network"
 msgstr "join &lt;szoba&gt;:  Csatlakozás csevegőszobához a Yahoo hálózatán"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4141
+#: ../libpurple/protocols/yahoo/yahoo.c:4143
 msgid "list: List rooms on the Yahoo network"
 msgstr "list: Csatornák listázása a Yahoo hálózatán"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4149
+#: ../libpurple/protocols/yahoo/yahoo.c:4151
 msgid "doodle: Request user to start a Doodle session"
 msgstr "doodle: Kérés a felhasználóhoz egy firkálási folyamat indítására"
 
@@ -12860,56 +13103,56 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/yahoo/yahoo.c:4358
 #: ../libpurple/protocols/yahoo/yahoo.c:4360
+#: ../libpurple/protocols/yahoo/yahoo.c:4362
 msgid "Yahoo Protocol Plugin"
 msgstr "Yahoo protokollbővítmény"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4383
+#: ../libpurple/protocols/yahoo/yahoo.c:4385
 msgid "Yahoo Japan"
 msgstr "Yahoo Japán"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4386
+#: ../libpurple/protocols/yahoo/yahoo.c:4388
 msgid "Pager server"
 msgstr "Személyhívó kiszolgáló"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4389
+#: ../libpurple/protocols/yahoo/yahoo.c:4391
 msgid "Japan Pager server"
 msgstr "Japán személyhívó kiszolgáló"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4392
+#: ../libpurple/protocols/yahoo/yahoo.c:4394
 msgid "Pager port"
 msgstr "Személyhívó Port"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4395
+#: ../libpurple/protocols/yahoo/yahoo.c:4397
 msgid "File transfer server"
 msgstr "Fájlátviteli kiszolgáló"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4398
+#: ../libpurple/protocols/yahoo/yahoo.c:4400
 msgid "Japan file transfer server"
 msgstr "Japán fájlátviteli kiszolgáló"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4401
+#: ../libpurple/protocols/yahoo/yahoo.c:4403
 msgid "File transfer port"
 msgstr "Fájlátviteli port"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4404
+#: ../libpurple/protocols/yahoo/yahoo.c:4406
 msgid "Chat room locale"
 msgstr "Csevegőszoba nyelve"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4407
+#: ../libpurple/protocols/yahoo/yahoo.c:4409
 msgid "Ignore conference and chatroom invitations"
 msgstr "Konferencia- és csevegőszoba-meghívások figyelmen kívül hagyása"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4415
+#: ../libpurple/protocols/yahoo/yahoo.c:4417
 msgid "Chat room list URL"
 msgstr "Csevegőszobák listájának URL címe"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4418
+#: ../libpurple/protocols/yahoo/yahoo.c:4420
 msgid "Yahoo Chat server"
 msgstr "Yahoo csevegőkiszolgáló"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4421
+#: ../libpurple/protocols/yahoo/yahoo.c:4423
 msgid "Yahoo Chat port"
 msgstr "Yahoo csevegőport"
 
@@ -12927,7 +13170,7 @@
 msgstr "Nem lehet a fájlleírót létrehozni."
 
 #. TODO: what to do here - do we really have to disconnect?
-#: ../libpurple/protocols/yahoo/yahoo_packet.c:307
+#: ../libpurple/protocols/yahoo/yahoo_packet.c:306
 msgid "Write Error"
 msgstr "Írási hiba"
 
@@ -13185,8 +13428,7 @@
 "csevegéshez"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2721
-msgid ""
-"zi &lt;instance&gt;: Send a message to &lt;message,<i>instance</i>,*&gt;"
+msgid "zi &lt;instance&gt;: Send a message to &lt;message,<i>instance</i>,*&gt;"
 msgstr ""
 "zi &lt;példány&gt;: Üzenet küldése a következőnek: &lt;üzenet,<i>példány</i>,"
 "*&gt;"
@@ -13276,8 +13518,8 @@
 msgid "Exposure"
 msgstr "Exportálás"
 
-#: ../libpurple/proxy.c:459 ../libpurple/proxy.c:894 ../libpurple/proxy.c:1049
-#: ../libpurple/proxy.c:1617
+#: ../libpurple/proxy.c:461 ../libpurple/proxy.c:902 ../libpurple/proxy.c:1061
+#: ../libpurple/proxy.c:1632
 #, c-format
 msgid ""
 "Unable to create socket:\n"
@@ -13286,48 +13528,62 @@
 "Nem lehet létrehozni a foglalatot:\n"
 "%s"
 
-#: ../libpurple/proxy.c:659
+#: ../libpurple/proxy.c:662
 #, c-format
 msgid "Unable to parse response from HTTP proxy: %s\n"
 msgstr "A válasz nem dolgozható fel a HTTP proxytól: %s\n"
 
-#: ../libpurple/proxy.c:698 ../libpurple/proxy.c:744 ../libpurple/proxy.c:780
-#: ../libpurple/proxy.c:792
+#: ../libpurple/proxy.c:702 ../libpurple/proxy.c:750 ../libpurple/proxy.c:786
+#: ../libpurple/proxy.c:798
 #, c-format
 msgid "HTTP proxy connection error %d"
 msgstr "%d HTTP proxy kapcsolathiba"
 
-#: ../libpurple/proxy.c:788
+#: ../libpurple/proxy.c:794
 #, c-format
 msgid "Access denied: HTTP proxy server forbids port %d tunneling."
 msgstr ""
 "Hozzáférés megtagadva: a HTTP proxy kiszolgáló tiltja az alagutazást a(z) %"
 "d. porton."
 
-#: ../libpurple/proxy.c:1012
+#: ../libpurple/proxy.c:1022
 #, c-format
 msgid "Error resolving %s"
 msgstr "Hiba %s feloldásakor"
 
-#: ../libpurple/proxy.c:1714
+#: ../libpurple/proxy.c:1730
 msgid "Could not resolve host name"
 msgstr "A gépnév nem oldható fel"
 
 #. *
 #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
+#. *
+#. * @since 2.3.0
 #.
-#: ../libpurple/request.h:1378
+#. *
+#. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
+#. *
+#. * @deprecated Please use purple_request_yes_no_with_hint instead.
+#.
+#: ../libpurple/request.h:1802 ../libpurple/request.h:1815
 msgid "_Yes"
 msgstr "_Igen"
 
-#: ../libpurple/request.h:1378
+#: ../libpurple/request.h:1802 ../libpurple/request.h:1815
 msgid "_No"
 msgstr "_Nem"
 
 #. *
 #. * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
+#. *
+#. * @since 2.3.0
 #.
-#: ../libpurple/request.h:1398
+#. *
+#. * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
+#. *
+#. * @deprecated Please use purple_request_accept_cancel_with_hint instead.
+#.
+#: ../libpurple/request.h:1854 ../libpurple/request.h:1867
 msgid "_Accept"
 msgstr "Elfog_adás"
 
@@ -13350,14 +13606,14 @@
 #: ../libpurple/server.c:302
 #, c-format
 msgid "Requesting %s's attention..."
-msgstr ""
+msgstr "%s figyelmének kérése..."
 
 #: ../libpurple/server.c:347
 #, c-format
 msgid "%s has requested your attention!"
-msgstr ""
-
-#: ../libpurple/server.c:796
+msgstr "%s a figyelmét kéri!"
+
+#: ../libpurple/server.c:793
 #, c-format
 msgid ""
 "%s has invited %s to the chat room %s:\n"
@@ -13366,39 +13622,37 @@
 "%s meghívta %s felhasználót a(z) %s csevegőszobába:\n"
 "%s"
 
-#: ../libpurple/server.c:801
+#: ../libpurple/server.c:798
 #, c-format
 msgid "%s has invited %s to the chat room %s\n"
 msgstr "%s meghívta %s felhasználót a(z) %s csevegőszobába:\n"
 
-#: ../libpurple/server.c:805
+#: ../libpurple/server.c:802
 msgid "Accept chat invitation?"
 msgstr "Elfogadja a meghívást a csevegésre?"
 
 #: ../libpurple/sslconn.c:164
-#, fuzzy
 msgid "SSL Connection Failed"
-msgstr "Kapcsolódás sikertelen"
+msgstr "Az SSL kapcsolat meghiúsult"
 
 #: ../libpurple/sslconn.c:166
-#, fuzzy
 msgid "SSL Handshake Failed"
-msgstr "A fájlátvitel meghiúsult"
+msgstr "Az SSL kézfogás meghiúsult"
 
 #: ../libpurple/sslconn.c:168
 msgid "SSL peer presented an invalid certificate"
-msgstr ""
+msgstr "Az SSL partner érvénytelen tanúsítványt mutatott be"
 
 #: ../libpurple/sslconn.c:171
-#, fuzzy
 msgid "Unknown SSL error"
-msgstr "Ismeretlen hiba"
+msgstr "Ismeretlen SSL hiba"
 
 #: ../libpurple/status.c:153
 msgid "Unset"
 msgstr "Visszaállítás"
 
-#: ../libpurple/status.c:156 ../pidgin/gtkstatusbox.c:1059
+#: ../libpurple/status.c:156 ../pidgin/gtkdocklet.c:553
+#: ../pidgin/gtkstatusbox.c:1059
 msgid "Do not disturb"
 msgstr "Ne zavarjanak"
 
@@ -13410,52 +13664,71 @@
 msgid "Mobile"
 msgstr "Mobil"
 
-#: ../libpurple/status.c:609
+#: ../libpurple/status.c:161
+msgid "Listening to music"
+msgstr "Zenét hallgat"
+
+#: ../libpurple/status.c:610
 #, c-format
 msgid "%s changed status from %s to %s"
 msgstr "%s megváltoztatta az állapotát (%s -> %s)"
 
-#: ../libpurple/status.c:619
+#: ../libpurple/status.c:613
+#, c-format
+msgid "%s (%s) changed status from %s to %s"
+msgstr "%s (%s) megváltoztatta az állapotát (%s -> %s)"
+
+#: ../libpurple/status.c:624
 #, c-format
 msgid "%s is now %s"
 msgstr "%s ezentúl %s"
 
-#: ../libpurple/status.c:624
+#: ../libpurple/status.c:626
+#, c-format
+msgid "%s (%s) is now %s"
+msgstr "%s (%s) ezentúl %s"
+
+#: ../libpurple/status.c:632
 #, c-format
 msgid "%s is no longer %s"
 msgstr "%s már nem %s"
 
-#: ../libpurple/status.c:1234
+#: ../libpurple/status.c:634
+#, c-format
+msgid "%s (%s) is no longer %s"
+msgstr "%s (%s) már nem %s"
+
+#: ../libpurple/status.c:1247
 #, c-format
 msgid "%s became idle"
 msgstr "%s inaktív lett"
 
-#: ../libpurple/status.c:1251
+#: ../libpurple/status.c:1264
 #, c-format
 msgid "%s became unidle"
 msgstr "%s már nem inaktív"
 
-#: ../libpurple/status.c:1314
+#: ../libpurple/status.c:1327
 #, c-format
 msgid "+++ %s became idle"
 msgstr "+++ %s inaktív lett"
 
-#: ../libpurple/status.c:1316
+#: ../libpurple/status.c:1329
 #, c-format
 msgid "+++ %s became unidle"
 msgstr "+++ %s már nem inaktív"
 
-#: ../libpurple/util.c:718
+#: ../libpurple/util.c:721
 #, c-format
 msgid "%x %X"
 msgstr "%x %X"
 
-#: ../libpurple/util.c:2722
+#: ../libpurple/util.c:2783
 #, c-format
 msgid "Error Reading %s"
 msgstr "Hiba %s olvasásakor"
 
-#: ../libpurple/util.c:2723
+#: ../libpurple/util.c:2784
 #, c-format
 msgid ""
 "An error was encountered reading your %s.  They have not been loaded, and "
@@ -13464,67 +13737,67 @@
 "Hiba lépett fel a(z) %s feldolgozása közben. Ezek nem lettek betöltve, a "
 "régi fájl %s~ néven lett elmentve."
 
-#: ../libpurple/util.c:3223
+#: ../libpurple/util.c:3281
 msgid "Calculating..."
 msgstr "Számítás..."
 
-#: ../libpurple/util.c:3226
+#: ../libpurple/util.c:3284
 msgid "Unknown."
 msgstr "Ismeretlen."
 
-#: ../libpurple/util.c:3252
+#: ../libpurple/util.c:3310
 #, c-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d másodperc"
 msgstr[1] "%d másodperc"
 
-#: ../libpurple/util.c:3264
+#: ../libpurple/util.c:3322
 #, c-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d nap"
 msgstr[1] "%d nap"
 
-#: ../libpurple/util.c:3272
+#: ../libpurple/util.c:3330
 #, c-format
 msgid "%s, %d hour"
 msgid_plural "%s, %d hours"
 msgstr[0] "%s, %d óra"
 msgstr[1] "%s, %d óra"
 
-#: ../libpurple/util.c:3278
+#: ../libpurple/util.c:3336
 #, c-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d óra"
 msgstr[1] "%d óra"
 
-#: ../libpurple/util.c:3286
+#: ../libpurple/util.c:3344
 #, c-format
 msgid "%s, %d minute"
 msgid_plural "%s, %d minutes"
 msgstr[0] "%s, %d perc"
 msgstr[1] "%s, %d perc"
 
-#: ../libpurple/util.c:3292
+#: ../libpurple/util.c:3350
 #, c-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d perc"
 msgstr[1] "%d perc"
 
-#: ../libpurple/util.c:3552
+#: ../libpurple/util.c:3610
 #, c-format
 msgid "Could not open %s: Redirected too many times"
 msgstr "%s nem nyitható meg: túl sok átirányítás"
 
-#: ../libpurple/util.c:3589 ../libpurple/util.c:3885
+#: ../libpurple/util.c:3647 ../libpurple/util.c:3943
 #, c-format
 msgid "Unable to connect to %s"
 msgstr "Nem lehet csatlakozni a következőhöz: %s"
 
-#: ../libpurple/util.c:3712
+#: ../libpurple/util.c:3770
 #, c-format
 msgid ""
 "Unable to allocate enough memory to hold the contents from %s.  The web "
@@ -13533,17 +13806,17 @@
 "Nem lehet elég memóriát lefoglalni a(z) %s tartalmának tárolásához. "
 "Lehetséges, hogy a webkiszolgáló valami ártalmassal próbálkozik."
 
-#: ../libpurple/util.c:3747
+#: ../libpurple/util.c:3805
 #, c-format
 msgid "Error reading from %s: %s"
 msgstr "Hiba %s olvasása közben: %s"
 
-#: ../libpurple/util.c:3778
+#: ../libpurple/util.c:3836
 #, c-format
 msgid "Error writing to %s: %s"
 msgstr "Hiba %s írása közben: %s"
 
-#: ../libpurple/util.c:3803
+#: ../libpurple/util.c:3861
 #, c-format
 msgid "Unable to connect to %s: %s"
 msgstr "Nem lehet a következőhöz kapcsolódni: %s: %s"
@@ -13560,80 +13833,80 @@
 msgid "Send instant messages over multiple protocols"
 msgstr "Azonnali üzenetek küldése több protokoll használatával"
 
-#: ../pidgin/eggtrayicon.c:129
+#: ../pidgin/eggtrayicon.c:128
 msgid "Orientation"
 msgstr "Tájolás"
 
-#: ../pidgin/eggtrayicon.c:130
+#: ../pidgin/eggtrayicon.c:129
 msgid "The orientation of the tray."
 msgstr "A tálca tájolása."
 
 #. Build the login options frame.
-#: ../pidgin/gtkaccount.c:407
+#: ../pidgin/gtkaccount.c:410
 msgid "Login Options"
 msgstr "Bejelentkezés beállításai"
 
-#: ../pidgin/gtkaccount.c:428
+#: ../pidgin/gtkaccount.c:431
 msgid "Pro_tocol:"
 msgstr "_Protokoll:"
 
-#: ../pidgin/gtkaccount.c:439
+#: ../pidgin/gtkaccount.c:442
 msgid "Screen _name:"
 msgstr "_Felhasználónév:"
 
-#: ../pidgin/gtkaccount.c:529
+#: ../pidgin/gtkaccount.c:532
 msgid "_Local alias:"
 msgstr "_Helyi álnév:"
 
-#: ../pidgin/gtkaccount.c:533
+#: ../pidgin/gtkaccount.c:536
 msgid "Remember pass_word"
 msgstr "E_mlékezzen a jelszóra"
 
 #. Build the user options frame.
-#: ../pidgin/gtkaccount.c:591
+#: ../pidgin/gtkaccount.c:594
 msgid "User Options"
 msgstr "Felhasználói beállítások"
 
-#: ../pidgin/gtkaccount.c:604
+#: ../pidgin/gtkaccount.c:607
 msgid "New _mail notifications"
 msgstr "Értesítések új le_vélre"
 
 #. Buddy icon
-#: ../pidgin/gtkaccount.c:609
+#: ../pidgin/gtkaccount.c:612
 msgid "Use this buddy _icon for this account:"
 msgstr "Ezen _partnerikon használata a fiókhoz:"
 
 #. Build the protocol options frame.
-#: ../pidgin/gtkaccount.c:731
+#: ../pidgin/gtkaccount.c:734
 #, c-format
 msgid "%s Options"
 msgstr "%s beállításai"
 
-#: ../pidgin/gtkaccount.c:936
+#: ../pidgin/gtkaccount.c:939
 msgid "Use GNOME Proxy Settings"
 msgstr "GNOME proxybeállítások használata"
 
-#: ../pidgin/gtkaccount.c:937
+#: ../pidgin/gtkaccount.c:940
 msgid "Use Global Proxy Settings"
 msgstr "Globális proxybeállítások használata"
 
-#: ../pidgin/gtkaccount.c:943
+#: ../pidgin/gtkaccount.c:946
 msgid "No Proxy"
 msgstr "Nincs Proxy"
 
-#: ../pidgin/gtkaccount.c:949
+#: ../pidgin/gtkaccount.c:952
 msgid "HTTP"
 msgstr "HTTP"
 
-#: ../pidgin/gtkaccount.c:955
+#: ../pidgin/gtkaccount.c:958
 msgid "SOCKS 4"
 msgstr "SOCKS 4"
 
-#: ../pidgin/gtkaccount.c:961
+#: ../pidgin/gtkaccount.c:964
 msgid "SOCKS 5"
 msgstr "SOCKS 5"
 
-#: ../pidgin/gtkaccount.c:967 ../pidgin/gtkprefs.c:1211
+#: ../pidgin/gtkaccount.c:970 ../pidgin/gtkprefs.c:1283
 msgid "Use Environmental Settings"
 msgstr "Környezeti beállítások használata"
 
@@ -13642,73 +13915,73 @@
 #. A) your network is really slow and you have nothing better to do than
 #. look at butterflies.
 #. B)You are looking really closely at something that shouldn't matter.
-#: ../pidgin/gtkaccount.c:1006
+#: ../pidgin/gtkaccount.c:1009
 msgid "If you look real closely"
 msgstr "ha igazán közelről nézi"
 
 #. This is an easter egg. See the comment on the previous line in the source.
-#: ../pidgin/gtkaccount.c:1009
+#: ../pidgin/gtkaccount.c:1012
 msgid "you can see the butterflies mating"
 msgstr "láthatja a pillangók nászát"
 
-#: ../pidgin/gtkaccount.c:1030
+#: ../pidgin/gtkaccount.c:1033
 msgid "Proxy Options"
 msgstr "Proxy beállításai"
 
-#: ../pidgin/gtkaccount.c:1044 ../pidgin/gtkprefs.c:1205
+#: ../pidgin/gtkaccount.c:1047 ../pidgin/gtkprefs.c:1277
 msgid "Proxy _type:"
 msgstr "Proxy _típusa:"
 
-#: ../pidgin/gtkaccount.c:1053 ../pidgin/gtkprefs.c:1226
+#: ../pidgin/gtkaccount.c:1056 ../pidgin/gtkprefs.c:1298
 msgid "_Host:"
 msgstr "_Gépnév:"
 
-#: ../pidgin/gtkaccount.c:1057 ../pidgin/gtkprefs.c:1244
+#: ../pidgin/gtkaccount.c:1060 ../pidgin/gtkprefs.c:1316
 msgid "_Port:"
 msgstr "_Port:"
 
-#: ../pidgin/gtkaccount.c:1065
+#: ../pidgin/gtkaccount.c:1068
 msgid "_Username:"
 msgstr "_Felhasználó:"
 
-#: ../pidgin/gtkaccount.c:1072 ../pidgin/gtkprefs.c:1281
+#: ../pidgin/gtkaccount.c:1075 ../pidgin/gtkprefs.c:1353
 msgid "Pa_ssword:"
 msgstr "Jel_szó:"
 
-#: ../pidgin/gtkaccount.c:1195
+#: ../pidgin/gtkaccount.c:1199
 msgid "Unable to save new account"
 msgstr "Nem menthető az új fiók"
 
-#: ../pidgin/gtkaccount.c:1196
+#: ../pidgin/gtkaccount.c:1200
 msgid "An account already exists with the specified criteria."
 msgstr "Már létezik fiók a megadott feltételekkel."
 
-#: ../pidgin/gtkaccount.c:1473
+#: ../pidgin/gtkaccount.c:1478
 msgid "Add Account"
 msgstr "Fiók hozzáadása"
 
-#: ../pidgin/gtkaccount.c:1492
+#: ../pidgin/gtkaccount.c:1497
 msgid "_Basic"
 msgstr "_Alap"
 
-#: ../pidgin/gtkaccount.c:1499
+#: ../pidgin/gtkaccount.c:1504
 msgid "Create this new account on the server"
 msgstr "Ezen új fiók létrehozása a kiszolgálón"
 
-#: ../pidgin/gtkaccount.c:1515
+#: ../pidgin/gtkaccount.c:1520
 msgid "_Advanced"
 msgstr "_Haladó"
 
-#: ../pidgin/gtkaccount.c:1973 ../pidgin/gtkplugin.c:569
+#: ../pidgin/gtkaccount.c:1978 ../pidgin/gtkplugin.c:595
 msgid "Enabled"
 msgstr "Engedélyezve"
 
-#: ../pidgin/gtkaccount.c:2001
+#: ../pidgin/gtkaccount.c:2006
 msgid "Protocol"
 msgstr "Protokoll"
 
 # fixme: üdvözli a %s az {pidgin | finch} lehet, nemde?
-#: ../pidgin/gtkaccount.c:2201
+#: ../pidgin/gtkaccount.c:2207
 #, c-format
 msgid ""
 "<span size='larger' weight='bold'>Welcome to %s!</span>\n"
@@ -13732,246 +14005,272 @@
 "segítségével visszatérhet ehhez az ablakhoz fiókok hozzáadásához, "
 "szerkesztéséhez vagy eltávolításához."
 
-#: ../pidgin/gtkblist.c:767
-msgid "Join a Chat"
-msgstr "Csatlakozás egy csevegéshez"
-
-#: ../pidgin/gtkblist.c:788
+#: ../pidgin/gtkblist.c:527
+#, c-format
+msgid "You have %d contact named %s. Would you like to merge them?"
+msgid_plural "You currently have %d contacts named %s. Would you like to merge them?"
+msgstr[0] "Jelenleg %d %s nevű partnere van. Össze kívánja vonni ezeket?"
+msgstr[1] "Jelenleg %d %s nevű partnere van. Össze kívánja vonni ezeket?"
+
+#: ../pidgin/gtkblist.c:528
+msgid ""
+"Merging these contacts will cause them to share a single entry on the buddy "
+"list and use a single conversation window. You can separate them again by "
+"choosing 'Expand' from the contact's context menu"
+msgstr "Ezen partnerek összevonásuk után a partnerlistán egyetlen bejegyzést és egy csevegőablakot fognak használni. A partnerlista felbukkanó menüjének \"Kibontás\" pontjával újra szétválaszthatja őket."
+
+#: ../pidgin/gtkblist.c:530
+msgid "_Merge"
+msgstr "Össz_evonás"
+
+#: ../pidgin/gtkblist.c:945
 msgid ""
 "Please enter the appropriate information about the chat you would like to "
 "join.\n"
 msgstr ""
-"Kérem adja meg a megfelelő információt arról a csevegésről, amelyhez "
-"csatlakozni kíván.\n"
-
-#. Set up stuff for the account box
-#: ../pidgin/gtkblist.c:799 ../pidgin/gtkblist.c:5530
-#: ../pidgin/gtkblist.c:5893 ../pidgin/gtkpounce.c:539
-#: ../pidgin/gtkroomlist.c:396
+"Adja meg a megfelelő információt arról a csevegésről, amelyhez csatlakozni "
+"kíván.\n"
+
+#: ../pidgin/gtkblist.c:956 ../pidgin/gtkblist.c:6267
+#: ../pidgin/gtkpounce.c:554 ../pidgin/gtkroomlist.c:396
 msgid "_Account:"
 msgstr "F_iók:"
 
-#: ../pidgin/gtkblist.c:1088 ../pidgin/gtkprivacy.c:603
-#: ../pidgin/gtkprivacy.c:617
+#: ../pidgin/gtkblist.c:1245 ../pidgin/gtkprivacy.c:605
+#: ../pidgin/gtkprivacy.c:619
 msgid "_Block"
 msgstr "_Tiltás"
 
-#: ../pidgin/gtkblist.c:1088
+#: ../pidgin/gtkblist.c:1245
 msgid "Un_block"
 msgstr "_Tiltás feloldása"
 
-#: ../pidgin/gtkblist.c:1139
+#: ../pidgin/gtkblist.c:1288
+msgid "Move to"
+msgstr "Áthelyezés"
+
+#: ../pidgin/gtkblist.c:1328
 msgid "Get _Info"
 msgstr "_Info"
 
-#: ../pidgin/gtkblist.c:1142 ../pidgin/pidginstock.c:90
+#: ../pidgin/gtkblist.c:1331 ../pidgin/pidginstock.c:90
 msgid "I_M"
 msgstr "Ü_zenet"
 
-#: ../pidgin/gtkblist.c:1148
-#, fuzzy
-msgid "_Send File"
-msgstr "Fájl küldése"
-
-#: ../pidgin/gtkblist.c:1155
-msgid "Add Buddy _Pounce"
-msgstr "_Partnerfigyelmeztetés felvétele"
-
-#: ../pidgin/gtkblist.c:1160 ../pidgin/gtkblist.c:1164
-#: ../pidgin/gtkblist.c:1269 ../pidgin/gtkblist.c:1292
+#: ../pidgin/gtkblist.c:1337
+msgid "_Send File..."
+msgstr "_Fájl küldése..."
+
+#: ../pidgin/gtkblist.c:1344
+msgid "Add Buddy _Pounce..."
+msgstr "_Partnerfigyelmeztetés felvétele..."
+
+#: ../pidgin/gtkblist.c:1349 ../pidgin/gtkblist.c:1353
+#: ../pidgin/gtkblist.c:1468 ../pidgin/gtkblist.c:1491
 msgid "View _Log"
 msgstr "Nap_ló megtekintése"
 
-#: ../pidgin/gtkblist.c:1177 ../pidgin/gtkblist.c:1186
-#: ../pidgin/gtkblist.c:1277 ../pidgin/gtkblist.c:1298
+#: ../pidgin/gtkblist.c:1359
+msgid "Hide when offline"
+msgstr "Elrejtés, ha nem érhető el"
+
+#: ../pidgin/gtkblist.c:1359
+msgid "Show when offline"
+msgstr "Megjelenítés, ha elérhető"
+
+#: ../pidgin/gtkblist.c:1373 ../pidgin/gtkblist.c:1382
+#: ../pidgin/gtkblist.c:1476 ../pidgin/gtkblist.c:1497
 msgid "_Alias..."
 msgstr "Ál_név..."
 
-#: ../pidgin/gtkblist.c:1180 ../pidgin/gtkblist.c:1188
-#: ../pidgin/gtkblist.c:1279 ../pidgin/gtkblist.c:1300
+#: ../pidgin/gtkblist.c:1376 ../pidgin/gtkblist.c:1384
+#: ../pidgin/gtkblist.c:1478 ../pidgin/gtkblist.c:1499
 msgid "_Remove"
 msgstr "_Eltávolítás"
 
-#: ../pidgin/gtkblist.c:1238
-msgid "Add a _Buddy"
-msgstr "P_artner felvétele"
-
-#: ../pidgin/gtkblist.c:1241
-msgid "Add a C_hat"
-msgstr "_Csevegés felvétele"
-
-#: ../pidgin/gtkblist.c:1244
+#: ../pidgin/gtkblist.c:1434
+msgid "Add _Buddy..."
+msgstr "P_artner felvétele..."
+
+#: ../pidgin/gtkblist.c:1437
+msgid "Add C_hat..."
+msgstr "Cse_vegés felvétele..."
+
+#: ../pidgin/gtkblist.c:1440
 msgid "_Delete Group"
 msgstr "_Csoport törlése"
 
-#: ../pidgin/gtkblist.c:1246
+#: ../pidgin/gtkblist.c:1442
 msgid "_Rename"
 msgstr "Á_tnevezés"
 
 #. join button
-#: ../pidgin/gtkblist.c:1265 ../pidgin/gtkroomlist.c:307
+#: ../pidgin/gtkblist.c:1462 ../pidgin/gtkroomlist.c:307
 #: ../pidgin/gtkroomlist.c:460 ../pidgin/pidginstock.c:88
 msgid "_Join"
 msgstr "_Csatlakozás"
 
-#: ../pidgin/gtkblist.c:1267
+#: ../pidgin/gtkblist.c:1464
 msgid "Auto-Join"
 msgstr "Automatikus csatlakozás"
 
-#: ../pidgin/gtkblist.c:1305 ../pidgin/gtkblist.c:1329
+#: ../pidgin/gtkblist.c:1466
+msgid "Persistent"
+msgstr "Állandó"
+
+#: ../pidgin/gtkblist.c:1504 ../pidgin/gtkblist.c:1527
 msgid "_Collapse"
 msgstr "Összecs_ukás"
 
-#: ../pidgin/gtkblist.c:1334
+#: ../pidgin/gtkblist.c:1532
 msgid "_Expand"
 msgstr "_Kibontás"
 
-#: ../pidgin/gtkblist.c:1585 ../pidgin/gtkblist.c:1597
-#: ../pidgin/gtkblist.c:4603 ../pidgin/gtkblist.c:4616
+#: ../pidgin/gtkblist.c:1783 ../pidgin/gtkblist.c:1795
+#: ../pidgin/gtkblist.c:4950 ../pidgin/gtkblist.c:4963
 msgid "/Tools/Mute Sounds"
 msgstr "/Eszközök/Hangok némítása"
 
-#: ../pidgin/gtkblist.c:2057 ../pidgin/gtkconv.c:4840
-#: ../pidgin/gtkpounce.c:430
-msgid ""
-"You are not currently signed on with an account that can add that buddy."
+#: ../pidgin/gtkblist.c:2255 ../pidgin/gtkconv.c:4922
+#: ../pidgin/gtkpounce.c:437
+msgid "You are not currently signed on with an account that can add that buddy."
 msgstr ""
 "Jelenleg nincs bejelentkezve olyan hálózatra, amelyen felvehetné ezt a "
 "partnert."
 
 #. Buddies menu
-#: ../pidgin/gtkblist.c:2869
+#: ../pidgin/gtkblist.c:3087
 msgid "/_Buddies"
 msgstr "/_Partnerek"
 
-#: ../pidgin/gtkblist.c:2870
+#: ../pidgin/gtkblist.c:3088
 msgid "/Buddies/New Instant _Message..."
 msgstr "/Partnerek/Új azonnal_i üzenet..."
 
-#: ../pidgin/gtkblist.c:2871
+#: ../pidgin/gtkblist.c:3089
 msgid "/Buddies/Join a _Chat..."
 msgstr "/Partnerek/_Csatlakozás csevegéshez..."
 
-#: ../pidgin/gtkblist.c:2872
+#: ../pidgin/gtkblist.c:3090
 msgid "/Buddies/Get User _Info..."
 msgstr "/Partnerek/_Felhasználó adatainak lekérése..."
 
-#: ../pidgin/gtkblist.c:2873
+#: ../pidgin/gtkblist.c:3091
 msgid "/Buddies/View User _Log..."
 msgstr "/Partnerek/Felhasználó _naplójának lekérése..."
 
-#: ../pidgin/gtkblist.c:2875
-msgid "/Buddies/Show"
-msgstr "/Partnerek/Megjelenítés"
-
-#: ../pidgin/gtkblist.c:2876
+#: ../pidgin/gtkblist.c:3093
+msgid "/Buddies/Sh_ow"
+msgstr "/Partnerek/Me_gjelenítés"
+
+#: ../pidgin/gtkblist.c:3094
 msgid "/Buddies/Show/_Offline Buddies"
 msgstr "/Partnerek/Megjelenítés/Ki_lépett partnerek"
 
-#: ../pidgin/gtkblist.c:2877
+#: ../pidgin/gtkblist.c:3095
 msgid "/Buddies/Show/_Empty Groups"
 msgstr "/Partnerek/Megjelenítés/Ür_es csoportok"
 
-#: ../pidgin/gtkblist.c:2878
+#: ../pidgin/gtkblist.c:3096
 msgid "/Buddies/Show/Buddy _Details"
 msgstr "/Partnerek/Megjelenítés/_Partner részletei"
 
-#: ../pidgin/gtkblist.c:2879
+#: ../pidgin/gtkblist.c:3097
 msgid "/Buddies/Show/Idle _Times"
 msgstr "/Partnerek/Megjelenítés/Inaktív i_dők"
 
-#: ../pidgin/gtkblist.c:2880
+#: ../pidgin/gtkblist.c:3098
 msgid "/Buddies/Show/_Protocol Icons"
 msgstr "/Partnerek/Megjelenítés/Protokolli_konok"
 
-#: ../pidgin/gtkblist.c:2881
+#: ../pidgin/gtkblist.c:3099
 msgid "/Buddies/_Sort Buddies"
 msgstr "/Partnerek/Part_nerek rendezése"
 
-#: ../pidgin/gtkblist.c:2883
+#: ../pidgin/gtkblist.c:3101
 msgid "/Buddies/_Add Buddy..."
 msgstr "/Partnerek/_Partner felvétele..."
 
-#: ../pidgin/gtkblist.c:2884
+#: ../pidgin/gtkblist.c:3102
 msgid "/Buddies/Add C_hat..."
 msgstr "/Partnerek/Cse_vegés felvétele..."
 
-#: ../pidgin/gtkblist.c:2885
+#: ../pidgin/gtkblist.c:3103
 msgid "/Buddies/Add _Group..."
 msgstr "/Partnerek/C_soport felvétele..."
 
-#: ../pidgin/gtkblist.c:2887
+#: ../pidgin/gtkblist.c:3105
 msgid "/Buddies/_Quit"
 msgstr "/Partnerek/_Kilépés"
 
 #. Accounts menu
-#: ../pidgin/gtkblist.c:2890
+#: ../pidgin/gtkblist.c:3108
 msgid "/_Accounts"
 msgstr "/_Fiókok"
 
-#: ../pidgin/gtkblist.c:2891 ../pidgin/gtkblist.c:6589
-msgid "/Accounts/Add\\/Edit"
-msgstr "/Fiókok/Hozzáadás\\/Szerkesztés"
+#: ../pidgin/gtkblist.c:3109 ../pidgin/gtkblist.c:6969
+msgid "/Accounts/Manage"
+msgstr "/Fiókok/Kezelés"
 
 #. Tools
-#: ../pidgin/gtkblist.c:2894
+#: ../pidgin/gtkblist.c:3112
 msgid "/_Tools"
 msgstr "/_Eszközök"
 
-#: ../pidgin/gtkblist.c:2895
+#: ../pidgin/gtkblist.c:3113
 msgid "/Tools/Buddy _Pounces"
 msgstr "/Eszközök/_Partnerfigyelmeztetések"
 
-#: ../pidgin/gtkblist.c:2896
+#: ../pidgin/gtkblist.c:3114
 msgid "/Tools/_Certificates"
 msgstr "/Eszközök/_Tanúsítványok"
 
-#: ../pidgin/gtkblist.c:2897
+#: ../pidgin/gtkblist.c:3115
 msgid "/Tools/Plu_gins"
 msgstr "/Eszközök/Bő_vítmények"
 
-#: ../pidgin/gtkblist.c:2898
+#: ../pidgin/gtkblist.c:3116
 msgid "/Tools/Pr_eferences"
 msgstr "/Eszközök/_Beállítások"
 
-#: ../pidgin/gtkblist.c:2899
+#: ../pidgin/gtkblist.c:3117
 msgid "/Tools/Pr_ivacy"
 msgstr "/Eszközök/Ma_gánszféra"
 
-#: ../pidgin/gtkblist.c:2901
+#: ../pidgin/gtkblist.c:3119
 msgid "/Tools/_File Transfers"
 msgstr "/Eszközök/_Fájlátvitelek"
 
-#: ../pidgin/gtkblist.c:2902
+#: ../pidgin/gtkblist.c:3120
 msgid "/Tools/R_oom List"
 msgstr "/Eszközök/_Szobalista"
 
-#: ../pidgin/gtkblist.c:2903
+#: ../pidgin/gtkblist.c:3121
 msgid "/Tools/System _Log"
 msgstr "/Eszközök/_Rendszernapló"
 
-#: ../pidgin/gtkblist.c:2905
+#: ../pidgin/gtkblist.c:3123
 msgid "/Tools/Mute _Sounds"
 msgstr "/Eszközök/_Hangok némítása"
 
 #. Help
-#: ../pidgin/gtkblist.c:2907
+#: ../pidgin/gtkblist.c:3125
 msgid "/_Help"
 msgstr "/_Súgó"
 
-#: ../pidgin/gtkblist.c:2908
+#: ../pidgin/gtkblist.c:3126
 msgid "/Help/Online _Help"
 msgstr "/Súgó/Online _súgó"
 
-#: ../pidgin/gtkblist.c:2909
+#: ../pidgin/gtkblist.c:3127
 msgid "/Help/_Debug Window"
 msgstr "/Súgó/_Hibakereső ablak"
 
-#: ../pidgin/gtkblist.c:2911 ../pidgin/gtkblist.c:2913
+#: ../pidgin/gtkblist.c:3129 ../pidgin/gtkblist.c:3131
 msgid "/Help/_About"
 msgstr "/Súgó/_Névjegy"
 
-#: ../pidgin/gtkblist.c:2942
+#: ../pidgin/gtkblist.c:3160
 #, c-format
 msgid ""
 "\n"
@@ -13980,167 +14279,161 @@
 "\n"
 "<b>Fiók:</b> %s"
 
-#: ../pidgin/gtkblist.c:3020
+#: ../pidgin/gtkblist.c:3238
 msgid "Buddy Alias"
 msgstr "Partnerálnév"
 
-#: ../pidgin/gtkblist.c:3049
+#: ../pidgin/gtkblist.c:3267
 msgid "Logged In"
 msgstr "Bejelentkezve"
 
-#: ../pidgin/gtkblist.c:3095
+#: ../pidgin/gtkblist.c:3313
 msgid "Last Seen"
 msgstr "Utoljára látszott"
 
-#: ../pidgin/gtkblist.c:3116
+#: ../pidgin/gtkblist.c:3334
 msgid "Spooky"
 msgstr "Idegroncs"
 
-#: ../pidgin/gtkblist.c:3118
+#: ../pidgin/gtkblist.c:3336
 msgid "Awesome"
 msgstr "Szuper"
 
-#: ../pidgin/gtkblist.c:3120
+#: ../pidgin/gtkblist.c:3338
 msgid "Rockin'"
 msgstr "Király"
 
-#: ../pidgin/gtkblist.c:3453
+#: ../pidgin/gtkblist.c:3677
 #, c-format
 msgid "Idle %dd %dh %02dm"
 msgstr "Inaktív (%d n %d ó %02d p)"
 
-#: ../pidgin/gtkblist.c:3455
+#: ../pidgin/gtkblist.c:3679
 #, c-format
 msgid "Idle %dh %02dm"
 msgstr "Inaktív (%d ó %02d p)"
 
-#: ../pidgin/gtkblist.c:3457
+#: ../pidgin/gtkblist.c:3681
 #, c-format
 msgid "Idle %dm"
 msgstr "Inaktív (%d p)"
 
-#: ../pidgin/gtkblist.c:3602
+#: ../pidgin/gtkblist.c:3835
 msgid "/Buddies/New Instant Message..."
 msgstr "/Partnerek/Új azonnali üzenet..."
 
-#: ../pidgin/gtkblist.c:3603 ../pidgin/gtkblist.c:3636
+#: ../pidgin/gtkblist.c:3836 ../pidgin/gtkblist.c:3869
 msgid "/Buddies/Join a Chat..."
 msgstr "/Partnerek/Csatlakozás csevegéshez..."
 
-#: ../pidgin/gtkblist.c:3604
+#: ../pidgin/gtkblist.c:3837
 msgid "/Buddies/Get User Info..."
 msgstr "/Partnerek/Felhasználó adatainak lekérése..."
 
-#: ../pidgin/gtkblist.c:3605
+#: ../pidgin/gtkblist.c:3838
 msgid "/Buddies/Add Buddy..."
 msgstr "/Partnerek/Partner felvétele..."
 
-#: ../pidgin/gtkblist.c:3606 ../pidgin/gtkblist.c:3639
+#: ../pidgin/gtkblist.c:3839 ../pidgin/gtkblist.c:3872
 msgid "/Buddies/Add Chat..."
 msgstr "/Partnerek/Csevegés felvétele..."
 
-#: ../pidgin/gtkblist.c:3607
+#: ../pidgin/gtkblist.c:3840
 msgid "/Buddies/Add Group..."
 msgstr "/Partnerek/Csoport felvétele..."
 
-#: ../pidgin/gtkblist.c:3642
+#: ../pidgin/gtkblist.c:3875
 msgid "/Tools/Privacy"
 msgstr "/Eszközök/Magánszféra"
 
-#: ../pidgin/gtkblist.c:3645
+#: ../pidgin/gtkblist.c:3878
 msgid "/Tools/Room List"
 msgstr "/Eszközök/Szobalista"
 
-#: ../pidgin/gtkblist.c:3742 ../pidgin/gtkdocklet.c:153
+#: ../pidgin/gtkblist.c:4010 ../pidgin/gtkdocklet.c:155
+#: ../pidgin/gtkdocklet.c:160
 #, c-format
 msgid "%d unread message from %s\n"
 msgid_plural "%d unread messages from %s\n"
 msgstr[0] "%d olvasatlan üzenet %s partnertől\n"
 msgstr[1] "%d olvasatlan üzenet %s partnertől\n"
 
-#: ../pidgin/gtkblist.c:3822
+#: ../pidgin/gtkblist.c:4170
 msgid "Manually"
 msgstr "Kézi"
 
-#: ../pidgin/gtkblist.c:3824
-msgid "Alphabetically"
-msgstr "ABC sorrend"
-
-#: ../pidgin/gtkblist.c:3825
+#: ../pidgin/gtkblist.c:4173
 msgid "By status"
 msgstr "Állapot szerint"
 
-#: ../pidgin/gtkblist.c:3826
+#: ../pidgin/gtkblist.c:4174
 msgid "By log size"
 msgstr "Napló mérete szerint"
 
-#: ../pidgin/gtkblist.c:4031 ../pidgin/gtkconn.c:179
+#: ../pidgin/gtkblist.c:4379 ../pidgin/gtkconn.c:180
 #, c-format
 msgid "%s disconnected"
 msgstr "%s bontotta a kapcsolatot"
 
-#: ../pidgin/gtkblist.c:4067
+#: ../pidgin/gtkblist.c:4414
 #, c-format
 msgid "<span color=\"red\">%s disconnected: %s</span>"
 msgstr "<span color=\"red\">%s bontotta a kapcsolatot: %s</span>"
 
-#: ../pidgin/gtkblist.c:4219
+#: ../pidgin/gtkblist.c:4566
 msgid "<b>Username:</b>"
 msgstr "<b>Felhasználónév:</b>"
 
-#: ../pidgin/gtkblist.c:4226
+#: ../pidgin/gtkblist.c:4573
 msgid "<b>Password:</b>"
 msgstr "<b>Jelszó:</b>"
 
-#: ../pidgin/gtkblist.c:4237
+#: ../pidgin/gtkblist.c:4584
 msgid "_Login"
 msgstr "_Bejelentkezés"
 
-#: ../pidgin/gtkblist.c:4320
+#: ../pidgin/gtkblist.c:4667
 msgid "/Accounts"
 msgstr "/Fiókok"
 
 #. Translators: Please maintain the use of -> and <- to refer to menu heirarchy
-#: ../pidgin/gtkblist.c:4334
-#, fuzzy, c-format
+#: ../pidgin/gtkblist.c:4681
+#, c-format
 msgid ""
 "<span weight='bold' size='larger'>Welcome to %s!</span>\n"
 "\n"
 "You have no accounts enabled. Enable your IM accounts from the <b>Accounts</"
-"b> window at <b>Accounts->Add/Edit</b>. Once you enable accounts, you'll be "
+"b> window at <b>Accounts->Manage</b>. Once you enable accounts, you'll be "
 "able to sign on, set your status, and talk to your friends."
 msgstr ""
-"<span size='larger' weight='bold'>Üdvözli a %s!</span>\n"
-"\n"
-"Nincsenek engedélyezve fiókjai. A <b>Fiókok</b> ablak <b>Fiókok -> Hozzáadás/"
-"Szerkesztés</b> menüpontja segítségével engedélyezze azonnali üzenő "
-"fiókjait. A fiókok engedélyezése után bejelentkezhet, beállíthatja állapotát "
-"és cseveghet barátaival."
+"<span weight='bold' size='larger'></span>Üdvözli a %s!</span>\n"
+"\n"
+"Nincsenek engedélyezve fiókjai. A <b>Fiókok</b> ablak <b>Fiókok -> Kezelés</b> menüpontja segítségével engedélyezze azonnali üzenő fiókjait. A fiókok engedélyezése után bejelentkezhet, beállíthatja állapotát és cseveghet barátaival."
 
 #. set the Show Offline Buddies option. must be done
 #. * after the treeview or faceprint gets mad. -Robot101
 #.
-#: ../pidgin/gtkblist.c:4597
+#: ../pidgin/gtkblist.c:4944
 msgid "/Buddies/Show/Offline Buddies"
 msgstr "/Partnerek/Megjelenítés/Kilépett partnerek"
 
-#: ../pidgin/gtkblist.c:4600
+#: ../pidgin/gtkblist.c:4947
 msgid "/Buddies/Show/Empty Groups"
 msgstr "/Partnerek/Megjelenítés/Üres csoportok"
 
-#: ../pidgin/gtkblist.c:4606
+#: ../pidgin/gtkblist.c:4953
 msgid "/Buddies/Show/Buddy Details"
 msgstr "/Partnerek/Megjelenítés/Partner részletei"
 
-#: ../pidgin/gtkblist.c:4609
+#: ../pidgin/gtkblist.c:4956
 msgid "/Buddies/Show/Idle Times"
 msgstr "/Partnerek/Megjelenítés/Inaktív idők"
 
-#: ../pidgin/gtkblist.c:4612
+#: ../pidgin/gtkblist.c:4959
 msgid "/Buddies/Show/Protocol Icons"
 msgstr "/Partnerek/Megjelenítés/Protokollikonok"
 
-#: ../pidgin/gtkblist.c:5507
+#: ../pidgin/gtkblist.c:5873
 msgid ""
 "Please enter the screen name of the person you would like to add to your "
 "buddy list. You may optionally enter an alias, or nickname,  for the buddy. "
@@ -14150,20 +14443,25 @@
 "egy álnevet vagy becenevet a partnerhez. Az álnév a felhasználónév helyett "
 "kerül megjelenítésre, amennyiben az lehetséges.\n"
 
+#. Set up stuff for the account box
+#: ../pidgin/gtkblist.c:5896
+msgid "A_ccount:"
+msgstr "_Fiók:"
+
 #. End of account box
-#: ../pidgin/gtkblist.c:5542
+#: ../pidgin/gtkblist.c:5908
 msgid "_Screen name:"
 msgstr "_Felhasználónév:"
 
-#: ../pidgin/gtkblist.c:5564 ../pidgin/gtkblist.c:5914
+#: ../pidgin/gtkblist.c:5930 ../pidgin/gtkblist.c:6288
 msgid "A_lias:"
 msgstr "Ál_név:"
 
-#: ../pidgin/gtkblist.c:5826
+#: ../pidgin/gtkblist.c:6198
 msgid "This protocol does not support chat rooms."
 msgstr "Ez a protokoll nem támogatja a csevegőszobákat."
 
-#: ../pidgin/gtkblist.c:5842
+#: ../pidgin/gtkblist.c:6214
 msgid ""
 "You are not currently signed on with any protocols that have the ability to "
 "chat."
@@ -14171,7 +14469,7 @@
 "Jelenleg nincs bejelentkezve olyan protokollal, ami csevegésre alkalmas "
 "lenne."
 
-#: ../pidgin/gtkblist.c:5883
+#: ../pidgin/gtkblist.c:6257
 msgid ""
 "Please enter an alias, and the appropriate information about the chat you "
 "would like to add to your buddy list.\n"
@@ -14179,49 +14477,56 @@
 "Adjon meg egy álnevet és a megfelelő információt a partnerlistára felvenni "
 "kívánt csevegésről.\n"
 
-#: ../pidgin/gtkblist.c:5964
+#: ../pidgin/gtkblist.c:6316
+msgid "Autojoin when account becomes online."
+msgstr "Automatikus csatlakozás a fiók elérhetővé válásakor."
+
+#: ../pidgin/gtkblist.c:6317
+msgid "Hide chat when the window is closed."
+msgstr "Csevegés elrejtése az ablak bezárásakor."
+
+#: ../pidgin/gtkblist.c:6343
 msgid "Please enter the name of the group to be added."
-msgstr "Kérem adja meg a felvenni kívánt csoport nevét."
-
-#: ../pidgin/gtkblist.c:6609
+msgstr "Adja meg a felvenni kívánt csoport nevét."
+
+#: ../pidgin/gtkblist.c:6989
 msgid "<PurpleMain>/Accounts/"
 msgstr "<PurpleMain>/Fiókok/"
 
-#: ../pidgin/gtkblist.c:6633
+#: ../pidgin/gtkblist.c:7013
 msgid "_Edit Account"
 msgstr "_Fiók szerkesztése"
 
-#: ../pidgin/gtkblist.c:6646 ../pidgin/gtkconv.c:3073
+#: ../pidgin/gtkblist.c:7026 ../pidgin/gtkconv.c:3146
 msgid "No actions available"
 msgstr "Nem állnak rendelkezésre műveletek"
 
-#: ../pidgin/gtkblist.c:6654
+#: ../pidgin/gtkblist.c:7034
 msgid "_Disable"
 msgstr "_Tiltás"
 
-#: ../pidgin/gtkblist.c:6666
+#: ../pidgin/gtkblist.c:7046
 msgid "Enable Account"
 msgstr "Fiók engedélyezése"
 
-#: ../pidgin/gtkblist.c:6672
+#: ../pidgin/gtkblist.c:7052
 msgid "<PurpleMain>/Accounts/Enable Account"
 msgstr "<PurpleMain>/Fiókok/Fiók engedélyezése"
 
-#: ../pidgin/gtkblist.c:6721
+#: ../pidgin/gtkblist.c:7101
 msgid "/Tools"
 msgstr "/Eszközök"
 
-#: ../pidgin/gtkblist.c:6791
+#: ../pidgin/gtkblist.c:7171
 msgid "/Buddies/Sort Buddies"
 msgstr "/Partnerek/Partnerek rendezése"
 
 #. Widget creation function
-#: ../pidgin/gtkcertmgr.c:530
-#, fuzzy
+#: ../pidgin/gtkcertmgr.c:531
 msgid "SSL Servers"
-msgstr "Kiszolgáló"
-
-#: ../pidgin/gtkconn.c:180
+msgstr "SSL kiszolgálók"
+
+#: ../pidgin/gtkconn.c:181
 #, c-format
 msgid ""
 "%s\n"
@@ -14234,27 +14539,26 @@
 "A %s nem próbálja meg újra csatlakoztatni a fiókot, amíg nem javítja a hibát "
 "és nem engedélyezi újra a fiókot."
 
-#: ../pidgin/gtkconv.c:482
+#: ../pidgin/gtkconv.c:524
 msgid "Unknown command."
 msgstr "Ismeretlen parancs."
 
-#: ../pidgin/gtkconv.c:754 ../pidgin/gtkconv.c:780
+#: ../pidgin/gtkconv.c:796 ../pidgin/gtkconv.c:822
 msgid "That buddy is not on the same protocol as this chat."
 msgstr "A partner nem ugyanazt a protokollt használja, mint ez a csevegés"
 
-#: ../pidgin/gtkconv.c:774
-msgid ""
-"You are not currently signed on with an account that can invite that buddy."
+#: ../pidgin/gtkconv.c:816
+msgid "You are not currently signed on with an account that can invite that buddy."
 msgstr ""
 "Jelenleg nincs bejelentkezve olyan fiókkal, mellyel meghívhatná ezt a "
 "partnert."
 
-#: ../pidgin/gtkconv.c:827
+#: ../pidgin/gtkconv.c:869
 msgid "Invite Buddy Into Chat Room"
 msgstr "Partner meghívása a csevegőszobába"
 
 #. Put our happy label in it.
-#: ../pidgin/gtkconv.c:857
+#: ../pidgin/gtkconv.c:899
 msgid ""
 "Please enter the name of the user you wish to invite, along with an optional "
 "invite message."
@@ -14262,188 +14566,183 @@
 "Adja meg annak a partnernek a nevét, akit meg szeretne hívni, egy "
 "tetszőleges meghívóüzenettel együtt."
 
-#: ../pidgin/gtkconv.c:878
+#: ../pidgin/gtkconv.c:920
 msgid "_Buddy:"
 msgstr "_Partner:"
 
-#: ../pidgin/gtkconv.c:889 ../pidgin/gtksavedstatuses.c:1194
-#: ../pidgin/gtksavedstatuses.c:1528
+#: ../pidgin/gtkconv.c:931 ../pidgin/gtksavedstatuses.c:1200
+#: ../pidgin/gtksavedstatuses.c:1536
 msgid "_Message:"
 msgstr "Ü_zenet:"
 
-#: ../pidgin/gtkconv.c:947 ../pidgin/gtkconv.c:2598 ../pidgin/gtkdebug.c:219
-#: ../pidgin/gtkft.c:543
-msgid "Unable to open file."
-msgstr "Nem lehet megnyitni a fájlt."
-
-#: ../pidgin/gtkconv.c:953
+#: ../pidgin/gtkconv.c:995
 #, c-format
 msgid "<h1>Conversation with %s</h1>\n"
 msgstr "<h1>Társalgás %s partnerrel</h1>\n"
 
-#: ../pidgin/gtkconv.c:991
+#: ../pidgin/gtkconv.c:1033
 msgid "Save Conversation"
 msgstr "Társalgás mentése"
 
-#: ../pidgin/gtkconv.c:1140 ../pidgin/gtkdebug.c:167 ../pidgin/gtkdebug.c:743
+#: ../pidgin/gtkconv.c:1179 ../pidgin/gtkdebug.c:168 ../pidgin/gtkdebug.c:748
 msgid "Find"
 msgstr "Keresés"
 
-#: ../pidgin/gtkconv.c:1166 ../pidgin/gtkdebug.c:195
+#: ../pidgin/gtkconv.c:1205 ../pidgin/gtkdebug.c:196
 msgid "_Search for:"
 msgstr "Kere_sés:"
 
-#: ../pidgin/gtkconv.c:1622
+#: ../pidgin/gtkconv.c:1676
 msgid "Un-Ignore"
 msgstr "Mellőzés visszavonása"
 
-#: ../pidgin/gtkconv.c:1625
+#: ../pidgin/gtkconv.c:1679
 msgid "Ignore"
 msgstr "Mellőzés"
 
-#: ../pidgin/gtkconv.c:1645
+#: ../pidgin/gtkconv.c:1699
 msgid "Get Away Message"
 msgstr "Távollét üzenet lekérdezése"
 
-#: ../pidgin/gtkconv.c:1668
+#: ../pidgin/gtkconv.c:1722
 msgid "Last said"
 msgstr "Utoljára ezt mondta"
 
-#: ../pidgin/gtkconv.c:2606
+#: ../pidgin/gtkconv.c:2671
 msgid "Unable to save icon file to disk."
 msgstr "Nem menthető lemezre az ikonfájl."
 
-#: ../pidgin/gtkconv.c:2657
+#: ../pidgin/gtkconv.c:2722
 msgid "Save Icon"
 msgstr "Ikon mentése"
 
-#: ../pidgin/gtkconv.c:2709
+#: ../pidgin/gtkconv.c:2774
 msgid "Animate"
 msgstr "Animálás"
 
-#: ../pidgin/gtkconv.c:2714
+#: ../pidgin/gtkconv.c:2779
 msgid "Hide Icon"
 msgstr "Ikon elrejtése"
 
-#: ../pidgin/gtkconv.c:2717
+#: ../pidgin/gtkconv.c:2782
 msgid "Save Icon As..."
 msgstr "Ikon mentése másként..."
 
-#: ../pidgin/gtkconv.c:2721
+#: ../pidgin/gtkconv.c:2786
 msgid "Set Custom Icon..."
 msgstr "Egyéni ikon beállítása..."
 
-#: ../pidgin/gtkconv.c:2734
+#: ../pidgin/gtkconv.c:2799
 msgid "Remove Custom Icon"
 msgstr "Egyéni ikon eltávolítása"
 
-#: ../pidgin/gtkconv.c:2861
+#: ../pidgin/gtkconv.c:2931
 msgid "Show All"
 msgstr "Összes megjelenítése"
 
 #. Conversation menu
-#: ../pidgin/gtkconv.c:2880
+#: ../pidgin/gtkconv.c:2950
 msgid "/_Conversation"
 msgstr "/_Társalgás"
 
-#: ../pidgin/gtkconv.c:2882
+#: ../pidgin/gtkconv.c:2952
 msgid "/Conversation/New Instant _Message..."
 msgstr "/Társalgás/Új azonnali ü_zenet..."
 
-#: ../pidgin/gtkconv.c:2887
+#: ../pidgin/gtkconv.c:2957
 msgid "/Conversation/_Find..."
 msgstr "/Társalgás/Ker_esés..."
 
-#: ../pidgin/gtkconv.c:2889
+#: ../pidgin/gtkconv.c:2959
 msgid "/Conversation/View _Log"
 msgstr "/Társalgás/Nap_ló megtekintése"
 
-#: ../pidgin/gtkconv.c:2890
+#: ../pidgin/gtkconv.c:2960
 msgid "/Conversation/_Save As..."
 msgstr "/Társalgás/_Mentés másként..."
 
-#: ../pidgin/gtkconv.c:2892
+#: ../pidgin/gtkconv.c:2962
 msgid "/Conversation/Clea_r Scrollback"
 msgstr "/Társalgás/Elő_zmények törlése"
 
-#: ../pidgin/gtkconv.c:2896
+#: ../pidgin/gtkconv.c:2966
 msgid "/Conversation/Se_nd File..."
 msgstr "/Társalgás/Fájl kül_dése..."
 
-#: ../pidgin/gtkconv.c:2897
+#: ../pidgin/gtkconv.c:2967
 msgid "/Conversation/Add Buddy _Pounce..."
 msgstr "/Társalgás/_Partnerfigyelmeztetés felvétele..."
 
-#: ../pidgin/gtkconv.c:2899
+#: ../pidgin/gtkconv.c:2969
 msgid "/Conversation/_Get Info"
 msgstr "/Társalgás/_Információ lekérése"
 
-#: ../pidgin/gtkconv.c:2901
+#: ../pidgin/gtkconv.c:2971
 msgid "/Conversation/In_vite..."
 msgstr "/Társalgás/Me_ghívás..."
 
-#: ../pidgin/gtkconv.c:2903
+#: ../pidgin/gtkconv.c:2973
 msgid "/Conversation/M_ore"
 msgstr "/Társalgás/_Több"
 
-#: ../pidgin/gtkconv.c:2907
+#: ../pidgin/gtkconv.c:2977
 msgid "/Conversation/Al_ias..."
 msgstr "/Társalgás/Ál_név..."
 
-#: ../pidgin/gtkconv.c:2909
+#: ../pidgin/gtkconv.c:2979
 msgid "/Conversation/_Block..."
 msgstr "/Társalgás/_Tiltás..."
 
-#: ../pidgin/gtkconv.c:2911
+#: ../pidgin/gtkconv.c:2981
 msgid "/Conversation/_Unblock..."
 msgstr "/Társalgás/_Tiltás feloldása..."
 
-#: ../pidgin/gtkconv.c:2913
+#: ../pidgin/gtkconv.c:2983
 msgid "/Conversation/_Add..."
 msgstr "/Társalgás/_Hozzáadás..."
 
-#: ../pidgin/gtkconv.c:2915
+#: ../pidgin/gtkconv.c:2985
 msgid "/Conversation/_Remove..."
 msgstr "/Társalgás/_Eltávolítás..."
 
-#: ../pidgin/gtkconv.c:2920
+#: ../pidgin/gtkconv.c:2990
 msgid "/Conversation/Insert Lin_k..."
 msgstr "/Társalgás/_Hivatkozás beszúrása..."
 
-#: ../pidgin/gtkconv.c:2922
+#: ../pidgin/gtkconv.c:2992
 msgid "/Conversation/Insert Imag_e..."
 msgstr "/Társalgás/Ké_p beszúrása..."
 
-#: ../pidgin/gtkconv.c:2928
+#: ../pidgin/gtkconv.c:2998
 msgid "/Conversation/_Close"
 msgstr "/Társalgás/_Bezárás"
 
 #. Options
-#: ../pidgin/gtkconv.c:2932
+#: ../pidgin/gtkconv.c:3002
 msgid "/_Options"
 msgstr "/_Beállítások"
 
-#: ../pidgin/gtkconv.c:2933
+#: ../pidgin/gtkconv.c:3003
 msgid "/Options/Enable _Logging"
 msgstr "/Beállítások/_Naplózás engedélyezése"
 
-#: ../pidgin/gtkconv.c:2934
+#: ../pidgin/gtkconv.c:3004
 msgid "/Options/Enable _Sounds"
 msgstr "/Beállítások/_Hangok engedélyezése"
 
-#: ../pidgin/gtkconv.c:2936
+#: ../pidgin/gtkconv.c:3006
 msgid "/Options/Show Formatting _Toolbars"
 msgstr "/Beállítások/_Formázás eszköztárak mutatása"
 
-#: ../pidgin/gtkconv.c:2937
+#: ../pidgin/gtkconv.c:3007
 msgid "/Options/Show Ti_mestamps"
 msgstr "/Beállítások/I_dőbélyegek mutatása"
 
-#: ../pidgin/gtkconv.c:3061
+#: ../pidgin/gtkconv.c:3134
 msgid "/Conversation/More"
 msgstr "/Társalgás/Több"
 
-#: ../pidgin/gtkconv.c:3117
+#: ../pidgin/gtkconv.c:3190
 msgid "/Options"
 msgstr "/Beállítások"
 
@@ -14452,232 +14751,232 @@
 #. Make sure the 'Conversation -> More' menuitems are regenerated whenever
 #. * the 'Conversation' menu pops up because the entries can change after the
 #. * conversation is created.
-#: ../pidgin/gtkconv.c:3152 ../pidgin/gtkconv.c:3184
+#: ../pidgin/gtkconv.c:3225 ../pidgin/gtkconv.c:3257
 msgid "/Conversation"
 msgstr "/Társalgás"
 
-#: ../pidgin/gtkconv.c:3192
+#: ../pidgin/gtkconv.c:3265
 msgid "/Conversation/View Log"
 msgstr "/Társalgás/Napló megtekintése"
 
-#: ../pidgin/gtkconv.c:3198
+#: ../pidgin/gtkconv.c:3271
 msgid "/Conversation/Send File..."
 msgstr "/Társalgás/Fájl küldése..."
 
-#: ../pidgin/gtkconv.c:3202
+#: ../pidgin/gtkconv.c:3275
 msgid "/Conversation/Add Buddy Pounce..."
 msgstr "/Társalgás/Partnerfigyelmeztetés felvétele..."
 
-#: ../pidgin/gtkconv.c:3208
+#: ../pidgin/gtkconv.c:3281
 msgid "/Conversation/Get Info"
 msgstr "/Társalgás/Információ lekérése"
 
-#: ../pidgin/gtkconv.c:3212
+#: ../pidgin/gtkconv.c:3285
 msgid "/Conversation/Invite..."
 msgstr "/Társalgás/Meghívás..."
 
-#: ../pidgin/gtkconv.c:3218
+#: ../pidgin/gtkconv.c:3291
 msgid "/Conversation/Alias..."
 msgstr "/Társalgás/Álnév..."
 
-#: ../pidgin/gtkconv.c:3222
+#: ../pidgin/gtkconv.c:3295
 msgid "/Conversation/Block..."
 msgstr "/Társalgás/Tiltás..."
 
-#: ../pidgin/gtkconv.c:3226
+#: ../pidgin/gtkconv.c:3299
 msgid "/Conversation/Unblock..."
 msgstr "/Társalgás/Tiltás feloldása..."
 
-#: ../pidgin/gtkconv.c:3230
+#: ../pidgin/gtkconv.c:3303
 msgid "/Conversation/Add..."
 msgstr "/Társalgás/Hozzáadás..."
 
-#: ../pidgin/gtkconv.c:3234
+#: ../pidgin/gtkconv.c:3307
 msgid "/Conversation/Remove..."
 msgstr "/Társalgás/Eltávolítás..."
 
-#: ../pidgin/gtkconv.c:3240
+#: ../pidgin/gtkconv.c:3313
 msgid "/Conversation/Insert Link..."
 msgstr "/Társalgás/Hivatkozás beszúrása..."
 
-#: ../pidgin/gtkconv.c:3244
+#: ../pidgin/gtkconv.c:3317
 msgid "/Conversation/Insert Image..."
 msgstr "/Társalgás/Kép beszúrása..."
 
-#: ../pidgin/gtkconv.c:3250
+#: ../pidgin/gtkconv.c:3323
 msgid "/Options/Enable Logging"
 msgstr "/Beállítások/Naplózás engedélyezése"
 
-#: ../pidgin/gtkconv.c:3253
+#: ../pidgin/gtkconv.c:3326
 msgid "/Options/Enable Sounds"
 msgstr "/Beállítások/Hangok engedélyezése"
 
-#: ../pidgin/gtkconv.c:3266
+#: ../pidgin/gtkconv.c:3339
 msgid "/Options/Show Formatting Toolbars"
 msgstr "/Beállítások/Formázás eszköztárak mutatása"
 
-#: ../pidgin/gtkconv.c:3269
+#: ../pidgin/gtkconv.c:3342
 msgid "/Options/Show Timestamps"
 msgstr "/Beállítások/Időbélyegek mutatása"
 
-#: ../pidgin/gtkconv.c:3346 ../pidgin/gtkconv.c:3388
+#: ../pidgin/gtkconv.c:3419 ../pidgin/gtkconv.c:3461
 msgid "User is typing..."
 msgstr "A felhasználó gépel..."
 
-#: ../pidgin/gtkconv.c:3391
+#: ../pidgin/gtkconv.c:3464
 msgid "User has typed something and stopped"
 msgstr "A felhasználó gépelt valamit és megállt"
 
 #. Build the Send To menu
-#: ../pidgin/gtkconv.c:3574 ../pidgin/gtkconv.c:8022
-msgid "_Send To"
-msgstr "_Küldés mint"
-
-#: ../pidgin/gtkconv.c:4286
+#: ../pidgin/gtkconv.c:3648 ../pidgin/gtkconv.c:8248
+msgid "S_end To"
+msgstr "Kül_dés ennek"
+
+#: ../pidgin/gtkconv.c:4360
 msgid "_Send"
 msgstr "_Küldés"
 
 #. Setup the label telling how many people are in the room.
-#: ../pidgin/gtkconv.c:4390
+#: ../pidgin/gtkconv.c:4473
 msgid "0 people in room"
 msgstr "0 személy tartózkodik a szobában"
 
-#: ../pidgin/gtkconv.c:5759 ../pidgin/gtkconv.c:5880
+#: ../pidgin/gtkconv.c:5846 ../pidgin/gtkconv.c:5967
 #, c-format
 msgid "%d person in room"
 msgid_plural "%d people in room"
 msgstr[0] "%d személy van a szobában"
 msgstr[1] "%d személy van a szobában"
 
-#: ../pidgin/gtkconv.c:6486 ../pidgin/gtkstatusbox.c:660
+#: ../pidgin/gtkconv.c:6574 ../pidgin/gtkstatusbox.c:660
 msgid "Typing"
 msgstr "Gépel"
 
-#: ../pidgin/gtkconv.c:6490
+#: ../pidgin/gtkconv.c:6578
 msgid "Stopped Typing"
 msgstr "Abbahagyta a gépelést"
 
-#: ../pidgin/gtkconv.c:6493
+#: ../pidgin/gtkconv.c:6581
 msgid "Nick Said"
 msgstr "Becenév kimondva"
 
-#: ../pidgin/gtkconv.c:6496 ../pidgin/gtkdocklet.c:492
+#: ../pidgin/gtkconv.c:6584 ../pidgin/gtkdocklet.c:685
 msgid "Unread Messages"
 msgstr "Olvasatlan üzenetek"
 
-#: ../pidgin/gtkconv.c:6499
+#: ../pidgin/gtkconv.c:6590
 msgid "New Event"
 msgstr "Új esemény"
 
-#: ../pidgin/gtkconv.c:7572
+#: ../pidgin/gtkconv.c:7767
 msgid "clear: Clears all conversation scrollbacks."
 msgstr "clear: Törli a társalgás előzményeit."
 
-#: ../pidgin/gtkconv.c:7736
+#: ../pidgin/gtkconv.c:7930
 msgid "Confirm close"
 msgstr "Bezárás jóváhagyása"
 
-#: ../pidgin/gtkconv.c:7768
+#: ../pidgin/gtkconv.c:7962
 msgid "You have unread messages. Are you sure you want to close the window?"
 msgstr "Olvasatlan üzenetei vannak. Biztos, hogy bezárja az ablakot?"
 
-#: ../pidgin/gtkconv.c:8355
+#: ../pidgin/gtkconv.c:8581
 msgid "Close other tabs"
 msgstr "Más lapok bezárása"
 
-#: ../pidgin/gtkconv.c:8361
+#: ../pidgin/gtkconv.c:8587
 msgid "Close all tabs"
 msgstr "Minden lap bezárása"
 
-#: ../pidgin/gtkconv.c:8369
+#: ../pidgin/gtkconv.c:8595
 msgid "Detach this tab"
 msgstr "Ezen lap leválasztása"
 
-#: ../pidgin/gtkconv.c:8375
+#: ../pidgin/gtkconv.c:8601
 msgid "Close this tab"
 msgstr "Ezen lap bezárása"
 
-#: ../pidgin/gtkconv.c:8875
+#: ../pidgin/gtkconv.c:9106
 msgid "Close conversation"
 msgstr "Társalgás bezárása"
 
-#: ../pidgin/gtkconv.c:9477
+#: ../pidgin/gtkconv.c:9708
 msgid "Last created window"
 msgstr "Utoljára létrehozott ablak"
 
-#: ../pidgin/gtkconv.c:9479
+#: ../pidgin/gtkconv.c:9710
 msgid "Separate IM and Chat windows"
 msgstr "Üzenő- és csevegőablakok elkülönítése"
 
-#: ../pidgin/gtkconv.c:9481 ../pidgin/gtkprefs.c:1415
+#: ../pidgin/gtkconv.c:9712 ../pidgin/gtkprefs.c:1510
 msgid "New window"
 msgstr "Új ablak"
 
-#: ../pidgin/gtkconv.c:9483
+#: ../pidgin/gtkconv.c:9714
 msgid "By group"
 msgstr "Csoport szerint"
 
-#: ../pidgin/gtkconv.c:9485
+#: ../pidgin/gtkconv.c:9716
 msgid "By account"
 msgstr "Fiók szerint"
 
-#: ../pidgin/gtkdebug.c:234
+#: ../pidgin/gtkdebug.c:235
 msgid "Save Debug Log"
 msgstr "Hibakereső napló mentése"
 
-#: ../pidgin/gtkdebug.c:582
+#: ../pidgin/gtkdebug.c:583
 msgid "Invert"
 msgstr "Invertálás"
 
-#: ../pidgin/gtkdebug.c:585
+#: ../pidgin/gtkdebug.c:586
 msgid "Highlight matches"
 msgstr "Találatok kiemelése"
 
-#: ../pidgin/gtkdebug.c:652
+#: ../pidgin/gtkdebug.c:653
 msgid "_Icon Only"
 msgstr "Csak i_kon"
 
-#: ../pidgin/gtkdebug.c:653
+#: ../pidgin/gtkdebug.c:654
 msgid "_Text Only"
 msgstr "Csak s_zöveg"
 
-#: ../pidgin/gtkdebug.c:654
+#: ../pidgin/gtkdebug.c:655
 msgid "_Both Icon & Text"
 msgstr "Ik_on és szöveg"
 
-#: ../pidgin/gtkdebug.c:775
+#: ../pidgin/gtkdebug.c:780
 msgid "Filter"
 msgstr "Szűrő"
 
-#: ../pidgin/gtkdebug.c:794
+#: ../pidgin/gtkdebug.c:799
 msgid "Right click for more options."
 msgstr "Kattintson a jobb egérgombbal további beállításokért."
 
-#: ../pidgin/gtkdebug.c:824
+#: ../pidgin/gtkdebug.c:829
 msgid "Level "
 msgstr "Szint: "
 
-#: ../pidgin/gtkdebug.c:825 ../pidgin/gtkdebug.c:831
+#: ../pidgin/gtkdebug.c:830 ../pidgin/gtkdebug.c:836
 msgid "Select the debug filter level."
 msgstr "Válassza ki a hibakeresési szűrő szintjét."
 
-#: ../pidgin/gtkdebug.c:833
+#: ../pidgin/gtkdebug.c:838
 msgid "All"
 msgstr "Minden"
 
-#: ../pidgin/gtkdebug.c:834
+#: ../pidgin/gtkdebug.c:839
 msgid "Misc"
 msgstr "Egyéb"
 
-#: ../pidgin/gtkdebug.c:836
+#: ../pidgin/gtkdebug.c:841
 msgid "Warning"
 msgstr "Figyelmeztetés"
 
-#: ../pidgin/gtkdebug.c:837
+#: ../pidgin/gtkdebug.c:842
 msgid "Error "
 msgstr "Hiba "
 
-#: ../pidgin/gtkdebug.c:838
+#: ../pidgin/gtkdebug.c:843
 msgid "Fatal Error"
 msgstr "Végzetes hiba"
 
@@ -14692,20 +14991,20 @@
 #: ../pidgin/gtkdialogs.c:81 ../pidgin/gtkdialogs.c:82
 #: ../pidgin/gtkdialogs.c:83 ../pidgin/gtkdialogs.c:84
 #: ../pidgin/gtkdialogs.c:85 ../pidgin/gtkdialogs.c:86
-#: ../pidgin/gtkdialogs.c:89 ../pidgin/gtkdialogs.c:91
-#: ../pidgin/gtkdialogs.c:92
+#: ../pidgin/gtkdialogs.c:87 ../pidgin/gtkdialogs.c:90
+#: ../pidgin/gtkdialogs.c:92 ../pidgin/gtkdialogs.c:93
 msgid "developer"
 msgstr "fejlesztő"
 
-#: ../pidgin/gtkdialogs.c:87
+#: ../pidgin/gtkdialogs.c:88
 msgid "support"
 msgstr "támogató"
 
-#: ../pidgin/gtkdialogs.c:88
+#: ../pidgin/gtkdialogs.c:89
 msgid "support/QA"
 msgstr "támogató/QA"
 
-#: ../pidgin/gtkdialogs.c:90 ../pidgin/gtkdialogs.c:112
+#: ../pidgin/gtkdialogs.c:91 ../pidgin/gtkdialogs.c:112
 msgid "developer & webmaster"
 msgstr "fejlesztő és webmester"
 
@@ -14748,7 +15047,7 @@
 
 #: ../pidgin/gtkdialogs.c:135
 msgid "Belarusian Latin"
-msgstr ""
+msgstr "Fehérorosz latin"
 
 #: ../pidgin/gtkdialogs.c:136 ../pidgin/gtkdialogs.c:137
 #: ../pidgin/gtkdialogs.c:227
@@ -14906,9 +15205,8 @@
 msgstr "Kurd"
 
 #: ../pidgin/gtkdialogs.c:185
-#, fuzzy
 msgid "Lao"
-msgstr "Oroszlán"
+msgstr "Lao"
 
 #: ../pidgin/gtkdialogs.c:186 ../pidgin/gtkdialogs.c:252
 #: ../pidgin/gtkdialogs.c:253
@@ -15029,12 +15327,12 @@
 msgid "Amharic"
 msgstr "Amhara"
 
-#: ../pidgin/gtkdialogs.c:357
+#: ../pidgin/gtkdialogs.c:368
 #, c-format
 msgid "About %s"
 msgstr "A %s névjegye"
 
-#: ../pidgin/gtkdialogs.c:400
+#: ../pidgin/gtkdialogs.c:411
 #, c-format
 msgid ""
 "%s is a graphical modular messaging client based on libpurple which is "
@@ -15057,49 +15355,62 @@
 "közreműködők birtokolják, ezek teljes listája megtalálható a COPYRIGHT "
 "fájlban. A programra nem biztosítunk garanciát.<BR><BR>"
 
-#: ../pidgin/gtkdialogs.c:418
+#: ../pidgin/gtkdialogs.c:429
 #, c-format
 msgid "<FONT SIZE=\"4\">IRC:</FONT> #pidgin on irc.freenode.net<BR><BR>"
-msgstr ""
-"<FONT SIZE=\"4\">IRC:</FONT> #pidgin az irc.freenode.net hálózaton<BR><BR>"
-
-#: ../pidgin/gtkdialogs.c:423
+msgstr "<FONT SIZE=\"4\">IRC:</FONT> #pidgin az irc.freenode.net hálózaton<BR><BR>"
+
+#: ../pidgin/gtkdialogs.c:434
 msgid "Current Developers"
 msgstr "Jelenlegi fejlesztők"
 
-#: ../pidgin/gtkdialogs.c:438
+#: ../pidgin/gtkdialogs.c:449
 msgid "Crazy Patch Writers"
 msgstr "Őrült patch szerzők"
 
-#: ../pidgin/gtkdialogs.c:453
+#: ../pidgin/gtkdialogs.c:464
 msgid "Retired Developers"
 msgstr "Visszavonult fejlesztők"
 
-#: ../pidgin/gtkdialogs.c:468
+#: ../pidgin/gtkdialogs.c:479
 msgid "Retired Crazy Patch Writers"
 msgstr "Visszavonult őrült patch szerzők"
 
-#: ../pidgin/gtkdialogs.c:483
+#: ../pidgin/gtkdialogs.c:494
 msgid "Artists"
 msgstr "Grafikusok"
 
-#: ../pidgin/gtkdialogs.c:498
+#: ../pidgin/gtkdialogs.c:509
 msgid "Current Translators"
 msgstr "Jelenlegi fordítók"
 
-#: ../pidgin/gtkdialogs.c:518
+#: ../pidgin/gtkdialogs.c:529
 msgid "Past Translators"
 msgstr "Korábbi fordítók"
 
-#: ../pidgin/gtkdialogs.c:536
+#: ../pidgin/gtkdialogs.c:547
 msgid "Debugging Information"
 msgstr "Hibakeresési információk"
 
-#: ../pidgin/gtkdialogs.c:906
+#: ../pidgin/gtkdialogs.c:764 ../pidgin/gtkdialogs.c:907
+#: ../pidgin/gtkdialogs.c:988
+msgid "_Name"
+msgstr "_Név"
+
+#: ../pidgin/gtkdialogs.c:769
+msgid "Buddy"
+msgstr "Partner"
+
+#: ../pidgin/gtkdialogs.c:773 ../pidgin/gtkdialogs.c:912
+#: ../pidgin/gtkdialogs.c:993
+msgid "_Account"
+msgstr "_Fiók"
+
+#: ../pidgin/gtkdialogs.c:920
 msgid "Get User Info"
 msgstr "Felhasználó adatainak lekérése"
 
-#: ../pidgin/gtkdialogs.c:908
+#: ../pidgin/gtkdialogs.c:922
 msgid ""
 "Please enter the screen name or alias of the person whose info you would "
 "like to view."
@@ -15107,11 +15418,11 @@
 "Adja meg azon partner felhasználónevét vagy álnevét, akinek az adatait meg "
 "szeretné tekinteni."
 
-#: ../pidgin/gtkdialogs.c:998
+#: ../pidgin/gtkdialogs.c:1012
 msgid "View User Log"
 msgstr "Felhasználó naplójának lekérése"
 
-#: ../pidgin/gtkdialogs.c:1000
+#: ../pidgin/gtkdialogs.c:1014
 msgid ""
 "Please enter the screen name or alias of the person whose log you would like "
 "to view."
@@ -15119,32 +15430,32 @@
 "Adja meg azon partner felhasználónevét vagy álnevét, akinek a naplóját meg "
 "szeretné tekinteni."
 
-#: ../pidgin/gtkdialogs.c:1020
+#: ../pidgin/gtkdialogs.c:1034
 msgid "Alias Contact"
 msgstr "Kapcsolat álneve"
 
-#: ../pidgin/gtkdialogs.c:1021
+#: ../pidgin/gtkdialogs.c:1035
 msgid "Enter an alias for this contact."
 msgstr "Adjon meg egy álnevet ehhez a kapcsolathoz."
 
-#: ../pidgin/gtkdialogs.c:1043
+#: ../pidgin/gtkdialogs.c:1057
 #, c-format
 msgid "Enter an alias for %s."
 msgstr "Adjon meg egy álnevet %s számára."
 
-#: ../pidgin/gtkdialogs.c:1045
+#: ../pidgin/gtkdialogs.c:1059
 msgid "Alias Buddy"
 msgstr "Partner álneve"
 
-#: ../pidgin/gtkdialogs.c:1066
+#: ../pidgin/gtkdialogs.c:1080
 msgid "Alias Chat"
 msgstr "Csevegés álneve"
 
-#: ../pidgin/gtkdialogs.c:1067
+#: ../pidgin/gtkdialogs.c:1081
 msgid "Enter an alias for this chat."
 msgstr "Adjon meg egy álnevet ehhez a csevegéshez."
 
-#: ../pidgin/gtkdialogs.c:1106
+#: ../pidgin/gtkdialogs.c:1120
 #, c-format
 msgid ""
 "You are about to remove the contact containing %s and %d other buddy from "
@@ -15159,15 +15470,15 @@
 "%s és %d más partnert tartalmazó kapcsolat eltávolítására készül a "
 "partnerlistájáról. Folytatni akarja?"
 
-#: ../pidgin/gtkdialogs.c:1114
+#: ../pidgin/gtkdialogs.c:1128
 msgid "Remove Contact"
 msgstr "Kapcsolat eltávolítása"
 
-#: ../pidgin/gtkdialogs.c:1117
+#: ../pidgin/gtkdialogs.c:1131
 msgid "_Remove Contact"
 msgstr "_Kapcsolat eltávolítása"
 
-#: ../pidgin/gtkdialogs.c:1148
+#: ../pidgin/gtkdialogs.c:1162
 #, c-format
 msgid ""
 "You are about to merge the group called %s into the group called %s. Do you "
@@ -15176,15 +15487,15 @@
 "A(z) %s csoport összes tagjának a(z) %s csoportba fésülésére készül. "
 "Folytatni akarja?"
 
-#: ../pidgin/gtkdialogs.c:1155
+#: ../pidgin/gtkdialogs.c:1169
 msgid "Merge Groups"
 msgstr "Csoportok összefésülése"
 
-#: ../pidgin/gtkdialogs.c:1158
+#: ../pidgin/gtkdialogs.c:1172
 msgid "_Merge Groups"
 msgstr "_Csoportok összefésülése"
 
-#: ../pidgin/gtkdialogs.c:1208
+#: ../pidgin/gtkdialogs.c:1222
 #, c-format
 msgid ""
 "You are about to remove the group %s and all its members from your buddy "
@@ -15193,70 +15504,67 @@
 "A(z) %s csoport és annak összes tagja eltávolítására készül a "
 "partnerlistájáról. Folytatni akarja?"
 
-#: ../pidgin/gtkdialogs.c:1211
+#: ../pidgin/gtkdialogs.c:1225
 msgid "Remove Group"
 msgstr "Csoport törlése"
 
-#: ../pidgin/gtkdialogs.c:1214
+#: ../pidgin/gtkdialogs.c:1228
 msgid "_Remove Group"
 msgstr "_Csoport eltávolítása"
 
-#: ../pidgin/gtkdialogs.c:1247
-#, c-format
-msgid ""
-"You are about to remove %s from your buddy list.  Do you want to continue?"
+#: ../pidgin/gtkdialogs.c:1261
+#, c-format
+msgid "You are about to remove %s from your buddy list.  Do you want to continue?"
 msgstr "%s eltávolítására készül a partnerlistájáról. Folytatni akarja?"
 
-#: ../pidgin/gtkdialogs.c:1250
+#: ../pidgin/gtkdialogs.c:1264
 msgid "Remove Buddy"
 msgstr "Partner törlése"
 
-#: ../pidgin/gtkdialogs.c:1253
+#: ../pidgin/gtkdialogs.c:1267
 msgid "_Remove Buddy"
 msgstr "Partner _törlése"
 
-#: ../pidgin/gtkdialogs.c:1274
+#: ../pidgin/gtkdialogs.c:1288
 #, c-format
 msgid ""
 "You are about to remove the chat %s from your buddy list.  Do you want to "
 "continue?"
-msgstr ""
-"%s csevegés eltávolítására készül a partnerlistájáról. Folytatni akarja?"
-
-#: ../pidgin/gtkdialogs.c:1277
+msgstr "%s csevegés eltávolítására készül a partnerlistájáról. Folytatni akarja?"
+
+#: ../pidgin/gtkdialogs.c:1291
 msgid "Remove Chat"
 msgstr "Csevegés eltávolítása"
 
-#: ../pidgin/gtkdialogs.c:1280
+#: ../pidgin/gtkdialogs.c:1294
 msgid "_Remove Chat"
 msgstr "_Csevegés eltávolítása"
 
-#: ../pidgin/gtkdocklet.c:150
+#: ../pidgin/gtkdocklet.c:152
 msgid "Right-click for more unread messages...\n"
 msgstr "További olvasatlan üzenetekért kattintson a jobb egérgombbal...\n"
 
-#: ../pidgin/gtkdocklet.c:435
+#: ../pidgin/gtkdocklet.c:533
 msgid "Change Status"
 msgstr "Állapot megváltoztatása"
 
-#: ../pidgin/gtkdocklet.c:487
+#: ../pidgin/gtkdocklet.c:680
 msgid "Show Buddy List"
 msgstr "Partnerlista mutatása"
 
-#: ../pidgin/gtkdocklet.c:513
+#: ../pidgin/gtkdocklet.c:706
 msgid "New Message..."
 msgstr "Új üzenet..."
 
-#: ../pidgin/gtkdocklet.c:528
+#: ../pidgin/gtkdocklet.c:721
 msgid "Mute Sounds"
 msgstr "Hangok némítása"
 
-#: ../pidgin/gtkdocklet.c:535
-#, fuzzy
-msgid "Blink on new message"
+#: ../pidgin/gtkdocklet.c:728
+msgid "Blink on New Message"
 msgstr "Villogjon új üzenetkor"
 
-#: ../pidgin/gtkdocklet.c:542
+#: ../pidgin/gtkdocklet.c:738
 msgid "Quit"
 msgstr "Kilépés"
 
@@ -15346,44 +15654,43 @@
 msgid "_Resume"
 msgstr "_Folytatás"
 
-#: ../pidgin/gtkimhtml.c:816
+#: ../pidgin/gtkimhtml.c:815
 msgid "Paste as Plain _Text"
 msgstr "Beillesztés egyszerű szö_vegként"
 
-#: ../pidgin/gtkimhtml.c:833 ../pidgin/gtkimhtmltoolbar.c:1194
+#: ../pidgin/gtkimhtml.c:832 ../pidgin/gtkimhtmltoolbar.c:1199
 msgid "_Reset formatting"
 msgstr "F_ormázás törlése"
 
-#: ../pidgin/gtkimhtml.c:1373
+#: ../pidgin/gtkimhtml.c:1359
 msgid "Hyperlink color"
 msgstr "Hiperhivatkozás színe"
 
-#: ../pidgin/gtkimhtml.c:1374
+#: ../pidgin/gtkimhtml.c:1360
 msgid "Color to draw hyperlinks."
 msgstr "Hiperhivatkozások rajzolásához használt szín."
 
-#: ../pidgin/gtkimhtml.c:1377
+#: ../pidgin/gtkimhtml.c:1363
 msgid "Hyperlink prelight color"
 msgstr "Hiperhivatkozás előfényszíne"
 
-#: ../pidgin/gtkimhtml.c:1378
+#: ../pidgin/gtkimhtml.c:1364
 msgid "Color to draw hyperlinks when mouse is over them."
-msgstr ""
-"Hiperhivatkozások rajzolásához használt szín, amikor az egér rájuk mutat."
-
-#: ../pidgin/gtkimhtml.c:1598
+msgstr "Hiperhivatkozások rajzolásához használt szín, amikor az egér rájuk mutat."
+
+#: ../pidgin/gtkimhtml.c:1581
 msgid "_Copy E-Mail Address"
 msgstr "E-mail cím _másolása"
 
-#: ../pidgin/gtkimhtml.c:1610
+#: ../pidgin/gtkimhtml.c:1593
 msgid "_Open Link in Browser"
 msgstr "Hivatk_ozás megnyitása böngészőben"
 
-#: ../pidgin/gtkimhtml.c:1620
+#: ../pidgin/gtkimhtml.c:1603
 msgid "_Copy Link Location"
 msgstr "_Hivatkozás helyének másolása"
 
-#: ../pidgin/gtkimhtml.c:3369
+#: ../pidgin/gtkimhtml.c:3353
 msgid ""
 "<span size='larger' weight='bold'>Unrecognized file type</span>\n"
 "\n"
@@ -15393,7 +15700,7 @@
 "\n"
 "Alapértelmezett PNG használata."
 
-#: ../pidgin/gtkimhtml.c:3372
+#: ../pidgin/gtkimhtml.c:3356
 msgid ""
 "Unrecognized file type\n"
 "\n"
@@ -15403,7 +15710,7 @@
 "\n"
 "Alapértelmezett PNG használata."
 
-#: ../pidgin/gtkimhtml.c:3401
+#: ../pidgin/gtkimhtml.c:3385
 #, c-format
 msgid ""
 "<span size='larger' weight='bold'>Error saving image</span>\n"
@@ -15414,7 +15721,7 @@
 "\n"
 "%s"
 
-#: ../pidgin/gtkimhtml.c:3404
+#: ../pidgin/gtkimhtml.c:3388
 #, c-format
 msgid ""
 "Error saving image\n"
@@ -15425,11 +15732,11 @@
 "\n"
 "%s"
 
-#: ../pidgin/gtkimhtml.c:3482 ../pidgin/gtkimhtml.c:3494
+#: ../pidgin/gtkimhtml.c:3466 ../pidgin/gtkimhtml.c:3478
 msgid "Save Image"
 msgstr "Kép mentése"
 
-#: ../pidgin/gtkimhtml.c:3522
+#: ../pidgin/gtkimhtml.c:3506
 #, c-format
 msgid "_Save Image..."
 msgstr "Kép menté_se..."
@@ -15438,178 +15745,176 @@
 msgid "Select Font"
 msgstr "Betűkészlet kiválasztása"
 
-#: ../pidgin/gtkimhtmltoolbar.c:242
+#: ../pidgin/gtkimhtmltoolbar.c:244
 msgid "Select Text Color"
 msgstr "Szöveg színének kiválasztása"
 
-#: ../pidgin/gtkimhtmltoolbar.c:321
+#: ../pidgin/gtkimhtmltoolbar.c:323
 msgid "Select Background Color"
 msgstr "Háttérszín kiválasztása"
 
-#: ../pidgin/gtkimhtmltoolbar.c:410
+#: ../pidgin/gtkimhtmltoolbar.c:412
 msgid "_URL"
 msgstr "_URL"
 
-#: ../pidgin/gtkimhtmltoolbar.c:418
+#: ../pidgin/gtkimhtmltoolbar.c:420
 msgid "_Description"
 msgstr "_Leírás"
 
-#: ../pidgin/gtkimhtmltoolbar.c:421
+#: ../pidgin/gtkimhtmltoolbar.c:423
 msgid ""
 "Please enter the URL and description of the link that you want to insert. "
 "The description is optional."
-msgstr ""
-"Kérem adja meg a beszúrandó hivatkozás URL-jét és leírását. A leírás "
-"opcionális."
-
-#: ../pidgin/gtkimhtmltoolbar.c:425
+msgstr "Adja meg a beszúrandó hivatkozás URL címét és leírását. A leírás opcionális."
+
+#: ../pidgin/gtkimhtmltoolbar.c:427
 msgid "Please enter the URL of the link that you want to insert."
-msgstr "Kérem adja meg a beszúrandó hivatkozás URL-jét."
-
-#: ../pidgin/gtkimhtmltoolbar.c:430 ../pidgin/gtkimhtmltoolbar.c:1102
+msgstr "Adja meg a beszúrandó hivatkozás URL címét."
+
+#: ../pidgin/gtkimhtmltoolbar.c:432 ../pidgin/gtkimhtmltoolbar.c:1106
 msgid "Insert Link"
 msgstr "Hivatkozás beszúrása"
 
-#: ../pidgin/gtkimhtmltoolbar.c:434 ../pidgin/gtkimhtmltoolbar.c:1262
+#: ../pidgin/gtkimhtmltoolbar.c:436 ../pidgin/gtkimhtmltoolbar.c:1267
 msgid "_Insert"
 msgstr "_Beszúrás"
 
-#: ../pidgin/gtkimhtmltoolbar.c:514
+#: ../pidgin/gtkimhtmltoolbar.c:516
 #, c-format
 msgid "Failed to store image: %s\n"
 msgstr "A kép tárolása nem sikerült: %s\n"
 
-#: ../pidgin/gtkimhtmltoolbar.c:540 ../pidgin/gtkimhtmltoolbar.c:550
+#: ../pidgin/gtkimhtmltoolbar.c:542 ../pidgin/gtkimhtmltoolbar.c:552
 msgid "Insert Image"
 msgstr "Kép beszúrása"
 
-#: ../pidgin/gtkimhtmltoolbar.c:761
+#: ../pidgin/gtkimhtmltoolbar.c:765
 msgid "This theme has no available smileys."
 msgstr "Ehhez a témához nem állnak rendelkezésre hangulatjelek."
 
 #. show everything
-#: ../pidgin/gtkimhtmltoolbar.c:778
+#: ../pidgin/gtkimhtmltoolbar.c:782
 msgid "Smile!"
 msgstr "Hangulatjel választása"
 
-#: ../pidgin/gtkimhtmltoolbar.c:846 ../pidgin/gtkimhtmltoolbar.c:1219
+#: ../pidgin/gtkimhtmltoolbar.c:850 ../pidgin/gtkimhtmltoolbar.c:1224
 msgid "_Font"
 msgstr "_Betű"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1054
+#: ../pidgin/gtkimhtmltoolbar.c:1058
 msgid "Group Items"
 msgstr "Elemek csoportosítása"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1054
+#: ../pidgin/gtkimhtmltoolbar.c:1058
 msgid "Ungroup Items"
 msgstr "Csoportosítás megszüntetése"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1088 ../pidgin/plugins/convcolors.c:287
+#: ../pidgin/gtkimhtmltoolbar.c:1092 ../pidgin/plugins/convcolors.c:287
 msgid "Bold"
 msgstr "Félkövér"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1089 ../pidgin/plugins/convcolors.c:294
+#: ../pidgin/gtkimhtmltoolbar.c:1093 ../pidgin/plugins/convcolors.c:294
 msgid "Italic"
 msgstr "Dőlt"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1090 ../pidgin/plugins/convcolors.c:301
+#: ../pidgin/gtkimhtmltoolbar.c:1094 ../pidgin/plugins/convcolors.c:301
 msgid "Underline"
 msgstr "Aláhúzott"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1091
+#: ../pidgin/gtkimhtmltoolbar.c:1095
 msgid "Strikethrough"
 msgstr "Áthúzott"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1093
-msgid "Increase Font Size"
-msgstr "Betűméret növelése"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1094
-msgid "Decrease Font Size"
-msgstr "Betűméret csökkentése"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1096
-msgid "Font Face"
-msgstr "Betűkészlet"
-
 #: ../pidgin/gtkimhtmltoolbar.c:1097
-msgid "Background Color"
-msgstr "Háttérszín"
+msgid "Increase Font Size"
+msgstr "Betűméret növelése"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1098
+msgid "Decrease Font Size"
+msgstr "Betűméret csökkentése"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1100
+msgid "Font Face"
+msgstr "Betűkészlet"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1101
+msgid "Background Color"
+msgstr "Háttérszín"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1102
 msgid "Foreground Color"
 msgstr "Előtérszín"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1100
+#: ../pidgin/gtkimhtmltoolbar.c:1104
 msgid "Reset Formatting"
 msgstr "Formázás törlése"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1103
+#: ../pidgin/gtkimhtmltoolbar.c:1107
 msgid "Insert IM Image"
 msgstr "Kép beszúrása"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1104
+#: ../pidgin/gtkimhtmltoolbar.c:1108
 msgid "Insert Smiley"
 msgstr "Hangulatjel beszúrása"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1179
+#: ../pidgin/gtkimhtmltoolbar.c:1184
 msgid "<b>_Bold</b>"
 msgstr "<b>_Félkövér</b>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1180
+#: ../pidgin/gtkimhtmltoolbar.c:1185
 msgid "<i>_Italic</i>"
 msgstr "<i>_Dőlt</i>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1181
+#: ../pidgin/gtkimhtmltoolbar.c:1186
 msgid "<u>_Underline</u>"
 msgstr "<u>_Aláhúzott</u>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1182
+#: ../pidgin/gtkimhtmltoolbar.c:1187
 msgid "<span strikethrough='true'>Strikethrough</span>"
 msgstr "<span size='larger'>Áthúzott</span>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1183
+#: ../pidgin/gtkimhtmltoolbar.c:1188
 msgid "<span size='larger'>_Larger</span>"
 msgstr "<span size='larger'>_Nagyobb</span>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1185
+#: ../pidgin/gtkimhtmltoolbar.c:1190
 msgid "_Normal"
 msgstr "N_ormál"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1187
+#: ../pidgin/gtkimhtmltoolbar.c:1192
 msgid "<span size='smaller'>_Smaller</span>"
 msgstr "<span size='smaller'>_Kisebb</span>"
 
 #. If we want to show the formatting for the following items, we would
 #. * need to update them when formatting changes. The above items don't need
 #. * no updating nor nothin'
-#: ../pidgin/gtkimhtmltoolbar.c:1191
+#: ../pidgin/gtkimhtmltoolbar.c:1196
 msgid "_Font face"
 msgstr "_Betűkészlet"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1192
+#: ../pidgin/gtkimhtmltoolbar.c:1197
 msgid "Foreground _color"
 msgstr "_Előtérszín"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1193
+#: ../pidgin/gtkimhtmltoolbar.c:1198
 msgid "Bac_kground color"
 msgstr "_Háttérszín"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1270
-msgid "_Smiley"
-msgstr "Hang_ulatjel"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1276
+#: ../pidgin/gtkimhtmltoolbar.c:1275
 msgid "_Image"
 msgstr "Ké_p"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1282
+#: ../pidgin/gtkimhtmltoolbar.c:1281
 msgid "_Link"
 msgstr "_Hivatkozás"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1288
+#: ../pidgin/gtkimhtmltoolbar.c:1287
 msgid "_Horizontal rule"
-msgstr "_Vízszintes szabály"
+msgstr "_Vízszintes elválasztó"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1309
+msgid "_Smile!"
+msgstr "Hang_ulatjel"
 
 #: ../pidgin/gtklog.c:293
 #, c-format
@@ -15634,8 +15939,7 @@
 msgid ""
 "Are you sure you want to permanently delete the system log which started at %"
 "s?"
-msgstr ""
-"Biztos, hogy törölni akarja a(z) %s időpontban kezdődött rendszernaplót?"
+msgstr "Biztos, hogy törölni akarja a(z) %s időpontban kezdődött rendszernaplót?"
 
 #: ../pidgin/gtklog.c:453
 #, c-format
@@ -15645,8 +15949,7 @@
 #: ../pidgin/gtklog.c:456
 #, c-format
 msgid "<span size='larger' weight='bold'>Conversation with %s on %s</span>"
-msgstr ""
-"<span size='larger' weight='bold'>Társalgás ezzel: %s, ekkor: %s</span>"
+msgstr "<span size='larger' weight='bold'>Társalgás ezzel: %s, ekkor: %s</span>"
 
 #: ../pidgin/gtklog.c:503
 msgid "%B %Y"
@@ -15669,8 +15972,7 @@
 "üzenet naplózása\" tulajdonság be van állítva."
 
 #: ../pidgin/gtklog.c:557
-msgid ""
-"Chats will only be logged if the \"Log all chats\" preference is enabled."
+msgid "Chats will only be logged if the \"Log all chats\" preference is enabled."
 msgstr ""
 "A csevegések csak akkor lesznek naplózva, ha az \"Összes csevegés naplózása"
 "\" tulajdonság be van állítva."
@@ -15688,17 +15990,17 @@
 msgid "Total log size:"
 msgstr "Teljes naplóméret:"
 
-#: ../pidgin/gtklog.c:709
+#: ../pidgin/gtklog.c:714
 #, c-format
 msgid "Conversations in %s"
 msgstr "Társalgások ezen: %s"
 
-#: ../pidgin/gtklog.c:717 ../pidgin/gtklog.c:779
+#: ../pidgin/gtklog.c:722 ../pidgin/gtklog.c:793
 #, c-format
 msgid "Conversations with %s"
 msgstr "Társalgások a következővel: %s"
 
-#: ../pidgin/gtklog.c:804
+#: ../pidgin/gtklog.c:823
 msgid "System Log"
 msgstr "Rendszernapló"
 
@@ -15708,7 +16010,7 @@
 msgstr "%s %s. Próbálja a \"%s -h\" parancsot további információkért.\n"
 
 #: ../pidgin/gtkmain.c:388
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s %s\n"
 "Usage: %s [OPTION]...\n"
@@ -15720,6 +16022,7 @@
 "  -n, --nologin       don't automatically login\n"
 "  -l, --login[=NAME]  automatically login (optional argument NAME specifies\n"
 "                      account(s) to use, separated by commas)\n"
+"  --display=DISPLAY   X display to use\n"
 "  -v, --version       display the current version and exit\n"
 msgstr ""
 "%s %s\n"
@@ -15732,12 +16035,13 @@
 "  -n, --nologin       ne jelentkezzen be automatikusan\n"
 "  -l, --login[=NÉV]   automatikus bejelentkezés (a NÉV paraméter megadja a\n"
 "                      használandó fiókok vesszőkkel tagolt listáját)\n"
+"  --display=KÉPERNYŐ  a használandó X megjelenítő\n"
 "  -v, --version       az aktuális verzió megjelenítése és kilépés\n"
 
-#: ../pidgin/gtkmain.c:512
-#, fuzzy, c-format
-msgid ""
-"%s has segfaulted and attempted to dump a core file.\n"
+#: ../pidgin/gtkmain.c:516
+#, c-format
+msgid ""
+"%s %s has segfaulted and attempted to dump a core file.\n"
 "This is a bug in the software and has happened through\n"
 "no fault of your own.\n"
 "\n"
@@ -15755,7 +16059,7 @@
 "on other protocols is at\n"
 "%swiki/DeveloperPages\n"
 msgstr ""
-"A %s összeomlott és megpróbált kiírni egy magfájlt.\n"
+"A %s %s összeomlott és megpróbált kiírni egy magfájlt.\n"
 "Ez a szoftver és nem az Ön hibája miatt történt.\n"
 "\n"
 "Ha ismételten elő tudja állítani az összeomlást, akkor\n"
@@ -15776,50 +16080,49 @@
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
-#: ../pidgin/gtkmain.c:699 ../pidgin/pidgin.h:51
+#: ../pidgin/gtkmain.c:706 ../pidgin/pidgin.h:51
 msgid "Pidgin"
 msgstr "Pidgin"
 
-#: ../pidgin/gtknotify.c:349
+#: ../pidgin/gtknotify.c:350
 msgid "Open All Messages"
 msgstr "Összes üzenet megnyitása"
 
-#: ../pidgin/gtknotify.c:402
+#: ../pidgin/gtknotify.c:403
 msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>"
 msgstr "<span weight=\"bold\" size=\"larger\">Levele érkezett!</span>"
 
-#: ../pidgin/gtknotify.c:540
+#: ../pidgin/gtknotify.c:546
 #, c-format
 msgid "%s has %d new message."
 msgid_plural "%s has %d new messages."
 msgstr[0] "%s %d új üzenetet kapott."
 msgstr[1] "%s %d új üzenetet kapott."
 
-#: ../pidgin/gtknotify.c:564
-#, fuzzy, c-format
-msgid "<b>You have %d new e-mail.</b>"
-msgid_plural "<b>You have %d new e-mails.</b>"
-msgstr[0] "<b>%d új e-mailje érkezett.</b>"
-msgstr[1] "<b>%d új e-mailje érkezett.</b>"
-
-#: ../pidgin/gtknotify.c:989
+#: ../pidgin/gtknotify.c:570
+#, c-format
+msgid "<b>%d new e-mail.</b>"
+msgid_plural "<b>%d new e-mails.</b>"
+msgstr[0] "<b>%d új e-mail.</b>"
+msgstr[1] "<b>%d új e-mail.</b>"
+
+#: ../pidgin/gtknotify.c:998
 #, c-format
 msgid "The browser command \"%s\" is invalid."
 msgstr "A(z) \"%s\" böngészőparancs érvénytelen."
 
-#: ../pidgin/gtknotify.c:991 ../pidgin/gtknotify.c:1003
-#: ../pidgin/gtknotify.c:1016 ../pidgin/gtknotify.c:1144
+#: ../pidgin/gtknotify.c:1000 ../pidgin/gtknotify.c:1012
+#: ../pidgin/gtknotify.c:1025 ../pidgin/gtknotify.c:1153
 msgid "Unable to open URL"
 msgstr "Az URL megnyitása sikertelen"
 
-#: ../pidgin/gtknotify.c:1001 ../pidgin/gtknotify.c:1014
+#: ../pidgin/gtknotify.c:1010 ../pidgin/gtknotify.c:1023
 #, c-format
 msgid "Error launching \"%s\": %s"
 msgstr "Hiba \"%s\" indításakor: %s"
 
-#: ../pidgin/gtknotify.c:1145
-msgid ""
-"The 'Manual' browser command has been chosen, but no command has been set."
+#: ../pidgin/gtknotify.c:1154
+msgid "The 'Manual' browser command has been chosen, but no command has been set."
 msgstr "A \"Kézi\" böngészőparancsot választotta, de nem adott meg parancsot."
 
 #: ../pidgin/gtkplugin.c:265
@@ -15834,7 +16137,17 @@
 msgid "Unload Plugins"
 msgstr "Bővítmények eltávolítása"
 
-#: ../pidgin/gtkplugin.c:400
+#: ../pidgin/gtkplugin.c:308
+msgid "Could not unload plugin"
+msgstr "Nem sikerült eltávolítani a bővítményt"
+
+#: ../pidgin/gtkplugin.c:309
+msgid ""
+"The plugin could not be unloaded now, but will be disabled at the next "
+"startup."
+msgstr "A bővítmény most nem távolítható el, de a következő indítás után letiltásra kerül."
+
+#: ../pidgin/gtkplugin.c:417
 #, c-format
 msgid ""
 "%s%s<span weight=\"bold\">Written by:</span>\t%s\n"
@@ -15845,7 +16158,7 @@
 "<span weight=\"bold\">Webcím:</span>\t\t%s\n"
 "<span weight=\"bold\">Fájlnév:</span>\t\t%s"
 
-#: ../pidgin/gtkplugin.c:410
+#: ../pidgin/gtkplugin.c:427
 #, c-format
 msgid ""
 "%s\n"
@@ -15856,11 +16169,11 @@
 "<span foreground=\"#ff0000\" weight=\"bold\">Hiba: %s\n"
 "Keressen frissítést a bővítmény webhelyén.</span>"
 
-#: ../pidgin/gtkplugin.c:536
+#: ../pidgin/gtkplugin.c:562
 msgid "Configure Pl_ugin"
 msgstr "Bő_vítmény beállítása"
 
-#: ../pidgin/gtkplugin.c:599
+#: ../pidgin/gtkplugin.c:625
 msgid "<b>Plugin Details</b>"
 msgstr "<b>Bővítmény részletei</b>"
 
@@ -15869,95 +16182,95 @@
 msgstr "Fájl kiválasztása"
 
 #. Create the "Pounce on Whom" frame.
-#: ../pidgin/gtkpounce.c:532
+#: ../pidgin/gtkpounce.c:547
 msgid "Pounce on Whom"
 msgstr "Kinél figyelmeztet"
 
-#: ../pidgin/gtkpounce.c:559
+#: ../pidgin/gtkpounce.c:574
 msgid "_Buddy name:"
 msgstr "_Partner neve:"
 
-#: ../pidgin/gtkpounce.c:593
+#: ../pidgin/gtkpounce.c:608
 msgid "Si_gns on"
 msgstr "Be_jelentkezik"
 
-#: ../pidgin/gtkpounce.c:595
+#: ../pidgin/gtkpounce.c:610
 msgid "Signs o_ff"
 msgstr "_Kijelentkezik"
 
-#: ../pidgin/gtkpounce.c:597
+#: ../pidgin/gtkpounce.c:612
 msgid "Goes a_way"
 msgstr "A partner _elmegy"
 
-#: ../pidgin/gtkpounce.c:599
+#: ../pidgin/gtkpounce.c:614
 msgid "Ret_urns from away"
 msgstr "Visszaté_r távollétből"
 
-#: ../pidgin/gtkpounce.c:601
+#: ../pidgin/gtkpounce.c:616
 msgid "Becomes _idle"
 msgstr "_Inaktív lesz"
 
-#: ../pidgin/gtkpounce.c:603
+#: ../pidgin/gtkpounce.c:618
 msgid "Is no longer i_dle"
 msgstr "_Már nem inaktív"
 
-#: ../pidgin/gtkpounce.c:605
+#: ../pidgin/gtkpounce.c:620
 msgid "Starts _typing"
 msgstr "Elkez_d gépelni"
 
-#: ../pidgin/gtkpounce.c:607
+#: ../pidgin/gtkpounce.c:622
 msgid "P_auses while typing"
 msgstr "_Felfüggeszti a gépelést"
 
-#: ../pidgin/gtkpounce.c:609
+#: ../pidgin/gtkpounce.c:624
 msgid "Stops t_yping"
 msgstr "_Abbahagyja a gépelést"
 
-#: ../pidgin/gtkpounce.c:611
+#: ../pidgin/gtkpounce.c:626
 msgid "Sends a _message"
 msgstr "Ü_zenetet küld"
 
-#: ../pidgin/gtkpounce.c:654
+#: ../pidgin/gtkpounce.c:669
 msgid "Ope_n an IM window"
 msgstr "Azonnali üzenőablak _megnyitása"
 
-#: ../pidgin/gtkpounce.c:656
+#: ../pidgin/gtkpounce.c:671
 msgid "_Pop up a notification"
 msgstr "Értesítés _megjelenítése"
 
-#: ../pidgin/gtkpounce.c:658
+#: ../pidgin/gtkpounce.c:673
 msgid "Send a _message"
 msgstr "Ü_zenet küldése"
 
-#: ../pidgin/gtkpounce.c:660
+#: ../pidgin/gtkpounce.c:675
 msgid "E_xecute a command"
 msgstr "Paran_cs végrehajtása"
 
-#: ../pidgin/gtkpounce.c:662
+#: ../pidgin/gtkpounce.c:677
 msgid "P_lay a sound"
 msgstr "Hang _lejátszása"
 
-#: ../pidgin/gtkpounce.c:668
+#: ../pidgin/gtkpounce.c:683
 msgid "Brows_e..."
 msgstr "_Tallózás..."
 
-#: ../pidgin/gtkpounce.c:670
+#: ../pidgin/gtkpounce.c:685
 msgid "Br_owse..."
 msgstr "_Tallózás..."
 
-#: ../pidgin/gtkpounce.c:671
+#: ../pidgin/gtkpounce.c:686
 msgid "Pre_view"
 msgstr "_Előnézet"
 
-#: ../pidgin/gtkpounce.c:798
+#: ../pidgin/gtkpounce.c:818
 msgid "P_ounce only when my status is not Available"
 msgstr "_Csak akkor figyelmeztet, ha az állapotom nem \"Elérhető\""
 
-#: ../pidgin/gtkpounce.c:803
+#: ../pidgin/gtkpounce.c:823
 msgid "_Recurring"
 msgstr "_Ismétlődő"
 
-#: ../pidgin/gtkpounce.c:1246
+#: ../pidgin/gtkpounce.c:1266
 msgid "Pounce Target"
 msgstr "Figyelmeztetés címzettje"
 
@@ -15974,7 +16287,7 @@
 msgid "Install Theme"
 msgstr "Téma telepítése"
 
-#: ../pidgin/gtkprefs.c:697
+#: ../pidgin/gtkprefs.c:698
 msgid ""
 "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."
@@ -15982,15 +16295,15 @@
 "Válassza ki a használni kívánt hangulatjel-témát az alábbi listából. Új "
 "témák a témalistába dobással telepíthetők."
 
-#: ../pidgin/gtkprefs.c:732
+#: ../pidgin/gtkprefs.c:733
 msgid "Icon"
 msgstr "Ikon"
 
-#: ../pidgin/gtkprefs.c:894
+#: ../pidgin/gtkprefs.c:895
 msgid "System Tray Icon"
 msgstr "Rendszertálca-ikon"
 
-#: ../pidgin/gtkprefs.c:895
+#: ../pidgin/gtkprefs.c:896
 msgid "_Show system tray icon:"
 msgstr "_Rendszertálca-ikon megjelenítése:"
 
@@ -15998,116 +16311,120 @@
 msgid "On unread messages"
 msgstr "Olvasatlan üzenetek esetén"
 
-#: ../pidgin/gtkprefs.c:904
+#: ../pidgin/gtkprefs.c:905
 msgid "Conversation Window Hiding"
 msgstr "Társalgási ablak elrejtése"
 
-#: ../pidgin/gtkprefs.c:905
+#: ../pidgin/gtkprefs.c:906
 msgid "_Hide new IM conversations:"
 msgstr "Új társal_gások elrejtése:"
 
-#: ../pidgin/gtkprefs.c:908 ../pidgin/gtkprefs.c:1944
+#: ../pidgin/gtkprefs.c:909 ../pidgin/gtkprefs.c:2045
 msgid "When away"
 msgstr "Ha távol vagyok"
 
 #. All the tab options!
-#: ../pidgin/gtkprefs.c:916
+#: ../pidgin/gtkprefs.c:917
 msgid "Tabs"
 msgstr "Lapok"
 
-#: ../pidgin/gtkprefs.c:918
+#: ../pidgin/gtkprefs.c:919
 msgid "Show IMs and chats in _tabbed windows"
 msgstr "Üzenetek és csevegések megjelenítése _lapokkal ellátott ablakokban"
 
-#: ../pidgin/gtkprefs.c:932
+#: ../pidgin/gtkprefs.c:933
 msgid "Show close b_utton on tabs"
 msgstr "_Bezárás gomb megjelenítése a lapokon"
 
-#: ../pidgin/gtkprefs.c:935
+#: ../pidgin/gtkprefs.c:936
 msgid "_Placement:"
 msgstr "_Elhelyezés:"
 
-#: ../pidgin/gtkprefs.c:937
+#: ../pidgin/gtkprefs.c:938
 msgid "Top"
 msgstr "Felül"
 
-#: ../pidgin/gtkprefs.c:938
+#: ../pidgin/gtkprefs.c:939
 msgid "Bottom"
 msgstr "Alul"
 
-#: ../pidgin/gtkprefs.c:939
+#: ../pidgin/gtkprefs.c:940
 msgid "Left"
 msgstr "Bal oldalon"
 
-#: ../pidgin/gtkprefs.c:940
+#: ../pidgin/gtkprefs.c:941
 msgid "Right"
 msgstr "Jobb oldalon"
 
-#: ../pidgin/gtkprefs.c:942
+#: ../pidgin/gtkprefs.c:943
 msgid "Left Vertical"
 msgstr "Balra függőlegesen"
 
-#: ../pidgin/gtkprefs.c:943
+#: ../pidgin/gtkprefs.c:944
 msgid "Right Vertical"
 msgstr "Jobbra függőlegesen"
 
-#: ../pidgin/gtkprefs.c:950
+#: ../pidgin/gtkprefs.c:951
 msgid "N_ew conversations:"
 msgstr "Új _társalgások:"
 
-#: ../pidgin/gtkprefs.c:995
+#: ../pidgin/gtkprefs.c:997
 msgid "Show _formatting on incoming messages"
 msgstr "_Formázás mutatása bejövő üzeneteknél"
 
-#: ../pidgin/gtkprefs.c:998
+#: ../pidgin/gtkprefs.c:999
+msgid "Close IMs immediately when the tab is closed"
+msgstr "Üzenetváltások bezárása a lap bezárása után azonnal"
+
+#: ../pidgin/gtkprefs.c:1002
 msgid "Show _detailed information"
 msgstr "_Részletes információk megjelenítése"
 
-#: ../pidgin/gtkprefs.c:1000
+#: ../pidgin/gtkprefs.c:1004
 msgid "Enable buddy ic_on animation"
 msgstr "Partnerikon-a_nimáció engedélyezése"
 
-#: ../pidgin/gtkprefs.c:1007
+#: ../pidgin/gtkprefs.c:1011
 msgid "_Notify buddies that you are typing to them"
 msgstr "Partnerek figyelmez_tetése, ha nekik gépel"
 
-#: ../pidgin/gtkprefs.c:1010
+#: ../pidgin/gtkprefs.c:1014
 msgid "Highlight _misspelled words"
 msgstr "_Helytelenül írt szavak kiemelése"
 
-#: ../pidgin/gtkprefs.c:1014
+#: ../pidgin/gtkprefs.c:1018
 msgid "Use smooth-scrolling"
 msgstr "Finom görgetés használata"
 
-#: ../pidgin/gtkprefs.c:1017
+#: ../pidgin/gtkprefs.c:1021
 msgid "F_lash window when IMs are received"
 msgstr "_Villanjon az ablak új üzenetek fogadásakor"
 
-#: ../pidgin/gtkprefs.c:1019
+#: ../pidgin/gtkprefs.c:1023
 msgid "Minimi_ze new conversation windows"
 msgstr "Új társalgási ablakok _minimalizálása"
 
-#: ../pidgin/gtkprefs.c:1023
-msgid "Font"
-msgstr "Betűkészlet"
-
-#: ../pidgin/gtkprefs.c:1025
-msgid "Use document font from _theme"
-msgstr "A _téma dokumentum-betűkészletének használata"
-
 #: ../pidgin/gtkprefs.c:1027
+msgid "Font"
+msgstr "Betűkészlet"
+
+#: ../pidgin/gtkprefs.c:1029
+msgid "Use document font from _theme"
+msgstr "A _téma dokumentum-betűkészletének használata"
+
+#: ../pidgin/gtkprefs.c:1031
 msgid "Use font from _theme"
 msgstr "A téma _betűkészletének használata"
 
-#: ../pidgin/gtkprefs.c:1029
+#: ../pidgin/gtkprefs.c:1033
 msgid "Conversation _font:"
 msgstr "_Társalgás betűkészlete:"
 
-#: ../pidgin/gtkprefs.c:1043
+#: ../pidgin/gtkprefs.c:1047
 msgid "Default Formatting"
 msgstr "Alapértelmezett formázás"
 
-#: ../pidgin/gtkprefs.c:1062
+#: ../pidgin/gtkprefs.c:1066
 msgid ""
 "This is how your outgoing message text will appear when you use protocols "
 "that support formatting."
@@ -16115,119 +16432,155 @@
 "Így fog kinézni a kimenő üzenet szövege, ha olyan protokollokat használ, "
 "amelyek támogatják a formázást."
 
-#: ../pidgin/gtkprefs.c:1128
+#: ../pidgin/gtkprefs.c:1126
+msgid "Cannot start proxy configuration program."
+msgstr "Nem indítható a proxykonfigurációs program."
+
+#: ../pidgin/gtkprefs.c:1138
+msgid "Cannot start browser configuration program."
+msgstr "Nem indítható a böngészőkonfigurációs program."
+
+#: ../pidgin/gtkprefs.c:1158
 msgid "ST_UN server:"
 msgstr "ST_UN kiszolgáló:"
 
-#: ../pidgin/gtkprefs.c:1140
+#: ../pidgin/gtkprefs.c:1170
 msgid "<span style=\"italic\">Example: stunserver.org</span>"
 msgstr "<span style=\"italic\">Például: stunserver.org</span>"
 
-#: ../pidgin/gtkprefs.c:1144
+#: ../pidgin/gtkprefs.c:1174
 msgid "_Autodetect IP address"
 msgstr "_IP cím automatikus felismerése"
 
-#: ../pidgin/gtkprefs.c:1153
+#: ../pidgin/gtkprefs.c:1183
 msgid "Public _IP:"
 msgstr "_Nyilvános IP:"
 
-#: ../pidgin/gtkprefs.c:1182
+#: ../pidgin/gtkprefs.c:1214
 msgid "Ports"
 msgstr "Portok"
 
-#: ../pidgin/gtkprefs.c:1185
+#: ../pidgin/gtkprefs.c:1217
 msgid "_Manually specify range of ports to listen on"
 msgstr "A figyelendő porttartomány _kézi megadása"
 
-#: ../pidgin/gtkprefs.c:1188
+#: ../pidgin/gtkprefs.c:1220
 msgid "_Start port:"
 msgstr "_Első port:"
 
-#: ../pidgin/gtkprefs.c:1195
+#: ../pidgin/gtkprefs.c:1227
 msgid "_End port:"
 msgstr "_Utolsó port:"
 
-#: ../pidgin/gtkprefs.c:1203
-msgid "Proxy Server"
-msgstr "Proxy-kiszolgáló"
-
-#: ../pidgin/gtkprefs.c:1207
-msgid "No proxy"
-msgstr "Nincs Proxy"
+#: ../pidgin/gtkprefs.c:1235
+msgid "Proxy Server &amp; Browser"
+msgstr "Proxy-kiszolgáló és böngésző"
+
+#: ../pidgin/gtkprefs.c:1243
+msgid "<b>Proxy configuration program was not found.</b>"
+msgstr "<b>A proxykonfigurációs program nem található.</b>"
+
+#: ../pidgin/gtkprefs.c:1251
+msgid "<b>Browser configuration program was not found.</b>"
+msgstr "<b>A böngészőkonfigurációs program nem található.</b>"
+
+#: ../pidgin/gtkprefs.c:1256
+msgid ""
+"Proxy & Browser preferences are configured\n"
+"in GNOME Preferences"
+msgstr ""
+"A proxy és böngésző a GNOME beállításaiban\n"
+"vannak konfigurálva"
 
 #: ../pidgin/gtkprefs.c:1263
+msgid "Configure _Proxy"
+msgstr "_Proxy beállítása"
+
+#: ../pidgin/gtkprefs.c:1268
+msgid "Configure _Browser"
+msgstr "Bö_ngésző beállítása"
+
+#: ../pidgin/gtkprefs.c:1274
+msgid "Proxy Server"
+msgstr "Proxy-kiszolgáló"
+
+#: ../pidgin/gtkprefs.c:1279
+msgid "No proxy"
+msgstr "Nincs Proxy"
+
+#: ../pidgin/gtkprefs.c:1335
 msgid "_User:"
 msgstr "_Felhasználó:"
 
-#: ../pidgin/gtkprefs.c:1328
+#: ../pidgin/gtkprefs.c:1423
 msgid "Seamonkey"
 msgstr "Seamonkey"
 
-#: ../pidgin/gtkprefs.c:1329
+#: ../pidgin/gtkprefs.c:1424
 msgid "Opera"
 msgstr "Opera"
 
-#: ../pidgin/gtkprefs.c:1330
+#: ../pidgin/gtkprefs.c:1425
 msgid "Netscape"
 msgstr "Netscape"
 
-#: ../pidgin/gtkprefs.c:1331
+#: ../pidgin/gtkprefs.c:1426
 msgid "Mozilla"
 msgstr "Mozilla"
 
-#: ../pidgin/gtkprefs.c:1332
+#: ../pidgin/gtkprefs.c:1427
 msgid "Konqueror"
 msgstr "Konqueror"
 
-#: ../pidgin/gtkprefs.c:1333
+#: ../pidgin/gtkprefs.c:1428
 msgid "GNOME Default"
 msgstr "GNOME alapértelmezés"
 
-#: ../pidgin/gtkprefs.c:1334
+#: ../pidgin/gtkprefs.c:1429
 msgid "Galeon"
 msgstr "Galeon"
 
-#: ../pidgin/gtkprefs.c:1335
+#: ../pidgin/gtkprefs.c:1430
 msgid "Firefox"
 msgstr "Firefox"
 
-#: ../pidgin/gtkprefs.c:1336
+#: ../pidgin/gtkprefs.c:1431
 msgid "Firebird"
 msgstr "Firebird"
 
-#: ../pidgin/gtkprefs.c:1337
+#: ../pidgin/gtkprefs.c:1432
 msgid "Epiphany"
 msgstr "Epiphany"
 
-#: ../pidgin/gtkprefs.c:1346
+#: ../pidgin/gtkprefs.c:1441
 msgid "Manual"
 msgstr "Egyéni"
 
-#: ../pidgin/gtkprefs.c:1399
+#: ../pidgin/gtkprefs.c:1494
 msgid "Browser Selection"
 msgstr "Böngészőválasztás"
 
-#: ../pidgin/gtkprefs.c:1403
+#: ../pidgin/gtkprefs.c:1498
 msgid "_Browser:"
 msgstr "_Böngésző:"
 
-#: ../pidgin/gtkprefs.c:1411
+#: ../pidgin/gtkprefs.c:1506
 msgid "_Open link in:"
 msgstr "Hivatk_ozás megnyitása:"
 
-#: ../pidgin/gtkprefs.c:1413
+#: ../pidgin/gtkprefs.c:1508
 msgid "Browser default"
 msgstr "Alapértelmezett böngésző"
 
-#: ../pidgin/gtkprefs.c:1414
+#: ../pidgin/gtkprefs.c:1509
 msgid "Existing window"
 msgstr "Létező ablak"
 
-#: ../pidgin/gtkprefs.c:1416
+#: ../pidgin/gtkprefs.c:1511
 msgid "New tab"
 msgstr "Új lap"
 
-#: ../pidgin/gtkprefs.c:1430
+#: ../pidgin/gtkprefs.c:1525
 #, c-format
 msgid ""
 "_Manual:\n"
@@ -16236,69 +16589,69 @@
 "_Kézi:\n"
 "(%s az URL-hez)"
 
-#: ../pidgin/gtkprefs.c:1470
+#: ../pidgin/gtkprefs.c:1566
 msgid "Log _format:"
 msgstr "Napló_formátum:"
 
-#: ../pidgin/gtkprefs.c:1475
+#: ../pidgin/gtkprefs.c:1571
 msgid "Log all _instant messages"
 msgstr "Összes azonnali üzenet na_plózása"
 
-#: ../pidgin/gtkprefs.c:1477
+#: ../pidgin/gtkprefs.c:1573
 msgid "Log all c_hats"
 msgstr "Összes _csevegés naplózása"
 
-#: ../pidgin/gtkprefs.c:1479
+#: ../pidgin/gtkprefs.c:1575
 msgid "Log all _status changes to system log"
 msgstr "Összes állapot_változás naplózása a rendszernaplóba"
 
-#: ../pidgin/gtkprefs.c:1625
+#: ../pidgin/gtkprefs.c:1725
 msgid "Sound Selection"
 msgstr "Hang kiválasztása"
 
-#: ../pidgin/gtkprefs.c:1635
+#: ../pidgin/gtkprefs.c:1735
 #, c-format
 msgid "Quietest"
 msgstr "Leghalkabb"
 
-#: ../pidgin/gtkprefs.c:1637
+#: ../pidgin/gtkprefs.c:1737
 #, c-format
 msgid "Quieter"
 msgstr "Halkabb"
 
-#: ../pidgin/gtkprefs.c:1639
+#: ../pidgin/gtkprefs.c:1739
 #, c-format
 msgid "Quiet"
 msgstr "Halk"
 
-#: ../pidgin/gtkprefs.c:1643
+#: ../pidgin/gtkprefs.c:1743
 #, c-format
 msgid "Loud"
 msgstr "Hangos"
 
-#: ../pidgin/gtkprefs.c:1645
+#: ../pidgin/gtkprefs.c:1745
 #, c-format
 msgid "Louder"
 msgstr "Hangosabb"
 
-#: ../pidgin/gtkprefs.c:1647
+#: ../pidgin/gtkprefs.c:1747
 #, c-format
 msgid "Loudest"
 msgstr "Leghangosabb"
 
-#: ../pidgin/gtkprefs.c:1713
+#: ../pidgin/gtkprefs.c:1813
 msgid "_Method:"
 msgstr "Hang_rendszer kiválasztása:"
 
-#: ../pidgin/gtkprefs.c:1715
+#: ../pidgin/gtkprefs.c:1815
 msgid "Console beep"
 msgstr "Rendszer-hangszóró"
 
-#: ../pidgin/gtkprefs.c:1722
+#: ../pidgin/gtkprefs.c:1822
 msgid "No sounds"
 msgstr "Nincsenek hangok"
 
-#: ../pidgin/gtkprefs.c:1730
+#: ../pidgin/gtkprefs.c:1830
 #, c-format
 msgid ""
 "Sound c_ommand:\n"
@@ -16307,81 +16660,81 @@
 "Hanglejátszó _parancs:\n"
 "(%s fájlnév megadásához)"
 
-#: ../pidgin/gtkprefs.c:1757
+#: ../pidgin/gtkprefs.c:1857
 msgid "Sounds when conversation has _focus"
 msgstr "Hangok lejátszása, ha a társalgás ablaka a_ktív"
 
-#: ../pidgin/gtkprefs.c:1759
+#: ../pidgin/gtkprefs.c:1859
 msgid "Enable sounds:"
 msgstr "Hangok engedélyezése:"
 
-#: ../pidgin/gtkprefs.c:1770
+#: ../pidgin/gtkprefs.c:1870
 msgid "Volume:"
 msgstr "Hangerő:"
 
-#: ../pidgin/gtkprefs.c:1850
+#: ../pidgin/gtkprefs.c:1950
 msgid "Play"
 msgstr "Lejátszás"
 
-#: ../pidgin/gtkprefs.c:1927
+#: ../pidgin/gtkprefs.c:2028
 msgid "_Report idle time:"
 msgstr "_Inaktivitás idejének jelentése:"
 
-#: ../pidgin/gtkprefs.c:1932
+#: ../pidgin/gtkprefs.c:2033
 msgid "Based on keyboard or mouse use"
 msgstr "Billentyűzet vagy egér használata alapján"
 
-#: ../pidgin/gtkprefs.c:1941
+#: ../pidgin/gtkprefs.c:2042
 msgid "_Auto-reply:"
 msgstr "_Automatikus válasz:"
 
-#: ../pidgin/gtkprefs.c:1945
+#: ../pidgin/gtkprefs.c:2046
 msgid "When both away and idle"
 msgstr "Ha távol van és inaktív"
 
 #. Auto-away stuff
-#: ../pidgin/gtkprefs.c:1951
+#: ../pidgin/gtkprefs.c:2052
 msgid "Auto-away"
 msgstr "Automatikus távollét"
 
-#: ../pidgin/gtkprefs.c:1953
+#: ../pidgin/gtkprefs.c:2054
 msgid "Change status when _idle"
 msgstr "Állapot módosítása, _ha inaktív"
 
-#: ../pidgin/gtkprefs.c:1957
+#: ../pidgin/gtkprefs.c:2058
 msgid "_Minutes before becoming idle:"
 msgstr "Üresjárat ennyi _perc után:"
 
-#: ../pidgin/gtkprefs.c:1965
+#: ../pidgin/gtkprefs.c:2066
 msgid "Change _status to:"
 msgstr "Állap_ot megváltoztatása a következőre:"
 
 #. Signon status stuff
-#: ../pidgin/gtkprefs.c:1986
+#: ../pidgin/gtkprefs.c:2087
 msgid "Status at Startup"
 msgstr "Állapot induláskor"
 
-#: ../pidgin/gtkprefs.c:1988
+#: ../pidgin/gtkprefs.c:2089
 msgid "Use status from last _exit at startup"
 msgstr "Az utolsó kilé_péskor érvényes állapot használata induláskor"
 
-#: ../pidgin/gtkprefs.c:1994
+#: ../pidgin/gtkprefs.c:2095
 msgid "Status to a_pply at startup:"
 msgstr "In_dításkor alkalmazandó állapot:"
 
-#: ../pidgin/gtkprefs.c:2032
+#: ../pidgin/gtkprefs.c:2134
 msgid "Interface"
 msgstr "Felület"
 
-#: ../pidgin/gtkprefs.c:2034
+#: ../pidgin/gtkprefs.c:2136
 msgid "Smiley Themes"
 msgstr "Hangulatjel-témák"
 
-#: ../pidgin/gtkprefs.c:2041
+#: ../pidgin/gtkprefs.c:2143
 msgid "Browser"
 msgstr "Böngésző"
 
-#: ../pidgin/gtkprefs.c:2045
+#: ../pidgin/gtkprefs.c:2147
 msgid "Status / Idle"
 msgstr "Állapot / Inaktív"
 
@@ -16405,90 +16758,90 @@
 msgid "Block only the users below"
 msgstr "Csak a következő felhasználók letiltása:"
 
-#: ../pidgin/gtkprivacy.c:370
+#: ../pidgin/gtkprivacy.c:372
 msgid "Privacy"
 msgstr "Magánszféra"
 
-#: ../pidgin/gtkprivacy.c:382
+#: ../pidgin/gtkprivacy.c:384
 msgid "Changes to privacy settings take effect immediately."
 msgstr "A magánszféra beállításainak módosításai azonnal életbe lépnek."
 
 #. "Set privacy for:" label
-#: ../pidgin/gtkprivacy.c:394
+#: ../pidgin/gtkprivacy.c:396
 msgid "Set privacy for:"
 msgstr "Magánszféra beállításai ehhez:"
 
-#: ../pidgin/gtkprivacy.c:557 ../pidgin/gtkprivacy.c:574
+#: ../pidgin/gtkprivacy.c:559 ../pidgin/gtkprivacy.c:576
 msgid "Permit User"
 msgstr "Felhasználó engedélyezése"
 
-#: ../pidgin/gtkprivacy.c:558
+#: ../pidgin/gtkprivacy.c:560
 msgid "Type a user you permit to contact you."
 msgstr "Adjon meg egy felhasználót, aki kapcsolatba léphet Önnel."
 
-#: ../pidgin/gtkprivacy.c:559
+#: ../pidgin/gtkprivacy.c:561
 msgid "Please enter the name of the user you wish to be able to contact you."
 msgstr ""
 "Adja meg egy felhasználó nevét, akinek meg szeretné engedni, hogy "
 "kapcsolatba lépjen Önnel."
 
-#: ../pidgin/gtkprivacy.c:562 ../pidgin/gtkprivacy.c:578
+#: ../pidgin/gtkprivacy.c:564 ../pidgin/gtkprivacy.c:580
 msgid "_Permit"
 msgstr "_Engedélyezés"
 
-#: ../pidgin/gtkprivacy.c:568
+#: ../pidgin/gtkprivacy.c:570
 #, c-format
 msgid "Allow %s to contact you?"
 msgstr "Megengedi, hogy %s kapcsolatba lépjen Önnel?"
 
-#: ../pidgin/gtkprivacy.c:570
+#: ../pidgin/gtkprivacy.c:572
 #, c-format
 msgid "Are you sure you wish to allow %s to contact you?"
 msgstr "Biztosan megengedi, hogy %s kapcsolatba lépjen Önnel?"
 
-#: ../pidgin/gtkprivacy.c:599 ../pidgin/gtkprivacy.c:613
+#: ../pidgin/gtkprivacy.c:601 ../pidgin/gtkprivacy.c:615
 msgid "Block User"
 msgstr "Felhasználó tiltása"
 
-#: ../pidgin/gtkprivacy.c:600
+#: ../pidgin/gtkprivacy.c:602
 msgid "Type a user to block."
 msgstr "Adjon meg egy letiltandó felhasználót."
 
-#: ../pidgin/gtkprivacy.c:601
+#: ../pidgin/gtkprivacy.c:603
 msgid "Please enter the name of the user you wish to block."
 msgstr "Adja meg a letiltani kívánt felhasználó nevét."
 
-#: ../pidgin/gtkprivacy.c:609
+#: ../pidgin/gtkprivacy.c:611
 #, c-format
 msgid "Block %s?"
 msgstr "Letiltja a következőt: %s?"
 
-#: ../pidgin/gtkprivacy.c:611
+#: ../pidgin/gtkprivacy.c:613
 #, c-format
 msgid "Are you sure you want to block %s?"
 msgstr "Biztosan le akarja tiltani %s felhasználót?"
 
-#: ../pidgin/gtkrequest.c:272
+#: ../pidgin/gtkrequest.c:322
 msgid "Apply"
 msgstr "Alkalmazás"
 
-#: ../pidgin/gtkrequest.c:1507
+#: ../pidgin/gtkrequest.c:1651
 msgid "That file already exists"
 msgstr "Ez a fájl már létezik"
 
-#: ../pidgin/gtkrequest.c:1508
+#: ../pidgin/gtkrequest.c:1652
 msgid "Would you like to overwrite it?"
 msgstr "Szeretné felülírni?"
 
-#: ../pidgin/gtkrequest.c:1511
+#: ../pidgin/gtkrequest.c:1655
 msgid "Overwrite"
 msgstr "Felülírás"
 
-#: ../pidgin/gtkrequest.c:1512
+#: ../pidgin/gtkrequest.c:1656
 msgid "Choose New Name"
 msgstr "Új név választása"
 
-#: ../pidgin/gtkrequest.c:1650 ../pidgin/gtkrequest.c:1664
+#: ../pidgin/gtkrequest.c:1797 ../pidgin/gtkrequest.c:1811
 msgid "Select Folder..."
 msgstr "Válasszon mappát..."
 
@@ -16512,7 +16865,7 @@
 msgstr "Biztos, hogy törölni akarja a kijelölt mentett állapotokat?"
 
 #. Use button
-#: ../pidgin/gtksavedstatuses.c:620 ../pidgin/gtksavedstatuses.c:1266
+#: ../pidgin/gtksavedstatuses.c:620 ../pidgin/gtksavedstatuses.c:1273
 msgid "_Use"
 msgstr "_Használat"
 
@@ -16520,29 +16873,29 @@
 msgid "Title already in use.  You must choose a unique title."
 msgstr "A cím már használatban van. Használjon egyedi címet."
 
-#: ../pidgin/gtksavedstatuses.c:970
+#: ../pidgin/gtksavedstatuses.c:976
 msgid "Different"
 msgstr "Eltérő"
 
-#: ../pidgin/gtksavedstatuses.c:1159
+#: ../pidgin/gtksavedstatuses.c:1165
 msgid "_Title:"
 msgstr "_Cím:"
 
-#: ../pidgin/gtksavedstatuses.c:1178 ../pidgin/gtksavedstatuses.c:1497
+#: ../pidgin/gtksavedstatuses.c:1184 ../pidgin/gtksavedstatuses.c:1505
 msgid "_Status:"
 msgstr "Áll_apot:"
 
 #. Different status message expander
-#: ../pidgin/gtksavedstatuses.c:1210
+#: ../pidgin/gtksavedstatuses.c:1217
 msgid "Use a _different status for some accounts"
 msgstr "_Eltérő állapot használata egyes fiókokhoz"
 
 #. Save & Use button
-#: ../pidgin/gtksavedstatuses.c:1274
+#: ../pidgin/gtksavedstatuses.c:1281
 msgid "Sa_ve & Use"
 msgstr "Menté_s és használat"
 
-#: ../pidgin/gtksavedstatuses.c:1480
+#: ../pidgin/gtksavedstatuses.c:1488
 #, c-format
 msgid "Status for %s"
 msgstr "%s állapota"
@@ -16551,25 +16904,33 @@
 msgid "Waiting for network connection"
 msgstr "Várakozás a hálózati kapcsolatra"
 
-#: ../pidgin/gtkutils.c:632
+#: ../pidgin/gtkstatusbox.c:1072
+msgid "New status..."
+msgstr "Új állapot..."
+
+#: ../pidgin/gtkstatusbox.c:1073
+msgid "Saved statuses..."
+msgstr "Mentett állapotok..."
+
+#: ../pidgin/gtkutils.c:633
 msgid "Google Talk"
 msgstr "Google Talk"
 
-#: ../pidgin/gtkutils.c:1399 ../pidgin/gtkutils.c:1422
+#: ../pidgin/gtkutils.c:1400 ../pidgin/gtkutils.c:1423
 #, c-format
 msgid "The following error has occurred loading %s: %s"
 msgstr "A következő hiba történt %s betöltése közben: %s"
 
-#: ../pidgin/gtkutils.c:1402 ../pidgin/gtkutils.c:1424
+#: ../pidgin/gtkutils.c:1403 ../pidgin/gtkutils.c:1425
 msgid "Failed to load image"
 msgstr "A kép betöltése meghiúsult"
 
-#: ../pidgin/gtkutils.c:1498
+#: ../pidgin/gtkutils.c:1499
 #, c-format
 msgid "Cannot send folder %s."
 msgstr "A(z) %s mappa nem küldhető el."
 
-#: ../pidgin/gtkutils.c:1499
+#: ../pidgin/gtkutils.c:1500
 #, c-format
 msgid ""
 "%s cannot transfer a folder. You will need to send the files within "
@@ -16578,12 +16939,12 @@
 "A(z) %s nem képes átvinni egy mappát. Az általa tartalmazott fájlokat "
 "egyenként kell elküldenie."
 
-#: ../pidgin/gtkutils.c:1531 ../pidgin/gtkutils.c:1543
-#: ../pidgin/gtkutils.c:1550
+#: ../pidgin/gtkutils.c:1534 ../pidgin/gtkutils.c:1546
+#: ../pidgin/gtkutils.c:1553
 msgid "You have dragged an image"
 msgstr "Egy képet húzott be"
 
-#: ../pidgin/gtkutils.c:1532
+#: ../pidgin/gtkutils.c:1535
 msgid ""
 "You can send this image as a file transfer, embed it into this message, or "
 "use it as the buddy icon for this user."
@@ -16591,23 +16952,23 @@
 "Elküldheti ezt a képet fájlátvitelként, beágyazhatja az üzenetbe, vagy "
 "használhatja ezen felhasználó partnerikonjaként."
 
-#: ../pidgin/gtkutils.c:1538 ../pidgin/gtkutils.c:1558
+#: ../pidgin/gtkutils.c:1541 ../pidgin/gtkutils.c:1561
 msgid "Set as buddy icon"
 msgstr "Beállítás partnerikonként"
 
-#: ../pidgin/gtkutils.c:1539 ../pidgin/gtkutils.c:1559
+#: ../pidgin/gtkutils.c:1542 ../pidgin/gtkutils.c:1562
 msgid "Send image file"
 msgstr "Képfájl küldése"
 
-#: ../pidgin/gtkutils.c:1540 ../pidgin/gtkutils.c:1559
+#: ../pidgin/gtkutils.c:1543 ../pidgin/gtkutils.c:1562
 msgid "Insert in message"
 msgstr "Beszúrás az üzenetbe"
 
-#: ../pidgin/gtkutils.c:1544
+#: ../pidgin/gtkutils.c:1547
 msgid "Would you like to set it as the buddy icon for this user?"
 msgstr "Be kívánja állítani partnerikonként ehhez a felhasználóhoz?"
 
-#: ../pidgin/gtkutils.c:1551
+#: ../pidgin/gtkutils.c:1554
 msgid ""
 "You can send this image as a file transfer, or use it as the buddy icon for "
 "this user."
@@ -16615,7 +16976,7 @@
 "Elküldheti ezt a képet fájlátvitelként vagy használhatja ezen felhasználó "
 "partnerikonjaként."
 
-#: ../pidgin/gtkutils.c:1552
+#: ../pidgin/gtkutils.c:1555
 msgid ""
 "You can insert this image into this message, or use it as the buddy icon for "
 "this user"
@@ -16628,11 +16989,11 @@
 #. * send.  The only logical one is "Application," but do we really want to send a binary and nothing else?
 #. * Probably not.  I'll just give an error and return.
 #. The original patch sent the icon used by the launcher.  That's probably wrong
-#: ../pidgin/gtkutils.c:1610
+#: ../pidgin/gtkutils.c:1614
 msgid "Cannot send launcher"
 msgstr "Az indítóikon nem küldhető el"
 
-#: ../pidgin/gtkutils.c:1610
+#: ../pidgin/gtkutils.c:1614
 msgid ""
 "You dragged a desktop launcher. Most likely you wanted to send whatever this "
 "launcher points to instead of this launcher itself."
@@ -16640,7 +17001,7 @@
 "Egy asztali indítóikont húzott be. Valószínűleg az indítóikon által mutatott "
 "objektumot akarta elküldeni az indítóikon helyett."
 
-#: ../pidgin/gtkutils.c:2345
+#: ../pidgin/gtkutils.c:2349
 #, c-format
 msgid ""
 "<b>File:</b> %s\n"
@@ -16651,29 +17012,27 @@
 "<b>Fájlméret:</b> %s\n"
 "<b>Képméret:</b> %dx%d"
 
-#: ../pidgin/gtkutils.c:2641
+#: ../pidgin/gtkutils.c:2645
 #, c-format
 msgid "The file '%s' is too large for %s.  Please try a smaller image.\n"
-msgstr ""
-"A(z) \"%s\" fájl túl nagy a következőhöz: %s. Próbálkozzon kisebb képpel.\n"
-
-#: ../pidgin/gtkutils.c:2643
+msgstr "A(z) \"%s\" fájl túl nagy a következőhöz: %s. Próbálkozzon kisebb képpel.\n"
+
+#: ../pidgin/gtkutils.c:2647
 msgid "Icon Error"
 msgstr "Ikonhiba"
 
-#: ../pidgin/gtkutils.c:2644
+#: ../pidgin/gtkutils.c:2648
 msgid "Could not set icon"
 msgstr "Az ikon beállítása meghiúsult"
 
-#: ../pidgin/gtkutils.c:2744
+#: ../pidgin/gtkutils.c:2748
 #, c-format
 msgid "Failed to open file '%s': %s"
 msgstr "Nem sikerült megnyitni a(z) \"%s\" fájlt: %s"
 
-#: ../pidgin/gtkutils.c:2793
-#, c-format
-msgid ""
-"Failed to load image '%s': reason not known, probably a corrupt image file"
+#: ../pidgin/gtkutils.c:2797
+#, c-format
+msgid "Failed to load image '%s': reason not known, probably a corrupt image file"
 msgstr ""
 "A(z) \"%s\" kép betöltése sikertelen: az ok nem ismert, valószínűleg sérült "
 "a képfájl"
@@ -16830,22 +17189,21 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/contact_priority.c:187
+#: ../pidgin/plugins/contact_priority.c:188
 msgid "Contact Priority"
 msgstr "Kapcsolat prioritása"
 
 #. *< name
 #. *< version
 #. *< summary
-#: ../pidgin/plugins/contact_priority.c:190
-msgid ""
-"Allows for controlling the values associated with different buddy states."
+#: ../pidgin/plugins/contact_priority.c:191
+msgid "Allows for controlling the values associated with different buddy states."
 msgstr ""
 "Lehetővé teszi a partnerek különböző állapotaihoz rendelt értékek "
 "beállítását."
 
 #. *< description
-#: ../pidgin/plugins/contact_priority.c:192
+#: ../pidgin/plugins/contact_priority.c:193
 msgid ""
 "Allows for changing the point values of idle/away/offline states for buddies "
 "in contact priority computations."
@@ -16881,7 +17239,7 @@
 msgid "Received Messages"
 msgstr "Fogadott üzenetek"
 
-#: ../pidgin/plugins/convcolors.c:210 ../pidgin/plugins/pidginrc.c:251
+#: ../pidgin/plugins/convcolors.c:210 ../pidgin/plugins/pidginrc.c:245
 #, c-format
 msgid "Select Color for %s"
 msgstr "Válassza ki %s színét"
@@ -16921,8 +17279,7 @@
 
 #: ../pidgin/plugins/extplacement.c:117
 msgid "Separate IM and Chat windows when placing by number"
-msgstr ""
-"Azonnali üzenő- és csevegőablakok elkülönítése szám szerinti elhelyezésnél"
+msgstr "Azonnali üzenő- és csevegőablakok elkülönítése szám szerinti elhelyezésnél"
 
 #. *< type
 #. *< ui_requirement
@@ -17103,11 +17460,11 @@
 
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:262
 msgid "Please enter the person's information below."
-msgstr "Kérem adja meg alább a személy adatait."
+msgstr "Adja meg alább a személy adatait."
 
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:266
 msgid "Please enter the buddy's screen name and account type below."
-msgstr "Kérem adja meg a partner felhasználónevét és fiókjának típusát."
+msgstr "Adja meg a partner felhasználónevét és fiókjának típusát."
 
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:286
 msgid "Account type:"
@@ -17158,7 +17515,7 @@
 "\n"
 "<b>Partnerjegyzet</b>: %s"
 
-#: ../pidgin/plugins/history.c:188
+#: ../pidgin/plugins/history.c:195
 msgid "History"
 msgstr "Előzmények"
 
@@ -17178,8 +17535,7 @@
 #. *  description
 #: ../pidgin/plugins/iconaway.c:85 ../pidgin/plugins/iconaway.c:87
 msgid "Iconifies the buddy list and your conversations when you go away."
-msgstr ""
-"Ikonállapotba helyezi a partnerlistát és a társalgásokat, amikor távol van."
+msgstr "Ikonállapotba helyezi a partnerlistát és a társalgásokat, amikor távol van."
 
 #: ../pidgin/plugins/mailchk.c:160
 msgid "Mail Checker"
@@ -17191,8 +17547,7 @@
 
 #: ../pidgin/plugins/mailchk.c:163
 msgid "Adds a small box to the buddy list that shows if you have new mail."
-msgstr ""
-"Kis dobozt ad a partnerlistához, amely megjelenik új levél érkezésekor."
+msgstr "Kis dobozt ad a partnerlistához, amely megjelenik új levél érkezésekor."
 
 #: ../pidgin/plugins/markerline.c:23
 msgid "Markerline"
@@ -17364,8 +17719,7 @@
 #. *  description
 #: ../pidgin/plugins/notify.c:910 ../pidgin/plugins/notify.c:912
 msgid "Provides a variety of ways of notifying you of unread messages."
-msgstr ""
-"Különböző lehetőségeket nyújt az olvasatlan üzenetekre figyelmeztetésre."
+msgstr "Különböző lehetőségeket nyújt az olvasatlan üzenetekre figyelmeztetésre."
 
 #. *< type
 #. *< ui_requirement
@@ -17413,45 +17767,37 @@
 msgid "GtkTreeView Horizontal Separation"
 msgstr "GtkTreeView vízszintes elválasztás"
 
-#: ../pidgin/plugins/pidginrc.c:73
+#: ../pidgin/plugins/pidginrc.c:69
 msgid "Conversation Entry"
 msgstr "Társalgás beviteli mező"
 
-#: ../pidgin/plugins/pidginrc.c:74
-msgid "Conversation History"
-msgstr "Társalgások előzményei"
-
-#: ../pidgin/plugins/pidginrc.c:75
-msgid "Log Viewer"
-msgstr "Naplómegjelenítő"
-
-#: ../pidgin/plugins/pidginrc.c:76
+#: ../pidgin/plugins/pidginrc.c:70
 msgid "Request Dialog"
 msgstr "Kérdés párbeszédablak"
 
-#: ../pidgin/plugins/pidginrc.c:77
+#: ../pidgin/plugins/pidginrc.c:71
 msgid "Notify Dialog"
 msgstr "Figyelmeztetés párbeszédablak"
 
-#: ../pidgin/plugins/pidginrc.c:253
+#: ../pidgin/plugins/pidginrc.c:247
 msgid "Select Color"
 msgstr "Válasszon színt"
 
-#: ../pidgin/plugins/pidginrc.c:300
+#: ../pidgin/plugins/pidginrc.c:294
 #, c-format
 msgid "Select Interface Font"
 msgstr "Válassza ki a felület betűkészletét"
 
-#: ../pidgin/plugins/pidginrc.c:303
+#: ../pidgin/plugins/pidginrc.c:297
 #, c-format
 msgid "Select Font for %s"
 msgstr "Válassza ki %s betűkészletét"
 
-#: ../pidgin/plugins/pidginrc.c:371
+#: ../pidgin/plugins/pidginrc.c:365
 msgid "GTK+ Interface Font"
 msgstr "GTK+ felület betűkészlete"
 
-#: ../pidgin/plugins/pidginrc.c:391
+#: ../pidgin/plugins/pidginrc.c:385
 msgid "GTK+ Text Shortcut Theme"
 msgstr "GTK+ szöveges gyorsbillentyű téma"
 
@@ -17475,36 +17821,36 @@
 #. widget_bool_widgets[i]);
 #. }
 #.
-#: ../pidgin/plugins/pidginrc.c:428
+#: ../pidgin/plugins/pidginrc.c:422
 msgid "Interface colors"
 msgstr "Felület színei"
 
-#: ../pidgin/plugins/pidginrc.c:452
+#: ../pidgin/plugins/pidginrc.c:446
 msgid "Widget Sizes"
 msgstr "Felületi elemek méretei"
 
-#: ../pidgin/plugins/pidginrc.c:473
+#: ../pidgin/plugins/pidginrc.c:467
 msgid "Fonts"
 msgstr "Betűkészletek"
 
-#: ../pidgin/plugins/pidginrc.c:497
+#: ../pidgin/plugins/pidginrc.c:491
 msgid "Gtkrc File Tools"
 msgstr "Gtkrc fájleszközök"
 
-#: ../pidgin/plugins/pidginrc.c:502
+#: ../pidgin/plugins/pidginrc.c:496
 #, c-format
 msgid "Write settings to %s%sgtkrc-2.0"
 msgstr "Beállítások kiírása ide: %s%sgtkrc-2.0"
 
-#: ../pidgin/plugins/pidginrc.c:511
+#: ../pidgin/plugins/pidginrc.c:505
 msgid "Re-read gtkrc files"
 msgstr "A gtkrc fájlok újraolvasása"
 
-#: ../pidgin/plugins/pidginrc.c:544
+#: ../pidgin/plugins/pidginrc.c:543
 msgid "Pidgin GTK+ Theme Control"
 msgstr "Pidgin GTK+ témavezérlés"
 
-#: ../pidgin/plugins/pidginrc.c:546 ../pidgin/plugins/pidginrc.c:547
+#: ../pidgin/plugins/pidginrc.c:545 ../pidgin/plugins/pidginrc.c:546
 msgid "Provides access to commonly used gtkrc settings."
 msgstr "Hozzáférést biztosít az általánosan használt gtkrc beállításokhoz."
 
@@ -17628,11 +17974,11 @@
 msgid "Enable replacement of last word on send"
 msgstr "Az utolsó szó helyettesítésének engedélyezése küldéskor"
 
-#: ../pidgin/plugins/spellchk.c:2370
+#: ../pidgin/plugins/spellchk.c:2372
 msgid "Text replacement"
 msgstr "Szöveg cseréje"
 
-#: ../pidgin/plugins/spellchk.c:2372 ../pidgin/plugins/spellchk.c:2373
+#: ../pidgin/plugins/spellchk.c:2374 ../pidgin/plugins/spellchk.c:2375
 msgid "Replaces text in outgoing messages according to user-defined rules."
 msgstr ""
 "A felhasználó által megadott szabályoknak megfelelően cseréli a szöveget a "
@@ -17644,7 +17990,7 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/ticker/ticker.c:74 ../pidgin/plugins/ticker/ticker.c:354
+#: ../pidgin/plugins/ticker/ticker.c:74 ../pidgin/plugins/ticker/ticker.c:356
 msgid "Buddy Ticker"
 msgstr "Partnerfigyelő"
 
@@ -17652,7 +17998,7 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../pidgin/plugins/ticker/ticker.c:357 ../pidgin/plugins/ticker/ticker.c:359
+#: ../pidgin/plugins/ticker/ticker.c:359 ../pidgin/plugins/ticker/ticker.c:361
 msgid "A horizontal scrolling version of the buddy list."
 msgstr "Vízszintesen gördülő partnerlista."
 
@@ -17851,13 +18197,12 @@
 msgstr "A windowsos Pidginre jellemző beállítások."
 
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:374
-msgid ""
-"Provides options specific to Pidgin for Windows , such as buddy list docking."
+msgid "Provides options specific to Pidgin for Windows , such as buddy list docking."
 msgstr ""
 "A windowsos Pidginre jellemző beállításokat biztosít, mint például a "
 "partnerlista dokkolása."
 
-#: ../pidgin/plugins/xmppconsole.c:667
+#: ../pidgin/plugins/xmppconsole.c:670
 msgid "<font color='#777777'>Logged out.</font>"
 msgstr "<font color='#777777'>Kijelentkezve.</font>"
 
@@ -17867,176 +18212,42 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/xmppconsole.c:746 ../pidgin/plugins/xmppconsole.c:841
-#: ../pidgin/plugins/xmppconsole.c:860
+#: ../pidgin/plugins/xmppconsole.c:749 ../pidgin/plugins/xmppconsole.c:844
+#: ../pidgin/plugins/xmppconsole.c:863
 msgid "XMPP Console"
 msgstr "XMPP konzol"
 
-#: ../pidgin/plugins/xmppconsole.c:753
+#: ../pidgin/plugins/xmppconsole.c:756
 msgid "Account: "
 msgstr "Fiók: "
 
-#: ../pidgin/plugins/xmppconsole.c:780
+#: ../pidgin/plugins/xmppconsole.c:783
 msgid "<font color='#777777'>Not connected to XMPP</font>"
 msgstr "<font color='#777777'>Nincs csatlakoztatva az XMPP-hez</font>"
 
-#: ../pidgin/plugins/xmppconsole.c:790
+#: ../pidgin/plugins/xmppconsole.c:793
 msgid "Insert an <iq/> stanza."
 msgstr "<iq/> mondat beszúrása."
 
-#: ../pidgin/plugins/xmppconsole.c:799
+#: ../pidgin/plugins/xmppconsole.c:802
 msgid "Insert a <presence/> stanza."
 msgstr "<presence/> mondat beszúrása."
 
-#: ../pidgin/plugins/xmppconsole.c:808
+#: ../pidgin/plugins/xmppconsole.c:811
 msgid "Insert a <message/> stanza."
 msgstr "<message/> mondat beszúrása."
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../pidgin/plugins/xmppconsole.c:863
+#: ../pidgin/plugins/xmppconsole.c:866
 msgid "Send and receive raw XMPP stanzas."
 msgstr "Nyers XMPP mondatok küldése és fogadása."
 
 #. *  description
-#: ../pidgin/plugins/xmppconsole.c:865
+#: ../pidgin/plugins/xmppconsole.c:868
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr ""
 "Ez a bővítmény XMPP kiszolgálókban vagy kliensekben végzett hibakereséshez "
 "hasznos."
 
-#, fuzzy
-#~ msgid "Show"
-#~ msgstr "Összes megjelenítése"
-
-#, fuzzy
-#~ msgid "Offline buddies"
-#~ msgstr "Kilépett partnerek megjelenítése"
-
-#, fuzzy
-#~ msgid "Sort"
-#~ msgstr "Port"
-
-#, fuzzy
-#~ msgid "By Status"
-#~ msgstr "Állapot szerint"
-
-#, fuzzy
-#~ msgid "By Log Size"
-#~ msgstr "Napló mérete szerint"
-
-#, fuzzy
-#~ msgid "Unable to connect to contact server"
-#~ msgstr "Nem lehet a kiszolgálóhoz kapcsolódni."
-
-#, fuzzy
-#~ msgid "Unable to retrieve MSN Address Book"
-#~ msgstr "Válasszon Notes címjegyzéket"
-
-#, fuzzy
-#~ msgid "Current media"
-#~ msgstr "Aktuális jelsor"
-
-#, fuzzy
-#~ msgid "Windows Live Messenger Protocol Plugin"
-#~ msgstr "Novell GroupWise Messenger protokollbővítmény"
-
-#, fuzzy
-#~ msgid "Windows Live ID authentication Failed"
-#~ msgstr "Hiba: Hitelesítés sikertelen"
-
-#~ msgid "%s just sent you a Nudge!"
-#~ msgstr "%s egy bökést küldött Önnek!"
-
-#, fuzzy
-#~ msgid "Unknown error (%d)"
-#~ msgstr "Ismeretlen hiba"
-
-#, fuzzy
-#~ msgid "Unable to connect to OIM server"
-#~ msgstr "Nem lehet a kiszolgálóhoz kapcsolódni."
-
-#, fuzzy
-#~ msgid "%s (%s) changed status from %s to %s"
-#~ msgstr "%s megváltoztatta az állapotát (%s -> %s)"
-
-#, fuzzy
-#~ msgid "%s (%s) is now %s"
-#~ msgstr "%s ezentúl %s"
-
-#, fuzzy
-#~ msgid "%s (%s) is no longer %s"
-#~ msgstr "%s már nem %s"
-
-#, fuzzy
-#~ msgid "_Merge"
-#~ msgstr "Ü_zenet:"
-
-#, fuzzy
-#~ msgid "_Send File..."
-#~ msgstr "_Fájl küldése"
-
-#, fuzzy
-#~ msgid "Add Buddy _Pounce..."
-#~ msgstr "Partnerfigyelmeztetés felvétele..."
-
-#, fuzzy
-#~ msgid "Hide when offline"
-#~ msgstr "Nem engedélyezett kijelentkezett állapotban"
-
-#, fuzzy
-#~ msgid "Show when offline"
-#~ msgstr "Nem engedélyezett kijelentkezett állapotban"
-
-#, fuzzy
-#~ msgid "Add _Buddy..."
-#~ msgstr "Partner felvétele"
-
-#, fuzzy
-#~ msgid "Add C_hat..."
-#~ msgstr "Csevegés hozzáadása"
-
-#, fuzzy
-#~ msgid "Persistent"
-#~ msgstr "Perzsa"
-
-#, fuzzy
-#~ msgid "/Accounts/Manage"
-#~ msgstr "/Fiókok"
-
-#, fuzzy
-#~ msgid "A_ccount:"
-#~ msgstr "Fiók:"
-
-#, fuzzy
-#~ msgid "S_end To"
-#~ msgstr "Küldés ennek"
-
-#, fuzzy
-#~ msgid "_Smile!"
-#~ msgstr "Hangulatjel választása"
-
-#~ msgid "nudged"
-#~ msgstr "megbökve"
-
-#~ msgid "You have just sent a Nudge!"
-#~ msgstr "Elküldött egy bökést!"
-
-#~ msgid "%s just sent you a Buzz!"
-#~ msgstr "%s egy bökést küldött!"
-
-#~ msgid "You have just sent a Buzz!"
-#~ msgstr "Elküldött egy bökést!"
-
-#~ msgid "buzzed"
-#~ msgstr "megcsörgetve"
-
-#~ msgid "Attention! %s %s."
-#~ msgstr "Figyelem! %s %s."
-
-#~ msgid "Attention!"
-#~ msgstr "Figyelem!"
-
-#~ msgid "Attention! You have been %s."
-#~ msgstr "Figyelem! %s érkezett."
--- a/share/Makefile.am	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-
-SUBDIRS = sounds ca-certs
-
-EXTRA_DIST = Makefile.mingw
--- a/share/Makefile.mingw	Mon Nov 12 16:15:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-#
-# Makefile.mingw
-#
-# Description: Makefile for win32 (mingw) version
-#
-
-PIDGIN_TREE_TOP := ..
-include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
-
-include ./Makefile.am
-
-.PHONY: install clean
-
-install:
-	if test '$(SUBDIRS)'; then \
-	  list='$(SUBDIRS)'; for subdir in $$list; do \
-	    $(MAKE) -C $$subdir -f $(MINGW_MAKEFILE) install || exit 1 ;\
-	  done; \
-	fi;