changeset 23456:00eaff9396ec

propagate from branch 'im.pidgin.pidgin' (head e39a6e9be3df05b59a878001feb9276b9ceb66a9) to branch 'im.pidgin.pidgin.khc.msnp15' (head c5b8a906c26f5cb0fd8c7256852e3c1e346d7863)
author Ka-Hing Cheung <khc@hxbc.us>
date Wed, 06 Feb 2008 03:35:04 +0000
parents f182cf94145c (current diff) 7f7c89ff5cc7 (diff)
children f61f7e8d897e
files libpurple/protocols/msn/msn.c libpurple/protocols/msn/session.c
diffstat 225 files changed, 12782 insertions(+), 10715 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Sun Jan 13 00:29:56 2008 +0000
+++ b/COPYRIGHT	Wed Feb 06 03:35:04 2008 +0000
@@ -151,6 +151,7 @@
 Michael Golden
 Charlie Gordon
 Ryan C. Gordon
+Konrad Gräfe
 Miah Gregory
 David Grohmann
 Christian Hammond
@@ -167,6 +168,7 @@
 Nick Hebner
 Mike Heffner
 Justin Heiner
+Moos Heintzen
 Benjamin Herrenschmidt
 Fernando Herrera
 hjheins
@@ -268,6 +270,7 @@
 Padraig O'Briain
 Christopher O'Brien (siege)
 Jon Oberheide
+Yusuke Odate
 Ruediger Oertel
 Gudmundur Bjarni Olafsson
 Bartosz Oler
@@ -298,6 +301,7 @@
 Jory A. Pratt
 Brent Priddy
 Justin Pryzby
+Ignacio Casal Quinteiro
 Federicco Mena Quintero
 Yosef Radchenko
 David Raeman
@@ -319,6 +323,7 @@
 Jean-Francois Roy
 Peter Ruibal
 Sam S.
+Thanumalayan S.
 Pradyumna Sampath
 Arvind Samptur
 Tom Samstag
@@ -347,6 +352,7 @@
 Scott Shedden
 Dossy Shiobara
 Michael Shkutkov
+Shreevatsa R
 Ettore Simone
 John Silvestri
 Craig Slusher
@@ -366,6 +372,7 @@
 Richard Stellingwerff
 Charlie Stockman
 David Stoddard
+Andreas Stührk
 Oleg Sukhodolsky
 Sun Microsystems
 Mårten Svantesson (fursten)
@@ -414,12 +421,14 @@
 Zsombor Welker
 Andrew Wellington
 Adam Wendt
+Simon Wenner
 Dave West
 Zac West
 Daniel Westermann-Clark
 Andrew Whewell
 Simon Wilkinson
 Dan Willemsen
+Justin Williams (Jaywalker)
 Jason Willis
 Matt Wilson
 Dan Winship
--- a/ChangeLog	Sun Jan 13 00:29:56 2008 +0000
+++ b/ChangeLog	Wed Feb 06 03:35:04 2008 +0000
@@ -7,19 +7,43 @@
 	* Eliminated unmaintained Howl backend implementation for the
 	  Bonjour protocol.  Avahi (or Apple's Bonjour runtime on win32) is
 	  now required to use Bonjour.
+	* Partial support for viewing ICQ status notes (Collin from
+	  ComBOTS GmbH).
+	* Support for /notice on IRC.
+	* Support for Yahoo Messenger 7.0+ file transfer method (Thanumalayan S.)
+	* Support for retrieving full names and addresses from the address book
+	  on Yahoo! Japan (Yusuke Odate)
+	* The AIM/ICQ server-side preference for "allow others to see me
+	  as idle" is no longer unconditionally set to "yes" even when
+	  your libpurple preference is "no."
 
 	Pidgin:
 	* Added the ability to theme conversation name colors (red and blue)
 	  through your GTK+ theme, and exposed those theme settings to the 
 	  Pidgin GTK+ Theme Control plugin (Dustin Howett)
+	* Fixed having multiple alias edit areas in the infopane (Elliott Sales
+	  de Andrade)
+	* Save the conversation "Enable Logging" option per-contact (Moos
+	  Heintzen)
 
 	Finch:
 	* Color is used in the buddylist to indicate status, and the conversation
 	  window to indicate various message attributes. Look at the sample gntrc
-	  file in the man-page for details.
+	  file in the man page for details.
 	* The default keybinding for dump-screen is now M-D and uses a file
 	  request dialog. M-d will properly delete-forward-word, and M-f has been
 	  fixed to imitate readline's behavior.
+	* New bindings alt+tab and alt+shift+tab to help navigating between the
+	  higlighted windows (details on the man page).
+	* Recently signed on (or off) buddies blink in the buddy list.
+	* New action 'Room List' in the action list can be used to get the list of
+	  available chat rooms for an online account.
+	* The 'Grouping' plugin can be used for alternate grouping in the
+	  buddylist. The current options are 'Group Online/Offline' and 'No
+	  Group'.
+	* Added a log viewer
+	* Added the ability to block/unblock buddies - see the buddy context menu
+	  and the menu for the buddy list.
 
 version 2.3.1 (12/7/2007):
 	http://developer.pidgin.im/query?status=closed&milestone=2.3.1
--- a/ChangeLog.API	Sun Jan 13 00:29:56 2008 +0000
+++ b/ChangeLog.API	Wed Feb 06 03:35:04 2008 +0000
@@ -8,6 +8,41 @@
 		* purple_major_version, purple_minor_version,
 		  purple_micro_version variables are exported by version.h,
 		  giving the version of libpurple in use at runtime.
+		* purple_util_set_current_song, purple_util_format_song_info
+		* Some accessor functions to the Roomlist API:
+			* purple_roomlist_get_fields
+			* purple_roomlist_room_get_type
+			* purple_roomlist_room_get_name
+			* purple_roomlist_room_get_parent
+			* purple_roomlist_room_get_fields
+			* purple_roomlist_field_get_type
+			* purple_roomlist_field_get_label
+			* purple_roomlist_field_get_hidden
+		* unlocalized_name field in PurpleAttentionType for UIs that need it.
+		* Some accessor and mutator functions for PurpleAttentionType:
+			* purple_attention_type_set_name
+			* purple_attention_type_set_incoming_desc
+			* purple_attention_type_set_outgoing_desc
+			* purple_attention_type_set_icon_name
+			* purple_attention_type_set_unlocalized_name
+			* purple_attention_type_get_name
+			* purple_attention_type_get_incoming_desc
+			* purple_attention_type_get_outgoing_desc
+			* purple_attention_type_get_icon_name
+			* purple_attention_type_get_unlocalized_name
+		* Add some PurpleBuddyListNode accessor functions:
+			* purple_blist_node_get_parent
+			* purple_blist_node_get_first_child
+			* purple_blist_node_get_sibling_next
+			* purple_blist_node_get_sibling_prev
+		* Added last_received to PurpleConnection, the time_t of the
+		  last received packet.
+		* Added some more accessor functions:
+			* purple_chat_get_account
+			* purple_chat_get_components
+			* purple_connection_get_prpl
+			* purple_xfer_get_start_time
+			* purple_xfer_get_end_time
 
 	Pidgin:
 		Added:
@@ -21,10 +56,28 @@
 		  smileys in the text. (Florian 'goutnet' Delizy)
 		* pidgin_auto_parent_window to make a window transient for a suitable
 		  parent window.
-		* pidgin_tooltip_setup_for_treeview, pidgin_tooltip_destroy and
-		  pidgin_tooltip_show to simplify the process of drawing tooltips.
+		* pidgin_tooltip_setup_for_treeview, pidgin_tooltip_destroy,
+		  pidgin_tooltip_show and pidgin_tooltip_setup_for_widget to simplify
+		  the process of drawing tooltips.
+		* pidgin_add_widget_to_vbox to simplify adding a labeled widget to a
+		  window.
+
+		Deprecated:
+		* PIDGIN_DIALOG
 
 	Finch:
+		* finch_roomlist_get_ui_ops and finch_roomlist_show_all
+		* finch_request_field_get_widget to get the widget for a request
+		  field.
+		* finch_blist_get_tree to get the GntTree widget representing the
+		  buddy list.
+		* FinchBlistManager structure to manage the buddylist view, and some
+		  util functions finch_blist_install_manager,
+		  finch_blist_uninstall_manager, finch_blist_manager_find and
+		  finch_blist_manager_add_node.
+		* Added finch_log_show, finch_log_show_contact, finch_syslog_show,
+		  finch_log_init, finch_log_get_handle, finch_log_uninit
+
 		libgnt:
 		* Added gnt_tree_set_row_color to set the color for a row in a tree.
 		* Added gnt_style_get_string_list
@@ -33,6 +86,7 @@
 		  string.
 		* Added gnt_style_get_color to get a color pair from an entry in
 		  ~/.gntrc
+		* Added gnt_tree_get_parent_key to get the key for the parent row.
 
 version 2.3.0 (11/24/2007):
 	libpurple:
--- a/ChangeLog.win32	Sun Jan 13 00:29:56 2008 +0000
+++ b/ChangeLog.win32	Wed Feb 06 03:35:04 2008 +0000
@@ -1,3 +1,6 @@
+version 2.3.1 (12/7/2007):
+	* No changes
+
 version 2.3.0 (11/24/2007):
 	* Updated GTK+ to 2.12.1 (This was actually included in 2.2.2, but 
 	  didn't get into the Changelog.)
@@ -135,7 +138,7 @@
 
 version 0.82 (08/26/2004):
 	* Selecting away messages using the system tray icon works
-	  (Thanks Fran?ois Gagn?)
+	  (Thanks François Gagné)
 	* Transparency plugin will save your settings again (Kevin Stange)
 	* Updated gtk-wimp to 0.6.2
 	* Updated libpng to 1.2.6 (major security update)
--- a/autogen.sh	Sun Jan 13 00:29:56 2008 +0000
+++ b/autogen.sh	Wed Feb 06 03:35:04 2008 +0000
@@ -9,42 +9,42 @@
 	echo;
 	echo "You must have glib-gettextize installed to compile Pidgin.";
 	echo;
-	exit;
+	exit 1;
 }
 
 (intltoolize --version) < /dev/null > /dev/null 2>&1 || {
 	echo;
 	echo "You must have intltool installed to compile Pidgin.";
 	echo;
-	exit;
+	exit 1;
 }
 
 (libtoolize --version) < /dev/null > /dev/null 2>&1 || {
 	echo;
 	echo "You must have libtool installed to compile Pidgin.";
 	echo;
-	exit;
+	exit 1;
 }
 
 (automake --version) < /dev/null > /dev/null 2>&1 || {
 	echo;
 	echo "You must have automake installed to compile Pidgin.";
 	echo;
-	exit;
+	exit 1;
 }
 
 (autoconf --version) < /dev/null > /dev/null 2>&1 || {
 	echo;
 	echo "You must have autoconf installed to compile Pidgin.";
 	echo;
-	exit;
+	exit 1;
 }
 
 echo "Generating configuration files for Pidgin, please wait...."
 echo;
 
 echo "Running libtoolize, please ignore non-fatal messages...."
-echo n | libtoolize --copy --force || exit;
+echo n | libtoolize --copy --force || exit 1;
 
 # Add other directories to this list if people continue to experience
 # brokennesses ...  Obviously the real answer is for them to fix it
@@ -60,11 +60,11 @@
 libtoolize -c -f --automake
 glib-gettextize --force --copy
 intltoolize --force --copy
-aclocal $ACLOCAL_FLAGS || exit;
-autoheader || exit;
+aclocal $ACLOCAL_FLAGS || exit 1;
+autoheader || exit 1;
 automake --add-missing --copy;
-autoconf || exit;
-automake || exit;
+autoconf || exit 1;
+automake || exit 1;
 
 echo;
 echo "Running ./configure ${CONFIGURE_ARGS} $@"
--- a/config.h.mingw	Sun Jan 13 00:29:56 2008 +0000
+++ b/config.h.mingw	Wed Feb 06 03:35:04 2008 +0000
@@ -355,7 +355,7 @@
 
 /* Loads static protocol plugin module initialization functions. */
 #ifndef STATIC_PROTO_INIT
-#define STATIC_PROTO_INIT static void static_proto_init() {  }
+#define STATIC_PROTO_INIT static void static_proto_init(void) {  }
 #endif
 
 /* Define to 1 if you have the ANSI C header files. */
--- a/configure.ac	Sun Jan 13 00:29:56 2008 +0000
+++ b/configure.ac	Wed Feb 06 03:35:04 2008 +0000
@@ -142,7 +142,7 @@
 dnl If we don't have msgfmt, then po/ is going to fail -- ensure that
 dnl AM_GLIB_GNU_GETTEXT found it.
 
-if test x$MSGFMT = xno -o x$MSGFMT$GMSGFMT = x
+if test x$MSGFMT = xno -o x$MSGFMT$GMSGFMT$INTLTOOL_MSGFMT = x
 then
 	AC_ERROR([
 
@@ -978,7 +978,7 @@
 AM_CONDITIONAL(STATIC_YAHOO, test "x$static_yahoo" = "xyes")
 AM_CONDITIONAL(STATIC_ZEPHYR, test "x$static_zephyr" = "xyes")
 AC_SUBST(STATIC_LINK_LIBS)
-AC_DEFINE_UNQUOTED(STATIC_PROTO_INIT, $extern_init static void static_proto_init() { $load_proto },
+AC_DEFINE_UNQUOTED(STATIC_PROTO_INIT, $extern_init static void static_proto_init(void) { $load_proto },
 	[Loads static protocol plugin module initialization functions.])
 
 AC_ARG_WITH(dynamic_prpls, [AC_HELP_STRING([--with-dynamic-prpls], [specify which protocols to build dynamically])], [DYNAMIC_PRPLS=`echo $withval | $sedpath 's/,/ /g'`])
--- a/doc/finch.1.in	Sun Jan 13 00:29:56 2008 +0000
+++ b/doc/finch.1.in	Wed Feb 06 03:35:04 2008 +0000
@@ -105,6 +105,12 @@
 .B Alt \+ 1 2 ... 0
 Jump to the 1st, 2nd ... 10th window.
 .TP
+.B Alt \+ Tab
+Jump to the next URGENT (highlighted) window.
+.TP
+.B Alt \+ Shift \+ Tab
+Jump to the previous URGENT (highlighted) window.
+.TP
 .B Ctrl \+ o
 Bring up the menu (if there is one) for a window.
 .TP
@@ -460,6 +466,7 @@
 .br
 # switch-window-n
 .br
+# Other actions: window-next-urgent, window-prev-urgent
 
 # For the sample custom window manager
 .br
--- a/finch/Makefile.am	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/Makefile.am	Wed Feb 06 03:35:04 2008 +0000
@@ -25,11 +25,13 @@
 	gntft.c \
 	finch.c \
 	gntidle.c \
+	gntlog.c \
 	gntnotify.c \
 	gntplugin.c \
 	gntpounce.c \
 	gntprefs.c \
 	gntrequest.c \
+	gntroomlist.c \
 	gntsound.c \
 	gntstatus.c \
 	gntui.c
@@ -44,11 +46,13 @@
 	gntft.h \
 	finch.h \
 	gntidle.h \
+	gntlog.h \
 	gntnotify.h \
 	gntplugin.h \
 	gntpounce.h \
 	gntprefs.h \
 	gntrequest.h \
+	gntroomlist.h \
 	gntsound.h \
 	gntstatus.h \
 	gntui.h
--- a/finch/finch.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/finch.c	Wed Feb 06 03:35:04 2008 +0000
@@ -49,14 +49,14 @@
 #include "config.h"
 
 static void
-debug_init()
+debug_init(void)
 {
 	finch_debug_init();
 	purple_debug_set_ui_ops(finch_debug_get_ui_ops());
 }
 
 static GHashTable *ui_info = NULL;
-static GHashTable *finch_ui_get_info()
+static GHashTable *finch_ui_get_info(void)
 {
 	if (ui_info == NULL) {
 		ui_info = g_hash_table_new(g_str_hash, g_str_equal);
@@ -91,7 +91,7 @@
 };
 
 static PurpleCoreUiOps *
-gnt_core_get_ui_ops()
+gnt_core_get_ui_ops(void)
 {
 	return &core_ops;
 }
--- a/finch/finch.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/finch.h	Wed Feb 06 03:35:04 2008 +0000
@@ -29,3 +29,7 @@
 #define FINCH_UI "gnt-purple"
 
 #define FINCH_PREFS_ROOT "/finch"
+
+#define FINCH_GET_DATA(obj)        (obj)->ui_data
+#define FINCH_SET_DATA(obj, data)  (obj)->ui_data = data
+
--- a/finch/gntaccount.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntaccount.c	Wed Feb 06 03:35:04 2008 +0000
@@ -632,7 +632,8 @@
 	prompt = g_strdup_printf(_("Are you sure you want to delete %s?"),
 			purple_account_get_username(account));
 
-	purple_request_action(account, _("Delete Account"), prompt, NULL, 0,
+	purple_request_action(account, _("Delete Account"), prompt, NULL,
+						  PURPLE_DEFAULT_ACTION_NONE,
 						  account, NULL, NULL, account, 2,
 						  _("Delete"), really_delete_account,
 						  _("Cancel"), NULL);
@@ -686,7 +687,7 @@
 	}
 
 	g_signal_connect(G_OBJECT(accounts.tree), "toggled", G_CALLBACK(account_toggled), NULL);
-	
+
 	gnt_tree_set_col_width(GNT_TREE(accounts.tree), 0, 40);
 	gnt_tree_set_col_width(GNT_TREE(accounts.tree), 1, 10);
 	gnt_box_add_widget(GNT_BOX(accounts.window), accounts.tree);
@@ -708,11 +709,11 @@
 	gnt_box_add_widget(GNT_BOX(box), button);
 	gnt_util_set_trigger_widget(GNT_WIDGET(accounts.tree), GNT_KEY_DEL, button);
 	g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(delete_account_cb), accounts.tree);
-	
+
 	gnt_box_add_widget(GNT_BOX(accounts.window), box);
 
 	g_signal_connect(G_OBJECT(accounts.window), "destroy", G_CALLBACK(reset_accounts_win), NULL);
-	
+
 	gnt_widget_show(accounts.window);
 }
 
@@ -722,7 +723,7 @@
 }
 
 static gpointer
-finch_accounts_get_handle()
+finch_accounts_get_handle(void)
 {
 	static int handle;
 
@@ -981,7 +982,7 @@
 
 		gnt_box_add_widget(GNT_BOX(uihandle), gnt_hline_new());
 
-		widget = finch_retrieve_user_info(account->gc, remote_user);
+		widget = finch_retrieve_user_info(purple_account_get_connection(account), remote_user);
 		for (iter = GNT_BOX(widget)->list; iter; iter = iter->next) {
 			if (GNT_IS_BUTTON(iter->data)) {
 				gnt_widget_destroy(iter->data);
--- a/finch/gntblist.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntblist.c	Wed Feb 06 03:35:04 2008 +0000
@@ -27,7 +27,9 @@
 
 #include <account.h>
 #include <blist.h>
+#include <log.h>
 #include <notify.h>
+#include <privacy.h>
 #include <request.h>
 #include <savedstatuses.h>
 #include <server.h>
@@ -43,6 +45,7 @@
 #include "gntft.h"
 #include "gntlabel.h"
 #include "gntline.h"
+#include "gntlog.h"
 #include "gntmenu.h"
 #include "gntmenuitem.h"
 #include "gntmenuitemcheck.h"
@@ -81,8 +84,17 @@
 	/* These are the menuitems that get regenerated */
 	GntMenuItem *accounts;
 	GntMenuItem *plugins;
+	GntMenuItem *grouping;
+
+	FinchBlistManager *manager;
 } FinchBlist;
 
+typedef struct
+{
+	gpointer row;                /* the row in the GntTree */
+	guint signed_timer;          /* used when 'recently' signed on/off */
+} FinchBlistNode;
+
 typedef enum
 {
 	STATUS_PRIMITIVE = 0,
@@ -109,7 +121,12 @@
 static void add_chat(PurpleChat *chat, FinchBlist *ggblist);
 static void add_node(PurpleBlistNode *node, FinchBlist *ggblist);
 static void node_update(PurpleBuddyList *list, PurpleBlistNode *node);
+#if 0
+static gboolean is_contact_online(PurpleContact *contact);
+static gboolean is_group_online(PurpleGroup *group);
+#endif
 static void draw_tooltip(FinchBlist *ggblist);
+static void tooltip_for_buddy(PurpleBuddy *buddy, GString *str, gboolean full);
 static gboolean remove_typing_cb(gpointer null);
 static void remove_peripherals(FinchBlist *ggblist);
 static const char * get_display_name(PurpleBlistNode *node);
@@ -119,6 +136,7 @@
 static void update_buddy_display(PurpleBuddy *buddy, FinchBlist *ggblist);
 static void account_signed_on_cb(PurpleConnection *pc, gpointer null);
 static void finch_request_add_buddy(PurpleAccount *account, const char *username, const char *grp, const char *alias);
+static void menu_group_set_cb(GntMenuItem *item, gpointer null);
 
 /* Sort functions */
 static int blist_node_compare_position(PurpleBlistNode *n1, PurpleBlistNode *n2);
@@ -131,6 +149,195 @@
 static int color_offline;
 static int color_idle;
 
+/**
+ * Buddy List Manager functions.
+ */
+
+static gboolean default_can_add_node(PurpleBlistNode *node)
+{
+	gboolean offline = purple_prefs_get_bool(PREF_ROOT "/showoffline");
+
+	if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
+		PurpleBuddy *buddy = (PurpleBuddy*)node;
+		FinchBlistNode *fnode = FINCH_GET_DATA(node);
+		if (!purple_buddy_get_contact(buddy))
+			return FALSE; /* When a new buddy is added and show-offline is set */
+		if (PURPLE_BUDDY_IS_ONLINE(buddy))
+			return TRUE;  /* The buddy is online */
+		if (!purple_account_is_connected(purple_buddy_get_account(buddy)))
+			return FALSE; /* The account is disconnected. Do not show */
+		if (offline)
+			return TRUE;  /* We want to see offline buddies too */
+		if (fnode && fnode->signed_timer)
+			return TRUE;  /* Show if the buddy just signed off */
+		if (purple_blist_node_get_bool(node, "show_offline"))
+			return TRUE;
+	} else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
+		PurpleBlistNode *nd;
+		for (nd = purple_blist_node_get_first_child(node);
+				nd; nd = purple_blist_node_get_sibling_next(nd)) {
+			if (default_can_add_node(nd))
+				return TRUE;
+		}
+	} else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
+		PurpleChat *chat = (PurpleChat*)node;
+		if (purple_account_is_connected(purple_chat_get_account(chat)))
+			return TRUE;  /* Show whenever the account is online */
+	} else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
+		PurpleBlistNode *nd;
+		gboolean empty = purple_prefs_get_bool(PREF_ROOT "/emptygroups");
+		if (empty)
+			return TRUE;  /* If we want to see empty groups, we can show any group */
+
+		for (nd = purple_blist_node_get_first_child(node);
+				nd; nd = purple_blist_node_get_sibling_next(nd)) {
+			if (default_can_add_node(nd))
+				return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+static gpointer default_find_parent(PurpleBlistNode *node)
+{
+	gpointer ret = NULL;
+	switch (purple_blist_node_get_type(node)) {
+		case PURPLE_BLIST_BUDDY_NODE:
+		case PURPLE_BLIST_CONTACT_NODE:
+		case PURPLE_BLIST_CHAT_NODE:
+			ret = purple_blist_node_get_parent(node);
+			break;
+		default:
+			break;
+	}
+	if (ret)
+		add_node(ret, ggblist);
+	return ret;
+}
+
+static gboolean default_create_tooltip(gpointer selected_row, GString **body, char **tool_title)
+{
+	GString *str;
+	PurpleBlistNode *node = selected_row;
+	int lastseen = 0;
+	char *title;
+
+	if (!node ||
+			purple_blist_node_get_type(node) == PURPLE_BLIST_OTHER_NODE)
+		return FALSE;
+
+	str = g_string_new("");
+
+	if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
+		PurpleBuddy *pr = purple_contact_get_priority_buddy((PurpleContact*)node);
+		gboolean offline = !PURPLE_BUDDY_IS_ONLINE(pr);
+		gboolean showoffline = purple_prefs_get_bool(PREF_ROOT "/showoffline");
+		const char *name = purple_buddy_get_name(pr);
+
+		title = g_strdup(name);
+		tooltip_for_buddy(pr, str, TRUE);
+		for (node = purple_blist_node_get_first_child(node); node; node = purple_blist_node_get_sibling_next(node)) {
+			PurpleBuddy *buddy = (PurpleBuddy*)node;
+			if (offline) {
+				int value = purple_blist_node_get_int(node, "last_seen");
+				if (value > lastseen)
+					lastseen = value;
+			}
+			if (node == (PurpleBlistNode*)pr)
+				continue;
+			if (!purple_account_is_connected(purple_buddy_get_account(buddy)))
+				continue;
+			if (!showoffline && !PURPLE_BUDDY_IS_ONLINE(buddy))
+				continue;
+			str = g_string_append(str, "\n----------\n");
+			tooltip_for_buddy(buddy, str, FALSE);
+		}
+	} else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
+		PurpleBuddy *buddy = (PurpleBuddy *)node;
+		tooltip_for_buddy(buddy, str, TRUE);
+		title = g_strdup(purple_buddy_get_name(buddy));
+		if (!PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node))
+			lastseen = purple_blist_node_get_int(node, "last_seen");
+	} else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
+		PurpleGroup *group = (PurpleGroup *)node;
+
+		g_string_append_printf(str, _("Online: %d\nTotal: %d"),
+						purple_blist_get_group_online_count(group),
+						purple_blist_get_group_size(group, FALSE));
+
+		title = g_strdup(purple_group_get_name(group));
+	} else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
+		PurpleChat *chat = (PurpleChat *)node;
+		PurpleAccount *account = purple_chat_get_account(chat);
+
+		g_string_append_printf(str, _("Account: %s (%s)"),
+				purple_account_get_username(account),
+				purple_account_get_protocol_name(account));
+
+		title = g_strdup(purple_chat_get_name(chat));
+	} else {
+		g_string_free(str, TRUE);
+		return FALSE;
+	}
+
+	if (lastseen > 0) {
+		char *tmp = purple_str_seconds_to_string(time(NULL) - lastseen);
+		g_string_append_printf(str, _("\nLast Seen: %s ago"), tmp);
+		g_free(tmp);
+	}
+
+	if (tool_title)
+		*tool_title = title;
+	else
+		g_free(title);
+
+	if (body)
+		*body = str;
+	else
+		g_string_free(str, TRUE);
+
+	return TRUE;
+}
+
+static FinchBlistManager default_manager =
+{
+	"default",
+	N_("Default"),
+	NULL,
+	NULL,
+	default_can_add_node,
+	default_find_parent,
+	default_create_tooltip,
+	{NULL, NULL, NULL, NULL}
+};
+static GList *managers;
+
+static FinchBlistNode *
+create_finch_blist_node(PurpleBlistNode *node, gpointer row)
+{
+	FinchBlistNode *fnode = FINCH_GET_DATA(node);
+	if (!fnode) {
+		fnode = g_new0(FinchBlistNode, 1);
+		fnode->signed_timer = 0;
+		FINCH_SET_DATA(node, fnode);
+	}
+	fnode->row = row;
+	return fnode;
+}
+
+static void
+reset_blist_node_ui_data(PurpleBlistNode *node)
+{
+	FinchBlistNode *fnode = FINCH_GET_DATA(node);
+	if (fnode == NULL)
+		return;
+	if (fnode->signed_timer)
+		purple_timeout_remove(fnode->signed_timer);
+	g_free(fnode);
+	FINCH_SET_DATA(node, NULL);
+}
+
 static int
 get_display_color(PurpleBlistNode  *node)
 {
@@ -157,12 +364,44 @@
 	return color;
 }
 
+static GntTextFormatFlags
+get_blist_node_flag(PurpleBlistNode *node)
+{
+	GntTextFormatFlags flag = 0;
+	FinchBlistNode *fnode = FINCH_GET_DATA(node);
+
+	if (ggblist->tagged && g_list_find(ggblist->tagged, node))
+		flag |= GNT_TEXT_FLAG_BOLD;
+
+	if (fnode && fnode->signed_timer)
+		flag |= GNT_TEXT_FLAG_BLINK;
+	else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
+		node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact *)node);
+		fnode = FINCH_GET_DATA(node);
+		if (fnode && fnode->signed_timer)
+			flag |= GNT_TEXT_FLAG_BLINK;
+	}
+
+	return flag;
+}
+
+static void
+blist_update_row_flags(PurpleBlistNode *node)
+{
+	gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), node, get_blist_node_flag(node));
+	gnt_tree_set_row_color(GNT_TREE(ggblist->tree), node, get_display_color(node));
+}
+
+#if 0
 static gboolean
 is_contact_online(PurpleContact *contact)
 {
 	PurpleBlistNode *node;
-	for (node = ((PurpleBlistNode*)contact)->child; node; node = node->next) {
-		if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node))
+	for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)contact)); node;
+			node = purple_blist_node_get_sibling_next(node)) {
+		FinchBlistNode *fnode = FINCH_GET_DATA(node);
+		if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) ||
+				(fnode && fnode->signed_timer))
 			return TRUE;
 	}
 	return FALSE;
@@ -172,7 +411,8 @@
 is_group_online(PurpleGroup *group)
 {
 	PurpleBlistNode *node;
-	for (node = ((PurpleBlistNode*)group)->child; node; node = node->next) {
+	for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)group)); node;
+			node = purple_blist_node_get_sibling_next(node)) {
 		if (PURPLE_BLIST_NODE_IS_CHAT(node) &&
 				purple_account_is_connected(((PurpleChat *)node)->account))
 			return TRUE;
@@ -181,14 +421,22 @@
 	}
 	return FALSE;
 }
+#endif
 
 static void
 new_node(PurpleBlistNode *node)
 {
 }
 
-static void add_node(PurpleBlistNode *node, FinchBlist *ggblist)
+static void
+add_node(PurpleBlistNode *node, FinchBlist *ggblist)
 {
+	if (FINCH_GET_DATA(node))
+		return;
+
+	if (!ggblist->manager->can_add_node(node))
+		return;
+
 	if (PURPLE_BLIST_NODE_IS_BUDDY(node))
 		add_buddy((PurpleBuddy*)node, ggblist);
 	else if (PURPLE_BLIST_NODE_IS_CONTACT(node))
@@ -197,9 +445,15 @@
 		add_group((PurpleGroup*)node, ggblist);
 	else if (PURPLE_BLIST_NODE_IS_CHAT(node))
 		add_chat((PurpleChat *)node, ggblist);
+
 	draw_tooltip(ggblist);
 }
 
+void finch_blist_manager_add_node(PurpleBlistNode *node)
+{
+	add_node(node, ggblist);
+}
+
 static void
 remove_tooltip(FinchBlist *ggblist)
 {
@@ -211,33 +465,27 @@
 static void
 node_remove(PurpleBuddyList *list, PurpleBlistNode *node)
 {
-	FinchBlist *ggblist = list->ui_data;
-
-	if (ggblist == NULL || node->ui_data == NULL)
+	FinchBlist *ggblist = FINCH_GET_DATA(list);
+	PurpleBlistNode *parent;
+
+	if (ggblist == NULL || FINCH_GET_DATA(node)== NULL)
 		return;
 
 	gnt_tree_remove(GNT_TREE(ggblist->tree), node);
-	node->ui_data = NULL;
+	reset_blist_node_ui_data(node);
 	if (ggblist->tagged)
 		ggblist->tagged = g_list_remove(ggblist->tagged, node);
 
-	if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
-		PurpleContact *contact = (PurpleContact*)node->parent;
-		if ((!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_contact_online(contact)) ||
-				contact->currentsize < 1)
-			node_remove(list, (PurpleBlistNode*)contact);
+	parent = purple_blist_node_get_parent(node);
+	for (node = purple_blist_node_get_first_child(node); node;
+			node = purple_blist_node_get_sibling_next(node))
+		node_remove(list, node);
+
+	if (parent) {
+		if (!ggblist->manager->can_add_node(parent))
+			node_remove(list, parent);
 		else
-			node_update(list, (PurpleBlistNode*)contact);
-	} else if (!PURPLE_BLIST_NODE_IS_GROUP(node)) {
-		PurpleGroup *group = (PurpleGroup*)node->parent;
-		if ((group->currentsize < 1 && !purple_prefs_get_bool(PREF_ROOT "/emptygroups")) ||
-				(!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_group_online(group)))
-			node_remove(list, node->parent);
-		for (node = node->child; node; node = node->next)
-			node->ui_data = NULL;
-	} else {
-		for (node = node->child; node; node = node->next)
-			node_remove(list, node);
+			node_update(list, parent);
 	}
 
 	draw_tooltip(ggblist);
@@ -251,50 +499,39 @@
            happens, so maybe someone will figure it out. */
 	g_return_if_fail(node != NULL);
 
-	if (list->ui_data == NULL)
+	if (FINCH_GET_DATA(list)== NULL)
 		return;   /* XXX: this is probably the place to auto-join chats */
 
 	if (ggblist->window == NULL)
 		return;
 
-	if (node->ui_data != NULL) {
+	if (FINCH_GET_DATA(node)!= NULL) {
 		gnt_tree_change_text(GNT_TREE(ggblist->tree), node,
 				0, get_display_name(node));
 		gnt_tree_sort_row(GNT_TREE(ggblist->tree), node);
-		gnt_tree_set_row_color(GNT_TREE(ggblist->tree), node, get_display_color(node));
+		blist_update_row_flags(node);
+		if (gnt_tree_get_parent_key(GNT_TREE(ggblist->tree), node) !=
+				ggblist->manager->find_parent(node))
+			node_remove(list, node);
 	}
 
 	if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
 		PurpleBuddy *buddy = (PurpleBuddy*)node;
-		if (purple_account_is_connected(buddy->account) &&
-				(PURPLE_BUDDY_IS_ONLINE(buddy) || purple_prefs_get_bool(PREF_ROOT "/showoffline")))
-			add_node((PurpleBlistNode*)buddy, list->ui_data);
-		else
-			node_remove(purple_get_blist(), node);
-
-		node_update(list, node->parent);
+		add_node((PurpleBlistNode*)buddy, FINCH_GET_DATA(list));
+		node_update(list, purple_blist_node_get_parent(node));
 	} else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
-		add_chat((PurpleChat *)node, list->ui_data);
+		add_node(node, FINCH_GET_DATA(list));
 	} else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
-		PurpleContact *contact = (PurpleContact*)node;
-		if ((!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_contact_online(contact)) ||
-				contact->currentsize < 1)
-			node_remove(purple_get_blist(), node);
-		else {
-			if (node->ui_data == NULL) {
-				/* The core seems to expect the UI to add the buddies. */
-				for (node = node->child; node; node = node->next)
-					add_node(node, list->ui_data);
-			}
+		if (FINCH_GET_DATA(node)== NULL) {
+			/* The core seems to expect the UI to add the buddies. */
+			for (node = purple_blist_node_get_first_child(node); node; node = purple_blist_node_get_sibling_next(node))
+				add_node(node, FINCH_GET_DATA(list));
 		}
 	} else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
-		PurpleGroup *group = (PurpleGroup*)node;
-		if (!purple_prefs_get_bool(PREF_ROOT "/emptygroups") &&
-				((!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_group_online(group)) ||
-				 group->currentsize < 1))
+		if (!ggblist->manager->can_add_node(node))
 			node_remove(list, node);
 		else
-			add_node(node, list->ui_data);
+			add_node(node, FINCH_GET_DATA(list));
 	}
 }
 
@@ -305,7 +542,10 @@
 		return;
 
 	ggblist = g_new0(FinchBlist, 1);
-	list->ui_data = ggblist;
+	FINCH_SET_DATA(list, ggblist);
+	ggblist->manager = finch_blist_manager_find(purple_prefs_get_string(PREF_ROOT "/grouping"));
+	if (!ggblist->manager)
+		ggblist->manager = &default_manager;
 }
 
 static void
@@ -342,6 +582,8 @@
 		purple_blist_add_group(grp, NULL);
 	}
 
+	/* XXX: Ask if there's already the same buddy in the same group (#4553) */
+
 	buddy = purple_buddy_new(account, username, alias);
 	purple_blist_add_buddy(buddy, NULL, grp, NULL);
 	purple_account_add_buddy(account, buddy);
@@ -390,6 +632,7 @@
 	GHashTable *hash = NULL;
 	PurpleConnection *gc;
 	gboolean autojoin;
+	PurplePluginProtocolInfo *info;
 
 	account = purple_request_fields_get_account(allfields, "account");
 	name = purple_request_fields_get_string(allfields, "name");
@@ -399,15 +642,15 @@
 
 	if (!purple_account_is_connected(account) || !name || !*name)
 		return;
-	
+
 	if (!group || !*group)
 		group = _("Chats");
 
 	gc = purple_account_get_connection(account);
-
-	if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL)
-		hash = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, name);
-	
+	info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
+	if (info->chat_info_defaults != NULL)
+		hash = info->chat_info_defaults(gc, name);
+
 	chat = purple_chat_new(account, name, hash);
 
 	if (chat != NULL) {
@@ -419,7 +662,7 @@
 		purple_blist_alias_chat(chat, alias);
 		purple_blist_node_set_bool((PurpleBlistNode*)chat, "gnt-autojoin", autojoin);
 		if (autojoin)
-			serv_join_chat(chat->account->gc, chat->components);
+			serv_join_chat(purple_account_get_connection(purple_chat_get_account(chat)), purple_chat_get_components(chat));
 	}
 }
 
@@ -444,7 +687,7 @@
 	field = purple_request_field_string_new("alias", _("Alias"), alias, FALSE);
 	purple_request_field_group_add_field(group, field);
 
-	field = purple_request_field_string_new("group", _("Group"), grp ? grp->name : NULL, FALSE);
+	field = purple_request_field_string_new("group", _("Group"), grp ? purple_group_get_name(grp) : NULL, FALSE);
 	purple_request_field_group_add_field(group, field);
 
 	field = purple_request_field_bool_new("autojoin", _("Auto-join"), FALSE);
@@ -483,7 +726,7 @@
 }
 
 static void
-finch_request_add_group()
+finch_request_add_group(void)
 {
 	purple_request_input(NULL, _("Add Group"), NULL, _("Enter the name of the group"),
 			NULL, FALSE, FALSE, NULL,
@@ -511,7 +754,7 @@
 };
 
 static gpointer
-finch_blist_get_handle()
+finch_blist_get_handle(void)
 {
 	static int handle;
 
@@ -521,11 +764,14 @@
 static void
 add_group(PurpleGroup *group, FinchBlist *ggblist)
 {
+	gpointer parent;
 	PurpleBlistNode *node = (PurpleBlistNode *)group;
-	if (node->ui_data)
+	if (FINCH_GET_DATA(node))
 		return;
-	node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group,
-			gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), NULL, NULL);
+	parent = ggblist->manager->find_parent((PurpleBlistNode*)group);
+	create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group,
+			gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)),
+			parent, NULL));
 	gnt_tree_set_expanded(GNT_TREE(ggblist->tree), node,
 		!purple_blist_node_get_bool(node, "collapsed"));
 }
@@ -539,7 +785,7 @@
 
 	if (PURPLE_BLIST_NODE_IS_CONTACT(node))
 		node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)node);  /* XXX: this can return NULL?! */
-	
+
 	if (node == NULL)
 		return NULL;
 
@@ -550,7 +796,7 @@
 		PurplePresence *presence;
 		PurpleStatus *now;
 		gboolean ascii = gnt_ascii_only();
-		
+
 		presence = purple_buddy_get_presence(buddy);
 		if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_MOBILE))
 			strncpy(status, ascii ? ":" : "☎", sizeof(status) - 1);
@@ -581,7 +827,7 @@
 		strncpy(status, "~", sizeof(status) - 1);
 	}
 	else if (PURPLE_BLIST_NODE_IS_GROUP(node))
-		return ((PurpleGroup*)node)->name;
+		return purple_group_get_name((PurpleGroup*)node);
 
 	snprintf(text, sizeof(text) - 1, "%s %s", status, name);
 
@@ -591,41 +837,39 @@
 static void
 add_chat(PurpleChat *chat, FinchBlist *ggblist)
 {
-	PurpleGroup *group;
+	gpointer parent;
 	PurpleBlistNode *node = (PurpleBlistNode *)chat;
-	if (node->ui_data)
+	if (FINCH_GET_DATA(node))
 		return;
-	if (!purple_account_is_connected(chat->account))
+	if (!purple_account_is_connected(purple_chat_get_account(chat)))
 		return;
 
-	group = purple_chat_get_group(chat);
-	add_node((PurpleBlistNode*)group, ggblist);
-
-	node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), chat,
+	parent = ggblist->manager->find_parent((PurpleBlistNode*)chat);
+
+	create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), chat,
 				gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)),
-				group, NULL);
+				parent, NULL));
 }
 
 static void
 add_contact(PurpleContact *contact, FinchBlist *ggblist)
 {
-	PurpleGroup *group;
+	gpointer parent;
 	PurpleBlistNode *node = (PurpleBlistNode*)contact;
 	const char *name;
 
-	if (node->ui_data)
+	if (FINCH_GET_DATA(node))
 		return;
 
 	name = get_display_name(node);
 	if (name == NULL)
 		return;
 
-	group = (PurpleGroup*)node->parent;
-	add_node((PurpleBlistNode*)group, ggblist);
-
-	node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), contact,
+	parent = ggblist->manager->find_parent((PurpleBlistNode*)contact);
+
+	create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), contact,
 				gnt_tree_create_row(GNT_TREE(ggblist->tree), name),
-				group, NULL);
+				parent, NULL));
 
 	gnt_tree_set_expanded(GNT_TREE(ggblist->tree), contact, FALSE);
 }
@@ -633,28 +877,23 @@
 static void
 add_buddy(PurpleBuddy *buddy, FinchBlist *ggblist)
 {
-	PurpleContact *contact;
+	gpointer parent;
 	PurpleBlistNode *node = (PurpleBlistNode *)buddy;
-	int color = 0;
-	if (node->ui_data)
-		return;
-
-	if (!purple_account_is_connected(buddy->account))
+	PurpleContact *contact;
+
+	if (FINCH_GET_DATA(node))
 		return;
 
-	contact = (PurpleContact*)node->parent;
-	if (!contact)   /* When a new buddy is added and show-offline is set */
-		return;
-	add_node((PurpleBlistNode*)contact, ggblist);
-
-	node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy,
+	contact = purple_buddy_get_contact(buddy);
+	parent = ggblist->manager->find_parent((PurpleBlistNode*)buddy);
+
+	create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy,
 				gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)),
-				contact, NULL);
-
-	color = get_display_color((PurpleBlistNode*)buddy);
-	gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color);
+				parent, NULL));
+
+	blist_update_row_flags((PurpleBlistNode*)buddy);
 	if (buddy == purple_contact_get_priority_buddy(contact))
-		gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color);
+		blist_update_row_flags((PurpleBlistNode*)contact);
 }
 
 #if 0
@@ -700,7 +939,7 @@
 						purple_buddy_get_account(buddy),
 						purple_buddy_get_name(buddy));
 		} else {
-			FinchConv *ggconv = conv->ui_data;
+			FinchConv *ggconv = FINCH_GET_DATA(conv);
 			gnt_window_present(ggconv->window);
 		}
 		finch_conversation_set_active(conv);
@@ -708,7 +947,7 @@
 	else if (PURPLE_BLIST_NODE_IS_CHAT(node))
 	{
 		PurpleChat *chat = (PurpleChat*)node;
-		serv_join_chat(chat->account->gc, chat->components);
+		serv_join_chat(purple_account_get_connection(purple_chat_get_account(chat)), purple_chat_get_components(chat));
 	}
 }
 
@@ -753,7 +992,7 @@
 append_proto_menu(GntMenu *menu, PurpleConnection *gc, PurpleBlistNode *node)
 {
 	GList *list;
-	PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
 
 	if(!prpl_info || !prpl_info->blist_node_menu)
 		return;
@@ -795,7 +1034,7 @@
 			else
 				val = g_strdup(purple_request_field_string_get_value(field));
 
-			g_hash_table_replace(chat->components, g_strdup(id), val);  /* val should not be free'd */
+			g_hash_table_replace(purple_chat_get_components(chat), g_strdup(id), val);  /* val should not be free'd */
 		}
 	}
 }
@@ -808,22 +1047,24 @@
 	PurpleRequestField *field;
 	GList *parts, *iter;
 	struct proto_chat_entry *pce;
+	PurpleConnection *gc;
 
 	purple_request_fields_add_group(fields, group);
 
-	parts = PURPLE_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc);
+	gc = purple_account_get_connection(purple_chat_get_account(chat));
+	parts = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc))->chat_info(gc);
 
 	for (iter = parts; iter; iter = iter->next) {
 		pce = iter->data;
 		if (pce->is_int) {
 			int val;
-			const char *str = g_hash_table_lookup(chat->components, pce->identifier);
+			const char *str = g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier);
 			if (!str || sscanf(str, "%d", &val) != 1)
 				val = pce->min;
 			field = purple_request_field_int_new(pce->identifier, pce->label, val);
 		} else {
 			field = purple_request_field_string_new(pce->identifier, pce->label,
-					g_hash_table_lookup(chat->components, pce->identifier), FALSE);
+					g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier), FALSE);
 		}
 
 		purple_request_field_group_add_field(group, field);
@@ -864,7 +1105,7 @@
 static void
 finch_add_buddy(PurpleBlistNode *selected, PurpleGroup *grp)
 {
-	purple_blist_request_add_buddy(NULL, NULL, grp ? grp->name : NULL, NULL);
+	purple_blist_request_add_buddy(NULL, NULL, grp ? purple_group_get_name(grp) : NULL, NULL);
 }
 
 static void
@@ -905,13 +1146,13 @@
 static void
 finch_blist_get_buddy_info_cb(PurpleBlistNode *selected, PurpleBuddy *buddy)
 {
-	finch_retrieve_user_info(buddy->account->gc, purple_buddy_get_name(buddy));
+	finch_retrieve_user_info(purple_account_get_connection(purple_buddy_get_account(buddy)), purple_buddy_get_name(buddy));
 }
 
 static void
 finch_blist_menu_send_file_cb(PurpleBlistNode *selected, PurpleBuddy *buddy)
 {
-	serv_send_file(buddy->account->gc, buddy->name, NULL);
+	serv_send_file(purple_account_get_connection(purple_buddy_get_account(buddy)), purple_buddy_get_name(buddy), NULL);
 }
 
 static void
@@ -922,16 +1163,30 @@
 		b = purple_contact_get_priority_buddy((PurpleContact *)node);
 	else
 		b = (PurpleBuddy *)node;
-	finch_pounce_editor_show(b->account, b->name, NULL);
+	finch_pounce_editor_show(purple_buddy_get_account(b), purple_buddy_get_name(b), NULL);
 }
 
+static void
+toggle_block_buddy(GntMenuItem *item, gpointer buddy)
+{
+	gboolean block = gnt_menuitem_check_get_checked(GNT_MENU_ITEM_CHECK(item));
+	PurpleAccount *account = purple_buddy_get_account(buddy);
+	const char *name = purple_buddy_get_name(buddy);
+
+	block ? purple_privacy_deny(account, name, FALSE, FALSE) :
+		purple_privacy_allow(account, name, FALSE, FALSE);
+}
 
 static void
 create_buddy_menu(GntMenu *menu, PurpleBuddy *buddy)
 {
+	PurpleAccount *account;
+	gboolean permitted;
+	GntMenuItem *item;
 	PurplePluginProtocolInfo *prpl_info;
-
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(buddy->account->gc->prpl);
+	PurpleConnection *gc = purple_account_get_connection(purple_buddy_get_account(buddy));
+
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
 	if (prpl_info && prpl_info->get_info)
 	{
 		add_custom_action(menu, _("Get Info"),
@@ -944,10 +1199,19 @@
 	if (prpl_info && prpl_info->send_file)
 	{
 		if (!prpl_info->can_receive_file ||
-			prpl_info->can_receive_file(buddy->account->gc, buddy->name))
+			prpl_info->can_receive_file(gc, purple_buddy_get_name(buddy)))
 			add_custom_action(menu, _("Send File"),
 					PURPLE_CALLBACK(finch_blist_menu_send_file_cb), buddy);
 	}
+
+	account = purple_buddy_get_account(buddy);
+	permitted = purple_privacy_check(account, purple_buddy_get_name(buddy));
+
+	item = gnt_menuitem_check_new(_("Blocked"));
+	gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), !permitted);
+	gnt_menuitem_set_callback(item, toggle_block_buddy, buddy);
+	gnt_menu_add_item(menu, item);
+
 #if 0
 	add_custom_action(tree, _("View Log"),
 			PURPLE_CALLBACK(finch_blist_view_log_cb)), buddy);
@@ -979,11 +1243,12 @@
 	PurpleGroup *group;
 
 	cnode = (PurpleBlistNode *)contact;
-	group = (PurpleGroup*)cnode->parent;
-	for (bnode = cnode->child; bnode; bnode = bnode->next) {
+	group = (PurpleGroup*)purple_blist_node_get_parent(cnode);
+	for (bnode = purple_blist_node_get_first_child(cnode); bnode; bnode = purple_blist_node_get_sibling_next(bnode)) {
 		PurpleBuddy *buddy = (PurpleBuddy*)bnode;
-		if (purple_account_is_connected(buddy->account))
-			purple_account_remove_buddy(buddy->account, buddy, group);
+		PurpleAccount *account = purple_buddy_get_account(buddy);
+		if (purple_account_is_connected(account))
+			purple_account_remove_buddy(account, buddy, group);
 	}
 	purple_blist_remove_contact(contact);
 }
@@ -1026,7 +1291,7 @@
 	else if (PURPLE_BLIST_NODE_IS_CHAT(node))
 		name = purple_chat_get_name((PurpleChat*)node);
 	else if (PURPLE_BLIST_NODE_IS_GROUP(node))
-		name = ((PurpleGroup*)node)->name;
+		name = purple_group_get_name((PurpleGroup*)node);
 	else
 		g_return_if_reached();
 
@@ -1042,38 +1307,77 @@
 	g_free(prompt);
 }
 
+
+static void showlog_cb(PurpleBlistNode *node)
+{
+	PurpleLogType type;
+	PurpleAccount *account;
+	char *name = NULL;
+
+	if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
+		PurpleBuddy *b = (PurpleBuddy*) node;
+		type = PURPLE_LOG_IM;
+		name = g_strdup(b->name);
+		account = b->account;
+	} else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
+		PurpleChat *c = (PurpleChat*) node;
+		PurplePluginProtocolInfo *prpl_info = NULL;
+		type = PURPLE_LOG_CHAT;
+		account = c->account;
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_find_prpl(purple_account_get_protocol_id(account)));
+		if (prpl_info && prpl_info->get_chat_name) {
+			name = prpl_info->get_chat_name(c->components);
+		}
+	} else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
+		finch_log_show_contact((PurpleContact *)node);
+		return;
+	} else {
+		/* This callback should not have been registered for a node
+		 * that doesn't match the type of one of the blocks above. */
+		g_return_if_reached();
+	}
+
+	if (name && account) {
+		finch_log_show(type, name, account);
+		g_free(name);
+	}
+}
+
+
 /* Xeroxed from gtkdialogs.c:purple_gtkdialogs_remove_group_cb*/
 static void
 remove_group(PurpleGroup *group)
 {
 	PurpleBlistNode *cnode, *bnode;
 
-	cnode = ((PurpleBlistNode*)group)->child;
+	cnode = purple_blist_node_get_first_child(((PurpleBlistNode*)group));
 
 	while (cnode) {
 		if (PURPLE_BLIST_NODE_IS_CONTACT(cnode)) {
-			bnode = cnode->child;
-			cnode = cnode->next;
+			bnode = purple_blist_node_get_first_child(cnode);
+			cnode = purple_blist_node_get_sibling_next(cnode);
 			while (bnode) {
 				PurpleBuddy *buddy;
 				if (PURPLE_BLIST_NODE_IS_BUDDY(bnode)) {
+					PurpleAccount *account;
 					buddy = (PurpleBuddy*)bnode;
-					bnode = bnode->next;
-					if (purple_account_is_connected(buddy->account)) {
-						purple_account_remove_buddy(buddy->account, buddy, group);
+					bnode = purple_blist_node_get_sibling_next(bnode);
+					account = purple_buddy_get_account(buddy);
+					if (purple_account_is_connected(account)) {
+						purple_account_remove_buddy(account, buddy, group);
 						purple_blist_remove_buddy(buddy);
 					}
 				} else {
-					bnode = bnode->next;
+					bnode = purple_blist_node_get_sibling_next(bnode);
 				}
 			}
 		} else if (PURPLE_BLIST_NODE_IS_CHAT(cnode)) {
 			PurpleChat *chat = (PurpleChat *)cnode;
-			cnode = cnode->next;
-			if (purple_account_is_connected(chat->account))
+			cnode = purple_blist_node_get_sibling_next(cnode);
+			if (purple_account_is_connected(purple_chat_get_account(chat)))
 				purple_blist_remove_chat(chat);
 		} else {
-			cnode = cnode->next;
+			cnode = purple_blist_node_get_sibling_next(cnode);
 		}
 	}
 
@@ -1116,7 +1420,7 @@
 	} else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
 		name = purple_chat_get_name((PurpleChat*)node);
 	} else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
-		name = ((PurpleGroup*)node)->name;
+		name = purple_group_get_name((PurpleGroup*)node);
 		sec = _("Removing this group will also remove all the buddies in the group");
 	}
 	else
@@ -1160,18 +1464,19 @@
 	PurpleGroup *tg = NULL;
 	PurpleContact *tc = NULL;
 
-	if (target == NULL)
+	if (target == NULL ||
+			purple_blist_node_get_type(target) == PURPLE_BLIST_OTHER_NODE)
 		return;
 
 	if (PURPLE_BLIST_NODE_IS_GROUP(target))
 		tg = (PurpleGroup*)target;
 	else if (PURPLE_BLIST_NODE_IS_BUDDY(target)) {
-		tc = (PurpleContact*)target->parent;
-		tg = (PurpleGroup*)target->parent->parent;
+		tc = (PurpleContact*)purple_blist_node_get_parent(target);
+		tg = (PurpleGroup*)purple_blist_node_get_parent((PurpleBlistNode*)tc);
 	} else {
 		if (PURPLE_BLIST_NODE_IS_CONTACT(target))
 			tc = (PurpleContact*)target;
-		tg = (PurpleGroup*)target->parent;
+		tg = (PurpleGroup*)purple_blist_node_get_parent(target);
 	}
 
 	if (ggblist->tagged) {
@@ -1244,6 +1549,8 @@
 	tree = GNT_TREE(ggblist->tree);
 
 	node = gnt_tree_get_selection_data(tree);
+	if (node && purple_blist_node_get_type(node) == PURPLE_BLIST_OTHER_NODE)
+		return;
 
 	if (ggblist->tooltip)
 		remove_tooltip(ggblist);
@@ -1272,7 +1579,7 @@
 	} else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
 		PurpleGroup *group = (PurpleGroup *)node;
 		create_group_menu(GNT_MENU(context), group);
-		title = g_strdup(group->name);
+		title = g_strdup(purple_group_get_name(group));
 	}
 
 	append_extended_menu(GNT_MENU(context), node);
@@ -1295,6 +1602,10 @@
 			add_custom_action(GNT_MENU(context), _("Toggle Tag"),
 					PURPLE_CALLBACK(finch_blist_toggle_tag_buddy), node);
 		}
+		if (!PURPLE_BLIST_NODE_IS_GROUP(node)) {
+			add_custom_action(GNT_MENU(context), _("View Log"),
+					PURPLE_CALLBACK(showlog_cb), node);
+		}
 	}
 
 	/* Set the position for the popup */
@@ -1337,7 +1648,7 @@
 			purple_account_get_protocol_name(account));
 	purple_notify_user_info_add_pair(user_info, _("Account"), tmp);
 	g_free(tmp);
-	
+
 	prpl = purple_find_prpl(purple_account_get_protocol_id(account));
 	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 	if (prpl_info && prpl_info->tooltip_text) {
@@ -1386,16 +1697,15 @@
 {
 	PurpleBlistNode *node;
 	int x, y, top, width, w, h;
-	GString *str;
+	GString *str = NULL;
 	GntTree *tree;
 	GntWidget *widget, *box, *tv;
 	char *title = NULL;
-	int lastseen = 0;
 
 	widget = ggblist->tree;
 	tree = GNT_TREE(widget);
 
-	if (!gnt_widget_has_focus(ggblist->tree) || 
+	if (!gnt_widget_has_focus(ggblist->tree) ||
 			(ggblist->context && !GNT_WIDGET_IS_FLAG_SET(ggblist->context, GNT_WIDGET_INVISIBLE)))
 		return FALSE;
 
@@ -1410,65 +1720,8 @@
 	if (!node)
 		return FALSE;
 
-	str = g_string_new("");
-
-	if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
-		PurpleBuddy *pr = purple_contact_get_priority_buddy((PurpleContact*)node);
-		gboolean offline = !PURPLE_BUDDY_IS_ONLINE(pr);
-		gboolean showoffline = purple_prefs_get_bool(PREF_ROOT "/showoffline");
-		const char *name = purple_buddy_get_name(pr);
-
-		title = g_strdup(name);
-		tooltip_for_buddy(pr, str, TRUE);
-		for (node = node->child; node; node = node->next) {
-			PurpleBuddy *buddy = (PurpleBuddy*)node;
-			if (offline) {
-				int value = purple_blist_node_get_int(node, "last_seen");
-				if (value > lastseen)
-					lastseen = value;
-			}
-			if (node == (PurpleBlistNode*)pr)
-				continue;
-			if (!purple_account_is_connected(buddy->account))
-				continue;
-			if (!showoffline && !PURPLE_BUDDY_IS_ONLINE(buddy))
-				continue;
-			str = g_string_append(str, "\n----------\n");
-			tooltip_for_buddy(buddy, str, FALSE);
-		}
-	} else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
-		PurpleBuddy *buddy = (PurpleBuddy *)node;
-		tooltip_for_buddy(buddy, str, TRUE);
-		title = g_strdup(purple_buddy_get_name(buddy));
-		if (!PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node))
-			lastseen = purple_blist_node_get_int(node, "last_seen");
-	} else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
-		PurpleGroup *group = (PurpleGroup *)node;
-
-		g_string_append_printf(str, _("Online: %d\nTotal: %d"),
-						purple_blist_get_group_online_count(group),
-						purple_blist_get_group_size(group, FALSE));
-
-		title = g_strdup(group->name);
-	} else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
-		PurpleChat *chat = (PurpleChat *)node;
-		PurpleAccount *account = chat->account;
-
-		g_string_append_printf(str, _("Account: %s (%s)"),
-				purple_account_get_username(account),
-				purple_account_get_protocol_name(account));
-
-		title = g_strdup(purple_chat_get_name(chat));
-	} else {
-		g_string_free(str, TRUE);
+	if (!ggblist->manager->create_tooltip(node, &str, &title))
 		return FALSE;
-	}
-
-	if (lastseen > 0) {
-		char *tmp = purple_str_seconds_to_string(time(NULL) - lastseen);
-		g_string_append_printf(str, _("\nLast Seen: %s ago"), tmp);
-		g_free(tmp);
-	}
 
 	gnt_widget_get_position(widget, &x, &y);
 	gnt_widget_get_size(widget, &width, NULL);
@@ -1564,9 +1817,7 @@
 static void
 update_node_display(PurpleBlistNode *node, FinchBlist *ggblist)
 {
-	GntTextFormatFlags flag = 0;
-	if (ggblist->tagged && g_list_find(ggblist->tagged, node))
-		flag |= GNT_TEXT_FLAG_BOLD;
+	GntTextFormatFlags flag = get_blist_node_flag(node);
 	gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), node, flag);
 }
 
@@ -1574,33 +1825,18 @@
 update_buddy_display(PurpleBuddy *buddy, FinchBlist *ggblist)
 {
 	PurpleContact *contact;
-	GntTextFormatFlags bflag = 0, cflag = 0;
-	int color = 0;
 
 	contact = purple_buddy_get_contact(buddy);
 
 	gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, 0, get_display_name((PurpleBlistNode*)buddy));
 	gnt_tree_change_text(GNT_TREE(ggblist->tree), contact, 0, get_display_name((PurpleBlistNode*)contact));
 
-	if (ggblist->tagged && g_list_find(ggblist->tagged, buddy))
-		bflag |= GNT_TEXT_FLAG_BOLD;
-	if (ggblist->tagged && g_list_find(ggblist->tagged, contact))
-		cflag |= GNT_TEXT_FLAG_BOLD;
+	blist_update_row_flags((PurpleBlistNode *)buddy);
+	if (buddy == purple_contact_get_priority_buddy(contact))
+		blist_update_row_flags((PurpleBlistNode *)contact);
 
 	if (ggblist->tnode == (PurpleBlistNode*)buddy)
 		draw_tooltip(ggblist);
-
-	color = get_display_color((PurpleBlistNode*)buddy);
-	gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color);
-	if (buddy == purple_contact_get_priority_buddy(contact))
-		gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color);
-
-	gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag);
-	if (buddy == purple_contact_get_priority_buddy(contact))
-		gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag);
-
-	if (buddy != purple_contact_get_priority_buddy(contact))
-			update_buddy_display(purple_contact_get_priority_buddy(contact), ggblist);
 }
 
 static void
@@ -1645,11 +1881,11 @@
 {
 	PurpleBlistNode *node;
 	purple_signals_disconnect_by_handle(finch_blist_get_handle());
-	purple_get_blist()->ui_data = NULL;
+	FINCH_SET_DATA(purple_get_blist(), NULL);
 
 	node = purple_blist_get_root();
 	while (node) {
-		node->ui_data = NULL;
+		reset_blist_node_ui_data(node);
 		node = purple_blist_node_next(node, TRUE);
 	}
 
@@ -1663,11 +1899,14 @@
 }
 
 static void
-populate_buddylist()
+populate_buddylist(void)
 {
 	PurpleBlistNode *node;
 	PurpleBuddyList *list;
 
+	if (ggblist->manager->init)
+		ggblist->manager->init();
+
 	if (strcmp(purple_prefs_get_string(PREF_ROOT "/sort_type"), "text") == 0) {
 		gnt_tree_set_compare_func(GNT_TREE(ggblist->tree),
 			(GCompareFunc)blist_node_compare_text);
@@ -1696,7 +1935,7 @@
 }
 
 static void
-populate_status_dropdown()
+populate_status_dropdown(void)
 {
 	int i;
 	GList *iter;
@@ -1755,14 +1994,36 @@
 redraw_blist(const char *name, PurplePrefType type, gconstpointer val, gpointer data)
 {
 	PurpleBlistNode *node, *sel;
-	if (ggblist == NULL || ggblist->window == NULL)
+	FinchBlistManager *manager;
+
+	if (ggblist == NULL)
+		return;
+
+	manager = finch_blist_manager_find(purple_prefs_get_string(PREF_ROOT "/grouping"));
+	if (manager == NULL)
+		manager = &default_manager;
+	if (ggblist->manager != manager) {
+		if (ggblist->manager->uninit)
+			ggblist->manager->uninit();
+
+		ggblist->manager = manager;
+		if (manager->can_add_node == NULL)
+			manager->can_add_node = default_can_add_node;
+		if (manager->find_parent == NULL)
+			manager->find_parent = default_find_parent;
+		if (manager->create_tooltip == NULL)
+			manager->create_tooltip = default_create_tooltip;
+	}
+
+	if (ggblist->window == NULL)
 		return;
 
 	sel = gnt_tree_get_selection_data(GNT_TREE(ggblist->tree));
 	gnt_tree_remove_all(GNT_TREE(ggblist->tree));
+
 	node = purple_blist_get_root();
 	for (; node; node = purple_blist_node_next(node, TRUE))
-		node->ui_data = NULL;
+		reset_blist_node_ui_data(node);
 	populate_buddylist();
 	gnt_tree_set_selected(GNT_TREE(ggblist->tree), sel);
 	draw_tooltip(ggblist);
@@ -1794,6 +2055,7 @@
 	purple_prefs_add_bool(PREF_ROOT "/showoffline", FALSE);
 	purple_prefs_add_bool(PREF_ROOT "/emptygroups", FALSE);
 	purple_prefs_add_string(PREF_ROOT "/sort_type", "text");
+	purple_prefs_add_string(PREF_ROOT "/grouping", "default");
 
 	purple_prefs_connect_callback(finch_blist_get_handle(),
 			PREF_ROOT "/emptygroups", redraw_blist, NULL);
@@ -1801,9 +2063,14 @@
 			PREF_ROOT "/showoffline", redraw_blist, NULL);
 	purple_prefs_connect_callback(finch_blist_get_handle(),
 			PREF_ROOT "/sort_type", redraw_blist, NULL);
+	purple_prefs_connect_callback(finch_blist_get_handle(),
+			PREF_ROOT "/grouping", redraw_blist, NULL);
 
 	purple_signal_connect(purple_connections_get_handle(), "signed-on", purple_blist_get_handle(),
 			G_CALLBACK(account_signed_on_cb), NULL);
+
+	finch_blist_install_manager(&default_manager);
+
 	return;
 }
 
@@ -1964,7 +2231,7 @@
 static int
 blist_node_compare_position(PurpleBlistNode *n1, PurpleBlistNode *n2)
 {
-	while ((n1 = n1->prev) != NULL)
+	while ((n1 = purple_blist_node_get_sibling_prev(n1)) != NULL)
 		if (n1 == n2)
 			return 1;
 	return -1;
@@ -1977,10 +2244,10 @@
 	char *us1, *us2;
 	int ret;
 
-	if (n1->type != n2->type)
+	if (purple_blist_node_get_type(n1) != purple_blist_node_get_type(n2))
 		return blist_node_compare_position(n1, n2);
 
-	switch (n1->type)
+	switch (purple_blist_node_get_type(n1))
 	{
 		case PURPLE_BLIST_CHAT_NODE:
 			s1 = purple_chat_get_name((PurpleChat*)n1);
@@ -2012,10 +2279,10 @@
 {
 	int ret;
 
-	if (n1->type != n2->type)
+	if (purple_blist_node_get_type(n1) != purple_blist_node_get_type(n2))
 		return blist_node_compare_position(n1, n2);
 
-	switch (n1->type) {
+	switch (purple_blist_node_get_type(n1)) {
 		case PURPLE_BLIST_CONTACT_NODE:
 			n1 = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)n1);
 			n2 = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)n2);
@@ -2043,9 +2310,10 @@
 	int log = 0;
 	PurpleBlistNode *node;
 
-	for (node = c->child; node; node = node->next) {
+	for (node = purple_blist_node_get_first_child(c); node; node = purple_blist_node_get_sibling_next(node)) {
 		PurpleBuddy *b = (PurpleBuddy*)node;
-		log += purple_log_get_total_size(PURPLE_LOG_IM, b->name, b->account);
+		log += purple_log_get_total_size(PURPLE_LOG_IM, purple_buddy_get_name(b),
+				purple_buddy_get_account(b));
 	}
 
 	return log;
@@ -2057,15 +2325,15 @@
 	int ret;
 	PurpleBuddy *b1, *b2;
 
-	if (n1->type != n2->type)
+	if (purple_blist_node_get_type(n1) != purple_blist_node_get_type(n2))
 		return blist_node_compare_position(n1, n2);
 
-	switch (n1->type) {
+	switch (purple_blist_node_get_type(n1)) {
 		case PURPLE_BLIST_BUDDY_NODE:
 			b1 = (PurpleBuddy*)n1;
 			b2 = (PurpleBuddy*)n2;
-			ret = purple_log_get_total_size(PURPLE_LOG_IM, b2->name, b2->account) - 
-					purple_log_get_total_size(PURPLE_LOG_IM, b1->name, b1->account);
+			ret = purple_log_get_total_size(PURPLE_LOG_IM, purple_buddy_get_name(b2), purple_buddy_get_account(b2)) -
+					purple_log_get_total_size(PURPLE_LOG_IM, purple_buddy_get_name(b1), purple_buddy_get_account(b1));
 			if (ret != 0)
 				return ret;
 			break;
@@ -2122,8 +2390,51 @@
 	}
 }
 
+static gboolean
+buddy_recent_signed_on_off(gpointer data)
+{
+	PurpleBlistNode *node = data;
+	FinchBlistNode *fnode = FINCH_GET_DATA(node);
+
+	purple_timeout_remove(fnode->signed_timer);
+	fnode->signed_timer = 0;
+
+	if (!ggblist->manager->can_add_node(node)) {
+		node_remove(purple_get_blist(), node);
+	} else {
+		update_node_display(node, ggblist);
+		if (purple_blist_node_get_parent(node) && PURPLE_BLIST_NODE_IS_CONTACT(purple_blist_node_get_parent(node)))
+			update_node_display(purple_blist_node_get_parent(node), ggblist);
+	}
+
+	return FALSE;
+}
+
+static gboolean
+buddy_signed_on_off_cb(gpointer data)
+{
+	PurpleBlistNode *node = data;
+	FinchBlistNode *fnode = FINCH_GET_DATA(node);
+	if (!ggblist || !fnode)
+		return FALSE;
+
+	if (fnode->signed_timer)
+		purple_timeout_remove(fnode->signed_timer);
+	fnode->signed_timer = purple_timeout_add_seconds(6, (GSourceFunc)buddy_recent_signed_on_off, data);
+	update_node_display(node, ggblist);
+	if (purple_blist_node_get_parent(node) && PURPLE_BLIST_NODE_IS_CONTACT(purple_blist_node_get_parent(node)))
+		update_node_display(purple_blist_node_get_parent(node), ggblist);
+	return FALSE;
+}
+
 static void
-reconstruct_plugins_menu()
+buddy_signed_on_off(PurpleBuddy* buddy, gpointer null)
+{
+	g_idle_add(buddy_signed_on_off_cb, buddy);
+}
+
+static void
+reconstruct_plugins_menu(void)
 {
 	GntWidget *sub;
 	GntMenuItem *plg;
@@ -2155,7 +2466,7 @@
 }
 
 static void
-reconstruct_accounts_menu()
+reconstruct_accounts_menu(void)
 {
 	GntWidget *sub;
 	GntMenuItem *acc, *item;
@@ -2176,10 +2487,10 @@
 		PurpleAccount *account = iter->data;
 		PurpleConnection *gc = purple_account_get_connection(account);
 		PurplePlugin *prpl;
-		
+
 		if (!gc || !PURPLE_CONNECTION_IS_CONNECTED(gc))
 			continue;
-		prpl = gc->prpl;
+		prpl = purple_connection_get_prpl(gc);
 
 		if (PURPLE_PLUGIN_HAS_ACTIONS(prpl)) {
 			item = gnt_menuitem_new(purple_account_get_username(account));
@@ -2189,6 +2500,30 @@
 	}
 }
 
+static void
+reconstruct_grouping_menu(void)
+{
+	GList *iter;
+	GntWidget *subsub;
+
+	if (!ggblist || !ggblist->grouping)
+		return;
+
+	subsub = gnt_menu_new(GNT_MENU_POPUP);
+	gnt_menuitem_set_submenu(ggblist->grouping, GNT_MENU(subsub));
+
+	for (iter = managers; iter; iter = iter->next) {
+		char menuid[128];
+		FinchBlistManager *manager = iter->data;
+		GntMenuItem *item = gnt_menuitem_new(_(manager->name));
+		snprintf(menuid, sizeof(menuid), "grouping-%s", manager->id);
+		gnt_menuitem_set_id(GNT_MENU_ITEM(item), menuid);
+		gnt_menu_add_item(GNT_MENU(subsub), item);
+		g_object_set_data_full(G_OBJECT(item), "grouping-id", g_strdup(manager->id), g_free);
+		gnt_menuitem_set_callback(item, menu_group_set_cb, NULL);
+	}
+}
+
 static gboolean
 auto_join_chats(gpointer data)
 {
@@ -2200,9 +2535,9 @@
 			node = purple_blist_node_next(node, FALSE)) {
 		if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
 			PurpleChat *chat = (PurpleChat*)node;
-			if (chat->account == account &&
+			if (purple_chat_get_account(chat) == account &&
 					purple_blist_node_get_bool(node, "gnt-autojoin"))
-				serv_join_chat(purple_account_get_connection(chat->account), chat->components);
+				serv_join_chat(purple_account_get_connection(account), purple_chat_get_components(chat));
 		}
 	}
 	return FALSE;
@@ -2224,6 +2559,61 @@
 	purple_prefs_set_string(PREF_ROOT "/sort_type", n);
 }
 
+static void
+block_select_cb(gpointer data, PurpleRequestFields *fields)
+{
+	PurpleAccount *account = purple_request_fields_get_account(fields, "account");
+	const char *name = purple_request_fields_get_string(fields,  "screenname");
+	if (account && name && *name != '\0') {
+		if (purple_request_fields_get_choice(fields, "block") == 1) {
+			purple_privacy_deny(account, name, FALSE, FALSE);
+		} else {
+			purple_privacy_allow(account, name, FALSE, FALSE);
+		}
+	}
+}
+
+static void
+block_select(GntMenuItem *item, gpointer n)
+{
+	PurpleRequestFields *fields;
+	PurpleRequestFieldGroup *group;
+	PurpleRequestField *field;
+
+	fields = purple_request_fields_new();
+
+	group = purple_request_field_group_new(NULL);
+	purple_request_fields_add_group(fields, group);
+
+	field = purple_request_field_string_new("screenname", _("Name"), NULL, FALSE);
+	purple_request_field_set_type_hint(field, "screenname");
+	purple_request_field_set_required(field, TRUE);
+	purple_request_field_group_add_field(group, field);
+
+	field = purple_request_field_account_new("account", _("Account"), NULL);
+	purple_request_field_set_type_hint(field, "account");
+	purple_request_field_set_visible(field,
+		(purple_connections_get_all() != NULL &&
+		 purple_connections_get_all()->next != NULL));
+	purple_request_field_set_required(field, TRUE);
+	purple_request_field_group_add_field(group, field);
+
+	field = purple_request_field_choice_new("block", _("Block/Unblock"), 1);
+	purple_request_field_choice_add(field, _("Block"));
+	purple_request_field_choice_add(field, _("Unblock"));
+	purple_request_field_group_add_field(group, field);
+
+	purple_request_fields(purple_get_blist(), _("Block/Unblock"),
+						NULL,
+						_("Please enter the screen name or alias of the person "
+						  "you would like to Block/Unblock."),
+						fields,
+						_("OK"), G_CALLBACK(block_select_cb),
+						_("Cancel"), NULL,
+						NULL, NULL, NULL,
+						NULL);
+}
+
 /* send_im_select* -- Xerox */
 static void
 send_im_select_cb(gpointer data, PurpleRequestFields *fields)
@@ -2288,14 +2678,15 @@
 	if (!purple_account_is_connected(account))
 		return;
 
-	gc = purple_account_get_connection(account);	
+	gc = purple_account_get_connection(account);
 	purple_conversation_new(PURPLE_CONV_TYPE_CHAT, account, name);
 	chat = purple_blist_find_chat(account, name);
 	if (chat == NULL) {
-		if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL)
-			hash = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, name);
+		PurplePluginProtocolInfo *info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
+		if (info->chat_info_defaults != NULL)
+			hash = info->chat_info_defaults(gc, name);
 	} else {
-		hash = chat->components;
+		hash = purple_chat_get_components(chat);
 	}
 	serv_join_chat(gc, hash);
 	if (chat == NULL && hash != NULL)
@@ -2355,7 +2746,14 @@
 }
 
 static void
-create_menu()
+menu_group_set_cb(GntMenuItem *item, gpointer null)
+{
+	const char *id = g_object_get_data(G_OBJECT(item), "grouping-id");
+	purple_prefs_set_string(PREF_ROOT "/grouping", id);
+}
+
+static void
+create_menu(void)
 {
 	GntWidget *menu, *sub, *subsub;
 	GntMenuItem *item;
@@ -2379,6 +2777,11 @@
 	gnt_menu_add_item(GNT_MENU(sub), item);
 	gnt_menuitem_set_callback(GNT_MENU_ITEM(item), send_im_select, NULL);
 
+	item = gnt_menuitem_new(_("Block/Unblock..."));
+	gnt_menuitem_set_id(GNT_MENU_ITEM(item), "block-unblock");
+	gnt_menu_add_item(GNT_MENU(sub), item);
+	gnt_menuitem_set_callback(GNT_MENU_ITEM(item), block_select, NULL);
+
 	item = gnt_menuitem_new(_("Join Chat..."));
 	gnt_menuitem_set_id(GNT_MENU_ITEM(item), "join-chat");
 	gnt_menu_add_item(GNT_MENU(sub), item);
@@ -2395,7 +2798,7 @@
 				purple_prefs_get_bool(PREF_ROOT "/emptygroups"));
 	gnt_menu_add_item(GNT_MENU(subsub), item);
 	gnt_menuitem_set_callback(GNT_MENU_ITEM(item), toggle_pref_cb, PREF_ROOT "/emptygroups");
-	
+
 	item = gnt_menuitem_check_new(_("Offline buddies"));
 	gnt_menuitem_set_id(GNT_MENU_ITEM(item), "show-offline-buddies");
 	gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item),
@@ -2429,21 +2832,25 @@
 	subsub = gnt_menu_new(GNT_MENU_POPUP);
 	gnt_menuitem_set_submenu(item, GNT_MENU(subsub));
 
-	item = gnt_menuitem_new("Buddy");
+	item = gnt_menuitem_new(_("Buddy"));
 	gnt_menuitem_set_id(GNT_MENU_ITEM(item), "add-buddy");
 	gnt_menu_add_item(GNT_MENU(subsub), item);
 	gnt_menuitem_set_callback(item, menu_add_buddy_cb, NULL);
 
-	item = gnt_menuitem_new("Chat");
+	item = gnt_menuitem_new(_("Chat"));
 	gnt_menuitem_set_id(GNT_MENU_ITEM(item), "add-chat");
 	gnt_menu_add_item(GNT_MENU(subsub), item);
 	gnt_menuitem_set_callback(item, menu_add_chat_cb, NULL);
 
-	item = gnt_menuitem_new("Group");
+	item = gnt_menuitem_new(_("Group"));
 	gnt_menuitem_set_id(GNT_MENU_ITEM(item), "add-group");
 	gnt_menu_add_item(GNT_MENU(subsub), item);
 	gnt_menuitem_set_callback(item, menu_add_group_cb, NULL);
 
+	ggblist->grouping = item = gnt_menuitem_new(_("Grouping"));
+	gnt_menu_add_item(GNT_MENU(sub), item);
+	reconstruct_grouping_menu();
+
 	reconstruct_accounts_menu();
 	gnt_menu_add_item(GNT_MENU(menu), ggblist->accounts);
 
@@ -2513,12 +2920,12 @@
 	purple_signal_connect(purple_plugins_get_handle(), "plugin-unload", finch_blist_get_handle(),
 				PURPLE_CALLBACK(reconstruct_plugins_menu), NULL);
 
+	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", finch_blist_get_handle(),
+				PURPLE_CALLBACK(buddy_signed_on_off), ggblist);
+	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", finch_blist_get_handle(),
+				PURPLE_CALLBACK(buddy_signed_on_off), ggblist);
+
 #if 0
-	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", finch_blist_get_handle(),
-				PURPLE_CALLBACK(buddy_signed_on), ggblist);
-	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", finch_blist_get_handle(),
-				PURPLE_CALLBACK(buddy_signed_off), ggblist);
-
 	/* These I plan to use to indicate unread-messages etc. */
 	purple_signal_connect(purple_conversations_get_handle(), "received-im-msg", finch_blist_get_handle(),
 				PURPLE_CALLBACK(received_im_msg), list);
@@ -2595,3 +3002,43 @@
 {
 	gnt_widget_set_size(ggblist->window, width, height);
 }
+
+void finch_blist_install_manager(const FinchBlistManager *manager)
+{
+	if (!g_list_find(managers, manager)) {
+		managers = g_list_append(managers, (gpointer)manager);
+		reconstruct_grouping_menu();
+		if (strcmp(manager->id, purple_prefs_get_string(PREF_ROOT "/grouping")) == 0)
+			purple_prefs_trigger_callback(PREF_ROOT "/grouping");
+	}
+}
+
+void finch_blist_uninstall_manager(const FinchBlistManager *manager)
+{
+	if (g_list_find(managers, manager)) {
+		managers = g_list_remove(managers, manager);
+		reconstruct_grouping_menu();
+		if (strcmp(manager->id, purple_prefs_get_string(PREF_ROOT "/grouping")) == 0)
+			purple_prefs_trigger_callback(PREF_ROOT "/grouping");
+	}
+}
+
+FinchBlistManager * finch_blist_manager_find(const char *id)
+{
+	GList *iter = managers;
+	if (!id)
+		return NULL;
+
+	for (; iter; iter = iter->next) {
+		FinchBlistManager *m = iter->data;
+		if (strcmp(id, m->id) == 0)
+			return m;
+	}
+	return NULL;
+}
+
+GntTree * finch_blist_get_tree(void)
+{
+	return ggblist ? GNT_TREE(ggblist->tree) : NULL;
+}
+
--- a/finch/gntblist.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntblist.h	Wed Feb 06 03:35:04 2008 +0000
@@ -27,12 +27,25 @@
 #define _GNT_BLIST_H
 
 #include "blist.h"
+#include "gnttree.h"
 
 /**********************************************************************
  * @name GNT BuddyList API
  **********************************************************************/
 /*@{*/
 
+typedef struct
+{
+	const char *id;                                    /**< An identifier for the manager. */
+	const char *name;                                  /**< Displayable name for the manager. */
+	gboolean (*init)(void);                            /**< Called right before it's being used. */
+	gboolean (*uninit)(void);                          /**< Called right after it's not being used any more. */
+	gboolean (*can_add_node)(PurpleBlistNode *node);   /**< Whether a node should be added to the view. */
+	gpointer (*find_parent)(PurpleBlistNode *node);    /**< Find the parent row for a node. */
+	gboolean (*create_tooltip)(gpointer selected_row, GString **body, char **title);  /**< Create tooltip for a selected row. */
+	gpointer reserved[4];
+} FinchBlistManager;
+
 /**
  * Get the ui-functions.
  *
@@ -103,6 +116,47 @@
  */
 gpointer finch_retrieve_user_info(PurpleConnection *conn, const char *name);
 
+/**
+ * Get the tree list of the buddy list.
+ * @return  The GntTree widget.
+ * @since 2.4.0
+ */
+GntTree * finch_blist_get_tree(void);
+
+/**
+ * Add an alternate buddy list manager.
+ *
+ * @param manager   The alternate buddylist manager.
+ * @since 2.4.0
+ */
+void finch_blist_install_manager(const FinchBlistManager *manager);
+
+/**
+ * Remove an alternate buddy list manager.
+ *
+ * @param manager   The buddy list manager to remove.
+ * @since 2.4.0
+ */
+void finch_blist_uninstall_manager(const FinchBlistManager *manager);
+
+/**
+ * Find a buddy list manager.
+ *
+ * @param id   The identifier for the desired buddy list manager.
+ *
+ * @return  The manager with the requested identifier, if available. @c NULL otherwise.
+ * @since 2.4.0
+ */
+FinchBlistManager * finch_blist_manager_find(const char *id);
+
+/**
+ * Request the active buddy list manager to add a node.
+ *
+ * @param node  The node to add
+ * @since 2.4.0
+ */
+void finch_blist_manager_add_node(PurpleBlistNode *node);
+
 /*@}*/
 
 #endif
--- a/finch/gntcertmgr.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntcertmgr.c	Wed Feb 06 03:35:04 2008 +0000
@@ -25,14 +25,13 @@
  *
  */
 
-#include "internal.h"
+#include "finch.h"
 
 #include "certificate.h"
 #include "debug.h"
 #include "notify.h"
 #include "request.h"
 
-#include "finch.h"
 #include "gntcertmgr.h"
 
 #include "gntbutton.h"
@@ -235,7 +234,7 @@
 	purple_request_close_with_handle((void *)key);
 	purple_request_yes_no((void *)key, _("Confirm certificate delete"),
 			primary, NULL,
-			2,
+			0,
 			NULL, NULL, NULL,
 			g_strdup(key),
 			tls_peers_mgmt_delete_confirm_cb,
@@ -246,7 +245,7 @@
 
 /* populate the list */
 static void
-populate_cert_list()
+populate_cert_list(void)
 {
 	GList *idlist, *l;
 
--- a/finch/gntconn.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntconn.c	Wed Feb 06 03:35:04 2008 +0000
@@ -101,13 +101,14 @@
 }
 
 static void
-finch_connection_report_disconnect(PurpleConnection *gc, const char *text)
+finch_connection_report_disconnect(PurpleConnection *gc, PurpleConnectionError reason,
+		const char *text)
 {
 	FinchAutoRecon *info;
 	PurpleAccount *account = purple_connection_get_account(gc);
 	GList *list;
 
-	if (!gc->wants_to_die) {
+	if (!purple_connection_error_is_fatal(reason)) {
 		info = g_hash_table_lookup(hash, account);
 
 		if (info == NULL) {
@@ -148,7 +149,7 @@
 	while (list) {
 		PurpleConversation *conv = list->data;
 		list = list->next;
-		if (conv->account != account ||
+		if (purple_conversation_get_account(conv) != account ||
 				purple_conv_chat_has_left(PURPLE_CONV_CHAT(conv)))
 			continue;
 		purple_conversation_set_data(conv, "want-to-rejoin", GINT_TO_POINTER(TRUE));
@@ -179,10 +180,10 @@
 	NULL, /* connected */
 	NULL, /* disconnected */
 	NULL, /* notice */
-	finch_connection_report_disconnect,
+	NULL,
 	NULL, /* network_connected */
 	NULL, /* network_disconnected */
-	NULL,
+	finch_connection_report_disconnect,
 	NULL,
 	NULL,
 	NULL
--- a/finch/gntconv.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntconv.c	Wed Feb 06 03:35:04 2008 +0000
@@ -36,6 +36,7 @@
 #include "gntblist.h"
 #include "gntconv.h"
 #include "gntdebug.h"
+#include "gntlog.h"
 #include "gntplugin.h"
 #include "gntprefs.h"
 #include "gntsound.h"
@@ -71,6 +72,20 @@
 static int color_message_action;
 static int color_timestamp;
 
+static PurpleBuddy *
+find_buddy_for_conversation(PurpleConversation *conv)
+{
+	return purple_find_buddy(purple_conversation_get_account(conv),
+			purple_conversation_get_name(conv));
+}
+
+static PurpleChat *
+find_chat_for_conversation(PurpleConversation *conv)
+{
+	return purple_blist_find_chat(purple_conversation_get_account(conv),
+			purple_conversation_get_name(conv));
+}
+
 static PurpleBlistNode *
 get_conversation_blist_node(PurpleConversation *conv)
 {
@@ -78,11 +93,11 @@
 
 	switch (purple_conversation_get_type(conv)) {
 		case PURPLE_CONV_TYPE_IM:
-			node = (PurpleBlistNode*)purple_find_buddy(conv->account, conv->name);
-			node = node ? node->parent : NULL;
+			node = (PurpleBlistNode*)find_buddy_for_conversation(conv);
+			node = node ? purple_blist_node_get_parent(node) : NULL;
 			break;
 		case PURPLE_CONV_TYPE_CHAT:
-			node = (PurpleBlistNode*)purple_blist_find_chat(conv->account, conv->name);
+			node = (PurpleBlistNode*)find_chat_for_conversation(conv);
 			break;
 		default:
 			break;
@@ -168,7 +183,7 @@
 		}
 		g_free(error);
 	}
-	else if (!purple_account_is_connected(ggconv->active_conv->account))
+	else if (!purple_account_is_connected(purple_conversation_get_account(ggconv->active_conv)))
 	{
 		purple_conversation_write(ggconv->active_conv, "", _("Message was not sent, because you are not signed on."),
 				PURPLE_MESSAGE_ERROR | PURPLE_MESSAGE_NO_LOG, time(NULL));
@@ -236,11 +251,12 @@
 	if (!buddy)
 		return NULL;
 
-	for (node = ((PurpleBlistNode*)buddy)->parent->child; node; node = node->next) {
+	for (node = purple_blist_node_get_first_child(purple_blist_node_get_parent((PurpleBlistNode*)buddy));
+				node; node = purple_blist_node_get_sibling_next(node)) {
 		if (node == (PurpleBlistNode*)buddy)
 			continue;
 		if ((ret = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
-				((PurpleBuddy*)node)->name, ((PurpleBuddy*)node)->account)) != NULL)
+				purple_buddy_get_name((PurpleBuddy*)node), purple_buddy_get_account((PurpleBuddy*)node))) != NULL)
 			break;
 	}
 	return ret;
@@ -267,7 +283,7 @@
 		return;
 
 	im = PURPLE_CONV_IM(conv);
-	ggc = conv->ui_data;
+	ggc = FINCH_GET_DATA(conv);
 
 	if (purple_conv_im_get_typing_state(im) == PURPLE_TYPING) {
 		int scroll;
@@ -303,10 +319,10 @@
 static void
 buddy_signed_on_off(PurpleBuddy *buddy, gpointer null)
 {
-	PurpleConversation *conv = find_conv_with_contact(buddy->account, buddy->name);
+	PurpleConversation *conv = find_conv_with_contact(purple_buddy_get_account(buddy), purple_buddy_get_name(buddy));
 	if (conv == NULL)
 		return;
-	generate_send_to_menu(conv->ui_data);
+	generate_send_to_menu(FINCH_GET_DATA(conv));
 }
 
 static void
@@ -315,9 +331,10 @@
 	GList *list = purple_get_ims();
 	while (list) {
 		PurpleConversation *conv = list->data;
-		PurpleConversation *cc = find_conv_with_contact(conv->account, conv->name);
+		PurpleConversation *cc = find_conv_with_contact(
+				purple_conversation_get_account(conv), purple_conversation_get_name(conv));
 		if (cc)
-			generate_send_to_menu(cc->ui_data);
+			generate_send_to_menu(FINCH_GET_DATA(cc));
 		list = list->next;
 	}
 
@@ -331,16 +348,17 @@
 			GHashTable *comps = NULL;
 
 			list = list->next;
-			if (conv->account != gc->account ||
+			if (purple_conversation_get_account(conv) != purple_connection_get_account(gc) ||
 					!purple_conversation_get_data(conv, "want-to-rejoin"))
 				continue;
 
-			chat = purple_blist_find_chat(conv->account, conv->name);
+			chat = find_chat_for_conversation(conv);
 			if (chat == NULL) {
-				if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL)
-					comps = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, conv->name);
+				PurplePluginProtocolInfo *info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
+				if (info->chat_info_defaults != NULL)
+					comps = info->chat_info_defaults(gc, purple_conversation_get_name(conv));
 			} else {
-				comps = chat->components;
+				comps = purple_chat_get_components(chat);
 			}
 			serv_join_chat(gc, comps);
 			if (chat == NULL && comps != NULL)
@@ -350,7 +368,7 @@
 }
 
 static gpointer
-finch_conv_get_handle()
+finch_conv_get_handle(void)
 {
 	static int handle;
 	return &handle;
@@ -413,15 +431,11 @@
 
 		purple_conversation_write(conv, NULL,
 				_("Logging started. Future messages in this conversation will be logged."),
-				conv->logs ? (PURPLE_MESSAGE_SYSTEM) :
-				(PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG),
-				time(NULL));
+				PURPLE_MESSAGE_SYSTEM, time(NULL));
 	} else {
 		purple_conversation_write(conv, NULL,
 				_("Logging stopped. Future messages in this conversation will not be logged."),
-				conv->logs ? (PURPLE_MESSAGE_SYSTEM) :
-				(PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG),
-				time(NULL));
+				PURPLE_MESSAGE_SYSTEM, time(NULL));
 
 		/* Disable the logging second, so that the above message can be logged. */
 		purple_conversation_set_logging(conv, FALSE);
@@ -455,6 +469,44 @@
 }
 
 static void
+view_log_cb(GntMenuItem *n, gpointer ggc)
+{
+	FinchConv *fc;
+	PurpleConversation *conv;
+	PurpleLogType type;
+	const char *name;
+	PurpleAccount *account;
+	GSList *buddies;
+	GSList *cur;
+
+	fc = ggc;
+	conv = fc->active_conv;
+
+	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)
+		type = PURPLE_LOG_IM;
+	else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT)
+		type = PURPLE_LOG_CHAT;
+	else
+		return;
+
+	name = purple_conversation_get_name(conv);
+	account = purple_conversation_get_account(conv);
+
+	buddies = purple_find_buddies(account, name);
+	for (cur = buddies; cur != NULL; cur = cur->next) {
+		PurpleBlistNode *node = cur->data;
+		if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) {
+			finch_log_show_contact((PurpleContact *)node->parent);
+			g_slist_free(buddies);
+			return;
+		}
+	}
+	g_slist_free(buddies);
+
+	finch_log_show(type, name, account);
+}
+
+static void
 generate_send_to_menu(FinchConv *ggc)
 {
 	GntWidget *sub, *menu = ggc->menu;
@@ -462,7 +514,8 @@
 	GSList *buds;
 	GList *list = NULL;
 
-	buds = purple_find_buddies(ggc->active_conv->account, ggc->active_conv->name);
+	buds = purple_find_buddies(purple_conversation_get_account(ggc->active_conv),
+			purple_conversation_get_name(ggc->active_conv));
 	if (!buds)
 		return;
 
@@ -476,7 +529,8 @@
 
 	for (; buds; buds = g_slist_delete_link(buds, buds)) {
 		PurpleBlistNode *node = (PurpleBlistNode *)purple_buddy_get_contact((PurpleBuddy *)buds->data);
-		for (node = node->child; node != NULL; node = node->next) {
+		for (node = purple_blist_node_get_first_child(node); node != NULL;
+				node = purple_blist_node_get_sibling_next(node)) {
 			PurpleBuddy *buddy = (PurpleBuddy *)node;
 			PurpleAccount *account = purple_buddy_get_account(buddy);
 			if (purple_account_is_connected(account)) {
@@ -529,7 +583,9 @@
 
 	if (purple_conversation_get_type(ggc->active_conv) == PURPLE_CONV_TYPE_IM) {
 		PurpleAccount *account = purple_conversation_get_account(ggc->active_conv);
-		PurplePluginProtocolInfo *pinfo = account->gc ? PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl) : NULL;
+		PurpleConnection *gc = purple_account_get_connection(account);
+		PurplePluginProtocolInfo *pinfo =
+			gc ? PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)) : NULL;
 
 		if (pinfo && pinfo->get_info) {
 			item = gnt_menuitem_new(_("Get Info"));
@@ -543,7 +599,7 @@
 
 		if (pinfo && pinfo->send_file &&
 				(!pinfo->can_receive_file ||
-				 	pinfo->can_receive_file(account->gc, purple_conversation_get_name(ggc->active_conv)))) {
+					pinfo->can_receive_file(gc, purple_conversation_get_name(ggc->active_conv)))) {
 			item = gnt_menuitem_new(_("Send File"));
 			gnt_menu_add_item(GNT_MENU(sub), item);
 			gnt_menuitem_set_callback(item, send_file_cb, ggc);
@@ -552,6 +608,10 @@
 		generate_send_to_menu(ggc);
 	}
 
+	item = gnt_menuitem_new(_("View Log..."));
+	gnt_menu_add_item(GNT_MENU(sub), item);
+	gnt_menuitem_set_callback(item, view_log_cb, ggc);
+
 	item = gnt_menuitem_check_new(_("Enable Logging"));
 	gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item),
 			purple_conversation_is_logging(ggc->active_conv));
@@ -593,7 +653,7 @@
 static void
 finch_create_conversation(PurpleConversation *conv)
 {
-	FinchConv *ggc = conv->ui_data;
+	FinchConv *ggc = FINCH_GET_DATA(conv);
 	char *title;
 	PurpleConversationType type;
 	PurpleConversation *cc;
@@ -603,9 +663,10 @@
 	if (ggc)
 		return;
 
-	cc = find_conv_with_contact(conv->account, conv->name);
-	if (cc && cc->ui_data)
-		ggc = cc->ui_data;
+	account = purple_conversation_get_account(conv);
+	cc = find_conv_with_contact(account, purple_conversation_get_name(conv));
+	if (cc && FINCH_GET_DATA(cc))
+		ggc = FINCH_GET_DATA(cc);
 	else
 		ggc = g_new0(FinchConv, 1);
 
@@ -617,14 +678,13 @@
 
 	ggc->list = g_list_prepend(ggc->list, conv);
 	ggc->active_conv = conv;
-	conv->ui_data = ggc;
+	FINCH_SET_DATA(conv, ggc);
 
-	if (cc && cc->ui_data) {
+	if (cc && FINCH_GET_DATA(cc)) {
 		finch_conversation_set_active(conv);
 		return;
 	}
 
-	account = purple_conversation_get_account(conv);
 	type = purple_conversation_get_type(conv);
 	title = get_conversation_title(conv, account);
 
@@ -633,7 +693,7 @@
 	gnt_box_set_toplevel(GNT_BOX(ggc->window), TRUE);
 	gnt_box_set_pad(GNT_BOX(ggc->window), 0);
 
-	switch(conv->type){
+	switch (purple_conversation_get_type(conv)) {
 		case PURPLE_CONV_TYPE_UNKNOWN:
 			gnt_widget_set_name(ggc->window, "conversation-window-unknown" );
 			break;
@@ -721,7 +781,7 @@
 finch_destroy_conversation(PurpleConversation *conv)
 {
 	/* do stuff here */
-	FinchConv *ggc = conv->ui_data;
+	FinchConv *ggc = FINCH_GET_DATA(conv);
 	ggc->list = g_list_remove(ggc->list, conv);
 	if (ggc->list && conv == ggc->active_conv)
 		ggc->active_conv = ggc->list->data;
@@ -738,7 +798,7 @@
 finch_write_common(PurpleConversation *conv, const char *who, const char *message,
 		PurpleMessageFlags flags, time_t mtime)
 {
-	FinchConv *ggconv = conv->ui_data;
+	FinchConv *ggconv = FINCH_GET_DATA(conv);
 	char *strip, *newline;
 	GntTextFormatFlags fl = 0;
 	int pos;
@@ -891,7 +951,7 @@
 static void
 finch_chat_add_users(PurpleConversation *conv, GList *users, gboolean new_arrivals)
 {
-	FinchConv *ggc = conv->ui_data;
+	FinchConv *ggc = FINCH_GET_DATA(conv);
 	GntEntry *entry = GNT_ENTRY(ggc->entry);
 
 	if (!new_arrivals)
@@ -930,7 +990,7 @@
 finch_chat_rename_user(PurpleConversation *conv, const char *old, const char *new_n, const char *new_a)
 {
 	/* Update the name for string completion */
-	FinchConv *ggc = conv->ui_data;
+	FinchConv *ggc = FINCH_GET_DATA(conv);
 	GntEntry *entry = GNT_ENTRY(ggc->entry);
 	GntTree *tree = GNT_TREE(ggc->u.chat->userlist);
 	PurpleConvChatBuddy *cb = purple_conv_chat_cb_find(PURPLE_CONV_CHAT(conv), new_n);
@@ -948,7 +1008,7 @@
 finch_chat_remove_users(PurpleConversation *conv, GList *list)
 {
 	/* Remove the name from string completion */
-	FinchConv *ggc = conv->ui_data;
+	FinchConv *ggc = FINCH_GET_DATA(conv);
 	GntEntry *entry = GNT_ENTRY(ggc->entry);
 	for (; list; list = list->next) {
 		GntTree *tree = GNT_TREE(ggc->u.chat->userlist);
@@ -961,7 +1021,7 @@
 finch_chat_update_user(PurpleConversation *conv, const char *user)
 {
 	PurpleConvChatBuddy *cb = purple_conv_chat_cb_find(PURPLE_CONV_CHAT(conv), user);
-	FinchConv *ggc = conv->ui_data;
+	FinchConv *ggc = FINCH_GET_DATA(conv);
 	gnt_tree_change_text(GNT_TREE(ggc->u.chat->userlist), (gpointer)user, 0, chat_flag_text(cb->flags));
 }
 
@@ -1070,7 +1130,7 @@
 clear_command_cb(PurpleConversation *conv,
                  const char *cmd, char **args, char **error, void *data)
 {
-	FinchConv *ggconv = conv->ui_data;
+	FinchConv *ggconv = FINCH_GET_DATA(conv);
 	gnt_text_view_clear(GNT_TEXT_VIEW(ggconv->tv));
 	purple_conversation_clear_message_history(conv);
 	return PURPLE_CMD_STATUS_OK;
@@ -1119,7 +1179,7 @@
 static PurpleCmdRet
 cmd_show_window(PurpleConversation *conv, const char *cmd, char **args, char **error, gpointer data)
 {
-	void (*callback)() = data;
+	void (*callback)(void) = data;
 	callback();
 	return PURPLE_CMD_STATUS_OK;
 }
@@ -1127,7 +1187,7 @@
 static PurpleCmdRet
 users_command_cb(PurpleConversation *conv, const char *cmd, char **args, char **error, gpointer data)
 {
-	FinchConv *fc = conv->ui_data;
+	FinchConv *fc = FINCH_GET_DATA(conv);
 	FinchConvChat *ch;
 	if (!fc)
 		return PURPLE_CMD_STATUS_FAILED;
@@ -1231,7 +1291,7 @@
 
 void finch_conversation_set_active(PurpleConversation *conv)
 {
-	FinchConv *ggconv = conv->ui_data;
+	FinchConv *ggconv = FINCH_GET_DATA(conv);
 	PurpleAccount *account;
 	char *title;
 
@@ -1247,7 +1307,7 @@
 
 void finch_conversation_set_info_widget(PurpleConversation *conv, GntWidget *widget)
 {
-	FinchConv *fc = conv->ui_data;
+	FinchConv *fc = FINCH_GET_DATA(conv);
 	int height, width;
 
 	gnt_box_remove_all(GNT_BOX(fc->info));
--- a/finch/gntft.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntft.c	Wed Feb 06 03:35:04 2008 +0000
@@ -23,13 +23,14 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
+#include "finch.h"
+
 #include <gnt.h>
 #include <gntbox.h>
 #include <gntbutton.h>
 #include <gntcheckbox.h>
 #include <gntlabel.h>
 #include <gnttree.h>
-#include "internal.h"
 
 #include "debug.h"
 #include "notify.h"
@@ -41,7 +42,7 @@
 #include "prefs.h"
 
 #define FINCHXFER(xfer) \
-	(PurpleGntXferUiData *)(xfer)->ui_data
+	(PurpleGntXferUiData *)FINCH_GET_DATA(xfer)
 
 typedef struct
 {
@@ -65,6 +66,7 @@
 	gboolean in_list;
 
 	char *name;
+	gboolean notified;   /* Has the completion of the transfer been notified? */
 
 } PurpleGntXferUiData;
 
@@ -85,7 +87,7 @@
  **************************************************************************/
 
 static void
-update_title_progress()
+update_title_progress(void)
 {
 	GList *list;
 	int num_active_xfers = 0;
@@ -142,15 +144,23 @@
 	xfer_dialog->auto_clear = !xfer_dialog->auto_clear;
 	purple_prefs_set_bool("/finch/filetransfer/clear_finished",
 						xfer_dialog->auto_clear);
+	if (xfer_dialog->auto_clear) {
+		GList *iter = purple_xfers_get_all();
+		while (iter) {
+			PurpleXfer *xfer = iter->data;
+			iter = iter->next;
+			if (purple_xfer_is_completed(xfer) || purple_xfer_is_canceled(xfer))
+			finch_xfer_dialog_remove_xfer(xfer);
+		}
+	}
 }
 
 static void
 remove_button_cb(GntButton *button)
 {
 	PurpleXfer *selected_xfer = gnt_tree_get_selection_data(GNT_TREE(xfer_dialog->tree));
-	if (selected_xfer && (selected_xfer->status == PURPLE_XFER_STATUS_CANCEL_LOCAL ||
-			selected_xfer->status == PURPLE_XFER_STATUS_CANCEL_REMOTE ||
-			selected_xfer->status == PURPLE_XFER_STATUS_DONE)) {
+	if (selected_xfer && (purple_xfer_is_completed(selected_xfer) ||
+				purple_xfer_is_canceled(selected_xfer))) {
 		finch_xfer_dialog_remove_xfer(selected_xfer);
 	}
 }
@@ -159,9 +169,15 @@
 stop_button_cb(GntButton *button)
 {
 	PurpleXfer *selected_xfer = gnt_tree_get_selection_data(GNT_TREE(xfer_dialog->tree));
-	if (selected_xfer && selected_xfer->status != PURPLE_XFER_STATUS_CANCEL_LOCAL &&
-			selected_xfer->status != PURPLE_XFER_STATUS_CANCEL_REMOTE &&
-			selected_xfer->status != PURPLE_XFER_STATUS_DONE)
+	PurpleXferStatusType status;
+
+	if (!selected_xfer)
+		return;
+
+	status = purple_xfer_get_status(selected_xfer);
+	if (status != PURPLE_XFER_STATUS_CANCEL_LOCAL &&
+			status != PURPLE_XFER_STATUS_CANCEL_REMOTE &&
+			status != PURPLE_XFER_STATUS_DONE)
 		purple_xfer_cancel_local(selected_xfer);
 }
 
@@ -388,14 +404,12 @@
 	time_t elapsed, now;
 	char *kbsec;
 
-	if (xfer->end_time != 0)
-		now = xfer->end_time;
-	else
+	if ((now = purple_xfer_get_end_time(xfer)) == 0)
 		now = time(NULL);
 
 	kb_sent = purple_xfer_get_bytes_sent(xfer) / 1024.0;
 	kb_rem  = purple_xfer_get_bytes_remaining(xfer) / 1024.0;
-	elapsed = (xfer->start_time > 0 ? now - xfer->start_time : 0);
+	elapsed = (purple_xfer_get_start_time(xfer) > 0 ? now - purple_xfer_get_start_time(xfer) : 0);
 	kbps    = (elapsed > 0 ? (kb_sent / elapsed) : 0);
 
 	g_return_if_fail(xfer_dialog != NULL);
@@ -404,7 +418,7 @@
 	if ((data = FINCHXFER(xfer)) == NULL)
 		return;
 
-	if (data->in_list == FALSE)
+	if (data->in_list == FALSE || data->notified)
 		return;
 
 	current_time = time(NULL);
@@ -433,6 +447,7 @@
 		gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_REMAINING, _("Finished"));
 		purple_xfer_conversation_write(xfer, msg, FALSE);
 		g_free(msg);
+		data->notified = TRUE;
 	} else {
 		gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_STATUS, _("Transferring"));
 	}
@@ -453,7 +468,7 @@
 
 	/* This is where we're setting xfer->ui_data for the first time. */
 	data = g_new0(PurpleGntXferUiData, 1);
-	xfer->ui_data = data;
+	FINCH_SET_DATA(xfer, data);
 }
 
 static void
@@ -465,7 +480,7 @@
 	if (data) {
 		g_free(data->name);
 		g_free(data);
-		xfer->ui_data = NULL;
+		FINCH_SET_DATA(xfer, NULL);
 	}
 }
 
--- a/finch/gntft.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntft.h	Wed Feb 06 03:35:04 2008 +0000
@@ -55,7 +55,7 @@
 /**
  * Hides the file transfer dialog.
  */
-void finch_xfer_dialog_hide();
+void finch_xfer_dialog_hide(void);
 
 /**
  * Adds a file transfer to the dialog.
--- a/finch/gntidle.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntidle.c	Wed Feb 06 03:35:04 2008 +0000
@@ -21,14 +21,14 @@
  *
  */
 
-#include "internal.h"
+#include "finch.h"
 #include "gntidle.h"
 #include "gntwm.h"
 
 #include "idle.h"
 
 static time_t
-finch_get_idle_time()
+finch_get_idle_time(void)
 {
 	return gnt_wm_get_idle_time();
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/finch/gntlog.c	Wed Feb 06 03:35:04 2008 +0000
@@ -0,0 +1,504 @@
+/**
+ * @file gntlog.c GNT Log viewer
+ * @ingroup finch
+ */
+
+/* finch
+ *
+ * Finch 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 <gnt.h>
+#include <gntbox.h>
+#include <gntbutton.h>
+#include <gntentry.h>
+#include <gntlabel.h>
+#include <gnttextview.h>
+#include <gnttree.h>
+#include <gntwindow.h>
+
+#include "account.h"
+#include "debug.h"
+#include "log.h"
+#include "notify.h"
+#include "request.h"
+#include "util.h"
+
+#include "gntlog.h"
+
+static GHashTable *log_viewers = NULL;
+static void populate_log_tree(FinchLogViewer *lv);
+static FinchLogViewer *syslog_viewer = NULL;
+
+struct log_viewer_hash_t {
+	PurpleLogType type;
+	char *screenname;
+	PurpleAccount *account;
+	PurpleContact *contact;
+};
+
+static guint log_viewer_hash(gconstpointer data)
+{
+	const struct log_viewer_hash_t *viewer = data;
+
+	if (viewer->contact != NULL)
+		return g_direct_hash(viewer->contact);
+
+	return g_str_hash(viewer->screenname) +
+		g_str_hash(purple_account_get_username(viewer->account));
+}
+
+static gboolean log_viewer_equal(gconstpointer y, gconstpointer z)
+{
+	const struct log_viewer_hash_t *a, *b;
+	int ret;
+	char *normal;
+
+	a = y;
+	b = z;
+
+	if (a->contact != NULL) {
+		if (b->contact != NULL)
+			return (a->contact == b->contact);
+		else
+			return FALSE;
+	} else {
+		if (b->contact != NULL)
+			return FALSE;
+	}
+
+	normal = g_strdup(purple_normalize(a->account, a->screenname));
+	ret = (a->account == b->account) &&
+		!strcmp(normal, purple_normalize(b->account, b->screenname));
+	g_free(normal);
+
+	return ret;
+}
+
+static const char *log_get_date(PurpleLog *log)
+{
+	if (log->tm)
+		return purple_date_format_full(log->tm);
+	else
+		return purple_date_format_full(localtime(&log->time));
+}
+
+static void search_cb(GntWidget *button, FinchLogViewer *lv)
+{
+	const char *search_term = gnt_entry_get_text(GNT_ENTRY(lv->entry));
+	GList *logs;
+
+	if (!(*search_term)) {
+		/* reset the tree */
+		gnt_tree_remove_all(GNT_TREE(lv->tree));
+		g_free(lv->search);
+		lv->search = NULL;
+		populate_log_tree(lv);
+		return;
+	}
+
+	if (lv->search != NULL && !strcmp(lv->search, search_term)) {
+		return;
+	}
+
+	g_free(lv->search);
+	lv->search = g_strdup(search_term);
+
+	gnt_tree_remove_all(GNT_TREE(lv->tree));
+	gnt_text_view_clear(GNT_TEXT_VIEW(lv->text));
+
+	for (logs = lv->logs; logs != NULL; logs = logs->next) {
+		char *read = purple_log_read((PurpleLog*)logs->data, NULL);
+		if (read && *read && purple_strcasestr(read, search_term)) {
+			PurpleLog *log = logs->data;
+
+			gnt_tree_add_row_last(GNT_TREE(lv->tree),
+									log,
+									gnt_tree_create_row(GNT_TREE(lv->tree), log_get_date(log)),
+									NULL);
+		}
+		g_free(read);
+	}
+
+}
+
+static void destroy_cb(GntWidget *w, struct log_viewer_hash_t *ht) {
+	FinchLogViewer *lv = syslog_viewer;
+
+	if (ht != NULL) {
+		lv = g_hash_table_lookup(log_viewers, ht);
+		g_hash_table_remove(log_viewers, ht);
+
+		g_free(ht->screenname);
+		g_free(ht);
+	} else
+		syslog_viewer = NULL;
+
+	purple_request_close_with_handle(lv);
+
+	g_list_foreach(lv->logs, (GFunc)purple_log_free, NULL);
+	g_list_free(lv->logs);
+
+	g_free(lv->search);
+	g_free(lv);
+
+	gnt_widget_destroy(w);
+}
+
+static void log_select_cb(GntWidget *w, gpointer old, gpointer new, FinchLogViewer *viewer) {
+	GntTree *tree = GNT_TREE(w);
+	PurpleLog *log = NULL;
+	PurpleLogReadFlags flags;
+	char *read = NULL, *strip, *newline;
+	int h;
+
+	if (!viewer->search && !gnt_tree_get_parent_key(tree, new))
+		return;
+
+	log = (PurpleLog *)new;
+
+	if (log == NULL)
+		return;
+
+	if (log->type != PURPLE_LOG_SYSTEM) {
+		char *title;
+		if (log->type == PURPLE_LOG_CHAT)
+			title = g_strdup_printf(_("Conversation in %s on %s"),
+									log->name, log_get_date(log));
+		else
+			title = g_strdup_printf(_("Conversation with %s on %s"),
+									log->name, log_get_date(log));
+
+		gnt_label_set_text(GNT_LABEL(viewer->label), title);
+		g_free(title);
+	}
+
+	read = purple_log_read(log, &flags);
+	if (flags != PURPLE_LOG_READ_NO_NEWLINE) {
+		newline = purple_strdup_withhtml(read);
+		strip = purple_markup_strip_html(newline);
+		g_free(newline);
+	} else {
+		strip = purple_markup_strip_html(read);
+	}
+	viewer->flags = flags;
+
+	purple_signal_emit(finch_log_get_handle(), "log-displaying", viewer, log);
+
+	gnt_text_view_clear(GNT_TEXT_VIEW(viewer->text));
+	gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(viewer->text), strip, GNT_TEXT_FLAG_NORMAL);
+	gnt_widget_get_size(viewer->text, NULL, &h);
+	gnt_text_view_scroll(GNT_TEXT_VIEW(viewer->text), h - 2);
+	g_free(read);
+	g_free(strip);
+}
+
+/* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet.
+ * I want the tree to be divided into groups like "Today," "Yesterday," "Last week,"
+ * "August," "2002," etc. based on how many conversation took place in each subdivision.
+ *
+ * For now, I'll just make it a flat list.
+ */
+static void populate_log_tree(FinchLogViewer *lv)
+     /* Logs are made from trees in real life.
+        This is a tree made from logs */
+{
+	const char *pmonth;
+	char *month = NULL;
+	char prev_top_month[30] = "";
+	GList *logs = lv->logs;
+
+	while (logs != NULL) {
+		PurpleLog *log = logs->data;
+
+		pmonth = purple_utf8_strftime(_("%B %Y"),
+		                           log->tm ? log->tm : localtime(&log->time));
+
+		if (strcmp(pmonth, prev_top_month) != 0) {
+			month = g_strdup(pmonth);
+			/* top level */
+			gnt_tree_add_row_last(GNT_TREE(lv->tree),
+									month,
+									gnt_tree_create_row(GNT_TREE(lv->tree), month),
+									NULL);
+			gnt_tree_set_expanded(GNT_TREE(lv->tree), month, FALSE);
+
+			strncpy(prev_top_month, month, sizeof(prev_top_month));
+		}
+
+		/* sub */
+		gnt_tree_add_row_last(GNT_TREE(lv->tree),
+								log,
+								gnt_tree_create_row(GNT_TREE(lv->tree), log_get_date(log)),
+								month);
+
+		logs = logs->next;
+	}
+}
+
+static FinchLogViewer *display_log_viewer(struct log_viewer_hash_t *ht, GList *logs,
+						const char *title, int log_size)
+{
+	FinchLogViewer *lv;
+	char *text;
+	GntWidget *vbox, *hbox;
+	GntWidget *size_label;
+
+	if (logs == NULL)
+	{
+		/* No logs were found. */
+		const char *log_preferences = NULL;
+
+		if (ht == NULL) {
+			if (!purple_prefs_get_bool("/purple/logging/log_system"))
+				log_preferences = _("System events will only be logged if the \"Log all status changes to system log\" preference is enabled.");
+		} else {
+			if (ht->type == PURPLE_LOG_IM) {
+				if (!purple_prefs_get_bool("/purple/logging/log_ims"))
+					log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled.");
+			} else if (ht->type == PURPLE_LOG_CHAT) {
+				if (!purple_prefs_get_bool("/purple/logging/log_chats"))
+					log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled.");
+			}
+			g_free(ht->screenname);
+			g_free(ht);
+		}
+
+		purple_notify_info(NULL, title, _("No logs were found"), log_preferences);
+		return NULL;
+	}
+
+	lv = g_new0(FinchLogViewer, 1);
+	lv->logs = logs;
+
+	if (ht != NULL)
+		g_hash_table_insert(log_viewers, ht, lv);
+
+	/* Window ***********/
+	lv->window = gnt_vwindow_new(FALSE);
+	gnt_box_set_title(GNT_BOX(lv->window), title);
+	gnt_box_set_toplevel(GNT_BOX(lv->window), TRUE);
+	gnt_box_set_pad(GNT_BOX(lv->window), 0);
+	g_signal_connect(G_OBJECT(lv->window), "destroy", G_CALLBACK(destroy_cb), ht);
+
+	vbox = gnt_vbox_new(FALSE);
+	gnt_box_add_widget(GNT_BOX(lv->window), vbox);
+
+	/* Label ************/
+	text = g_strdup_printf("%s", title);
+	lv->label = gnt_label_new(text);
+	g_free(text);
+	gnt_box_add_widget(GNT_BOX(vbox), lv->label);
+
+	hbox = gnt_hbox_new(FALSE);
+	gnt_box_add_widget(GNT_BOX(vbox), hbox);
+	/* List *************/
+	lv->tree = gnt_tree_new();
+	gnt_widget_set_size(lv->tree, 30, 0);
+	populate_log_tree(lv);
+	g_signal_connect (G_OBJECT(lv->tree), "selection-changed",
+			G_CALLBACK (log_select_cb),
+			lv);
+	gnt_box_add_widget(GNT_BOX(hbox), lv->tree);
+
+	/* Viewer ************/
+	lv->text = gnt_text_view_new();
+	gnt_box_add_widget(GNT_BOX(hbox), lv->text);
+
+	hbox = gnt_hbox_new(FALSE);
+	gnt_box_add_widget(GNT_BOX(vbox), hbox);
+	/* Log size ************/
+	if (log_size) {
+		char *sz_txt = purple_str_size_to_units(log_size);
+		text = g_strdup_printf("%s %s", _("Total log size:"), sz_txt);
+		size_label = gnt_label_new(text);
+		gnt_box_add_widget(GNT_BOX(hbox), size_label);
+		g_free(sz_txt);
+		g_free(text);
+	}
+
+	/* Search box **********/
+	gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(_("Scroll/Search: ")));
+	lv->entry = gnt_entry_new("");
+	gnt_box_add_widget(GNT_BOX(hbox), lv->entry);
+	g_signal_connect(GNT_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv);
+
+	gnt_text_view_attach_scroll_widget(GNT_TEXT_VIEW(lv->text), lv->entry);
+	gnt_text_view_attach_pager_widget(GNT_TEXT_VIEW(lv->text), lv->entry);
+
+	gnt_widget_show(lv->window);
+
+	return lv;
+}
+
+void finch_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account) {
+	struct log_viewer_hash_t *ht;
+	FinchLogViewer *lv = NULL;
+	const char *name = screenname;
+	char *title;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(screenname != NULL);
+
+	ht = g_new0(struct log_viewer_hash_t, 1);
+
+	ht->type = type;
+	ht->screenname = g_strdup(screenname);
+	ht->account = account;
+
+	if (log_viewers == NULL) {
+		log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal);
+	} else if ((lv = g_hash_table_lookup(log_viewers, ht))) {
+		gnt_window_present(lv->window);
+		g_free(ht->screenname);
+		g_free(ht);
+		return;
+	}
+
+	if (type == PURPLE_LOG_CHAT) {
+		PurpleChat *chat;
+
+		chat = purple_blist_find_chat(account, screenname);
+		if (chat != NULL)
+			name = purple_chat_get_name(chat);
+
+		title = g_strdup_printf(_("Conversations in %s"), name);
+	} else {
+		PurpleBuddy *buddy;
+
+		buddy = purple_find_buddy(account, screenname);
+		if (buddy != NULL)
+			name = purple_buddy_get_contact_alias(buddy);
+
+		title = g_strdup_printf(_("Conversations with %s"), name);
+	}
+
+	display_log_viewer(ht, purple_log_get_logs(type, screenname, account),
+			title, purple_log_get_total_size(type, screenname, account));
+
+	g_free(title);
+}
+
+void finch_log_show_contact(PurpleContact *contact) {
+	struct log_viewer_hash_t *ht;
+	PurpleBlistNode *child;
+	FinchLogViewer *lv = NULL;
+	GList *logs = NULL;
+	const char *name = NULL;
+	char *title;
+	int total_log_size = 0;
+
+	g_return_if_fail(contact != NULL);
+
+	ht = g_new0(struct log_viewer_hash_t, 1);
+	ht->type = PURPLE_LOG_IM;
+	ht->contact = contact;
+
+	if (log_viewers == NULL) {
+		log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal);
+	} else if ((lv = g_hash_table_lookup(log_viewers, ht))) {
+		gnt_window_present(lv->window);
+		g_free(ht);
+		return;
+	}
+
+	for (child = contact->node.child ; child ; child = child->next) {
+		if (!PURPLE_BLIST_NODE_IS_BUDDY(child))
+			continue;
+
+		logs = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name,
+						((PurpleBuddy *)child)->account), logs);
+		total_log_size += purple_log_get_total_size(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, ((PurpleBuddy *)child)->account);
+	}
+	logs = g_list_sort(logs, purple_log_compare);
+
+	if (contact->alias != NULL)
+		name = contact->alias;
+	else if (contact->priority != NULL)
+		name = purple_buddy_get_contact_alias(contact->priority);
+
+	/* This will happen if the contact doesn't have an alias,
+	 * and none of the contact's buddies are online.
+	 * There is probably a better way to deal with this. */
+	if (name == NULL) {
+		if (contact->node.child != NULL && PURPLE_BLIST_NODE_IS_BUDDY(contact->node.child))
+			name = purple_buddy_get_contact_alias((PurpleBuddy *) contact->node.child);
+		if (name == NULL)
+			name = "";
+	}
+
+	title = g_strdup_printf(_("Conversations with %s"), name);
+	display_log_viewer(ht, logs, title, total_log_size);
+	g_free(title);
+}
+
+void finch_syslog_show()
+{
+	GList *accounts = NULL;
+	GList *logs = NULL;
+
+	if (syslog_viewer != NULL) {
+		gnt_window_present(syslog_viewer->window);
+		return;
+	}
+
+	for(accounts = purple_accounts_get_all(); accounts != NULL; accounts = accounts->next) {
+
+		PurpleAccount *account = (PurpleAccount *)accounts->data;
+		if(purple_find_prpl(purple_account_get_protocol_id(account)) == NULL)
+			continue;
+
+		logs = g_list_concat(purple_log_get_system_logs(account), logs);
+	}
+	logs = g_list_sort(logs, purple_log_compare);
+
+	syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), 0);
+}
+
+/****************************************************************************
+ * GNT LOG SUBSYSTEM *******************************************************
+ ****************************************************************************/
+
+void *
+finch_log_get_handle(void)
+{
+	static int handle;
+
+	return &handle;
+}
+
+void finch_log_init(void)
+{
+	void *handle = finch_log_get_handle();
+
+	purple_signal_register(handle, "log-displaying",
+	                     purple_marshal_VOID__POINTER_POINTER,
+	                     NULL, 2,
+	                     purple_value_new(PURPLE_TYPE_BOXED,
+	                                    "FinchLogViewer *"),
+	                     purple_value_new(PURPLE_TYPE_SUBTYPE,
+	                                    PURPLE_SUBTYPE_LOG));
+}
+
+void
+finch_log_uninit(void)
+{
+	purple_signals_unregister_by_instance(finch_log_get_handle());
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/finch/gntlog.h	Wed Feb 06 03:35:04 2008 +0000
@@ -0,0 +1,83 @@
+/**
+ * @file gntlog.h GNT Log viewer
+ * @ingroup finch
+ * @see @ref gntlog-signals
+ */
+
+/* finch
+ *
+ * Finch 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 _FINCHLOG_H_
+#define _FINCHLOG_H_
+
+#include "log.h"
+#include "account.h"
+#include "gntwidget.h"
+
+typedef struct _FinchLogViewer FinchLogViewer;
+
+/**
+ * A GNT Log Viewer.  You can look at logs with it.
+ */
+struct _FinchLogViewer {
+	GList *logs;                 /**< The list of logs viewed in this viewer   */
+
+	GntWidget	*window;    /**< The viewer's window                      */
+	GntWidget	*tree;      /**< The tree representing said treestore */
+	GntWidget	*text;      /**< The text to display said logs          */
+	GntWidget	*entry;     /**< The search entry, in which search terms
+	                              *   are entered                              */
+	GntWidget	*label;
+	PurpleLogReadFlags flags;      /**< The most recently used log flags         */
+	char		*search;    /**< The string currently being searched for  */
+};
+
+
+
+void finch_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account);
+void finch_log_show_contact(PurpleContact *contact);
+
+void finch_syslog_show(void);
+
+/**************************************************************************/
+/** @name GNT Log Subsystem                                              */
+/**************************************************************************/
+/*@{*/
+
+/**
+ * Initializes the GNT log subsystem.
+ */
+void finch_log_init(void);
+
+/**
+ * Returns the GNT log subsystem handle.
+ *
+ * @return The GNT log subsystem handle.
+ */
+void *finch_log_get_handle(void);
+
+/**
+ * Uninitializes the GNT log subsystem.
+ */
+void finch_log_uninit(void);
+
+/*@}*/
+
+#endif
--- a/finch/gntnotify.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntnotify.c	Wed Feb 06 03:35:04 2008 +0000
@@ -147,14 +147,14 @@
 }
 
 static void
-reset_email_dialog()
+reset_email_dialog(void)
 {
 	emaildialog.window = NULL;
 	emaildialog.tree = NULL;
 }
 
 static void
-setup_email_dialog()
+setup_email_dialog(void)
 {
 	GntWidget *box, *tree, *button;
 	if (emaildialog.window)
--- a/finch/gntplugin.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntplugin.c	Wed Feb 06 03:35:04 2008 +0000
@@ -171,7 +171,7 @@
 }
 
 static void
-confwin_init()
+confwin_init(void)
 {
 	confwins = g_hash_table_new(g_direct_hash, g_direct_equal);
 }
--- a/finch/gntplugin.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntplugin.h	Wed Feb 06 03:35:04 2008 +0000
@@ -40,7 +40,7 @@
  **********************************************************************/
 /*@{*/
 
-typedef GntWidget* (*FinchPluginFrame) ();
+typedef GntWidget* (*FinchPluginFrame) (void);
 
 /* Guess where these came from */
 #define FINCH_PLUGIN_TYPE FINCH_UI
--- a/finch/gntpounce.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntpounce.c	Wed Feb 06 03:35:04 2008 +0000
@@ -35,7 +35,6 @@
 #include <gnttree.h>
 #include <gntutils.h>
 
-#include "internal.h"
 #include "finch.h"
 
 #include "account.h"
@@ -458,7 +457,7 @@
 
 	gnt_box_add_widget(GNT_BOX(window), gnt_line_new(FALSE));
 	gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(_("Options"), GNT_TEXT_FLAG_BOLD));
-	dialog->on_away = gnt_check_box_new(_("Pounce only when my status is not available"));
+	dialog->on_away = gnt_check_box_new(_("Pounce only when my status is not Available"));
 	gnt_box_add_widget(GNT_BOX(window), dialog->on_away);
 	dialog->save_pounce = gnt_check_box_new(_("Recurring"));
 	gnt_box_add_widget(GNT_BOX(window), dialog->save_pounce);
@@ -808,39 +807,42 @@
 
 	if (purple_pounce_action_is_enabled(pounce, "popup-notify"))
 	{
-		char *tmp;
+		char *tmp = NULL;
 		const char *name_shown;
 		const char *reason;
+		struct {
+			PurplePounceEvent event;
+			const char *format;
+		} messages[] = {
+			{PURPLE_POUNCE_TYPING, _("%s has started typing to you (%s)")},
+			{PURPLE_POUNCE_TYPED, _("%s has paused while typing to you (%s)")},
+			{PURPLE_POUNCE_SIGNON, _("%s has signed on (%s)")},
+			{PURPLE_POUNCE_IDLE_RETURN, _("%s has returned from being idle (%s)")},
+			{PURPLE_POUNCE_AWAY_RETURN, _("%s has returned from being away (%s)")},
+			{PURPLE_POUNCE_TYPING_STOPPED, _("%s has stopped typing to you (%s)")},
+			{PURPLE_POUNCE_SIGNOFF, _("%s has signed off (%s)")},
+			{PURPLE_POUNCE_IDLE, _("%s has become idle (%s)")},
+			{PURPLE_POUNCE_AWAY, _("%s has gone away. (%s)")},
+			{PURPLE_POUNCE_MESSAGE_RECEIVED, _("%s has sent you a message. (%s)")},
+			{0, NULL}
+		};
+		int i;
 		reason = purple_pounce_action_get_attribute(pounce, "popup-notify",
-														  "reason");
+				"reason");
 
 		/*
 		 * Here we place the protocol name in the pounce dialog to lessen
 		 * confusion about what protocol a pounce is for.
 		 */
-		tmp = g_strdup_printf(
-				   (events & PURPLE_POUNCE_TYPING) ?
-				   _("%s has started typing to you (%s)") :
-				   (events & PURPLE_POUNCE_TYPED) ?
-				   _("%s has paused while typing to you (%s)") :
-				   (events & PURPLE_POUNCE_SIGNON) ?
-				   _("%s has signed on (%s)") :
-				   (events & PURPLE_POUNCE_IDLE_RETURN) ?
-				   _("%s has returned from being idle (%s)") :
-				   (events & PURPLE_POUNCE_AWAY_RETURN) ?
-				   _("%s has returned from being away (%s)") :
-				   (events & PURPLE_POUNCE_TYPING_STOPPED) ?
-				   _("%s has stopped typing to you (%s)") :
-				   (events & PURPLE_POUNCE_SIGNOFF) ?
-				   _("%s has signed off (%s)") :
-				   (events & PURPLE_POUNCE_IDLE) ?
-				   _("%s has become idle (%s)") :
-				   (events & PURPLE_POUNCE_AWAY) ?
-				   _("%s has gone away. (%s)") :
-				   (events & PURPLE_POUNCE_MESSAGE_RECEIVED) ?
-				   _("%s has sent you a message. (%s)") :
-				   _("Unknown pounce event. Please report this!"),
-				   alias, purple_account_get_protocol_name(account));
+		for (i = 0; messages[i].format != NULL; i++) {
+			if (messages[i].event & events) {
+				tmp = g_strdup_printf(messages[i].format, alias,
+						purple_account_get_protocol_name(account));
+				break;
+			}
+		}
+		if (tmp == NULL)
+			tmp = g_strdup(_("Unknown pounce event. Please report this!"));
 
 		/*
 		 * Ok here is where I change the second argument, title, from
@@ -880,7 +882,7 @@
 			purple_conversation_write(conv, NULL, message,
 									PURPLE_MESSAGE_SEND, time(NULL));
 
-			serv_send_im(account->gc, (char *)pouncee, (char *)message, 0);
+			serv_send_im(purple_account_get_connection(account), (char *)pouncee, (char *)message, 0);
 		}
 	}
 
--- a/finch/gntprefs.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntprefs.c	Wed Feb 06 03:35:04 2008 +0000
@@ -76,17 +76,17 @@
 	PurplePrefType type;
 	const char *pref;
 	const char *label;
-	GList *(*lv)();   /* If the value is to be selected from a number of choices */
+	GList *(*lv)(void);   /* If the value is to be selected from a number of choices */
 } Prefs;
 
 static GList *
-get_log_options()
+get_log_options(void)
 {
 	return purple_log_logger_get_options();
 }
 
 static GList *
-get_idle_options()
+get_idle_options(void)
 {
 	GList *list = NULL;
 	list = g_list_append(list, (char *)_("Based on keyboard use"));
@@ -99,7 +99,7 @@
 }
 
 static GList *
-get_status_titles()
+get_status_titles(void)
 {
 	GList *list = NULL;
 	GList *iter;
@@ -212,7 +212,7 @@
 };
 
 static void
-free_strings()
+free_strings(void)
 {
 	g_list_foreach(pref_request.freestrings, (GFunc)g_free, NULL);
 	g_list_free(pref_request.freestrings);
--- a/finch/gntrequest.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntrequest.c	Wed Feb 06 03:35:04 2008 +0000
@@ -36,6 +36,7 @@
 
 #include "finch.h"
 #include "gntrequest.h"
+#include "debug.h"
 #include "util.h"
 
 typedef struct
@@ -252,7 +253,7 @@
 		void *user_data, size_t actioncount,
 		va_list actions)
 {
-	GntWidget *window, *box, *button;
+	GntWidget *window, *box, *button, *focus = NULL;
 	int i;
 
 	window = setup_request_window(title, primary, secondary, PURPLE_REQUEST_ACTION);
@@ -271,9 +272,14 @@
 		g_object_set_data(G_OBJECT(button), "activate-userdata", user_data);
 		g_object_set_data(G_OBJECT(button), "activate-id", GINT_TO_POINTER(i));
 		g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(request_action_cb), window);
+
+		if (i == default_value)
+			focus = button;
 	}
 
 	gnt_widget_show(window);
+	if (focus)
+		gnt_box_give_focus_to_child(GNT_BOX(window), focus);
 
 	return window;
 }
@@ -302,26 +308,26 @@
 			PurpleRequestFieldType type = purple_request_field_get_type(field);
 			if (type == PURPLE_REQUEST_FIELD_BOOLEAN)
 			{
-				GntWidget *check = field->ui_data;
+				GntWidget *check = FINCH_GET_DATA(field);
 				gboolean value = gnt_check_box_get_checked(GNT_CHECK_BOX(check));
 				purple_request_field_bool_set_value(field, value);
 			}
 			else if (type == PURPLE_REQUEST_FIELD_STRING)
 			{
-				GntWidget *entry = field->ui_data;
+				GntWidget *entry = FINCH_GET_DATA(field);
 				const char *text = gnt_entry_get_text(GNT_ENTRY(entry));
 				purple_request_field_string_set_value(field, (text && *text) ? text : NULL);
 			}
 			else if (type == PURPLE_REQUEST_FIELD_INTEGER)
 			{
-				GntWidget *entry = field->ui_data;
+				GntWidget *entry = FINCH_GET_DATA(field);
 				const char *text = gnt_entry_get_text(GNT_ENTRY(entry));
 				int value = (text && *text) ? atoi(text) : 0;
 				purple_request_field_int_set_value(field, value);
 			}
 			else if (type == PURPLE_REQUEST_FIELD_CHOICE)
 			{
-				GntWidget *combo = field->ui_data;
+				GntWidget *combo = FINCH_GET_DATA(field);
 				int id;
 				id = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)));
 				purple_request_field_choice_set_value(field, id);
@@ -332,7 +338,7 @@
 				if (purple_request_field_list_get_multi_select(field))
 				{
 					GList *iter;
-					GntWidget *tree = field->ui_data;
+					GntWidget *tree = FINCH_GET_DATA(field);
 
 					iter = purple_request_field_list_get_items(field);
 					for (; iter; iter = iter->next)
@@ -345,7 +351,7 @@
 				}
 				else
 				{
-					GntWidget *combo = field->ui_data;
+					GntWidget *combo = FINCH_GET_DATA(field);
 					gpointer data = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo));
 					list = g_list_append(list, data);
 				}
@@ -355,7 +361,7 @@
 			}
 			else if (type == PURPLE_REQUEST_FIELD_ACCOUNT)
 			{
-				GntWidget *combo = field->ui_data;
+				GntWidget *combo = FINCH_GET_DATA(field);
 				PurpleAccount *acc = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo));
 				purple_request_field_account_set_value(field, acc);
 			}
@@ -418,9 +424,10 @@
 			*screenname = entry;
 	} else if (hint && !strcmp(hint, "group")) {
 		PurpleBlistNode *node;
-		for (node = purple_blist_get_root(); node; node = node->next) {
+		for (node = purple_blist_get_root(); node;
+				node = purple_blist_node_get_sibling_next(node)) {
 			if (PURPLE_BLIST_NODE_IS_GROUP(node))
-				gnt_entry_add_suggest(GNT_ENTRY(entry), ((PurpleGroup *)node)->name);
+				gnt_entry_add_suggest(GNT_ENTRY(entry), purple_group_get_name((PurpleGroup *)node));
 		}
 	}
 	return entry;
@@ -587,35 +594,35 @@
 
 			if (type == PURPLE_REQUEST_FIELD_BOOLEAN)
 			{
-				field->ui_data = create_boolean_field(field);
+				FINCH_SET_DATA(field, create_boolean_field(field));
 			}
 			else if (type == PURPLE_REQUEST_FIELD_STRING)
 			{
-				field->ui_data = create_string_field(field, &screenname);
+				FINCH_SET_DATA(field, create_string_field(field, &screenname));
 			}
 			else if (type == PURPLE_REQUEST_FIELD_INTEGER)
 			{
-				field->ui_data = create_integer_field(field);
+				FINCH_SET_DATA(field, create_integer_field(field));
 			}
 			else if (type == PURPLE_REQUEST_FIELD_CHOICE)
 			{
-				field->ui_data = create_choice_field(field);
+				FINCH_SET_DATA(field, create_choice_field(field));
 			}
 			else if (type == PURPLE_REQUEST_FIELD_LIST)
 			{
-				field->ui_data = create_list_field(field);
+				FINCH_SET_DATA(field, create_list_field(field));
 			}
 			else if (type == PURPLE_REQUEST_FIELD_ACCOUNT)
 			{
-				accountlist = field->ui_data = create_account_field(field);
+				accountlist = FINCH_SET_DATA(field, create_account_field(field));
 			}
 			else
 			{
-				field->ui_data = gnt_label_new_with_format(_("Not implemented yet."),
-						GNT_TEXT_FLAG_BOLD);
+				FINCH_SET_DATA(field, gnt_label_new_with_format(_("Not implemented yet."),
+						GNT_TEXT_FLAG_BOLD));
 			}
 			gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID);
-			gnt_box_add_widget(GNT_BOX(hbox), GNT_WIDGET(field->ui_data));
+			gnt_box_add_widget(GNT_BOX(hbox), GNT_WIDGET(FINCH_GET_DATA(field)));
 		}
 		if (grlist->next)
 			gnt_box_add_widget(GNT_BOX(box), gnt_hline_new());
@@ -824,3 +831,32 @@
 	}
 }
 
+GntWidget *finch_request_field_get_widget(PurpleRequestField *field)
+{
+	GntWidget *ret = NULL;
+	switch (purple_request_field_get_type(field)) {
+		case PURPLE_REQUEST_FIELD_BOOLEAN:
+			ret = create_boolean_field(field);
+			break;
+		case PURPLE_REQUEST_FIELD_STRING:
+			ret = create_string_field(field, NULL);
+			break;
+		case PURPLE_REQUEST_FIELD_INTEGER:
+			ret = create_integer_field(field);
+			break;
+		case PURPLE_REQUEST_FIELD_CHOICE:
+			ret = create_choice_field(field);
+			break;
+		case PURPLE_REQUEST_FIELD_LIST:
+			ret = create_list_field(field);
+			break;
+		case PURPLE_REQUEST_FIELD_ACCOUNT:
+			ret = create_account_field(field);
+			break;
+		default:
+			purple_debug_error("GntRequest", "Unimplemented request-field %d\n", purple_request_field_get_type(field));
+			break;
+	}
+	return ret;
+}
+
--- a/finch/gntrequest.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntrequest.h	Wed Feb 06 03:35:04 2008 +0000
@@ -27,6 +27,7 @@
 #define _GNT_REQUEST_H
 
 #include "request.h"
+#include "gnt.h"
 
 /**********************************************************************
  * @name GNT Request API
@@ -56,6 +57,15 @@
  */
 void finch_request_save_in_prefs(gpointer null, PurpleRequestFields *fields);
 
+/**
+ * Create a widget field for a request-field.
+ *
+ * @param field   The request field.
+ *
+ * @return A GntWidget for the request field.
+ * @since 2.4.0
+ */
+GntWidget *finch_request_field_get_widget(PurpleRequestField *field);
 /*@}*/
 
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/finch/gntroomlist.c	Wed Feb 06 03:35:04 2008 +0000
@@ -0,0 +1,420 @@
+/**
+ * @file gntroomlist.c GNT Room List API
+ * @ingroup finch
+ */
+
+/* finch
+ *
+ * Finch 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 "finch.h"
+
+#include "gntrequest.h"
+#include "gntroomlist.h"
+
+#include "gntbox.h"
+#include "gntbutton.h"
+#include "gntcombobox.h"
+#include "gnttextview.h"
+#include "gnttree.h"
+#include "gntwindow.h"
+
+#include "debug.h"
+
+#define PREF_ROOT "/finch/roomlist"
+
+/* Yes, just one roomlist at a time. Let's not get greedy. Aight? */
+struct _FinchRoomlist
+{
+	GntWidget *window;
+
+	GntWidget *accounts;
+	GntWidget *tree;
+	GntWidget *details;
+
+	GntWidget *getlist;
+	GntWidget *add;
+	GntWidget *join;
+	GntWidget *stop;
+	GntWidget *close;
+
+	PurpleAccount *account;
+	PurpleRoomlist *roomlist;
+} froomlist;
+
+typedef struct _FinchRoomlist FinchRoomlist;
+
+static void
+unset_roomlist(gpointer null)
+{
+	froomlist.window = NULL;
+	if (froomlist.roomlist) {
+		purple_roomlist_unref(froomlist.roomlist);
+		froomlist.roomlist = NULL;
+	}
+	froomlist.account = NULL;
+	froomlist.tree = NULL;
+}
+
+static void
+update_roomlist(PurpleRoomlist *list)
+{
+	if (froomlist.roomlist == list)
+		return;
+
+	if (froomlist.roomlist)
+		purple_roomlist_unref(froomlist.roomlist);
+
+	if ((froomlist.roomlist = list) != NULL)
+		purple_roomlist_ref(list);
+}
+
+static void fl_stop(GntWidget *button, gpointer null)
+{
+	if (froomlist.roomlist &&
+			purple_roomlist_get_in_progress(froomlist.roomlist))
+		purple_roomlist_cancel_get_list(froomlist.roomlist);
+}
+
+static void fl_get_list(GntWidget *button, gpointer null)
+{
+	PurpleAccount *account = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(froomlist.accounts));
+	PurpleConnection *gc = purple_account_get_connection(account);
+
+	if (!gc)
+		return;
+
+	update_roomlist(NULL);
+	froomlist.roomlist = purple_roomlist_get_list(gc);
+	gnt_box_give_focus_to_child(GNT_BOX(froomlist.window), froomlist.tree);
+}
+
+static void fl_add_chat(GntWidget *button, gpointer null)
+{
+	char *name;
+	PurpleRoomlistRoom *room = gnt_tree_get_selection_data(GNT_TREE(froomlist.tree));
+	PurpleConnection *gc = purple_account_get_connection(froomlist.account);
+	PurplePluginProtocolInfo *prpl_info = NULL;
+
+	if (gc == NULL || room == NULL)
+		return;
+
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
+
+	if(prpl_info != NULL && prpl_info->roomlist_room_serialize)
+		name = prpl_info->roomlist_room_serialize(room);
+	else
+		name = g_strdup(purple_roomlist_room_get_name(room));
+
+	purple_blist_request_add_chat(froomlist.account, NULL, NULL, name);
+
+	g_free(name);
+}
+
+static void fl_close(GntWidget *button, gpointer null)
+{
+	gnt_widget_destroy(froomlist.window);
+}
+
+static void
+roomlist_activated(GntWidget *widget)
+{
+	PurpleRoomlistRoom *room = gnt_tree_get_selection_data(GNT_TREE(widget));
+	if (!room)
+		return;
+
+	switch (purple_roomlist_room_get_type(room)) {
+		case PURPLE_ROOMLIST_ROOMTYPE_ROOM:
+			purple_roomlist_room_join(froomlist.roomlist, room);
+			break;
+		case PURPLE_ROOMLIST_ROOMTYPE_CATEGORY:
+			if (!room->expanded_once) {
+				purple_roomlist_expand_category(froomlist.roomlist, room);
+				room->expanded_once = TRUE;
+			}
+			break;
+	}
+	gnt_tree_set_expanded(GNT_TREE(widget), room, TRUE);
+}
+
+static void
+roomlist_selection_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null)
+{
+	GList *iter, *field;
+	PurpleRoomlistRoom *room = current;
+	GntTextView *tv = GNT_TEXT_VIEW(froomlist.details);
+	gboolean first = TRUE;
+
+	gnt_text_view_clear(tv);
+
+	if (!room)
+		return;
+
+	for (iter = purple_roomlist_room_get_fields(room),
+			field = purple_roomlist_get_fields(froomlist.roomlist);
+			iter && field;
+			iter = iter->next, field = field->next) {
+		PurpleRoomlistField *f = field->data;
+		char *label = NULL;
+
+		if (purple_roomlist_field_get_hidden(f)) {
+			continue;
+		}
+
+		if (!first)
+			gnt_text_view_append_text_with_flags(tv, "\n", GNT_TEXT_FLAG_NORMAL);
+
+		gnt_text_view_append_text_with_flags(tv,
+				purple_roomlist_field_get_label(f), GNT_TEXT_FLAG_BOLD);
+		gnt_text_view_append_text_with_flags(tv, ": ", GNT_TEXT_FLAG_BOLD);
+
+		switch (purple_roomlist_field_get_type(f)) {
+			case PURPLE_ROOMLIST_FIELD_BOOL:
+				label = g_strdup(iter->data ? "True" : "False");
+				break;
+			case PURPLE_ROOMLIST_FIELD_INT:
+				label = g_strdup_printf("%d", (int)iter->data);
+				break;
+			case PURPLE_ROOMLIST_FIELD_STRING:
+				label = g_strdup(iter->data);
+				break;
+		}
+		gnt_text_view_append_text_with_flags(tv, label, GNT_TEXT_FLAG_NORMAL);
+		g_free(label);
+		first = FALSE;
+	}
+
+	if (purple_roomlist_room_get_type(room) == PURPLE_ROOMLIST_ROOMTYPE_CATEGORY) {
+		if (!first)
+			gnt_text_view_append_text_with_flags(tv, "\n", GNT_TEXT_FLAG_NORMAL);
+		gnt_text_view_append_text_with_flags(tv,
+				_("Hit 'Enter' to find more rooms of this category."),
+				GNT_TEXT_FLAG_NORMAL);
+	}
+}
+
+static void
+roomlist_account_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null)
+{
+	if (froomlist.account == current) {
+		return;
+	}
+
+	froomlist.account = current;
+	if (froomlist.roomlist) {
+		if (purple_roomlist_get_in_progress(froomlist.roomlist))
+			purple_roomlist_cancel_get_list(froomlist.roomlist);
+		update_roomlist(NULL);
+	}
+
+	gnt_tree_remove_all(GNT_TREE(froomlist.tree));
+	gnt_widget_draw(froomlist.tree);
+}
+
+static void
+reset_account_list(PurpleAccount *account)
+{
+	GList *list;
+	GntComboBox *accounts = GNT_COMBO_BOX(froomlist.accounts);
+	gnt_combo_box_remove_all(accounts);
+	for (list = purple_connections_get_all(); list; list = list->next) {
+		PurplePluginProtocolInfo *prpl_info = NULL;
+		PurpleConnection *gc = list->data;
+
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
+		if (prpl_info->roomlist_get_list != NULL) {
+			PurpleAccount *account = purple_connection_get_account(gc);
+			char *text = g_strdup_printf("%s (%s)",
+					purple_account_get_username(account),
+					purple_account_get_protocol_name(account));
+			gnt_combo_box_add_data(accounts, account, text);
+			g_free(text);
+		}
+	}
+}
+
+static void
+size_changed_cb(GntWidget *widget, int oldw, int oldh)
+{
+	int w, h;
+	gnt_widget_get_size(widget, &w, &h);
+	purple_prefs_set_int(PREF_ROOT "/size/width", w);
+	purple_prefs_set_int(PREF_ROOT "/size/height", h);
+}
+
+static void
+setup_roomlist(PurpleAccount *account)
+{
+	GntWidget *window, *tree, *hbox, *accounts;
+	int iter;
+	struct {
+		const char *label;
+		GCallback callback;
+		GntWidget **widget;
+	} buttons[] = {
+		{_("Stop"), G_CALLBACK(fl_stop), &froomlist.stop},
+		{_("Get"), G_CALLBACK(fl_get_list), &froomlist.getlist},
+		{_("Add"), G_CALLBACK(fl_add_chat), &froomlist.add},
+		{_("Close"), G_CALLBACK(fl_close), &froomlist.close},
+		{NULL, NULL, NULL}
+	};
+
+	if (froomlist.window)
+		return;
+
+	froomlist.window = window = gnt_window_new();
+	g_object_set(G_OBJECT(window), "vertical", TRUE, NULL);
+	gnt_box_set_pad(GNT_BOX(window), 0);
+	gnt_box_set_title(GNT_BOX(window), _("Room List"));
+	gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID);
+
+	froomlist.accounts = accounts = gnt_combo_box_new();
+	reset_account_list(account);
+	gnt_box_add_widget(GNT_BOX(window), accounts);
+	g_signal_connect(G_OBJECT(accounts), "selection-changed",
+			G_CALLBACK(roomlist_account_changed), NULL);
+	froomlist.account = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(accounts));
+
+	froomlist.tree = tree = gnt_tree_new_with_columns(2);
+	gnt_tree_set_show_title(GNT_TREE(tree), TRUE);
+	g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(roomlist_activated), NULL);
+	gnt_tree_set_column_titles(GNT_TREE(tree), _("Name"), "");
+	gnt_tree_set_show_separator(GNT_TREE(tree), FALSE);
+	gnt_tree_set_col_width(GNT_TREE(tree), 1, 1);
+	gnt_tree_set_column_resizable(GNT_TREE(tree), 1, FALSE);
+	gnt_tree_set_search_column(GNT_TREE(tree), 0);
+
+	gnt_box_add_widget(GNT_BOX(window), tree);
+
+	froomlist.details = gnt_text_view_new();
+	gnt_text_view_set_flag(GNT_TEXT_VIEW(froomlist.details), GNT_TEXT_VIEW_TOP_ALIGN);
+	gnt_box_add_widget(GNT_BOX(window), froomlist.details);
+	gnt_widget_set_size(froomlist.details, -1, 8);
+
+	hbox = gnt_hbox_new(FALSE);
+	gnt_box_add_widget(GNT_BOX(window), hbox);
+
+	for (iter = 0; buttons[iter].label; iter++) {
+		GntWidget *button = gnt_button_new(buttons[iter].label);
+		gnt_box_add_widget(GNT_BOX(hbox), button);
+		g_signal_connect(G_OBJECT(button), "activate", buttons[iter].callback, NULL);
+		*buttons[iter].widget = button;
+		gnt_text_view_attach_scroll_widget(GNT_TEXT_VIEW(froomlist.details), button);
+	}
+
+	g_signal_connect(G_OBJECT(tree), "selection-changed", G_CALLBACK(roomlist_selection_changed), NULL);
+
+	g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(unset_roomlist), NULL);
+}
+
+static void
+fl_show_with_account(PurpleAccount *account)
+{
+	setup_roomlist(account);
+	g_signal_handlers_disconnect_matched(G_OBJECT(froomlist.window), G_SIGNAL_MATCH_FUNC,
+			0, 0, NULL, G_CALLBACK(size_changed_cb), NULL);
+	gnt_widget_show(froomlist.window);
+	gnt_screen_resize_widget(froomlist.window,
+			purple_prefs_get_int(PREF_ROOT "/size/width"),
+			purple_prefs_get_int(PREF_ROOT "/size/height"));
+	g_signal_connect(G_OBJECT(froomlist.window), "size_changed", G_CALLBACK(size_changed_cb), NULL);
+	gnt_window_present(froomlist.window);
+}
+
+static void
+fl_create(PurpleRoomlist *list)
+{
+	FINCH_SET_DATA(list, &froomlist);
+	setup_roomlist(NULL);
+	update_roomlist(list);
+}
+
+static void
+fl_set_fields(PurpleRoomlist *list, GList *fields)
+{
+}
+
+static void
+fl_add_room(PurpleRoomlist *roomlist, PurpleRoomlistRoom *room)
+{
+	gboolean category;
+	if (froomlist.roomlist != roomlist)
+		return;
+
+	category = (purple_roomlist_room_get_type(room) == PURPLE_ROOMLIST_ROOMTYPE_CATEGORY);
+	gnt_tree_remove(GNT_TREE(froomlist.tree), room);
+	gnt_tree_add_row_after(GNT_TREE(froomlist.tree), room,
+			gnt_tree_create_row(GNT_TREE(froomlist.tree),
+				purple_roomlist_room_get_name(room),
+				category ? "<" : ""),
+			purple_roomlist_room_get_parent(room), NULL);
+	gnt_tree_set_expanded(GNT_TREE(froomlist.tree), room, !category);
+}
+
+static void
+fl_destroy(PurpleRoomlist *list)
+{
+	if (!froomlist.window)
+		return;
+
+	if (froomlist.roomlist == list) {
+		froomlist.roomlist = NULL;
+		gnt_tree_remove_all(GNT_TREE(froomlist.tree));
+		gnt_widget_draw(froomlist.tree);
+	}
+}
+
+static PurpleRoomlistUiOps ui_ops =
+{
+	fl_show_with_account, /* void (*show_with_account)(PurpleAccount *account); **< Force the ui to pop up a dialog and get the list */
+	fl_create, /* void (*create)(PurpleRoomlist *list); **< A new list was created. */
+	fl_set_fields, /* void (*set_fields)(PurpleRoomlist *list, GList *fields); **< Sets the columns. */
+	fl_add_room, /* void (*add_room)(PurpleRoomlist *list, PurpleRoomlistRoom *room); **< Add a room to the list. */
+	NULL, /* void (*in_progress)(PurpleRoomlist *list, gboolean flag); **< Are we fetching stuff still? */
+	fl_destroy, /* void (*destroy)(PurpleRoomlist *list); **< We're destroying list. */
+
+	NULL, /* void (*_purple_reserved1)(void); */
+	NULL, /* void (*_purple_reserved2)(void); */
+	NULL, /* void (*_purple_reserved3)(void); */
+	NULL /* void (*_purple_reserved4)(void); */
+};
+
+PurpleRoomlistUiOps *finch_roomlist_get_ui_ops(void)
+{
+	return &ui_ops;
+}
+
+void finch_roomlist_show_all(void)
+{
+	purple_roomlist_show_with_account(NULL);
+}
+
+void finch_roomlist_init(void)
+{
+	purple_prefs_add_none(PREF_ROOT);
+	purple_prefs_add_none(PREF_ROOT "/size");
+	purple_prefs_add_int(PREF_ROOT "/size/width", 60);
+	purple_prefs_add_int(PREF_ROOT "/size/height", 15);
+}
+
+void finch_roomlist_uninit(void)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/finch/gntroomlist.h	Wed Feb 06 03:35:04 2008 +0000
@@ -0,0 +1,61 @@
+/**
+ * @file gntroomlist.h GNT Room List API
+ * @ingroup finch
+ */
+
+/* finch
+ *
+ * Finch 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 _GNT_ROOMLIST_H
+#define _GNT_ROOMLIST_H
+
+#include "roomlist.h"
+
+/**********************************************************************
+ * @name GNT Room List API
+ **********************************************************************/
+/*@{*/
+
+/**
+ * Initialize the roomlist subsystem.
+ */
+void finch_roomlist_init(void);
+
+/**
+ * Get the ui-functions.
+ *
+ * @return The PurpleRoomlistUiOps structure populated with the appropriate functions.
+ */
+PurpleRoomlistUiOps *finch_roomlist_get_ui_ops(void);
+
+/**
+ * Show the roomlist dialog.
+ */
+void finch_roomlist_show_all(void);
+
+/**
+ * Uninitialize the roomlist subsystem.
+ */
+void finch_roomlist_uninit(void);
+
+/*@}*/
+
+#endif
+
--- a/finch/gntsound.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntsound.c	Wed Feb 06 03:35:04 2008 +0000
@@ -23,7 +23,6 @@
  * 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 "finch.h"
 
 #ifdef _WIN32
@@ -142,13 +141,15 @@
 	char *nick = NULL;
 	char *name = NULL;
 	gboolean ret = FALSE;
+	PurpleAccount *account;
+
 	chat = purple_conversation_get_chat_data(conv);
-
 	if (chat == NULL)
 		return ret;
 
-	nick = g_strdup(purple_normalize(conv->account, chat->nick));
-	name = g_strdup(purple_normalize(conv->account, aname));
+	account = purple_conversation_get_account(conv);
+	nick = g_strdup(purple_normalize(account, chat->nick));
+	name = g_strdup(purple_normalize(account, aname));
 
 	if (g_utf8_collate(nick, name) == 0)
 		ret = TRUE;
@@ -286,7 +287,7 @@
 }
 
 static void *
-finch_sound_get_handle()
+finch_sound_get_handle(void)
 {
 	static int handle;
 
--- a/finch/gntui.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/gntui.c	Wed Feb 06 03:35:04 2008 +0000
@@ -19,7 +19,7 @@
  * 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 "finch.h"
 
 #include "gntui.h"
 
@@ -30,11 +30,13 @@
 #include "gntconv.h"
 #include "gntdebug.h"
 #include "gntft.h"
+#include "gntlog.h"
 #include "gntnotify.h"
 #include "gntplugin.h"
 #include "gntpounce.h"
 #include "gntprefs.h"
 #include "gntrequest.h"
+#include "gntroomlist.h"
 #include "gntstatus.h"
 #include "gntsound.h"
 
@@ -71,14 +73,24 @@
 	finch_notify_init();
 	purple_notify_set_ui_ops(finch_notify_get_ui_ops());
 
+	/* Request */
 	finch_request_init();
 	purple_request_set_ui_ops(finch_request_get_ui_ops());
 
+	/* Pounce */
 	finch_pounces_init();
 
+	/* Log */
+	finch_log_init();
+
+	/* File transfer */
 	finch_xfers_init();
 	purple_xfers_set_ui_ops(finch_xfers_get_ui_ops());
 
+	/* Roomlist */
+	finch_roomlist_init();
+	purple_roomlist_set_ui_ops(finch_roomlist_get_ui_ops());
+
 	gnt_register_action(_("Accounts"), finch_accounts_show_all);
 	gnt_register_action(_("Buddy List"), finch_blist_show);
 	gnt_register_action(_("Buddy Pounces"), finch_pounces_manager_show);
@@ -86,6 +98,7 @@
 	gnt_register_action(_("Debug Window"), finch_debug_window_show);
 	gnt_register_action(_("File Transfers"), finch_xfer_dialog_show);
 	gnt_register_action(_("Plugins"), finch_plugins_show_all);
+	gnt_register_action(_("Room List"), finch_roomlist_show_all);
 	gnt_register_action(_("Sounds"), finch_sounds_show_all);
 	gnt_register_action(_("Preferences"), finch_prefs_show_all);
 	gnt_register_action(_("Statuses"), finch_savedstatus_show_all);
@@ -115,9 +128,14 @@
 
 	finch_pounces_uninit();
 
+	finch_log_uninit();
+
 	finch_xfers_uninit();
 	purple_xfers_set_ui_ops(NULL);
 
+	finch_roomlist_uninit();
+	purple_roomlist_set_ui_ops(NULL);
+
 	gnt_quit();
 #endif
 }
--- a/finch/libgnt/gnt.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gnt.h	Wed Feb 06 03:35:04 2008 +0000
@@ -141,7 +141,7 @@
  * @param label      The user-visible label for the action.
  * @param callback   The callback function for the action.
  */
-void gnt_register_action(const char *label, void (*callback)());
+void gnt_register_action(const char *label, void (*callback)(void));
 
 /**
  * Show a menu.
--- a/finch/libgnt/gntbindable.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gntbindable.c	Wed Feb 06 03:35:04 2008 +0000
@@ -45,7 +45,7 @@
 } rebind_info;
 
 static void 
-gnt_bindable_free_rebind_info()
+gnt_bindable_free_rebind_info(void)
 {
 	g_free(rebind_info.name);
 	g_free(rebind_info.keys);
--- a/finch/libgnt/gntcolors.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gntcolors.c	Wed Feb 06 03:35:04 2008 +0000
@@ -40,7 +40,7 @@
 } colors[GNT_TOTAL_COLORS];
 
 static void
-backup_colors()
+backup_colors(void)
 {
 	short i;
 	for (i = 0; i < GNT_TOTAL_COLORS; i++)
@@ -51,13 +51,13 @@
 }
 
 static gboolean
-can_use_custom_color()
+can_use_custom_color(void)
 {
 	return (gnt_style_get_bool(GNT_STYLE_COLOR, FALSE) && can_change_color());
 }
 
 static void
-restore_colors()
+restore_colors(void)
 {
 	short i;
 	for (i = 0; i < GNT_TOTAL_COLORS; i++)
--- a/finch/libgnt/gntentry.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gntentry.c	Wed Feb 06 03:35:04 2008 +0000
@@ -916,7 +916,7 @@
 }
 
 static GntEntryKillRing *
-new_killring()
+new_killring(void)
 {
 	GntEntryKillRing *kr = g_new0(GntEntryKillRing, 1);
 	kr->buffer = g_string_new(NULL);
--- a/finch/libgnt/gntmain.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gntmain.c	Wed Feb 06 03:35:04 2008 +0000
@@ -72,7 +72,7 @@
 
 static void setup_io(void);
 
-static gboolean refresh_screen();
+static gboolean refresh_screen(void);
 
 static GntWM *wm;
 static GntClipboard *clipboard;
@@ -326,7 +326,7 @@
 }
 
 static gboolean
-refresh_screen()
+refresh_screen(void)
 {
 	gnt_bindable_perform_action_named(GNT_BINDABLE(wm), "refresh-screen", NULL);
 	return FALSE;
@@ -363,7 +363,7 @@
 }
 
 static void
-ask_before_exit()
+ask_before_exit(void)
 {
 	static GntWidget *win = NULL;
 	GntWidget *bbox, *button;
@@ -412,7 +412,7 @@
 #ifdef SIGWINCH
 	case SIGWINCH:
 		erase();
-		g_idle_add(refresh_screen, NULL);
+		g_idle_add((GSourceFunc)refresh_screen, NULL);
 		if (org_winch_handler)
 			org_winch_handler(sig);
 		signal(SIGWINCH, sighandler);
@@ -430,7 +430,7 @@
 }
 
 static void
-init_wm()
+init_wm(void)
 {
 	const char *name = gnt_style_get(GNT_STYLE_WM);
 	gpointer handle;
@@ -614,7 +614,7 @@
 	gnt_wm_update_window(wm, widget);
 }
 
-void gnt_register_action(const char *label, void (*callback)())
+void gnt_register_action(const char *label, void (*callback)(void))
 {
 	GntAction *action = g_new0(GntAction, 1);
 	action->label = g_strdup(label);
--- a/finch/libgnt/gnttextview.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gnttextview.c	Wed Feb 06 03:35:04 2008 +0000
@@ -830,7 +830,7 @@
 
 
 static void
-cleanup_pageditor()
+cleanup_pageditor(void)
 {
 	unlink(pageditor.file);
 	g_free(pageditor.file);
--- a/finch/libgnt/gnttree.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gnttree.c	Wed Feb 06 03:35:04 2008 +0000
@@ -39,6 +39,7 @@
 {
 	PROP_0,
 	PROP_COLUMNS,
+	PROP_EXPANDER,
 };
 
 enum
@@ -59,6 +60,7 @@
 
 	GCompareFunc compare;
 	int lastvisible;
+	int expander_level;
 };
 
 #define	TAB_SIZE 3
@@ -338,7 +340,7 @@
 						row->isselected ? 'X' : ' ');
 				fl = 4;
 			}
-			else if (row->parent == NULL && row->child)
+			else if (find_depth(row) < tree->priv->expander_level && row->child)
 			{
 				if (row->collapsed)
 				{
@@ -682,7 +684,7 @@
 	GntTreeRow *row = tree->current;
 	int dist;
 
-	if (!row->parent || SEARCHING(tree))
+	if (!row || !row->parent || SEARCHING(tree))
 		return FALSE;
 
 	tree->current = row->parent;
@@ -951,6 +953,11 @@
 		case PROP_COLUMNS:
 			_gnt_tree_init_internals(tree, g_value_get_int(value));
 			break;
+		case PROP_EXPANDER:
+			if (tree->priv->expander_level == g_value_get_int(value))
+				break;
+			tree->priv->expander_level = g_value_get_int(value);
+			g_object_notify(obj, "expander-level");
 		default:
 			break;
 	}
@@ -965,6 +972,9 @@
 		case PROP_COLUMNS:
 			g_value_set_int(value, tree->ncol);
 			break;
+		case PROP_EXPANDER:
+			g_value_set_int(value, tree->priv->expander_level);
+			break;
 		default:
 			break;
 	}
@@ -995,6 +1005,14 @@
 				G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB
 			)
 		);
+	g_object_class_install_property(gclass,
+			PROP_EXPANDER,
+			g_param_spec_int("expander-level", "Expander level",
+				"Number of levels to show expander in the tree.",
+				0, G_MAXINT, 1,
+				G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB
+			)
+		);
 
 	signals[SIG_SELECTION_CHANGED] = 
 		g_signal_new("selection-changed",
@@ -1618,6 +1636,7 @@
 {
 	GntWidget *widget = g_object_new(GNT_TYPE_TREE,
 			"columns", col,
+			"expander-level", 1,
 			NULL);
 
 	return widget;
@@ -1841,3 +1860,9 @@
 	tree->priv->search_func = func;
 }
 
+gpointer gnt_tree_get_parent_key(GntTree *tree, gpointer key)
+{
+	GntTreeRow *row = g_hash_table_lookup(tree->hash, key);
+	return (row && row->parent) ? row->parent->key : NULL;
+}
+
--- a/finch/libgnt/gnttree.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gnttree.h	Wed Feb 06 03:35:04 2008 +0000
@@ -332,7 +332,7 @@
  * @param color  The color
  * @since 2.4.0
  */
-void gnt_tree_set_row_color(GntTree *, void *, int);
+void gnt_tree_set_row_color(GntTree *tree, void *key, int color);
 
 /**
  * Select a row.
@@ -575,6 +575,17 @@
 void gnt_tree_set_search_function(GntTree *tree,
 		gboolean (*func)(GntTree *tree, gpointer key, const char *search, const char *current));
 
+/**
+ * Get the parent key for a row.
+ *
+ * @param  tree  The tree
+ * @param  key   The key for the row.
+ *
+ * @return The key of the parent row.
+ * @since 2.4.0
+ */
+gpointer gnt_tree_get_parent_key(GntTree *tree, gpointer key);
+
 G_END_DECLS
 
 #endif /* GNT_TREE_H */
--- a/finch/libgnt/gntwm.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gntwm.c	Wed Feb 06 03:35:04 2008 +0000
@@ -135,7 +135,7 @@
  * to expose the entire character, it is not always redrawn.
  */
 static void
-work_around_for_ncurses_bug()
+work_around_for_ncurses_bug(void)
 {
 #ifndef NO_WIDECHAR
 	PANEL *panel = NULL;
@@ -183,7 +183,7 @@
 }
 
 static void
-update_act_msg()
+update_act_msg(void)
 {
 	GntWidget *label;
 	GList *iter;
@@ -388,10 +388,10 @@
 }
 
 static void
-switch_window(GntWM *wm, int direction)
+switch_window(GntWM *wm, int direction, gboolean urgent)
 {
 	GntWidget *w = NULL, *wid = NULL;
-	int pos;
+	int pos, orgpos;
 
 	if (wm->_list.window || wm->menu)
 		return;
@@ -404,15 +404,20 @@
 	}
 
 	w = wm->cws->ordered->data;
-	pos = g_list_index(wm->cws->list, w);
-	pos += direction;
+	orgpos = pos = g_list_index(wm->cws->list, w);
+
+	do {
+		pos += direction;
 
-	if (pos < 0)
-		wid = g_list_last(wm->cws->list)->data;
-	else if (pos >= g_list_length(wm->cws->list))
-		wid = wm->cws->list->data;
-	else if (pos >= 0)
-		wid = g_list_nth_data(wm->cws->list, pos);
+		if (pos < 0) {
+			wid = g_list_last(wm->cws->list)->data;
+			pos = g_list_length(wm->cws->list) - 1;
+		} else if (pos >= g_list_length(wm->cws->list)) {
+			wid = wm->cws->list->data;
+			pos = 0;
+		} else
+			wid = g_list_nth_data(wm->cws->list, pos);
+	} while (urgent && !GNT_WIDGET_IS_FLAG_SET(wid, GNT_WIDGET_URGENT) && pos != orgpos);
 
 	gnt_wm_raise_window(wm, wid);
 }
@@ -421,7 +426,7 @@
 window_next(GntBindable *bindable, GList *null)
 {
 	GntWM *wm = GNT_WM(bindable);
-	switch_window(wm, 1);
+	switch_window(wm, 1, FALSE);
 	return TRUE;
 }
 
@@ -429,7 +434,7 @@
 window_prev(GntBindable *bindable, GList *null)
 {
 	GntWM *wm = GNT_WM(bindable);
-	switch_window(wm, -1);
+	switch_window(wm, -1, FALSE);
 	return TRUE;
 }
 
@@ -1202,6 +1207,22 @@
 	return ignore_keys ? !(ignore_keys = FALSE) : FALSE;
 }
 
+static gboolean
+window_next_urgent(GntBindable *bindable, GList *n)
+{
+	GntWM *wm = GNT_WM(bindable);
+	switch_window(wm, 1, TRUE);
+	return TRUE;
+}
+
+static gboolean
+window_prev_urgent(GntBindable *bindable, GList *n)
+{
+	GntWM *wm = GNT_WM(bindable);
+	switch_window(wm, -1, TRUE);
+	return TRUE;
+}
+
 #ifdef USE_PYTHON
 static void
 python_script_selected(GntFileSel *fs, const char *path, const char *f, gpointer n)
@@ -1323,6 +1344,7 @@
 {
 	int i;
 	GObjectClass *gclass = G_OBJECT_CLASS(klass);
+	char key[32];
 
 	gclass->dispose = gnt_wm_destroy;
 
@@ -1482,10 +1504,15 @@
 				"\033" "\\", NULL);
 	gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "help-for-window", help_for_window,
 				"\033" "|", NULL);
-	gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-start", ignore_keys_start, 
+	gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-start", ignore_keys_start,
 				GNT_KEY_CTRL_G, NULL);
-	gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-end", ignore_keys_end, 
+	gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-end", ignore_keys_end,
 				"\033" GNT_KEY_CTRL_G, NULL);
+	gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-next-urgent", window_next_urgent,
+				"\033" "\t", NULL);
+	snprintf(key, sizeof(key), "\033%s", GNT_KEY_BACK_TAB);
+	gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-prev-urgent", window_prev_urgent,
+				key[1] ? key : NULL, NULL);
 #ifdef USE_PYTHON
 	gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "run-python", run_python,
 				GNT_KEY_F3, NULL);
--- a/finch/libgnt/gntwm.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/gntwm.h	Wed Feb 06 03:35:04 2008 +0000
@@ -73,7 +73,7 @@
 typedef struct _GntAction
 {
 	const char *label;
-	void (*callback)();
+	void (*callback)(void);
 } GntAction;
 
 struct _GntWM
--- a/finch/libgnt/pygnt/test.py	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/libgnt/pygnt/test.py	Wed Feb 06 03:35:04 2008 +0000
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 import gobject
 import gnt
 
--- a/finch/plugins/Makefile.am	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/plugins/Makefile.am	Wed Feb 06 03:35:04 2008 +0000
@@ -1,7 +1,8 @@
 gntclipboard_la_LDFLAGS = -module -avoid-version
 gntgf_la_LDFLAGS      = -module -avoid-version
 gnthistory_la_LDFLAGS = -module -avoid-version
-gntlastlog_la_LDFLAGS    = -module -avoid-version
+gntlastlog_la_LDFLAGS = -module -avoid-version
+grouping_la_LDFLAGS   = -module -avoid-version
 
 if PLUGINS
 
@@ -9,7 +10,8 @@
 	gntclipboard.la \
 	gntgf.la \
 	gnthistory.la \
-	gntlastlog.la
+	gntlastlog.la \
+	grouping.la
 
 plugindir = $(libdir)/finch
 
@@ -17,6 +19,7 @@
 gntgf_la_SOURCES      = gntgf.c
 gnthistory_la_SOURCES = gnthistory.c
 gntlastlog_la_SOURCES = lastlog.c
+grouping_la_SOURCES   = grouping.c
 
 gntclipboard_la_CFLAGS = $(X11_CFLAGS)
 gntgf_la_CFLAGS = $(X11_CFLAGS)
@@ -25,6 +28,7 @@
 gntgf_la_LIBADD       = $(GLIB_LIBS) $(X11_LIBS) $(top_builddir)/finch/libgnt/libgnt.la
 gnthistory_la_LIBADD  = $(GLIB_LIBS)
 gntlastlog_la_LIBADD  = $(GLIB_LIBS)
+grouping_la_LIBADD    = $(GLIB_LIBS) $(top_builddir)/finch/libgnt/libgnt.la
 
 endif # PLUGINS
 
--- a/finch/plugins/gntgf.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/plugins/gntgf.c	Wed Feb 06 03:35:04 2008 +0000
@@ -122,7 +122,7 @@
 }
 
 static void
-urgent()
+urgent(void)
 {
 	/* This is from deryni/tuomov's urgent_test.c */
 	Display *dpy;
@@ -322,7 +322,7 @@
 }
 
 static GntWidget *
-config_frame()
+config_frame(void)
 {
 	GntWidget *window, *tree, *check;
 	int i;
--- a/finch/plugins/gnthistory.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/finch/plugins/gnthistory.c	Wed Feb 06 03:35:04 2008 +0000
@@ -51,8 +51,7 @@
 	PurpleMessageFlags mflag;
 
 	convtype = purple_conversation_get_type(c);
-	if (convtype == PURPLE_CONV_TYPE_IM)
-	{
+	if (convtype == PURPLE_CONV_TYPE_IM) {
 		GSList *buddies;
 		GSList *cur;
 
@@ -62,17 +61,17 @@
 			return;
 
 		/* Find buddies for this conversation. */
-	        buddies = purple_find_buddies(account, name);
+		buddies = purple_find_buddies(account, name);
 
 		/* If we found at least one buddy, save the first buddy's alias. */
 		if (buddies != NULL)
 			alias = purple_buddy_get_contact_alias((PurpleBuddy *)buddies->data);
 
-	        for (cur = buddies; cur != NULL; cur = cur->next)
-	        {
-	                PurpleBlistNode *node = cur->data;
-	                if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL)))
-	                {
+		for (cur = buddies; cur != NULL; cur = cur->next) {
+			PurpleBlistNode *node = cur->data;
+			if ((node != NULL) &&
+					((purple_blist_node_get_sibling_prev(node) != NULL) ||
+						(purple_blist_node_get_sibling_next(node) != NULL))) {
 				PurpleBlistNode *node2;
 
 				alias = purple_buddy_get_contact_alias((PurpleBuddy *)node);
@@ -80,26 +79,24 @@
 				/* We've found a buddy that matches this conversation.  It's part of a
 				 * PurpleContact with more than one PurpleBuddy.  Loop through the PurpleBuddies
 				 * in the contact and get all the logs. */
-				for (node2 = node->parent->child ; node2 != NULL ; node2 = node2->next)
-				{
+				for (node2 = purple_blist_node_get_first_child(purple_blist_node_get_parent(node));
+						node2 != NULL ; node2 = purple_blist_node_get_sibling_next(node2)) {
 					logs = g_list_concat(
-						purple_log_get_logs(PURPLE_LOG_IM,
-							purple_buddy_get_name((PurpleBuddy *)node2),
-							purple_buddy_get_account((PurpleBuddy *)node2)),
-						logs);
+							purple_log_get_logs(PURPLE_LOG_IM,
+								purple_buddy_get_name((PurpleBuddy *)node2),
+								purple_buddy_get_account((PurpleBuddy *)node2)),
+							logs);
 				}
 				break;
-	                }
-	        }
-	        g_slist_free(buddies);
+			}
+		}
+		g_slist_free(buddies);
 
 		if (logs == NULL)
 			logs = purple_log_get_logs(PURPLE_LOG_IM, name, account);
 		else
 			logs = g_list_sort(logs, purple_log_compare);
-	}
-	else if (convtype == PURPLE_CONV_TYPE_CHAT)
-	{
+	} else if (convtype == PURPLE_CONV_TYPE_CHAT) {
 		/* If we're not logging, don't show anything.
 		 * Otherwise, we might show a very old log. */
 		if (!purple_prefs_get_bool("/purple/logging/log_chats"))
@@ -115,7 +112,7 @@
 	history = purple_log_read((PurpleLog*)logs->data, &flags);
 
 	header = g_strdup_printf(_("<b>Conversation with %s on %s:</b><br>"), alias,
-							 purple_date_format_full(localtime(&((PurpleLog *)logs->data)->time)));
+			purple_date_format_full(localtime(&((PurpleLog *)logs->data)->time)));
 	purple_conversation_write(c, "", header, mflag, time(NULL));
 	g_free(header);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/finch/plugins/grouping.c	Wed Feb 06 03:35:04 2008 +0000
@@ -0,0 +1,278 @@
+/**
+ * @file grouping.c  Provides different grouping options.
+ *
+ * Copyright (C) 2008 Sadrul Habib Chowdhury <sadrul@users.sourceforge.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define PURPLE_PLUGIN
+
+#include "internal.h"
+#include "purple.h"
+
+#include "gntblist.h"
+#include "gntplugin.h"
+
+#include "gnttree.h"
+
+/**
+ * Online/Offline
+ */
+static PurpleBlistNode online = {.type = PURPLE_BLIST_OTHER_NODE},
+					   offline = {.type = PURPLE_BLIST_OTHER_NODE};
+
+static gboolean on_offline_init()
+{
+	GntTree *tree = finch_blist_get_tree();
+
+	gnt_tree_add_row_after(tree, &online,
+			gnt_tree_create_row(tree, _("Online")), NULL, NULL);
+	gnt_tree_add_row_after(tree, &offline,
+			gnt_tree_create_row(tree, _("Offline")), NULL, &online);
+
+	return TRUE;
+}
+
+static gboolean on_offline_can_add_node(PurpleBlistNode *node)
+{
+	switch (purple_blist_node_get_type(node)) {
+		case PURPLE_BLIST_CONTACT_NODE:
+			{
+				PurpleContact *contact = (PurpleContact*)node;
+				if (contact->currentsize > 0)
+					return TRUE;
+				return FALSE;
+			}
+			break;
+		case PURPLE_BLIST_BUDDY_NODE:
+			{
+				PurpleBuddy *buddy = (PurpleBuddy*)node;
+				if (PURPLE_BUDDY_IS_ONLINE(buddy))
+					return TRUE;
+				if (purple_prefs_get_bool("/finch/blist/showoffline") &&
+						purple_account_is_connected(purple_buddy_get_account(buddy)))
+					return TRUE;
+				return FALSE;
+			}
+			break;
+		case PURPLE_BLIST_CHAT_NODE:
+			{
+				PurpleChat *chat = (PurpleChat*)node;
+				return purple_account_is_connected(purple_chat_get_account(chat));
+			}
+			break;
+		default:
+			return FALSE;
+	}
+}
+
+static gpointer on_offline_find_parent(PurpleBlistNode *node)
+{
+	gpointer ret = NULL;
+
+	switch (purple_blist_node_get_type(node)) {
+		case PURPLE_BLIST_CONTACT_NODE:
+			node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)node);
+			ret = PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) ? &online : &offline;
+			break;
+		case PURPLE_BLIST_BUDDY_NODE:
+			ret = purple_blist_node_get_parent(node);
+			finch_blist_manager_add_node(ret);
+			break;
+		case PURPLE_BLIST_CHAT_NODE:
+			ret = &online;
+			break;
+		default:
+			break;
+	}
+	return ret;
+}
+
+static gboolean on_offline_create_tooltip(gpointer selected_row, GString **body, char **tool_title)
+{
+	static FinchBlistManager *def = NULL;
+	PurpleBlistNode *node = selected_row;
+
+	if (def == NULL)
+		def = finch_blist_manager_find("default");
+
+	if (purple_blist_node_get_type(node) == PURPLE_BLIST_OTHER_NODE) {
+		/* There should be some easy way of getting the total online count,
+		 * or total number of chats. Doing a loop here will probably be pretty
+		 * expensive. */
+		if (body)
+			*body = g_string_new(node == &online ? _("Online Buddies") : _("Offline Buddies"));
+		return TRUE;
+	} else {
+		return def ? def->create_tooltip(selected_row, body, tool_title) : FALSE;
+	}
+}
+
+static FinchBlistManager on_offline =
+{
+	"on-offline",
+	N_("Online/Offline"),
+	on_offline_init,
+	NULL,
+	on_offline_can_add_node,
+	on_offline_find_parent,
+	on_offline_create_tooltip,
+	{NULL, NULL, NULL, NULL}
+};
+
+/**
+ * Meebo-like Grouping.
+ */
+static PurpleBlistNode meebo = {.type = PURPLE_BLIST_OTHER_NODE};
+static gboolean meebo_init()
+{
+	GntTree *tree = finch_blist_get_tree();
+	if (!g_list_find(gnt_tree_get_rows(tree), &meebo)) {
+		gnt_tree_add_row_last(tree, &meebo,
+				gnt_tree_create_row(tree, _("Offline")), NULL);
+	}
+	return TRUE;
+}
+
+static gpointer meebo_find_parent(PurpleBlistNode *node)
+{
+	static FinchBlistManager *def = NULL;
+	if (def == NULL)
+		def = finch_blist_manager_find("default");
+
+	if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
+		PurpleBuddy *buddy = purple_contact_get_priority_buddy((PurpleContact*)node);
+		if (buddy && !PURPLE_BUDDY_IS_ONLINE(buddy)) {
+			return &meebo;
+		}
+	}
+	return def->find_parent(node);
+}
+
+static FinchBlistManager meebo_group =
+{
+	"meebo",
+	N_("Meebo"),
+	meebo_init,
+	NULL,
+	NULL,
+	meebo_find_parent,
+	NULL,
+	{NULL, NULL, NULL, NULL}
+};
+
+/**
+ * No Grouping.
+ */
+static gboolean no_group_init()
+{
+	GntTree *tree = finch_blist_get_tree();
+	g_object_set(G_OBJECT(tree), "expander-level", 0, NULL);
+	return TRUE;
+}
+
+static gboolean no_group_uninit()
+{
+	GntTree *tree = finch_blist_get_tree();
+	g_object_set(G_OBJECT(tree), "expander-level", 1, NULL);
+	return TRUE;
+}
+
+static gboolean no_group_can_add_node(PurpleBlistNode *node)
+{
+	return on_offline_can_add_node(node);   /* These happen to be the same */
+}
+
+static gpointer no_group_find_parent(PurpleBlistNode *node)
+{
+	gpointer ret = NULL;
+
+	switch (purple_blist_node_get_type(node)) {
+		case PURPLE_BLIST_BUDDY_NODE:
+			ret = purple_blist_node_get_parent(node);
+			finch_blist_manager_add_node(ret);
+			break;
+		default:
+			break;
+	}
+	return ret;
+}
+
+static FinchBlistManager no_group =
+{
+	"no-group",
+	N_("No Grouping"),
+	no_group_init,
+	no_group_uninit,
+	no_group_can_add_node,
+	no_group_find_parent,
+	NULL,
+	{NULL, NULL, NULL, NULL}
+};
+
+static gboolean
+plugin_load(PurplePlugin *plugin)
+{
+	finch_blist_install_manager(&on_offline);
+	finch_blist_install_manager(&meebo_group);
+	finch_blist_install_manager(&no_group);
+	return TRUE;
+}
+
+static gboolean
+plugin_unload(PurplePlugin *plugin)
+{
+	finch_blist_uninstall_manager(&on_offline);
+	finch_blist_uninstall_manager(&meebo_group);
+	finch_blist_uninstall_manager(&no_group);
+	return TRUE;
+}
+
+static PurplePluginInfo info =
+{
+	PURPLE_PLUGIN_MAGIC,
+	PURPLE_MAJOR_VERSION,
+	PURPLE_MINOR_VERSION,
+	PURPLE_PLUGIN_STANDARD,
+	FINCH_PLUGIN_TYPE,
+	0,
+	NULL,
+	PURPLE_PRIORITY_DEFAULT,
+	"grouping",
+	N_("Grouping"),
+	VERSION,
+	N_("Provides alternate buddylist grouping options."),
+	N_("Provides alternate buddylist grouping options."),
+	"Sadrul H Chowdhury <sadrul@users.sourceforge.net>",
+	PURPLE_WEBSITE,
+	plugin_load,
+	plugin_unload,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,NULL,NULL,NULL
+};
+
+static void
+init_plugin(PurplePlugin *plugin)
+{
+}
+
+PURPLE_INIT_PLUGIN(ignore, init_plugin, info)
+
+
--- a/libpurple/account.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/account.c	Wed Feb 06 03:35:04 2008 +0000
@@ -467,7 +467,7 @@
 }
 
 static void
-schedule_accounts_save()
+schedule_accounts_save(void)
 {
 	if (save_timer == 0)
 		save_timer = purple_timeout_add_seconds(5, save_cb, NULL);
@@ -752,7 +752,7 @@
 
 	current_error = g_new0(PurpleConnectionErrorInfo, 1);
 	current_error->type = type;
-	current_error->description = g_strdup(description);
+	current_error->description = description;
 
 	set_current_error(account, current_error);
 }
@@ -1219,7 +1219,11 @@
 	if (ops != NULL && ops->close_account_request != NULL)
 		ops->close_account_request(info->ui_handle);
 
+	/* TODO: This will leak info->user_data, but there is no callback to just clean that up */
+
+	g_free(info->user);
 	g_free(info);
+
 }
 
 void
@@ -1264,9 +1268,14 @@
 request_auth_cb(void *data)
 {
 	PurpleAccountRequestInfo *info = data;
+
+	handles = g_list_remove(handles, info);
+
 	info->auth_cb(info->userdata);
+
 	purple_signal_emit(purple_accounts_get_handle(),
 			"account-authorization-granted", info->account, info->user);
+
 	g_free(info->user);
 	g_free(info);
 }
@@ -1275,9 +1284,14 @@
 request_deny_cb(void *data)
 {
 	PurpleAccountRequestInfo *info = data;
+
+	handles = g_list_remove(handles, info);
+
 	info->deny_cb(info->userdata);
+
 	purple_signal_emit(purple_accounts_get_handle(),
 			"account-authorization-denied", info->account, info->user);
+
 	g_free(info->user);
 	g_free(info);
 }
@@ -2186,9 +2200,13 @@
 {
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleConnection *gc = purple_account_get_connection(account);
-
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	PurplePlugin *prpl = NULL;
+	
+	if (gc != NULL)
+	        prpl = purple_connection_get_prpl(gc);      
+
+	if (prpl != NULL)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 	if (prpl_info != NULL && prpl_info->add_buddy != NULL)
 		prpl_info->add_buddy(gc, buddy, purple_buddy_get_group(buddy));
@@ -2199,10 +2217,14 @@
 {
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleConnection *gc = purple_account_get_connection(account);
-
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
-
+	PurplePlugin *prpl = NULL;
+	
+	if (gc != NULL)
+	        prpl = purple_connection_get_prpl(gc);      
+
+	if (prpl != NULL)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+		
 	if (prpl_info) {
 		GList *cur, *groups = NULL;
 
@@ -2234,10 +2256,14 @@
 {
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleConnection *gc = purple_account_get_connection(account);
-
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
-
+	PurplePlugin *prpl = NULL;
+	
+	if (gc != NULL)
+	        prpl = purple_connection_get_prpl(gc);      
+
+	if (prpl != NULL)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+		
 	if (prpl_info && prpl_info->remove_buddy)
 		prpl_info->remove_buddy(gc, buddy, group);
 }
@@ -2247,10 +2273,14 @@
 {
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleConnection *gc = purple_account_get_connection(account);
-
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
-
+	PurplePlugin *prpl = NULL;
+	
+	if (gc != NULL)
+	        prpl = purple_connection_get_prpl(gc);      
+
+	if (prpl != NULL)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+		
 	if (prpl_info) {
 		if (prpl_info->remove_buddies)
 			prpl_info->remove_buddies(gc, buddies, groups);
@@ -2271,9 +2301,13 @@
 {
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleConnection *gc = purple_account_get_connection(account);
-
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	PurplePlugin *prpl = NULL;
+	
+	if (gc != NULL)
+	        prpl = purple_connection_get_prpl(gc);      
+
+	if (prpl != NULL)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 	if (prpl_info && prpl_info->remove_group)
 		prpl_info->remove_group(gc, group);
@@ -2285,11 +2319,15 @@
 {
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleConnection *gc = purple_account_get_connection(account);
-
+	PurplePlugin *prpl = NULL;
+	
 	purple_account_set_password(account, new_pw);
-
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	
+	if (gc != NULL)
+	        prpl = purple_connection_get_prpl(gc);      
+
+	if (prpl != NULL)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 	if (prpl_info && prpl_info->change_passwd)
 		prpl_info->change_passwd(gc, orig_pw, new_pw);
@@ -2298,16 +2336,20 @@
 gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy)
 {
 	PurpleConnection *gc;
-	PurplePluginProtocolInfo *prpl_info;
-
+	PurplePluginProtocolInfo *prpl_info = NULL;
+	PurplePlugin *prpl = NULL;
+	
 	g_return_val_if_fail(account, FALSE);
 	g_return_val_if_fail(buddy, FALSE);
 
 	gc = purple_account_get_connection(account);
 	if (gc == NULL)
 		return FALSE;
-
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	
+	prpl = purple_connection_get_prpl(gc);      
+
+	if (prpl != NULL)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 	if (!prpl_info || !prpl_info->offline_message)
 		return FALSE;
--- a/libpurple/account.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/account.h	Wed Feb 06 03:35:04 2008 +0000
@@ -410,37 +410,34 @@
 void purple_account_set_status_types(PurpleAccount *account, GList *status_types);
 
 /**
- * Activates or deactivates a status.  All changes to the statuses of
- * an account go through this function or purple_account_set_status_list.
- *
- * Only independent statuses can be deactivated with this. To deactivate
- * an exclusive status, activate a different (and exclusive?) status.
+ * Variadic version of purple_account_set_status_list(); the variadic list
+ * replaces @a attrs, and should be <tt>NULL</tt>-terminated.
  *
- * @param account   The account.
- * @param status_id The ID of the status.
- * @param active    The active state.
- * @param ...       Pairs of attributes for the new status passed in
- *                  as a NULL-terminated list of id/value pairs.
+ * @copydoc purple_account_set_status_list()
  */
 void purple_account_set_status(PurpleAccount *account, const char *status_id,
-							 gboolean active, ...) G_GNUC_NULL_TERMINATED;
+	gboolean active, ...) G_GNUC_NULL_TERMINATED;
 
 
 /**
  * Activates or deactivates a status.  All changes to the statuses of
- * an account go through this function or purple_account_set_status.
+ * an account go through this function or purple_account_set_status().
  *
- * Only independent statuses can be deactivated with this. To deactivate
- * an exclusive status, activate a different (and exclusive?) status.
+ * You can only deactivate an exclusive status by activating another exclusive
+ * status.  So, if @a status_id is an exclusive status and @a active is @c
+ * FALSE, this function does nothing.
  *
  * @param account   The account.
  * @param status_id The ID of the status.
- * @param active    The active state.
- * @param attrs		A list of attributes in key/value pairs
+ * @param active    Whether @a status_id is to be activated (<tt>TRUE</tt>) or
+ *                  deactivated (<tt>FALSE</tt>).
+ * @param attrs     A list of <tt>const char *</tt> attribute names followed by
+ *                  <tt>const char *</tt> attribute values for the status.
+ *                  (For example, one pair might be <tt>"message"</tt> followed
+ *                  by <tt>"hello, talk to me!"</tt>.)
  */
 void purple_account_set_status_list(PurpleAccount *account,
-								  const char *status_id,
-								  gboolean active, GList *attrs);
+	const char *status_id, gboolean active, GList *attrs);
 
 /**
  * Clears all protocol-specific settings on an account.
--- a/libpurple/accountopt.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/accountopt.h	Wed Feb 06 03:35:04 2008 +0000
@@ -83,7 +83,10 @@
 /*@{*/
 
 /**
- * Creates a new account option.
+ * Creates a new account option.  If you know what @a type will be in advance,
+ * consider using purple_account_option_bool_new(),
+ * purple_account_option_int_new(), purple_account_option_string_new() or
+ * purple_account_option_list_new() (as appropriate) instead.
  *
  * @param type      The type of option.
  * @param text      The text of the option.
@@ -91,8 +94,8 @@
  *
  * @return The account option.
  */
-PurpleAccountOption *purple_account_option_new(PurplePrefType type, const char *text,
-										   const char *pref_name);
+PurpleAccountOption *purple_account_option_new(PurplePrefType type,
+	const char *text, const char *pref_name);
 
 /**
  * Creates a new boolean account option.
@@ -104,8 +107,7 @@
  * @return The account option.
  */
 PurpleAccountOption *purple_account_option_bool_new(const char *text,
-												const char *pref_name,
-												gboolean default_value);
+	const char *pref_name, gboolean default_value);
 
 /**
  * Creates a new integer account option.
@@ -117,8 +119,7 @@
  * @return The account option.
  */
 PurpleAccountOption *purple_account_option_int_new(const char *text,
-											   const char *pref_name,
-											   int default_value);
+	const char *pref_name, int default_value);
 
 /**
  * Creates a new string account option.
@@ -130,8 +131,7 @@
  * @return The account option.
  */
 PurpleAccountOption *purple_account_option_string_new(const char *text,
-												  const char *pref_name,
-												  const char *default_value);
+	const char *pref_name, const char *default_value);
 
 /**
  * Creates a new list account option.
@@ -140,7 +140,7 @@
  * strings inside will be freed automatically.
  *
  * The list is a list of PurpleKeyValuePair items. The key is the ID stored and
- * used internally, and the value is the label displayed.
+ * used internally, and the <tt>(const char *)</tt> value is the label displayed.
  *
  * @param text      The text of the option.
  * @param pref_name The account preference name for the option.
@@ -149,8 +149,7 @@
  * @return The account option.
  */
 PurpleAccountOption *purple_account_option_list_new(const char *text,
-												const char *pref_name,
-												GList *list);
+	const char *pref_name, GList *list);
 
 /**
  * Destroys an account option.
@@ -240,11 +239,13 @@
 const char *purple_account_option_get_text(const PurpleAccountOption *option);
 
 /**
- * Returns the account setting for an account option.
+ * Returns the name of an account option.  This corresponds to the @c pref_name
+ * parameter supplied to purple_account_option_new() or one of the
+ * type-specific constructors.
  *
  * @param option The account option.
  *
- * @return The account setting.
+ * @return The option's name.
  */
 const char *purple_account_option_get_setting(const PurpleAccountOption *option);
 
--- a/libpurple/blist.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/blist.c	Wed Feb 06 03:35:04 2008 +0000
@@ -298,7 +298,7 @@
 }
 
 static xmlnode *
-blist_to_xmlnode()
+blist_to_xmlnode(void)
 {
 	xmlnode *node, *child, *grandchild;
 	PurpleBlistNode *gnode;
@@ -332,7 +332,7 @@
 }
 
 static void
-purple_blist_sync()
+purple_blist_sync(void)
 {
 	xmlnode *node;
 	char *data;
@@ -640,10 +640,10 @@
 
 		if (purple_account_is_connected(buddy->account))
 		{
-			int cmp;
-
-			cmp = purple_presence_compare(purple_buddy_get_presence(new_priority),
-			                            purple_buddy_get_presence(buddy));
+			int cmp = 1;
+			if (purple_account_is_connected(new_priority->account))
+				cmp = purple_presence_compare(purple_buddy_get_presence(new_priority),
+						purple_buddy_get_presence(buddy));
 
 			if (cmp > 0 || (cmp == 0 &&
 			                purple_prefs_get_bool("/purple/contact/last_match")))
@@ -753,6 +753,26 @@
 	return ret;
 }
 
+PurpleBlistNode *purple_blist_node_get_parent(PurpleBlistNode *node)
+{
+	return node ? node->parent : NULL;
+}
+
+PurpleBlistNode *purple_blist_node_get_first_child(PurpleBlistNode *node)
+{
+	return node ? node->child : NULL;
+}
+
+PurpleBlistNode *purple_blist_node_get_sibling_next(PurpleBlistNode *node)
+{
+	return node? node->next : NULL;
+}
+
+PurpleBlistNode *purple_blist_node_get_sibling_prev(PurpleBlistNode *node)
+{
+	return node? node->prev : NULL;
+}
+
 void
 purple_blist_update_buddy_status(PurpleBuddy *buddy, PurpleStatus *old_status)
 {
@@ -1067,11 +1087,18 @@
 	if(old_name && source && strcmp(source->name, old_name)) {
 		for (accts = purple_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) {
 			PurpleAccount *account = accts->data;
+			PurpleConnection *gc = NULL;
+			PurplePlugin *prpl = NULL;
 			PurplePluginProtocolInfo *prpl_info = NULL;
 			GList *l = NULL, *buddies = NULL;
 
-			if(account->gc && account->gc->prpl)
-				prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl);
+			gc = purple_account_get_connection(account);
+			
+			if(gc)
+				prpl = purple_connection_get_prpl(gc);
+
+			if(gc && prpl)
+				prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 			if(!prpl_info)
 				continue;
@@ -1084,7 +1111,7 @@
 			}
 
 			if(prpl_info->rename_group) {
-				prpl_info->rename_group(account->gc, old_name, source, buddies);
+				prpl_info->rename_group(gc, old_name, source, buddies);
 			} else {
 				GList *cur, *groups = NULL;
 
@@ -2232,6 +2259,22 @@
 	return (PurpleGroup *)(((PurpleBlistNode *)chat)->parent);
 }
 
+PurpleAccount *
+purple_chat_get_account(PurpleChat *chat)
+{
+	g_return_val_if_fail(chat != NULL, NULL);
+
+	return chat->account;
+}
+
+GHashTable *
+purple_chat_get_components(PurpleChat *chat)
+{
+	g_return_val_if_fail(chat != NULL, NULL);
+
+	return chat->components;
+}
+
 PurpleContact *purple_buddy_get_contact(PurpleBuddy *buddy)
 {
 	g_return_val_if_fail(buddy != NULL, NULL);
--- a/libpurple/blist.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/blist.h	Wed Feb 06 03:35:04 2008 +0000
@@ -53,13 +53,13 @@
 
 } PurpleBlistNodeType;
 
-#define PURPLE_BLIST_NODE_IS_CHAT(n)    ((n)->type == PURPLE_BLIST_CHAT_NODE)
-#define PURPLE_BLIST_NODE_IS_BUDDY(n)   ((n)->type == PURPLE_BLIST_BUDDY_NODE)
-#define PURPLE_BLIST_NODE_IS_CONTACT(n) ((n)->type == PURPLE_BLIST_CONTACT_NODE)
-#define PURPLE_BLIST_NODE_IS_GROUP(n)   ((n)->type == PURPLE_BLIST_GROUP_NODE)
+#define PURPLE_BLIST_NODE_IS_CHAT(n)    (purple_blist_node_get_type(n) == PURPLE_BLIST_CHAT_NODE)
+#define PURPLE_BLIST_NODE_IS_BUDDY(n)   (purple_blist_node_get_type(n) == PURPLE_BLIST_BUDDY_NODE)
+#define PURPLE_BLIST_NODE_IS_CONTACT(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CONTACT_NODE)
+#define PURPLE_BLIST_NODE_IS_GROUP(n)   (purple_blist_node_get_type(n) == PURPLE_BLIST_GROUP_NODE)
 
 #define PURPLE_BUDDY_IS_ONLINE(b) \
-	((b) != NULL && purple_account_is_connected((b)->account) && \
+	((b) != NULL && purple_account_is_connected(purple_buddy_get_account(b)) && \
 	 purple_presence_is_online(purple_buddy_get_presence(b)))
 
 typedef enum
@@ -231,10 +231,66 @@
  * @param node		A node.
  * @param offline	Whether to include nodes for offline accounts
  * @return	The next node
+ * @see purple_blist_node_get_parent
+ * @see purple_blist_node_get_first_child
+ * @see purple_blist_node_get_sibling_next
+ * @see purple_blist_node_get_sibling_prev
  */
 PurpleBlistNode *purple_blist_node_next(PurpleBlistNode *node, gboolean offline);
 
 /**
+ * Returns the parent node of a given node.
+ *
+ * @param node A node.
+ * @return  The parent node.
+ * @since 2.4.0
+ * @see purple_blist_node_get_first_child
+ * @see purple_blist_node_get_sibling_next
+ * @see purple_blist_node_get_sibling_prev
+ * @see purple_blist_node_next
+ */
+PurpleBlistNode *purple_blist_node_get_parent(PurpleBlistNode *node);
+
+/**
+ * Returns the the first child node of a given node.
+ *
+ * @param node A node.
+ * @return  The child node.
+ * @since 2.4.0
+ * @see purple_blist_node_get_parent
+ * @see purple_blist_node_get_sibling_next
+ * @see purple_blist_node_get_sibling_prev
+ * @see purple_blist_node_next
+ */
+PurpleBlistNode *purple_blist_node_get_first_child(PurpleBlistNode *node);
+
+/**
+ * Returns the sibling node of a given node.
+ *
+ * @param node A node.
+ * @return  The sibling node.
+ * @since 2.4.0
+ * @see purple_blist_node_get_parent
+ * @see purple_blist_node_get_first_child
+ * @see purple_blist_node_get_sibling_prev
+ * @see purple_blist_node_next
+ */
+PurpleBlistNode *purple_blist_node_get_sibling_next(PurpleBlistNode *node);
+
+/**
+ * Returns the previous sibling node of a given node.
+ *
+ * @param node A node.
+ * @return  The sibling node.
+ * @since 2.4.0
+ * @see purple_blist_node_get_parent
+ * @see purple_blist_node_get_first_child
+ * @see purple_blist_node_get_sibling_next
+ * @see purple_blist_node_next
+ */
+PurpleBlistNode *purple_blist_node_get_sibling_prev(PurpleBlistNode *node);
+
+/**
  * Shows the buddy list, creating a new one if necessary.
  */
 void purple_blist_show(void);
@@ -667,6 +723,26 @@
 PurpleGroup *purple_chat_get_group(PurpleChat *chat);
 
 /**
+ * Returns the account the chat belongs to.
+ *
+ * @param chat  The chat.
+ *
+ * @return  The account the chat belongs to.
+ * @since 2.4.0
+ */
+PurpleAccount *purple_chat_get_account(PurpleChat *chat);
+
+/**
+ * Get a hashtable containing information about a chat.
+ *
+ * @param chat  The chat.
+ *
+ * @constreturn  The hashtable.
+ * @since 2.4.0
+ */
+GHashTable *purple_chat_get_components(PurpleChat *chat);
+
+/**
  * Returns the group of which the buddy is a member.
  *
  * @param buddy   The buddy
--- a/libpurple/buddyicon.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/buddyicon.c	Wed Feb 06 03:35:04 2008 +0000
@@ -49,6 +49,8 @@
 static GHashTable *icon_data_cache = NULL;
 static GHashTable *icon_file_cache = NULL;
 
+static void delete_buddy_icon_settings(PurpleBlistNode *node, const char *setting_name);
+
 /* This one is used for both custom buddy icons
  * on PurpleContacts and account icons. */
 static GHashTable *pointer_icon_cache = NULL;
@@ -124,7 +126,7 @@
 							purple_imgstore_get_size(img));	
 	} else 	{
 		purple_debug_error("buddyicon", "Unable to create file %s: %s\n",
-		                   path, g_strerror(errno));
+		                   path, "File already exists.");
 	}
 	g_free(path);
 }
@@ -614,13 +616,16 @@
 				checksum = purple_blist_node_get_string((PurpleBlistNode*)b, "icon_checksum");
 				purple_buddy_icon_set_data(icon, data, len, checksum);
 			}
+			else
+				delete_buddy_icon_settings((PurpleBlistNode*)b, "buddy_icon");
+
 			g_free(path);
 		}
 
 		purple_buddy_icons_set_caching(caching);
 	}
 
-	return purple_buddy_icon_ref(icon);
+	return (icon ? purple_buddy_icon_ref(icon) : NULL);
 }
 
 gboolean
@@ -696,18 +701,13 @@
 	}
 	unref_filename(old_icon);
 
-	if (img)
-		g_hash_table_insert(pointer_icon_cache, account, img);
-	else
-		g_hash_table_remove(pointer_icon_cache, account);
-
 	if (purple_account_is_connected(account))
 	{
 		PurpleConnection *gc;
 		PurplePluginProtocolInfo *prpl_info;
 
 		gc = purple_account_get_connection(account);
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
 
 		if (prpl_info && prpl_info->set_buddy_icon)
 			prpl_info->set_buddy_icon(gc, img);
@@ -724,6 +724,11 @@
 	}
 	g_free(old_icon);
 
+	if (img)
+		g_hash_table_insert(pointer_icon_cache, account, img);
+	else
+		g_hash_table_remove(pointer_icon_cache, account);
+
 	return img;
 }
 
@@ -1156,7 +1161,8 @@
 	                                        g_free, NULL);
 	pointer_icon_cache = g_hash_table_new(g_direct_hash, g_direct_equal);
 
-	cache_dir = g_build_filename(purple_user_dir(), "icons", NULL);
+    if (!cache_dir)
+    	cache_dir = g_build_filename(purple_user_dir(), "icons", NULL);
 
 	purple_signal_connect(purple_imgstore_get_handle(), "image-deleting",
 	                      purple_buddy_icons_get_handle(),
--- a/libpurple/certificate.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/certificate.c	Wed Feb 06 03:35:04 2008 +0000
@@ -568,7 +568,7 @@
 		_("Single-use Certificate Verification"),
 		primary,
 		secondary,
-		1,            /* Accept by default */
+		0,            /* Accept by default */
 		NULL,         /* No account */
 		NULL,         /* No other user */
 		NULL,         /* No associated conversation */
@@ -1199,7 +1199,7 @@
 		_("SSL Certificate Verification"),
 		primary,
 		reason,
-		2,            /* Accept by default */
+		0,            /* Accept by default */
 		NULL,         /* No account */
 		NULL,         /* No other user */
 		NULL,         /* No associated conversation */
--- a/libpurple/certificate.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/certificate.h	Wed Feb 06 03:35:04 2008 +0000
@@ -31,6 +31,8 @@
 #ifndef _PURPLE_CERTIFICATE_H
 #define _PURPLE_CERTIFICATE_H
 
+#include <time.h>
+
 #include <glib.h>
 
 #ifdef __cplusplus
--- a/libpurple/cipher.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/cipher.c	Wed Feb 06 03:35:04 2008 +0000
@@ -775,7 +775,7 @@
 static void
 hmac_set_key(PurpleCipherContext *context, const guchar * key)
 {
-	hmac_set_key_with_len(context, key, strlen(key));
+	hmac_set_key_with_len(context, key, strlen((char *)key));
 }
 
 static size_t 
--- a/libpurple/connection.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/connection.c	Wed Feb 06 03:35:04 2008 +0000
@@ -52,8 +52,19 @@
 	PurpleConnection *gc = data;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	if (gc == NULL)
+		return TRUE;
+
+	/* Only send keep-alives if we haven't heard from the
+	 * server in a while.
+	 */
+	if ((time(NULL) - gc->last_received) < KEEPALIVE_INTERVAL)
+		return TRUE;
+
+	if (gc->prpl == NULL)
+		return TRUE;
+
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
 
 	if (prpl_info && prpl_info->keepalive)
 		prpl_info->keepalive(gc);
@@ -413,6 +424,14 @@
 	return gc->account;
 }
 
+PurplePlugin *
+purple_connection_get_prpl(const PurpleConnection *gc)
+{
+	g_return_val_if_fail(gc != NULL, NULL);
+
+	return gc->prpl;
+}
+
 const char *
 purple_connection_get_password(const PurpleConnection *gc)
 {
@@ -542,8 +561,10 @@
 
 	switch (ssl_error) {
 		case PURPLE_SSL_HANDSHAKE_FAILED:
+			reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR;
+			break;
 		case PURPLE_SSL_CONNECT_FAILED:
-			reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR;
+			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 			break;
 		case PURPLE_SSL_CERTIFICATE_INVALID:
 			/* TODO: maybe PURPLE_SSL_* should be more specific? */
@@ -551,7 +572,7 @@
 			break;
 		default:
 			g_assert_not_reached ();
-			reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR;
+			reason = PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR;
 	}
 
 	purple_connection_error_reason (gc, reason,
@@ -564,12 +585,12 @@
 	switch (reason)
 	{
 		case PURPLE_CONNECTION_ERROR_NETWORK_ERROR:
+		case PURPLE_CONNECTION_ERROR_ENCRYPTION_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:
--- a/libpurple/connection.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/connection.h	Wed Feb 06 03:35:04 2008 +0000
@@ -196,11 +196,11 @@
 	 *  available; on Windows, it uses Win32's network change notification
 	 *  infrastructure.
 	 */
-	void (*network_connected)();
+	void (*network_connected)(void);
 	/** Called when libpurple discovers that the computer's network
 	 *  connection has gone away.
 	 */
-	void (*network_disconnected)();
+	void (*network_disconnected)(void);
 
 	/** Called when an error causes a connection to be disconnected.
 	 *  Called before #disconnected.  This op is intended to replace
@@ -251,6 +251,8 @@
 	gboolean wants_to_die;
 
 	guint disconnect_timeout;    /**< Timer used for nasty stack tricks  */
+	time_t last_received;        /**< When we last received a packet. Set by the
+					  prpl to avoid sending unneeded keepalives */
 };
 
 #ifdef __cplusplus
@@ -362,7 +364,7 @@
  * @return TRUE if the account is connected, otherwise returns FALSE.
  */
 #define PURPLE_CONNECTION_IS_CONNECTED(gc) \
-	(gc->state == PURPLE_CONNECTED)
+	(purple_connection_get_state(gc) == PURPLE_CONNECTED)
 
 /**
  * Returns the connection's account.
@@ -374,6 +376,16 @@
 PurpleAccount *purple_connection_get_account(const PurpleConnection *gc);
 
 /**
+ * Returns the protocol plugin managing a connection.
+ *
+ * @param gc The connection.
+ *
+ * @return The protocol plugin.
+ * @since 2.4.0
+ */
+PurplePlugin * purple_connection_get_prpl(const PurpleConnection *gc);
+
+/**
  * Returns the connection's password.
  *
  * @param gc The connection.
--- a/libpurple/conversation.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/conversation.c	Wed Feb 06 03:35:04 2008 +0000
@@ -295,10 +295,14 @@
 	/* Check if this conversation already exists. */
 	if ((conv = purple_find_conversation_with_account(type, name, account)) != NULL)
 	{
-		if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT &&
+		if (purple_conversation_get_type(conv) != PURPLE_CONV_TYPE_CHAT ||
 				purple_conv_chat_has_left(PURPLE_CONV_CHAT(conv)))
-			purple_conversation_chat_cleanup_for_rejoin(conv);
-		return conv;
+		{
+			if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT)
+				purple_conversation_chat_cleanup_for_rejoin(conv);
+
+			return conv;
+		}
 	}
 
 	gc = purple_account_get_connection(account);
@@ -398,7 +402,7 @@
 	if (gc != NULL)
 	{
 		/* Still connected */
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
 
 		if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)
 		{
@@ -1451,7 +1455,7 @@
 	conv      = purple_conv_chat_get_conversation(chat);
 	gc        = purple_conversation_get_gc(conv);
 	account   = purple_connection_get_account(gc);
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
 
 	/* Don't display this if the person who wrote it is ignored. */
 	if (purple_conv_chat_is_user_ignored(chat, who))
@@ -1570,7 +1574,7 @@
 
 	gc = purple_conversation_get_gc(conv);
 	g_return_if_fail(gc != NULL);
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
 	g_return_if_fail(prpl_info != NULL);
 
 	ul = users;
@@ -1671,7 +1675,7 @@
 
 	gc = purple_conversation_get_gc(conv);
 	g_return_if_fail(gc != NULL);
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
 	g_return_if_fail(prpl_info != NULL);
 
 	if (!strcmp(chat->nick, purple_normalize(conv->account, old_user))) {
@@ -1789,7 +1793,7 @@
 
 	gc = purple_conversation_get_gc(conv);
 	g_return_if_fail(gc != NULL);
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
 	g_return_if_fail(prpl_info != NULL);
 
 	ops  = purple_conversation_get_ui_ops(conv);
--- a/libpurple/conversation.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/conversation.h	Wed Feb 06 03:35:04 2008 +0000
@@ -490,7 +490,8 @@
  *
  * @param conv The conversation.
  *
- * @return The conversation's name.
+ * @return The conversation's name. If the conversation is an IM with a PurpleBuddy,
+ *         then it's the name of the PurpleBuddy.
  */
 const char *purple_conversation_get_name(const PurpleConversation *conv);
 
@@ -718,7 +719,7 @@
  *
  * @param msg   A PurpleConvMessage
  *
- * @return   The name of the sender of the message
+ * @return   The message flags
  *
  * @since 2.2.0
  */
@@ -729,7 +730,7 @@
  *
  * @param msg   A PurpleConvMessage
  *
- * @return   The name of the sender of the message
+ * @return   The timestamp of the message
  *
  * @since 2.2.0
  */
--- a/libpurple/core.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/core.h	Wed Feb 06 03:35:04 2008 +0000
@@ -67,13 +67,14 @@
  * Calls purple_core_quit().  This can be used as the function 
  * passed to purple_timeout_add() when you want to shutdown Purple 
  * in a specified amount of time.  When shutting down Purple 
- * from a plugin, you must use this with a timeout value of 0: 
+ * from a plugin, you must use this instead of purple_core_quit();
+ * for an immediate exit, use a timeout value of 0: 
  *   purple_timeout_add(0, purple_core_quitcb, NULL);
  * This is ensures that code from your plugin is not being 
- * executed when purple_core_quit() is called.  Otherwise you 
- * would get a core dump after purple_core_quit() executes and 
- * control returns to your plugin because purple_core_quit() frees 
- * all plugins.
+ * executed when purple_core_quit() is called.  If the plugin
+ * called purple_core_quit() directly, you would get a core dump
+ * after purple_core_quit() executes and control returns to your
+ * plugin because purple_core_quit() frees all plugins.
  */
 gboolean purple_core_quit_cb(gpointer unused);
 
--- a/libpurple/dbus-analyze-functions.py	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/dbus-analyze-functions.py	Wed Feb 06 03:35:04 2008 +0000
@@ -525,9 +525,10 @@
             try:
                 self.processfunction(functiontext, paramtexts)
             except MyException:
-                sys.stderr.write(myline + "\n")
+#                sys.stderr.write(myline + "\n")
+                 pass
             except:
-                sys.stderr.write(myline + "\n")
+#                sys.stderr.write(myline + "\n")
                 raise
 
         self.flush()
@@ -586,7 +587,7 @@
 else:
     fprefix = ""
 
-sys.stderr.write("%s: Functions not exported:\n" % sys.argv[0])
+#sys.stderr.write("%s: Functions not exported:\n" % sys.argv[0])
 
 if "client" in options:
     bindings = ClientBindingSet(sys.stdin, fprefix,
--- a/libpurple/dbus-server.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/dbus-server.c	Wed Feb 06 03:35:04 2008 +0000
@@ -689,6 +689,7 @@
 		switch (purple_values[i]->type)
 		{
 		case PURPLE_TYPE_INT:
+		case PURPLE_TYPE_ENUM:
 			xint = my_arg(gint);
 			dbus_message_iter_append_basic(iter, DBUS_TYPE_INT32, &xint);
 			break;
@@ -729,7 +730,7 @@
 			if (id == 0 && val != NULL)
 				error = TRUE;      /* Some error happened. */
 			dbus_message_iter_append_basic(iter,
-					(sizeof(void *) == 4) ? DBUS_TYPE_UINT32 : DBUS_TYPE_UINT64, &id);
+					(sizeof(id) == sizeof(dbus_int32_t)) ? DBUS_TYPE_INT32 : DBUS_TYPE_INT64, &id);
 			break;
 		default: /* no conversion implemented */
 			g_return_val_if_reached(TRUE);
--- a/libpurple/dnsquery.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/dnsquery.c	Wed Feb 06 03:35:04 2008 +0000
@@ -142,7 +142,7 @@
  */
 #ifdef HAVE_SIGNAL_H
 G_GNUC_NORETURN static void
-trap_gdb_bug()
+trap_gdb_bug(int sig)
 {
 	const char *message =
 		"Purple's DNS child got a SIGTRAP signal.\n"
@@ -159,6 +159,24 @@
 }
 #endif
 
+static void
+write_to_parent(int fd, const void *buf, size_t count)
+{
+	ssize_t written;
+
+	written = write(fd, buf, count);
+	if (written != count) {
+		if (written < 0)
+			fprintf(stderr, "dns[%d]: Error writing data to "
+					"parent: %s\n", getpid(), strerror(errno));
+		else
+			fprintf(stderr, "dns[%d]: Error: Tried to write %"
+					G_GSIZE_FORMAT " bytes to parent but instead "
+					"wrote %" G_GSIZE_FORMAT " bytes\n",
+					getpid(), count, written);
+	}
+}
+
 G_GNUC_NORETURN static void
 purple_dnsquery_resolver_run(int child_out, int child_in, gboolean show_debug)
 {
@@ -201,7 +219,8 @@
 		}
 		rc = read(child_in, &dns_params, sizeof(dns_params_t));
 		if (rc < 0) {
-			perror("read()");
+			fprintf(stderr, "dns[%d]: Error: Could not read dns_params: "
+					"%s\n", getpid(), strerror(errno));
 			break;
 		}
 		if (rc == 0) {
@@ -210,11 +229,13 @@
 			_exit(0);
 		}
 		if (dns_params.hostname[0] == '\0') {
-			printf("dns[%d]: hostname = \"\" (port = %d)!!!\n", getpid(), dns_params.port);
+			fprintf(stderr, "dns[%d]: Error: Parent requested resolution "
+					"of an empty hostname (port = %d)!!!\n", getpid(),
+					dns_params.port);
 			_exit(1);
 		}
 		/* Tell our parent that we read the data successfully */
-		write(child_out, &ch, sizeof(ch));
+		write_to_parent(child_out, &ch, sizeof(ch));
 
 		/* We have the hostname and port, now resolve the IP */
 
@@ -230,7 +251,7 @@
 		 */
 		hints.ai_socktype = SOCK_STREAM;
 		rc = getaddrinfo(dns_params.hostname, servname, &hints, &res);
-		write(child_out, &rc, sizeof(rc));
+		write_to_parent(child_out, &rc, sizeof(rc));
 		if (rc != 0) {
 			close(child_out);
 			if (show_debug)
@@ -242,17 +263,17 @@
 		tmp = res;
 		while (res) {
 			size_t ai_addrlen = res->ai_addrlen;
-			write(child_out, &ai_addrlen, sizeof(ai_addrlen));
-			write(child_out, res->ai_addr, res->ai_addrlen);
+			write_to_parent(child_out, &ai_addrlen, sizeof(ai_addrlen));
+			write_to_parent(child_out, res->ai_addr, res->ai_addrlen);
 			res = res->ai_next;
 		}
 		freeaddrinfo(tmp);
-		write(child_out, &zero, sizeof(zero));
+		write_to_parent(child_out, &zero, sizeof(zero));
 #else
 		if (!inet_aton(dns_params.hostname, &sin.sin_addr)) {
 			struct hostent *hp;
 			if (!(hp = gethostbyname(dns_params.hostname))) {
-				write(child_out, &h_errno, sizeof(int));
+				write_to_parent(child_out, &h_errno, sizeof(int));
 				close(child_out);
 				if (show_debug)
 					printf("DNS Error: %d\n", h_errno);
@@ -265,10 +286,10 @@
 			sin.sin_family = AF_INET;
 
 		sin.sin_port = htons(dns_params.port);
-		write(child_out, &zero, sizeof(zero));
-		write(child_out, &addrlen, sizeof(addrlen));
-		write(child_out, &sin, addrlen);
-		write(child_out, &zero, sizeof(zero));
+		write_to_parent(child_out, &zero, sizeof(zero));
+		write_to_parent(child_out, &addrlen, sizeof(addrlen));
+		write_to_parent(child_out, &sin, addrlen);
+		write_to_parent(child_out, &zero, sizeof(zero));
 #endif
 		dns_params.hostname[0] = '\0';
 	}
@@ -286,7 +307,7 @@
  * Begin the functions for dealing with the DNS child processes.
  */
 static void
-cope_with_gdb_brokenness()
+cope_with_gdb_brokenness(void)
 {
 #ifdef __linux__
 	static gboolean already_done = FALSE;
@@ -460,7 +481,7 @@
 static void host_resolved(gpointer data, gint source, PurpleInputCondition cond);
 
 static void
-handle_next_queued_request()
+handle_next_queued_request(void)
 {
 	PurpleDnsQueryData *query_data;
 	PurpleDnsQueryResolverProcess *resolver;
--- a/libpurple/dnssrv.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/dnssrv.c	Wed Feb 06 03:35:04 2008 +0000
@@ -200,12 +200,20 @@
 	PurpleSrvCallback cb = query_data->cb;
 	int status;
 
-	if (read(source, &size, sizeof(int)) > 0)
+	if (read(source, &size, sizeof(int)) == sizeof(int))
 	{
+		ssize_t red;
 		purple_debug_info("dnssrv","found %d SRV entries\n", size);
 		tmp = res = g_new0(PurpleSrvResponse, size);
 		for (i = 0; i < size; i++) {
-			read(source, tmp++, sizeof(PurpleSrvResponse));
+			red = read(source, tmp++, sizeof(PurpleSrvResponse));
+			if (red != sizeof(PurpleSrvResponse)) {
+				purple_debug_error("dnssrv","unable to read srv "
+						"response: %s\n", g_strerror(errno));
+				size = 0;
+				g_free(res);
+				res = NULL;
+			}
 		}
 	}
 	else
@@ -307,7 +315,7 @@
 
 	/* back to main thread */
 	/* Note: this should *not* be attached to query_data->handle - it will cause leakage */
-	g_idle_add(res_main_thread_cb, query_data);
+	purple_timeout_add(0, res_main_thread_cb, query_data);
 
 	g_thread_exit(NULL);
 	return NULL;
@@ -350,9 +358,12 @@
 	/* Child */
 	if (pid == 0)
 	{
+		g_free(query);
+
 		close(out[0]);
 		close(in[1]);
 		resolve(in[0], out[1]);
+		/* resolve() does not return */
 	}
 
 	close(out[1]);
@@ -399,7 +410,7 @@
 	 * Asynchronously call the callback since stuff may not expect
 	 * the callback to be called before this returns */
 	if (query_data->error_message != NULL)
-		query_data->handle = g_idle_add(res_main_thread_cb, query_data);
+		query_data->handle = purple_timeout_add(0, res_main_thread_cb, query_data);
 
 	return query_data;
 #endif
--- a/libpurple/example/Makefile.am	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/example/Makefile.am	Wed Feb 06 03:35:04 2008 +0000
@@ -17,7 +17,8 @@
 	-DLIBDIR=\"$(libdir)/purple-$(PURPLE_MAJOR_VERSION)/\" \
 	-DLOCALEDIR=\"$(datadir)/locale\" \
 	-DSYSCONFDIR=\"$(sysconfdir)\" \
-	-I$(top_srcdir)/libpurple/ \
+	-I$(top_builddir)/libpurple \
+	-I$(top_srcdir)/libpurple \
 	-I$(top_srcdir) \
 	$(DEBUG_CFLAGS) \
 	$(GLIB_CFLAGS) \
--- a/libpurple/example/nullclient.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/example/nullclient.c	Wed Feb 06 03:35:04 2008 +0000
@@ -21,28 +21,11 @@
  *
  */
 
-/* XXX: we probably shouldn't include internal.h in examples */
-#include "internal.h"
-
-#include "account.h"
-#include "conversation.h"
-#include "core.h"
-#include "debug.h"
-#include "eventloop.h"
-#include "ft.h"
-#include "log.h"
-#include "notify.h"
-#include "prefs.h"
-#include "prpl.h"
-#include "pounce.h"
-#include "savedstatuses.h"
-#include "sound.h"
-#include "status.h"
-#include "util.h"
-#include "whiteboard.h"
+#include "purple.h"
 
 #include <glib.h>
 
+#include <signal.h>
 #include <string.h>
 #include <unistd.h>
 
@@ -167,7 +150,7 @@
 };
 
 static void
-null_ui_init()
+null_ui_init(void)
 {
 	/**
 	 * This should initialize the UI components for all the modules. Here we
@@ -191,7 +174,7 @@
 };
 
 static void
-init_libpurple()
+init_libpurple(void)
 {
 	/* Set a custom user directory (optional) */
 	purple_util_set_user_dir(CUSTOM_USER_DIRECTORY);
@@ -250,14 +233,14 @@
 }
 
 static void
-connect_to_signals_for_demonstration_purposes_only()
+connect_to_signals_for_demonstration_purposes_only(void)
 {
 	static int handle;
 	purple_signal_connect(purple_connections_get_handle(), "signed-on", &handle,
 				PURPLE_CALLBACK(signed_on), NULL);
 }
 
-int main()
+int main(int argc, char *argv[])
 {
 	GList *iter;
 	int i, num;
@@ -268,6 +251,7 @@
 	GMainLoop *loop = g_main_loop_new(NULL, FALSE);
 	PurpleAccount *account;
 	PurpleSavedStatus *status;
+	char *res;
 
 	/* libpurple's built-in DNS resolution forks processes to perform
 	 * blocking lookups without blocking the main process.  It does not
@@ -290,12 +274,20 @@
 		}
 	}
 	printf("Select the protocol [0-%d]: ", i-1);
-	fgets(name, sizeof(name), stdin);
+	res = fgets(name, sizeof(name), stdin);
+	if (!res) {
+		fprintf(stderr, "Failed to gets protocol selection.");
+		abort();
+	}
 	sscanf(name, "%d", &num);
 	prpl = g_list_nth_data(names, num);
 
 	printf("Username: ");
-	fgets(name, sizeof(name), stdin);
+	res = fgets(name, sizeof(name), stdin);
+	if (!res) {
+		fprintf(stderr, "Failed to read user name.");
+		abort();
+	}
 	name[strlen(name) - 1] = 0;  /* strip the \n at the end */
 
 	/* Create the account */
--- a/libpurple/ft.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/ft.c	Wed Feb 06 03:35:04 2008 +0000
@@ -32,6 +32,7 @@
 #include "proxy.h"
 #include "request.h"
 #include "util.h"
+#include "debug.h"
 
 #define FT_INITIAL_BUFFER_SIZE 4096
 #define FT_MAX_BUFFER_SIZE     65535
@@ -668,6 +669,22 @@
 	return xfer->remote_port;
 }
 
+time_t
+purple_xfer_get_start_time(const PurpleXfer *xfer)
+{
+	g_return_val_if_fail(xfer != NULL, 0);
+
+	return xfer->start_time;
+}
+
+time_t
+purple_xfer_get_end_time(const PurpleXfer *xfer)
+{
+	g_return_val_if_fail(xfer != NULL, 0);
+
+	return xfer->end_time;
+}
+
 void
 purple_xfer_set_completed(PurpleXfer *xfer, gboolean completed)
 {
@@ -903,7 +920,12 @@
 	if (condition & PURPLE_INPUT_READ) {
 		r = purple_xfer_read(xfer, &buffer);
 		if (r > 0) {
-			fwrite(buffer, 1, r, xfer->dest_fp);
+			const size_t wc = fwrite(buffer, 1, r, xfer->dest_fp);
+			if (wc != r) {
+				purple_debug_error("filetransfer", "Unable to write whole buffer.\n");
+				purple_xfer_cancel_remote(xfer);
+				return;
+			}
 		} else if(r < 0) {
 			purple_xfer_cancel_remote(xfer);
 			return;
@@ -911,6 +933,7 @@
 	}
 
 	if (condition & PURPLE_INPUT_WRITE) {
+		size_t result;
 		size_t s = MIN(purple_xfer_get_bytes_remaining(xfer), xfer->current_buffer_size);
 
 		/* this is so the prpl can keep the connection open
@@ -925,7 +948,13 @@
 
 		buffer = g_malloc0(s);
 
-		fread(buffer, 1, s, xfer->dest_fp);
+		result = fread(buffer, 1, s, xfer->dest_fp);
+		if (result != s) {
+			purple_debug_error("filetransfer", "Unable to read whole buffer.\n");
+			purple_xfer_cancel_remote(xfer);
+			g_free(buffer);
+			return;
+		}
 
 		/* Write as much as we're allowed to. */
 		r = purple_xfer_write(xfer, buffer, s);
--- a/libpurple/ft.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/ft.h	Wed Feb 06 03:35:04 2008 +0000
@@ -358,6 +358,26 @@
 unsigned int purple_xfer_get_remote_port(const PurpleXfer *xfer);
 
 /**
+ * Returns the time the transfer of a file started.
+ *
+ * @param xfer  The file transfer.
+ *
+ * @return The time when the transfer started.
+ * @since 2.4.0
+ */
+time_t purple_xfer_get_start_time(const PurpleXfer *xfer);
+
+/**
+ * Returns the time the transfer of a file ended.
+ *
+ * @param xfer  The file transfer.
+ *
+ * @return The time when the transfer ended.
+ * @since 2.4.0
+ */
+time_t purple_xfer_get_end_time(const PurpleXfer *xfer);
+
+/**
  * Sets the completed state for the file transfer.
  *
  * @param xfer      The file transfer.
--- a/libpurple/idle.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/idle.c	Wed Feb 06 03:35:04 2008 +0000
@@ -24,6 +24,7 @@
 
 #include "connection.h"
 #include "debug.h"
+#include "eventloop.h"
 #include "idle.h"
 #include "log.h"
 #include "prefs.h"
@@ -215,8 +216,8 @@
 /*
  * Check idle and set the timer to fire at the next idle-worth event 
  */
-static gint
-check_idleness_timer()
+static gboolean
+check_idleness_timer(void)
 {
 	check_idleness();
 	if (time_until_next_idle_event == 0)
@@ -225,7 +226,7 @@
 	{
 		/* +1 for the boundary,
 		 * +1 more for g_timeout_add_seconds rounding. */
-		idle_timer = purple_timeout_add_seconds(time_until_next_idle_event + 2, check_idleness_timer, NULL);
+		idle_timer = purple_timeout_add_seconds(time_until_next_idle_event + 2, (GSourceFunc)check_idleness_timer, NULL);
 	}
 	return FALSE;
 }
@@ -295,7 +296,7 @@
 }
 
 static void *
-purple_idle_get_handle()
+purple_idle_get_handle(void)
 {
 	static int handle;
 
@@ -307,7 +308,7 @@
 	int idle_poll_minutes = purple_prefs_get_int("/purple/away/mins_before_away");
 
 	 /* +1 more for g_timeout_add_seconds rounding. */
-	idle_timer = purple_timeout_add_seconds((idle_poll_minutes * 60) + 2, check_idleness_timer, NULL);
+	idle_timer = purple_timeout_add_seconds((idle_poll_minutes * 60) + 2, (GSourceFunc)check_idleness_timer, NULL);
 
 	purple_idle_touch();
 
@@ -333,7 +334,7 @@
 
 	/* Initialize the idleness asynchronously so it doesn't check idleness,
 	 * and potentially try to change the status before the UI is initialized */
-	g_idle_add(_do_purple_idle_touch_cb, NULL);
+	purple_timeout_add(0, _do_purple_idle_touch_cb, NULL);
 
 }
 
--- a/libpurple/log.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/log.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1859,11 +1859,15 @@
 
 static char * old_logger_read (PurpleLog *log, PurpleLogReadFlags *flags)
 {
+	size_t result;
 	struct old_logger_data *data = log->logger_data;
-	FILE *file = g_fopen(purple_stringref_value(data->pathref), "rb");
+	const char *path = purple_stringref_value(data->pathref);
+	FILE *file = g_fopen(path, "rb");
 	char *read = g_malloc(data->length + 1);
 	fseek(file, data->offset, SEEK_SET);
-	fread(read, data->length, 1, file);
+	result = fread(read, data->length, 1, file);
+	if (result != 1)
+		purple_debug_error("log", "Unable to read from log file: %s\n", path);
 	fclose(file);
 	read[data->length] = '\0';
 	*flags = 0;
--- a/libpurple/plugin.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/plugin.c	Wed Feb 06 03:35:04 2008 +0000
@@ -667,7 +667,10 @@
 			}
 			else
 			{
+#if 0
+				/* This isn't necessary. This has already been done when unloading dep_plugin. */
 				plugin->dependent_plugins = g_list_delete_link(plugin->dependent_plugins, l);
+#endif
 			}
 		}
 	}
--- a/libpurple/plugins/ciphertest.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/plugins/ciphertest.c	Wed Feb 06 03:35:04 2008 +0000
@@ -61,7 +61,7 @@
 };
 
 static void
-cipher_test_md5() {
+cipher_test_md5(void) {
 	PurpleCipher *cipher;
 	PurpleCipherContext *context;
 	gchar digest[33];
@@ -113,12 +113,12 @@
 	{"a", "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8"},
 	{"abc", "a9993e364706816aba3e25717850c26c9cd0d89d"} ,
 	{"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "84983e441c3bd26ebaae4aa1f95129e5e54670f1"} ,
-    {NULL, "34aa973cd4c4daa4f61eeb2bdbad27316534016f"},
+	{NULL, "34aa973cd4c4daa4f61eeb2bdbad27316534016f"},
 	{NULL, NULL}
 };
 
 static void
-cipher_test_sha1() {
+cipher_test_sha1(void) {
 	PurpleCipher *cipher;
 	PurpleCipherContext *context;
 	gchar digest[41];
@@ -176,7 +176,7 @@
 }
 
 static void
-cipher_test_digest()
+cipher_test_digest(void)
 {
 	const gchar *nonce = "dcd98b7102dd2f0e8b11d0f600bfb0c093";
 	const gchar *client_nonce = "0a4f113b";
--- a/libpurple/plugins/log_reader.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/plugins/log_reader.c	Wed Feb 06 03:35:04 2008 +0000
@@ -2426,7 +2426,7 @@
 
 }
 
-static void log_reader_init_prefs() {
+static void log_reader_init_prefs(void) {
 	char *path;
 #ifdef _WIN32
 	char *folder;
--- a/libpurple/plugins/offlinemsg.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/plugins/offlinemsg.c	Wed Feb 06 03:35:04 2008 +0000
@@ -159,7 +159,7 @@
 	
 		purple_request_action(handle, _("Offline Message"), ask,
 					_("You can edit/delete the pounce from the `Buddy Pounces' dialog"),
-					1,
+					0,
 					offline->account, offline->who, offline->conv,
 					offline, 2,
 					_("Yes"), record_pounce,
--- a/libpurple/plugins/perl/common/fallback/const-c.inc	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/plugins/perl/common/fallback/const-c.inc	Wed Feb 06 03:35:04 2008 +0000
@@ -33,7 +33,7 @@
      Regenerate these constant functions by feeding this entire source file to
      perl -x
 
-#!/usr/bin/perl -w
+#!/usr/bin/env perl -w
 use ExtUtils::Constant qw (constant_types C_constant XS_constant);
 
 my $types = {map {($_, 1)} qw(IV)};
--- a/libpurple/plugins/ssl/ssl-nss.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/plugins/ssl/ssl-nss.c	Wed Feb 06 03:35:04 2008 +0000
@@ -109,7 +109,7 @@
 	}
 }
 
-static gchar *get_error_text()
+static gchar *get_error_text(void)
 {
 	PRInt32 len = PR_GetErrorTextLength();
 	gchar *ret = NULL;
--- a/libpurple/plugins/tcl/tcl.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/plugins/tcl/tcl.c	Wed Feb 06 03:35:04 2008 +0000
@@ -149,7 +149,7 @@
 	return 0;
 }
 
-static Tcl_Interp *tcl_create_interp()
+static Tcl_Interp *tcl_create_interp(void)
 {
 	Tcl_Interp *interp;
 
--- a/libpurple/plugins/tcl/tcl_cmds.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/plugins/tcl/tcl_cmds.c	Wed Feb 06 03:35:04 2008 +0000
@@ -25,6 +25,7 @@
 #include "internal.h"
 #include "conversation.h"
 #include "connection.h"
+#include "eventloop.h"
 #include "account.h"
 #include "server.h"
 #include "notify.h"
@@ -1778,7 +1779,7 @@
 	}
 	/* We can't unload immediately, but we can unload at the first 
 	 * known safe opportunity. */
-	g_idle_add(unload_self, (gpointer)plugin);
+	purple_timeout_add(0, unload_self, (gpointer)plugin);
 
 	return TCL_OK;
 }
--- a/libpurple/plugins/test.pl	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/plugins/test.pl	Wed Feb 06 03:35:04 2008 +0000
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl -w
 
 use Gaim;
 
--- a/libpurple/privacy.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/privacy.c	Wed Feb 06 03:35:04 2008 +0000
@@ -202,9 +202,12 @@
 	return TRUE;
 }
 
-/* This makes sure that only all the buddies are in the permit list. */
+/**
+ * This makes sure your permit list contains all buddies from your
+ * buddy list and ONLY buddies from your buddy list.
+ */
 static void
-add_buddies_in_permit(PurpleAccount *account, gboolean local)
+add_all_buddies_to_permit_list(PurpleAccount *account, gboolean local)
 {
 	GSList *list;
 
@@ -227,6 +230,12 @@
 	}
 }
 
+/*
+ * TODO: All callers of this function pass in FALSE for local and
+ *       restore and I don't understand when you would ever want to
+ *       use TRUE for either of them.  I think both parameters could
+ *       safely be removed in the next major version bump.
+ */
 void
 purple_privacy_allow(PurpleAccount *account, const char *who, gboolean local,
 						gboolean restore)
@@ -256,7 +265,7 @@
 			break;
 		case PURPLE_PRIVACY_ALLOW_BUDDYLIST:
 			if (!purple_find_buddy(account, who)) {
-				add_buddies_in_permit(account, local);
+				add_all_buddies_to_permit_list(account, local);
 				purple_privacy_permit_add(account, who, local);
 				account->perm_deny = PURPLE_PRIVACY_ALLOW_USERS;
 			}
@@ -266,6 +275,12 @@
 	}
 }
 
+/*
+ * TODO: All callers of this function pass in FALSE for local and
+ *       restore and I don't understand when you would ever want to
+ *       use TRUE for either of them.  I think both parameters could
+ *       safely be removed in the next major version bump.
+ */
 void
 purple_privacy_deny(PurpleAccount *account, const char *who, gboolean local,
 					gboolean restore)
@@ -295,7 +310,7 @@
 			break;
 		case PURPLE_PRIVACY_ALLOW_BUDDYLIST:
 			if (purple_find_buddy(account, who)) {
-				add_buddies_in_permit(account, local);
+				add_all_buddies_to_permit_list(account, local);
 				purple_privacy_permit_remove(account, who, local);
 				account->perm_deny = PURPLE_PRIVACY_ALLOW_USERS;
 			}
--- a/libpurple/protocols/bonjour/bonjour.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/bonjour/bonjour.c	Wed Feb 06 03:35:04 2008 +0000
@@ -617,7 +617,7 @@
 #endif
 
 static void
-initialize_default_account_values()
+initialize_default_account_values(void)
 {
 #ifndef _WIN32
 	struct passwd *info;
@@ -673,11 +673,12 @@
 
 	/* Try to figure out a good host name to use */
 	/* TODO: Avoid 'localhost,' if possible */
-	if (gethostname(hostname, 255) != 0) {
+	if (gethostname(hostname, sizeof(hostname)) != 0) {
 		purple_debug_warning("bonjour", "Error when getting host name: %s.  Using \"localhost.\"\n",
 				g_strerror(errno));
 		strcpy(hostname, "localhost");
 	}
+	hostname[sizeof(hostname) - 1] = '\0';
 	default_hostname = g_strdup(hostname);
 }
 
--- a/libpurple/protocols/bonjour/jabber.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/bonjour/jabber.c	Wed Feb 06 03:35:04 2008 +0000
@@ -995,7 +995,7 @@
 			bb->conversation = NULL;
 	}
 
-	purple_timeout_add(0, _async_bonjour_jabber_close_conversation_cb, bconv);
+	bconv->close_timeout = purple_timeout_add(0, _async_bonjour_jabber_close_conversation_cb, bconv);
 }
 
 void
@@ -1054,6 +1054,9 @@
 		if (bconv->context != NULL)
 			bonjour_parser_setup(bconv);
 
+		if (bconv->close_timeout != 0)
+			purple_timeout_remove(bconv->close_timeout);
+
 		g_free(bconv->buddy_name);
 		g_free(bconv->ip);
 		g_free(bconv);
--- a/libpurple/protocols/bonjour/jabber.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/bonjour/jabber.h	Wed Feb 06 03:35:04 2008 +0000
@@ -47,6 +47,7 @@
 	gint socket;
 	guint rx_handler;
 	guint tx_handler;
+	guint close_timeout;
 	PurpleCircBuffer *tx_buf;
 	int sent_stream_start; /* 0 = Unsent, 1 = Partial, 2 = Complete */
 	gboolean recv_stream_start;
--- a/libpurple/protocols/bonjour/mdns_avahi.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/bonjour/mdns_avahi.c	Wed Feb 06 03:35:04 2008 +0000
@@ -445,14 +445,14 @@
 				idata->group, AVAHI_IF_UNSPEC,
 				AVAHI_PROTO_INET, 0,
 				purple_account_get_username(data->account),
-				ICHAT_SERVICE, NULL, NULL, data->port_p2pj, lst);
+				LINK_LOCAL_RECORD_NAME, NULL, NULL, data->port_p2pj, lst);
 			break;
 		case PUBLISH_UPDATE:
 			publish_result = avahi_entry_group_update_service_txt_strlst(
 				idata->group, AVAHI_IF_UNSPEC,
 				AVAHI_PROTO_INET, 0,
 				purple_account_get_username(data->account),
-				ICHAT_SERVICE, NULL, lst);
+				LINK_LOCAL_RECORD_NAME, NULL, lst);
 			break;
 	}
 
@@ -461,7 +461,7 @@
 
 	if (publish_result < 0) {
 		purple_debug_error("bonjour",
-			"Failed to add the " ICHAT_SERVICE " service. Error: %s\n",
+			"Failed to add the " LINK_LOCAL_RECORD_NAME " service. Error: %s\n",
 			avahi_strerror(publish_result));
 		return FALSE;
 	}
@@ -469,7 +469,7 @@
 	if (type == PUBLISH_START
 			&& (publish_result = avahi_entry_group_commit(idata->group)) < 0) {
 		purple_debug_error("bonjour",
-			"Failed to commit " ICHAT_SERVICE " service. Error: %s\n",
+			"Failed to commit " LINK_LOCAL_RECORD_NAME " service. Error: %s\n",
 			avahi_strerror(publish_result));
 		return FALSE;
 	}
@@ -482,7 +482,7 @@
 
 	g_return_val_if_fail(idata != NULL, FALSE);
 
-	idata->sb = avahi_service_browser_new(idata->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_INET, ICHAT_SERVICE, NULL, 0, _browser_callback, data->account);
+	idata->sb = avahi_service_browser_new(idata->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_INET, LINK_LOCAL_RECORD_NAME, NULL, 0, _browser_callback, data->account);
 	if (!idata->sb) {
 
 		purple_debug_error("bonjour",
@@ -524,7 +524,7 @@
 			return FALSE;
 		}
 
-		svc_name = g_strdup_printf("%s." ICHAT_SERVICE "local",
+		svc_name = g_strdup_printf("%s." LINK_LOCAL_RECORD_NAME "local",
 				purple_account_get_username(data->account));
 
 		ret = avahi_entry_group_add_record(idata->buddy_icon_group, AVAHI_IF_UNSPEC,
@@ -615,7 +615,7 @@
 
 	purple_debug_info("bonjour", "Retrieving buddy icon for '%s'.\n", buddy->name);
 
-	name = g_strdup_printf("%s." ICHAT_SERVICE "local", buddy->name);
+	name = g_strdup_printf("%s." LINK_LOCAL_RECORD_NAME "local", buddy->name);
 	idata->buddy_icon_rec_browser = avahi_record_browser_new(session_idata->client, AVAHI_IF_UNSPEC,
 		AVAHI_PROTO_INET, name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_NULL, 0,
 		_buddy_icon_record_cb, buddy);
--- a/libpurple/protocols/bonjour/mdns_types.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/bonjour/mdns_types.h	Wed Feb 06 03:35:04 2008 +0000
@@ -20,7 +20,7 @@
 #include <glib.h>
 #include "account.h"
 
-#define ICHAT_SERVICE "_presence._tcp."
+#define LINK_LOCAL_RECORD_NAME "_presence._tcp."
 
 /**
  * Data to be used by the dns-sd connection.
--- a/libpurple/protocols/bonjour/mdns_win32.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/bonjour/mdns_win32.c	Wed Feb 06 03:35:04 2008 +0000
@@ -30,19 +30,21 @@
 
 static GSList *pending_buddies = NULL;
 
+typedef struct _dnssd_service_ref_handler {
+	DNSServiceRef sdRef;
+	PurpleAccount *account;
+	guint input_handler;
+} DnsSDServiceRefHandlerData;
+
 /* data used by win32 bonjour implementation */
 typedef struct _win32_session_impl_data {
-	DNSServiceRef presence_svc;
-	DNSServiceRef browser_svc;
+	DnsSDServiceRefHandlerData *presence_query;
+	DnsSDServiceRefHandlerData *browser_query;
 	DNSRecordRef buddy_icon_rec;
-
-	guint presence_handler;
-	guint browser_handler;
 } Win32SessionImplData;
 
 typedef struct _win32_buddy_service_resolver_data {
-	DNSServiceRef txt_query;
-	guint txt_query_handler;
+	DnsSDServiceRefHandlerData *txt_query;
 	uint32_t if_idx;
 	gchar *name;
 	gchar *type;
@@ -53,21 +55,20 @@
 
 typedef struct _win32_buddy_impl_data {
 	GSList *resolvers;
-	DNSServiceRef null_query;
-	guint null_query_handler;
+	DnsSDServiceRefHandlerData *null_query;
 } Win32BuddyImplData;
 
 /* data structure for the resolve callback */
 typedef struct _ResolveCallbackArgs {
-	DNSServiceRef resolver;
-	guint resolver_handler;
+	DnsSDServiceRefHandlerData *resolver_query;
 	PurpleAccount *account;
 	BonjourBuddy *bb;
 	Win32SvcResolverData *res_data;
 	gchar *full_service_name;
-	PurpleDnsQueryData *query;
+	PurpleDnsQueryData *dns_query;
 } ResolveCallbackArgs;
 
+
 static gint
 _find_resolver_data(gconstpointer a, gconstpointer b) {
 	const Win32SvcResolverData *rd_a = a;
@@ -87,8 +88,9 @@
 static void
 _cleanup_resolver_data(Win32SvcResolverData *rd) {
 	if (rd->txt_query != NULL) {
-		purple_input_remove(rd->txt_query_handler);
-		DNSServiceRefDeallocate(rd->txt_query);
+		purple_input_remove(rd->txt_query->input_handler);
+		DNSServiceRefDeallocate(rd->txt_query->sdRef);
+		g_free(rd->txt_query);
 	}
 	g_free(rd->name);
 	g_free(rd->type);
@@ -98,7 +100,16 @@
 
 static void
 _mdns_handle_event(gpointer data, gint source, PurpleInputCondition condition) {
-	DNSServiceProcessResult((DNSServiceRef) data);
+	DnsSDServiceRefHandlerData *srh = data;
+	DNSServiceErrorType errorCode = DNSServiceProcessResult(srh->sdRef);
+	if (errorCode != kDNSServiceErr_NoError) {
+		purple_debug_error("bonjour", "Error (%d) handling mDNS response.\n", errorCode);
+		/* This happens when the mDNSResponder goes down, I haven't seen it happen any other time (in my limited testing) */
+		if (errorCode == kDNSServiceErr_Unknown) {
+			purple_connection_error_reason(srh->account->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Error communicating with local mDNSResponder."));
+		}
+	}
 }
 
 static void
@@ -123,7 +134,7 @@
 	uint32_t ttl, void *context)
 {
 
-	if (kDNSServiceErr_NoError != errorCode) {
+	if (errorCode != kDNSServiceErr_NoError) {
 		purple_debug_error("bonjour", "record query - callback error.\n");
 		/* TODO: Probably should remove the buddy when this happens */
 	} else if (flags & kDNSServiceFlagsAdd) {
@@ -142,9 +153,9 @@
 			bonjour_buddy_got_buddy_icon(bb, rdata, rdlen);
 
 			/* We've got what we need; stop listening */
-			purple_input_remove(idata->null_query_handler);
-			idata->null_query_handler = 0;
-			DNSServiceRefDeallocate(idata->null_query);
+			purple_input_remove(idata->null_query->input_handler);
+			DNSServiceRefDeallocate(idata->null_query->sdRef);
+			g_free(idata->null_query);
 			idata->null_query = NULL;
 		}
 	}
@@ -153,7 +164,7 @@
 static void
 _mdns_resolve_host_callback(GSList *hosts, gpointer data, const char *error_message)
 {
-	ResolveCallbackArgs* args = (ResolveCallbackArgs*) data;
+	ResolveCallbackArgs *args = (ResolveCallbackArgs*) data;
 	Win32BuddyImplData *idata = args->bb->mdns_impl_data;
 	gboolean delete_buddy = FALSE;
 	PurpleBuddy *pb;
@@ -168,27 +179,31 @@
 		delete_buddy = TRUE;
 	} else {
 		struct sockaddr_in *addr = g_slist_nth_data(hosts, 1);
+		DNSServiceErrorType errorCode;
+		DNSServiceRef txt_query_sr;
 
 		/* finally, set up the continuous txt record watcher, and add the buddy to purple */
-
-		if (kDNSServiceErr_NoError == DNSServiceQueryRecord(&args->res_data->txt_query, kDNSServiceFlagsLongLivedQuery,
+		errorCode = DNSServiceQueryRecord(&txt_query_sr, kDNSServiceFlagsLongLivedQuery,
 				kDNSServiceInterfaceIndexAny, args->full_service_name, kDNSServiceType_TXT,
-				kDNSServiceClass_IN, _mdns_record_query_callback, args->bb)) {
-
+				kDNSServiceClass_IN, _mdns_record_query_callback, args->bb);
+		if (errorCode == kDNSServiceErr_NoError) {
 			const char *ip = inet_ntoa(addr->sin_addr);
 
 			purple_debug_info("bonjour", "Found buddy %s at %s:%d\n", args->bb->name, ip, args->bb->port_p2pj);
 
-
 			args->bb->ips = g_slist_prepend(args->bb->ips, g_strdup(ip));
 			args->res_data->ip = args->bb->ips->data;
 
-			args->res_data->txt_query_handler = purple_input_add(DNSServiceRefSockFD(args->res_data->txt_query),
+			args->res_data->txt_query = g_new(DnsSDServiceRefHandlerData, 1);
+			args->res_data->txt_query->sdRef = txt_query_sr;
+			args->res_data->txt_query->account = args->account;
+
+			args->res_data->txt_query->input_handler = purple_input_add(DNSServiceRefSockFD(txt_query_sr),
 				PURPLE_INPUT_READ, _mdns_handle_event, args->res_data->txt_query);
 
 			bonjour_buddy_add_to_purple(args->bb, NULL);
 		} else {
-			purple_debug_error("bonjour", "Unable to set up record watcher for buddy %s\n", args->bb->name);
+			purple_debug_error("bonjour", "Unable to set up record watcher for buddy %s (%d)\n", args->bb->name, errorCode);
 			delete_buddy = TRUE;
 		}
 
@@ -230,21 +245,21 @@
 _mdns_service_resolve_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode,
     const char *fullname, const char *hosttarget, uint16_t port, uint16_t txtLen, const char *txtRecord, void *context)
 {
-	ResolveCallbackArgs *args = (ResolveCallbackArgs*)context;
+	ResolveCallbackArgs *args = (ResolveCallbackArgs*) context;
 	Win32BuddyImplData *idata = args->bb->mdns_impl_data;
 
 	/* remove the input fd and destroy the service ref */
-	purple_input_remove(args->resolver_handler);
-	args->resolver_handler = 0;
-	DNSServiceRefDeallocate(args->resolver);
-	args->resolver = NULL;
+	purple_input_remove(args->resolver_query->input_handler);
+	DNSServiceRefDeallocate(args->resolver_query->sdRef);
+	g_free(args->resolver_query);
+	args->resolver_query = NULL;
 
-	if (kDNSServiceErr_NoError != errorCode)
+	if (errorCode != kDNSServiceErr_NoError)
 		purple_debug_error("bonjour", "service resolver - callback error.\n");
 	else {
 		/* set more arguments, and start the host resolver */
 
-		if ((args->query =
+		if ((args->dns_query =
 				purple_dnsquery_a(hosttarget, port, _mdns_resolve_host_callback, args)) != NULL) {
 
 			args->full_service_name = g_strdup(fullname);
@@ -286,7 +301,7 @@
 				const char *name, const char *regtype, const char *domain, void *context) {
 
 	/* TODO: deal with collision */
-	if (kDNSServiceErr_NoError != errorCode)
+	if (errorCode != kDNSServiceErr_NoError)
 		purple_debug_error("bonjour", "service advertisement - callback error (%d).\n", errorCode);
 	else
 		purple_debug_info("bonjour", "service advertisement - callback.\n");
@@ -298,26 +313,28 @@
 {
 	PurpleAccount *account = (PurpleAccount*)context;
 
-	if (kDNSServiceErr_NoError != errorCode)
-		purple_debug_error("bonjour", "service browser - callback error\n");
+	if (errorCode != kDNSServiceErr_NoError)
+		purple_debug_error("bonjour", "service browser - callback error (%d)\n", errorCode);
 	else if (flags & kDNSServiceFlagsAdd) {
 		/* A presence service instance has been discovered... check it isn't us! */
 		if (purple_utf8_strcasecmp(serviceName, account->username) != 0) {
+			DNSServiceErrorType resErrorCode;
 			/* OK, lets go ahead and resolve it to add to the buddy list */
 			ResolveCallbackArgs *args = g_new0(ResolveCallbackArgs, 1);
+			DNSServiceRef resolver_sr;
 
 			purple_debug_info("bonjour", "Received new record for '%s' on iface %u (%s, %s)\n",
 							  serviceName, interfaceIndex, regtype ? regtype : "",
 							  replyDomain ? replyDomain : "");
 
-			if (kDNSServiceErr_NoError == DNSServiceResolve(&args->resolver, 0, 0, serviceName, regtype,
-					replyDomain, _mdns_service_resolve_callback, args)) {
+			resErrorCode = DNSServiceResolve(&resolver_sr, 0, 0, serviceName, regtype,
+					replyDomain, _mdns_service_resolve_callback, args);
+			if (resErrorCode == kDNSServiceErr_NoError) {
 				GSList *tmp = pending_buddies;
 				PurpleBuddy *pb;
 				BonjourBuddy* bb = NULL;
 				Win32SvcResolverData *rd;
 				Win32BuddyImplData *idata;
-				gint fd;
 
 				/* Is there an existing buddy? */
 				if ((pb = purple_find_buddy(account, serviceName)))
@@ -344,7 +361,6 @@
 						pb->proto_data = bb;
 				}
 
-
 				rd = g_new0(Win32SvcResolverData, 1);
 				rd->if_idx = interfaceIndex;
 				rd->name = g_strdup(serviceName);
@@ -358,11 +374,14 @@
 				args->res_data = rd;
 				args->account = account;
 
+				args->resolver_query = g_new(DnsSDServiceRefHandlerData, 1);
+				args->resolver_query->sdRef = resolver_sr;
+				args->resolver_query->account = account;
 				/* get a file descriptor for this service ref, and add it to the input list */
-				fd = DNSServiceRefSockFD(args->resolver);
-				args->resolver_handler = purple_input_add(fd, PURPLE_INPUT_READ, _mdns_handle_event, args->resolver);
+				args->resolver_query->input_handler = purple_input_add(DNSServiceRefSockFD(resolver_sr),
+					PURPLE_INPUT_READ, _mdns_handle_event, args->resolver_query);
 			} else {
-				purple_debug_error("bonjour", "service browser - failed to resolve service.\n");
+				purple_debug_error("bonjour", "service browser - failed to resolve service. (%d)\n", resErrorCode);
 				g_free(args);
 			}
 		}
@@ -432,7 +451,7 @@
 gboolean _mdns_publish(BonjourDnsSd *data, PublishType type, GSList *records) {
 	TXTRecordRef dns_data;
 	gboolean ret = TRUE;
-	DNSServiceErrorType set_ret = kDNSServiceErr_NoError;
+	DNSServiceErrorType errorCode = kDNSServiceErr_NoError;
 	Win32SessionImplData *idata = data->mdns_impl_data;
 
 	g_return_val_if_fail(idata != NULL, FALSE);
@@ -441,44 +460,46 @@
 
 	while (records) {
 		PurpleKeyValuePair *kvp = records->data;
-		set_ret = TXTRecordSetValue(&dns_data, kvp->key, strlen(kvp->value), kvp->value);
-		if (set_ret != kDNSServiceErr_NoError)
+		errorCode = TXTRecordSetValue(&dns_data, kvp->key, strlen(kvp->value), kvp->value);
+		if (errorCode != kDNSServiceErr_NoError)
 			break;
 		records = records->next;
 	}
 
-	if (set_ret != kDNSServiceErr_NoError) {
-		purple_debug_error("bonjour", "Unable to allocate memory for text record.\n");
+	if (errorCode != kDNSServiceErr_NoError) {
+		purple_debug_error("bonjour", "Unable to allocate memory for text record.(%d)\n", errorCode);
 		ret = FALSE;
 	} else {
-		DNSServiceErrorType err = kDNSServiceErr_NoError;
-
 		/* OK, we're done constructing the text record, (re)publish the service */
+		DNSServiceRef presence_sr;
 
 		switch (type) {
 			case PUBLISH_START:
 				purple_debug_info("bonjour", "Registering presence on port %d\n", data->port_p2pj);
-				err = DNSServiceRegister(&idata->presence_svc, 0, 0, purple_account_get_username(data->account), ICHAT_SERVICE,
+				errorCode = DNSServiceRegister(&presence_sr, 0, 0, purple_account_get_username(data->account), LINK_LOCAL_RECORD_NAME,
 					NULL, NULL, htons(data->port_p2pj), TXTRecordGetLength(&dns_data), TXTRecordGetBytesPtr(&dns_data),
 					_mdns_service_register_callback, NULL);
 				break;
 
 			case PUBLISH_UPDATE:
 				purple_debug_info("bonjour", "Updating presence.\n");
-				err = DNSServiceUpdateRecord(idata->presence_svc, NULL, 0, TXTRecordGetLength(&dns_data), TXTRecordGetBytesPtr(&dns_data), 0);
+				errorCode = DNSServiceUpdateRecord(idata->presence_query->sdRef, NULL, 0, TXTRecordGetLength(&dns_data), TXTRecordGetBytesPtr(&dns_data), 0);
 				break;
 		}
 
-		if (err != kDNSServiceErr_NoError) {
-			purple_debug_error("bonjour", "Failed to publish presence service.\n");
+		if (errorCode != kDNSServiceErr_NoError) {
+			purple_debug_error("bonjour", "Failed to publish presence service.(%d)\n", errorCode);
 			ret = FALSE;
 		} else if (type == PUBLISH_START) {
 			/* We need to do this because according to the Apple docs:
 			 * "the client is responsible for ensuring that DNSServiceProcessResult() is called
 			 * whenever there is a reply from the daemon - the daemon may terminate its connection
 			 * with a client that does not process the daemon's responses */
-			idata->presence_handler = purple_input_add(DNSServiceRefSockFD(idata->presence_svc),
-				PURPLE_INPUT_READ, _mdns_handle_event, idata->presence_svc);
+			idata->presence_query = g_new(DnsSDServiceRefHandlerData, 1);
+			idata->presence_query->sdRef = presence_sr;
+			idata->presence_query->account = data->account;
+			idata->presence_query->input_handler = purple_input_add(DNSServiceRefSockFD(presence_sr),
+				PURPLE_INPUT_READ, _mdns_handle_event, idata->presence_query);
 		}
 	}
 
@@ -488,17 +509,24 @@
 }
 
 gboolean _mdns_browse(BonjourDnsSd *data) {
+	DNSServiceErrorType errorCode;
 	Win32SessionImplData *idata = data->mdns_impl_data;
+	DNSServiceRef browser_sr;
 
 	g_return_val_if_fail(idata != NULL, FALSE);
 
-	if (DNSServiceBrowse(&idata->browser_svc, 0, 0, ICHAT_SERVICE, NULL,
-				 _mdns_service_browse_callback, data->account)
-			== kDNSServiceErr_NoError) {
-		idata->browser_handler = purple_input_add(DNSServiceRefSockFD(idata->browser_svc),
-			PURPLE_INPUT_READ, _mdns_handle_event, idata->browser_svc);
+	errorCode = DNSServiceBrowse(&browser_sr, 0, 0, LINK_LOCAL_RECORD_NAME, NULL,
+		_mdns_service_browse_callback, data->account);
+	if (errorCode == kDNSServiceErr_NoError) {
+		idata->browser_query = g_new(DnsSDServiceRefHandlerData, 1);
+		idata->browser_query->sdRef = browser_sr;
+		idata->browser_query->account = data->account;
+		idata->browser_query->input_handler = purple_input_add(DNSServiceRefSockFD(browser_sr),
+			PURPLE_INPUT_READ, _mdns_handle_event, idata->browser_query);
 		return TRUE;
-	}
+	} else
+		purple_debug_error("bonjour", "Error registering Local Link presence browser. (%d)\n", errorCode);
+
 
 	return FALSE;
 }
@@ -509,14 +537,16 @@
 	if (idata == NULL)
 		return;
 
-	if (idata->presence_svc != NULL) {
-		purple_input_remove(idata->presence_handler);
-		DNSServiceRefDeallocate(idata->presence_svc);
+	if (idata->presence_query != NULL) {
+		purple_input_remove(idata->presence_query->input_handler);
+		DNSServiceRefDeallocate(idata->presence_query->sdRef);
+		g_free(idata->presence_query);
 	}
 
-	if (idata->browser_svc != NULL) {
-		purple_input_remove(idata->browser_handler);
-		DNSServiceRefDeallocate(idata->browser_svc);
+	if (idata->browser_query != NULL) {
+		purple_input_remove(idata->browser_query->input_handler);
+		DNSServiceRefDeallocate(idata->browser_query->sdRef);
+		g_free(idata->browser_query);
 	}
 
 	g_free(idata);
@@ -526,28 +556,30 @@
 
 gboolean _mdns_set_buddy_icon_data(BonjourDnsSd *data, gconstpointer avatar_data, gsize avatar_len) {
 	Win32SessionImplData *idata = data->mdns_impl_data;
-	DNSServiceErrorType err = kDNSServiceErr_NoError;
+	DNSServiceErrorType errorCode = kDNSServiceErr_NoError;
 
 	g_return_val_if_fail(idata != NULL, FALSE);
 
 	if (avatar_data != NULL && idata->buddy_icon_rec == NULL) {
 		purple_debug_info("bonjour", "Setting new buddy icon.\n");
-		err = DNSServiceAddRecord(idata->presence_svc, &idata->buddy_icon_rec,
+		errorCode = DNSServiceAddRecord(idata->presence_query->sdRef, &idata->buddy_icon_rec,
 			0, kDNSServiceType_NULL, avatar_len, avatar_data, 0);
 	} else if (avatar_data != NULL) {
 		purple_debug_info("bonjour", "Updating existing buddy icon.\n");
-		err = DNSServiceUpdateRecord(idata->presence_svc, idata->buddy_icon_rec,
+		errorCode = DNSServiceUpdateRecord(idata->presence_query->sdRef, idata->buddy_icon_rec,
 			0, avatar_len, avatar_data, 0);
 	} else if (idata->buddy_icon_rec != NULL) {
 		purple_debug_info("bonjour", "Removing existing buddy icon.\n");
-		DNSServiceRemoveRecord(idata->presence_svc, idata->buddy_icon_rec, 0);
+		errorCode = DNSServiceRemoveRecord(idata->presence_query->sdRef, idata->buddy_icon_rec, 0);
 		idata->buddy_icon_rec = NULL;
 	}
 
-	if (err != kDNSServiceErr_NoError)
-		purple_debug_error("bonjour", "Error (%d) setting buddy icon record.\n", err);
+	if (errorCode != kDNSServiceErr_NoError) {
+		purple_debug_error("bonjour", "Error (%d) setting buddy icon record.\n", errorCode);
+		return FALSE;
+	}
 
-	return (err == kDNSServiceErr_NoError);
+	return TRUE;
 }
 
 void _mdns_init_buddy(BonjourBuddy *buddy) {
@@ -566,8 +598,9 @@
 	}
 
 	if (idata->null_query != NULL) {
-		purple_input_remove(idata->null_query_handler);
-		DNSServiceRefDeallocate(idata->null_query);
+		purple_input_remove(idata->null_query->input_handler);
+		DNSServiceRefDeallocate(idata->null_query->sdRef);
+		g_free(idata->null_query);
 	}
 
 	g_free(idata);
@@ -583,17 +616,30 @@
 
 	/* Cancel any existing query */
 	if (idata->null_query != NULL) {
-		purple_input_remove(idata->null_query_handler);
-		idata->null_query_handler = 0;
-		DNSServiceRefDeallocate(idata->null_query);
+		purple_input_remove(idata->null_query->input_handler);
+		DNSServiceRefDeallocate(idata->null_query->sdRef);
+		g_free(idata->null_query);
 		idata->null_query = NULL;
 	}
 
-	DNSServiceConstructFullName(svc_name, buddy->name, ICHAT_SERVICE, "local");
-	if (kDNSServiceErr_NoError == DNSServiceQueryRecord(&idata->null_query, 0, kDNSServiceInterfaceIndexAny, svc_name,
-			kDNSServiceType_NULL, kDNSServiceClass_IN, _mdns_record_query_callback, buddy)) {
-		idata->null_query_handler = purple_input_add(DNSServiceRefSockFD(idata->null_query),
-			PURPLE_INPUT_READ, _mdns_handle_event, idata->null_query);
+	if (DNSServiceConstructFullName(svc_name, buddy->name, LINK_LOCAL_RECORD_NAME, "local") != 0)
+		purple_debug_error("bonjour", "Unable to construct full name to retrieve buddy icon for %s.\n", buddy->name);
+	else {
+		DNSServiceRef null_query_sr;
+
+		DNSServiceErrorType errorCode = DNSServiceQueryRecord(&null_query_sr, 0, kDNSServiceInterfaceIndexAny,
+			svc_name, kDNSServiceType_NULL, kDNSServiceClass_IN, _mdns_record_query_callback, buddy);
+
+		if (errorCode == kDNSServiceErr_NoError) {
+			idata->null_query = g_new(DnsSDServiceRefHandlerData, 1);
+
+			idata->null_query->sdRef = null_query_sr;
+			idata->null_query->account = buddy->account;
+
+			idata->null_query->input_handler = purple_input_add(DNSServiceRefSockFD(null_query_sr),
+				PURPLE_INPUT_READ, _mdns_handle_event, idata->null_query);
+		} else
+			purple_debug_error("bonjour", "Unable to query buddy icon record for %s. (%d)\n", buddy->name, errorCode);
 	}
 
 }
--- a/libpurple/protocols/bonjour/parser.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/bonjour/parser.c	Wed Feb 06 03:35:04 2008 +0000
@@ -39,7 +39,7 @@
 	for(i=0; i < nb_attributes * 5; i+=5) {
 		if(!xmlStrcmp(attributes[i], (xmlChar*) "from")) {
 			int len = attributes[i+4] - attributes[i+3];
-			bconv->buddy_name = g_strndup(attributes[i+3], len);
+			bconv->buddy_name = g_strndup((char *)attributes[i+3], len);
 			bonjour_jabber_conv_match_by_name(bconv);
 
 			return (bconv->pb != NULL);
--- a/libpurple/protocols/gg/gg.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/gg/gg.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1314,7 +1314,7 @@
 			_("Unable to read socket"));
 		return;
 	}
-
+	gc->last_received = time(NULL);
 	switch (ev->type) {
 		case GG_EVENT_NONE:
 			/* Nothing happened. */
--- a/libpurple/protocols/irc/cmds.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/irc/cmds.c	Wed Feb 06 03:35:04 2008 +0000
@@ -367,7 +367,12 @@
 		if (!end)
 			end = cur + strlen(cur);
 		msg = g_strndup(cur, end - cur);
-		buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg);
+
+		if(!strcmp(cmd, "notice"))
+			buf = irc_format(irc, "vt:", "NOTICE", args[0], msg);
+		else
+			buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg);
+
 		irc_send(irc, buf);
 		g_free(msg);
 		g_free(buf);
--- a/libpurple/protocols/irc/dcc_send.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/irc/dcc_send.c	Wed Feb 06 03:35:04 2008 +0000
@@ -51,9 +51,14 @@
  */
 static void irc_dccsend_recv_ack(PurpleXfer *xfer, const guchar *data, size_t size) {
 	unsigned long l;
+	size_t result;
 
 	l = htonl(xfer->bytes_sent);
-	write(xfer->fd, &l, sizeof(l));
+	result = write(xfer->fd, &l, sizeof(l));
+	if (result != sizeof(l)) {
+		purple_debug_error("irc", "unable to send acknowledgement: %s\n", g_strerror(errno));
+		/* TODO: We should probably close the connection here or something. */
+	}
 }
 
 static void irc_dccsend_recv_init(PurpleXfer *xfer) {
--- a/libpurple/protocols/irc/irc.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/irc/irc.c	Wed Feb 06 03:35:04 2008 +0000
@@ -572,6 +572,7 @@
 {
 	char *cur, *end;
 
+	irc->account->gc->last_received = time(NULL);
 	irc->inbufused += len;
 	irc->inbuf[irc->inbufused] = '\0';
 
--- a/libpurple/protocols/irc/parse.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/irc/parse.c	Wed Feb 06 03:35:04 2008 +0000
@@ -136,6 +136,7 @@
 	{ "names", "c", irc_cmd_names, N_("names [channel]:  List the users currently in a channel.") },
 	{ "nick", "n", irc_cmd_nick, N_("nick &lt;new nickname&gt;:  Change your nickname.") },
 	{ "nickserv", ":", irc_cmd_service, N_("nickserv: Send a command to nickserv") },
+	{ "notice", "t:", irc_cmd_privmsg, N_("notice &lt;target&lt;:  Send a notice to a user or channel.") },
 	{ "op", ":", irc_cmd_op, N_("op &lt;nick1&gt; [nick2] ...:  Grant channel operator status to someone. You must be a channel operator to do this.") },
 	{ "operwall", ":", irc_cmd_wallops, N_("operwall &lt;message&gt;:  If you don't know what this is, you probably can't use it.") },
 	{ "operserv", ":", irc_cmd_service, N_("operserv: Send a command to operserv") },
--- a/libpurple/protocols/jabber/auth.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/jabber/auth.c	Wed Feb 06 03:35:04 2008 +0000
@@ -325,7 +325,7 @@
 					purple_request_yes_no(js->gc, _("Plaintext Authentication"),
 							_("Plaintext Authentication"),
 							msg,
-							2, js->gc->account, NULL, NULL, js->gc->account,
+							1, js->gc->account, NULL, NULL, js->gc->account,
 							allow_cyrus_plaintext_auth,
 							disallow_plaintext_auth);
 					g_free(msg);
@@ -344,6 +344,7 @@
 					 * Doing otherwise means that simply compiling with SASL support renders the client unable to connect to servers
 					 * which would connect without issue otherwise. -evands
 					 */
+					js->auth_type = JABBER_AUTH_IQ_AUTH;
 					jabber_auth_start_old(js);
 					return;
 				}
@@ -396,24 +397,6 @@
 				g_free(enc_out);
 			}
 		}
-		
-		if (mech && (strcmp(mech, "DIGEST-MD5") == 0)) {
-			/* CYRUS-SASL's DIGEST-MD5 and Java's DIGEST-MD5 are mutually incompatible because of different interpretations of RFC2831.
-			 * This means that if we are using SASL and connecting to a Java-based server such as OpenFire, we will receive an authentication
-			 * failure if that server offers DIGEST-MD5 in such a way that SASL chooses it as the best mechanism for us.
-			 *
-			 * However, we implement our own DIGEST-MD5 for use when we're compiled without SASL support, and that implementation
-			 * works correctly. Therefore, if SASL chooses DIGEST-MD5, we switch over to our own implementation.
-			 * jabber_auth_handle_challenge() will note the auth_type and take it from there.
-			 *
-			 * SASL would change state to SASL_OK after when handling the challenge; we do so immediately to avoid an error later.
-			 */
-			js->auth_type = JABBER_AUTH_DIGEST_MD5;
-			js->sasl_state = SASL_OK;
-			sasl_dispose(&js->sasl);
-			js->sasl = NULL;
-		}
-
 		jabber_send(js, auth);
 		xmlnode_free(auth);
 	} else {
@@ -545,7 +528,7 @@
 			purple_request_yes_no(js->gc, _("Plaintext Authentication"),
 					_("Plaintext Authentication"),
 					msg,
-					2,
+					1,
 					purple_connection_get_account(js->gc), NULL, NULL,
 					purple_connection_get_account(js->gc), allow_plaintext_auth,
 					disallow_plaintext_auth);
@@ -737,7 +720,7 @@
 				purple_request_yes_no(js->gc, _("Plaintext Authentication"),
 						_("Plaintext Authentication"),
 						_("This server requires plaintext authentication over an unencrypted connection.  Allow this and continue authentication?"),
-						2,
+						1,
 						purple_connection_get_account(js->gc), NULL, NULL,
 						purple_connection_get_account(js->gc), allow_plaintext_auth,
 						disallow_plaintext_auth);
@@ -1095,10 +1078,12 @@
 		}
 	}
 	/* If we've negotiated a security layer, we need to enable it */
-	sasl_getprop(js->sasl, SASL_SSF, &x);
-	if (*(int *)x > 0) {
-		sasl_getprop(js->sasl, SASL_MAXOUTBUF, &x);
-		js->sasl_maxbuf = *(int *)x;
+	if (js->sasl) {
+		sasl_getprop(js->sasl, SASL_SSF, &x);
+		if (*(int *)x > 0) {
+			sasl_getprop(js->sasl, SASL_MAXOUTBUF, &x);
+			js->sasl_maxbuf = *(int *)x;
+		}
 	}
 #endif
 
--- a/libpurple/protocols/jabber/jabber.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Wed Feb 06 03:35:04 2008 +0000
@@ -390,26 +390,29 @@
 
 static void jabber_pong_cb(JabberStream *js, xmlnode *packet, gpointer timeout) 
 {
-	g_source_remove(GPOINTER_TO_INT(timeout));
+	purple_timeout_remove(GPOINTER_TO_INT(timeout));
+	js->keepalive_timeout = -1;
 }
 
 static gboolean jabber_pong_timeout(PurpleConnection *gc)
 {
+	JabberStream *js = gc->proto_data;
 	purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
 					_("Ping timeout"));
+	js->keepalive_timeout = -1;
 	return FALSE;
 }
 
 void jabber_keepalive(PurpleConnection *gc)
 {
-	JabberIq *iq = jabber_iq_new(gc->proto_data, JABBER_IQ_GET);
-	guint timeout;
+	JabberStream *js = gc->proto_data;
+	JabberIq *iq = jabber_iq_new(js, JABBER_IQ_GET);
 
-        xmlnode *ping = xmlnode_new_child(iq->node, "ping");
-        xmlnode_set_namespace(ping, "urn:xmpp:ping");
+	xmlnode *ping = xmlnode_new_child(iq->node, "ping");
+	xmlnode_set_namespace(ping, "urn:xmpp:ping");
 
-	timeout = purple_timeout_add_seconds(20, (GSourceFunc)(jabber_pong_timeout), gc);
-        jabber_iq_set_callback(iq, jabber_pong_cb, GINT_TO_POINTER(timeout));
+	js->keepalive_timeout = purple_timeout_add_seconds(20, (GSourceFunc)(jabber_pong_timeout), gc);
+	jabber_iq_set_callback(iq, jabber_pong_cb, GINT_TO_POINTER(js->keepalive_timeout));
 	jabber_iq_send(iq);
 }
 
@@ -429,6 +432,7 @@
 	}
 
 	while((len = purple_ssl_read(gsc, buf, sizeof(buf) - 1)) > 0) {
+		gc->last_received = time(NULL);
 		buf[len] = '\0';
 		purple_debug(PURPLE_DEBUG_INFO, "jabber", "Recv (ssl)(%d): %s\n", len, buf);
 		jabber_parser_process(js, buf, len);
@@ -456,6 +460,7 @@
 		return;
 
 	if((len = read(js->fd, buf, sizeof(buf) - 1)) > 0) {
+		gc->last_received = time(NULL);
 #ifdef HAVE_CYRUS_SASL
 		if (js->sasl_maxbuf>0) {
 			const char *out;
@@ -556,13 +561,12 @@
 	purple_input_remove(js->gc->inpa);
 	js->gc->inpa = 0;
 	js->gsc = purple_ssl_connect_with_host_fd(js->gc->account, js->fd,
-			jabber_login_callback_ssl, jabber_ssl_connect_failure, js->host, js->gc);
+			jabber_login_callback_ssl, jabber_ssl_connect_failure, js->certificate_CN, js->gc);
 }
 
 static void jabber_login_connect(JabberStream *js, const char *fqdn, const char *host, int port)
 {
 	js->serverFQDN = g_strdup(fqdn);
-	js->host = g_strdup(host);
 
 	if (purple_proxy_connect(js->gc, js->gc->account, host,
 			port, jabber_login_callback, js->gc) == NULL)
@@ -611,7 +615,9 @@
 	js->user = jabber_id_new(purple_account_get_username(account));
 	js->next_id = g_random_int();
 	js->write_buffer = purple_circ_buffer_new(512);
-	js->old_length = -1;
+	js->old_length = 0;
+	js->keepalive_timeout = -1;
+	js->certificate_CN = g_strdup(connect_server[0] ? connect_server : js->user->domain);
 
 	if(!js->user) {
 		purple_connection_error_reason (gc,
@@ -649,7 +655,7 @@
 	if(purple_account_get_bool(js->gc->account, "old_ssl", FALSE)) {
 		if(purple_ssl_is_supported()) {
 			js->gsc = purple_ssl_connect(js->gc->account,
-					connect_server[0] ? connect_server : js->user->domain,
+					js->certificate_CN,
 					purple_account_get_int(account, "port", 5223), jabber_login_callback_ssl,
 					jabber_ssl_connect_failure, js->gc);
 		} else {
@@ -1096,7 +1102,7 @@
 			g_free, g_free);
 	js->user = jabber_id_new(purple_account_get_username(account));
 	js->next_id = g_random_int();
-	js->old_length = -1;
+	js->old_length = 0;
 
 	if(!js->user) {
 		purple_connection_error_reason (gc,
@@ -1124,6 +1130,7 @@
 		my_jb->subscription |= JABBER_SUB_BOTH;
 
 	server = connect_server[0] ? connect_server : js->user->domain;
+	js->certificate_CN = g_strdup(server);
 
 	jabber_stream_set_state(js, JABBER_STREAM_CONNECTING);
 
@@ -1300,7 +1307,7 @@
 		js->commands = g_list_delete_link(js->commands, js->commands);
 	}
 	g_free(js->server_name);
-	g_free(js->host);
+	g_free(js->certificate_CN);
 	g_free(js->gmail_last_time);
 	g_free(js->gmail_last_tid);
 	g_free(js->old_msg);
@@ -1311,6 +1318,9 @@
 	g_free(js->old_uri);
 	g_free(js->old_track);
 
+	if (js->keepalive_timeout != -1)
+		purple_timeout_remove(js->keepalive_timeout);
+	
 	g_free(js);
 
 	gc->proto_data = NULL;
@@ -1516,10 +1526,16 @@
 				} else
 					purple_notify_user_info_add_pair(user_info, _("Mood"), mood);
 			}
-			if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) {	
+			if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) {
 				PurpleStatus *tune = purple_presence_get_status(presence, "tune");
 				const char *title = purple_status_get_attr_string(tune, PURPLE_TUNE_TITLE);
-				purple_notify_user_info_add_pair(user_info, _("Current media"), title);
+				const char *artist = purple_status_get_attr_string(tune, PURPLE_TUNE_ARTIST);
+				const char *album = purple_status_get_attr_string(tune, PURPLE_TUNE_ALBUM);
+				char *playing = purple_util_format_song_info(title, artist, album, NULL);
+				if (playing) {
+					purple_notify_user_info_add_pair(user_info, _("Now Listening"), playing);
+					g_free(playing);
+				}
 			}
 		}
 
@@ -2287,14 +2303,10 @@
 GList *jabber_attention_types(PurpleAccount *account)
 {
 	static GList *types = NULL;
-	PurpleAttentionType *attn;
 
 	if (!types) {
-		attn = g_new0(PurpleAttentionType, 1);
-		attn->name = _("Buzz");
-		attn->incoming_description = _("%s has buzzed you!");
-		attn->outgoing_description = _("Buzzing %s...");
-		types = g_list_append(types, attn);
+		types = g_list_append(types, purple_attention_type_new("Buzz", _("Buzz"),
+				_("%s has buzzed you!"), _("Buzzing %s...")));
 	}
 
 	return types;
--- a/libpurple/protocols/jabber/jabber.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/jabber/jabber.h	Wed Feb 06 03:35:04 2008 +0000
@@ -192,7 +192,10 @@
 	int old_length;
 	char *old_track;
 	
-	char *host;
+	char *certificate_CN;
+	
+	/* A purple timeout tag for the keepalive */
+	int keepalive_timeout;
 };
 
 typedef gboolean (JabberFeatureEnabled)(JabberStream *js, const gchar *shortname, const gchar *namespace);
--- a/libpurple/protocols/jabber/si.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/jabber/si.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1089,7 +1089,7 @@
 		} else {
 			/* we've got multiple resources, we need to pick one to send to */
 			GList *l;
-			char *msg = g_strdup_printf(_("Please select which resource of %s you would like to send a file to"), xfer->who);
+			char *msg = g_strdup_printf(_("Please select the resource of %s to which you would like to send a file"), xfer->who);
 			PurpleRequestFields *fields = purple_request_fields_new();
 			PurpleRequestField *field = purple_request_field_choice_new("resource", _("Resource"), 0);
 			PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL);
--- a/libpurple/protocols/jabber/usertune.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/jabber/usertune.c	Wed Feb 06 03:35:04 2008 +0000
@@ -35,11 +35,12 @@
 	xmlnode *tuneinfo, *tune;
 	PurpleJabberTuneInfo tuneinfodata;
 	JabberBuddyResource *resource;
-	
+	gboolean valid = FALSE;
+
 	/* ignore the tune of people not on our buddy list */
 	if (!buddy || !item)
 		return;
-	
+
 	tuneinfodata.artist = NULL;
 	tuneinfodata.title = NULL;
 	tuneinfodata.album = NULL;
@@ -58,36 +59,47 @@
 			if (!strcmp(tuneinfo->name, "artist")) {
 				if (tuneinfodata.artist == NULL) /* only pick the first one */
 					tuneinfodata.artist = xmlnode_get_data(tuneinfo);
+				valid = TRUE;
 			} else if (!strcmp(tuneinfo->name, "length")) {
 				if (tuneinfodata.time == -1) {
 					char *length = xmlnode_get_data(tuneinfo);
 					if (length)
 						tuneinfodata.time = strtol(length, NULL, 10);
 					g_free(length);
+					if (tuneinfodata.time > 0)
+						valid = TRUE;
 				}
 			} else if (!strcmp(tuneinfo->name, "source")) {
 				if (tuneinfodata.album == NULL) /* only pick the first one */
 					tuneinfodata.album = xmlnode_get_data(tuneinfo);
+				valid = TRUE;
 			} else if (!strcmp(tuneinfo->name, "title")) {
 				if (tuneinfodata.title == NULL) /* only pick the first one */
 					tuneinfodata.title = xmlnode_get_data(tuneinfo);
+				valid = TRUE;
 			} else if (!strcmp(tuneinfo->name, "track")) {
 				if (tuneinfodata.track == NULL) /* only pick the first one */
 					tuneinfodata.track = xmlnode_get_data(tuneinfo);
+				valid = TRUE;
 			} else if (!strcmp(tuneinfo->name, "uri")) {
 				if (tuneinfodata.url == NULL) /* only pick the first one */
 					tuneinfodata.url = xmlnode_get_data(tuneinfo);
+				valid = TRUE;
 			}
 		}
 	}
 
-	purple_prpl_got_user_status(js->gc->account, from, "tune",
-			PURPLE_TUNE_ARTIST, tuneinfodata.artist,
-			PURPLE_TUNE_TITLE, tuneinfodata.title,
-			PURPLE_TUNE_ALBUM, tuneinfodata.album,
-			PURPLE_TUNE_TRACK, tuneinfodata.track,
-			PURPLE_TUNE_TIME, tuneinfodata.time,
-			PURPLE_TUNE_URL, tuneinfodata.url, NULL);
+	if (valid) {
+		purple_prpl_got_user_status(js->gc->account, from, "tune",
+				PURPLE_TUNE_ARTIST, tuneinfodata.artist,
+				PURPLE_TUNE_TITLE, tuneinfodata.title,
+				PURPLE_TUNE_ALBUM, tuneinfodata.album,
+				PURPLE_TUNE_TRACK, tuneinfodata.track,
+				PURPLE_TUNE_TIME, tuneinfodata.time,
+				PURPLE_TUNE_URL, tuneinfodata.url, NULL);
+	} else {
+		purple_prpl_got_user_status_deactive(js->gc->account, from, "tune");
+	}
 
 	g_free(tuneinfodata.artist);
 	g_free(tuneinfodata.title);
@@ -119,7 +131,7 @@
 			xmlnode_insert_data(xmlnode_new_child(tunenode, "source"),tuneinfo->album,-1);
 		if(tuneinfo->url && tuneinfo->url[0] != '\0')
 			xmlnode_insert_data(xmlnode_new_child(tunenode, "uri"),tuneinfo->url,-1);
-		if(tuneinfo->time >= 0) {
+		if(tuneinfo->time > 0) {
 			char *length = g_strdup_printf("%d", tuneinfo->time);
 			xmlnode_insert_data(xmlnode_new_child(tunenode, "length"),length,-1);
 			g_free(length);
--- a/libpurple/protocols/msn/msn.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msn/msn.c	Wed Feb 06 03:35:04 2008 +0000
@@ -122,15 +122,11 @@
 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);
+		list = g_list_append(list, purple_attention_type_new("Nudge", _("Nudge"),
+				_("%s has nudged you!"), _("Nudging %s...")));
 	}
 
 	return list;
@@ -355,7 +351,7 @@
 						_("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_DEFAULT_ACTION_NONE,
 						purple_connection_get_account(gc), NULL, NULL,
 						gc, 3,
 						_("Allow"), G_CALLBACK(enable_msn_pages_cb),
@@ -461,7 +457,7 @@
 	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->chat_id = msn_switchboard_get_chat_id();
 	swboard->conv = serv_got_joined_chat(gc, swboard->chat_id, "MSN Chat");
 	swboard->flag = MSN_SB_FLAG_IM;
 
@@ -593,8 +589,8 @@
 			PurpleStatus *tune = purple_presence_get_status(presence, "tune");
 			const char *title = purple_status_get_attr_string(tune, PURPLE_TUNE_TITLE);
 			const char *artist = purple_status_get_attr_string(tune, PURPLE_TUNE_ARTIST);
-			currentmedia = g_strdup_printf("%s%s%s", title, artist ? " - " : "",
-					artist ? artist : "");
+			const char *album = purple_status_get_attr_string(tune, PURPLE_TUNE_ALBUM);
+			currentmedia = purple_util_format_song_info(title, artist, album, NULL);
 			/* We could probably just use user->media.title etc. here */
 		}
 
@@ -643,9 +639,7 @@
 		}
 
 		if (currentmedia) {
-			tmp = g_markup_escape_text(currentmedia, -1);
-			purple_notify_user_info_add_pair(user_info, _("Current media"), tmp);
-			g_free(tmp);
+			purple_notify_user_info_add_pair(user_info, _("Now Listening"), currentmedia);
 			g_free(currentmedia);
 		}
 	}
@@ -661,8 +655,22 @@
 	 */
 	if (full && user)
 	{
+		const char *phone;
+
 		purple_notify_user_info_add_pair(user_info, _("Blocked"),
 									   ((user->list_op & (1 << MSN_LIST_BL)) ? _("Yes") : _("No")));
+
+		phone = msn_user_get_home_phone(user);
+		if (phone != NULL)
+			purple_notify_user_info_add_pair(user_info, _("Home Phone Number"), phone);
+
+		phone = msn_user_get_work_phone(user);
+		if (phone != NULL)
+			purple_notify_user_info_add_pair(user_info, _("Work Phone Number"), phone);
+
+		phone = msn_user_get_mobile_phone(user);
+		if (phone != NULL)
+			purple_notify_user_info_add_pair(user_info, _("Mobile Phone Number"), phone);
 	}
 }
 
--- a/libpurple/protocols/msn/servconn.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msn/servconn.c	Wed Feb 06 03:35:04 2008 +0000
@@ -391,6 +391,7 @@
 	session = servconn->session;
 
 	len = read(servconn->fd, buf, sizeof(buf) - 1);
+	servconn->session->account->gc->last_received = time(NULL);
 
 	if (len <= 0) {
 		switch (errno) {
--- a/libpurple/protocols/msn/session.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msn/session.c	Wed Feb 06 03:35:04 2008 +0000
@@ -46,7 +46,6 @@
 	session->oim = msn_oim_new(session);
 
 	session->protocol_ver = WLM_PROT_VER;
-	session->conv_seq = 1;
 
 	return session;
 }
--- a/libpurple/protocols/msn/session.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msn/session.h	Wed Feb 06 03:35:04 2008 +0000
@@ -107,8 +107,6 @@
 	GList *directconns; /**< The list of all the directconnections. */
 	GList *slplinks; /**< The list of all the slplinks. */
 
-	int conv_seq; /**< The current conversation sequence number. */
-
 	/*psm info*/
 	char *psm;
 
--- a/libpurple/protocols/msn/switchboard.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msn/switchboard.c	Wed Feb 06 03:35:04 2008 +0000
@@ -164,6 +164,14 @@
 	return swboard->session_id;
 }
 
+int
+msn_switchboard_get_chat_id(void)
+{
+	static int chat_id = 1;
+
+	return chat_id++;
+}
+
 void
 msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited)
 {
@@ -250,7 +258,7 @@
 				purple_conversation_destroy(swboard->conv);
 #endif
 
-			swboard->chat_id = cmdproc->session->conv_seq++;
+			swboard->chat_id = msn_switchboard_get_chat_id();
 			swboard->flag |= MSN_SB_FLAG_IM;
 			swboard->conv = serv_got_joined_chat(account->gc,
 												 swboard->chat_id,
--- a/libpurple/protocols/msn/switchboard.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msn/switchboard.h	Wed Feb 06 03:35:04 2008 +0000
@@ -167,6 +167,13 @@
 const char *msn_switchboard_get_session_id(MsnSwitchBoard *swboard);
 
 /**
+ * Returns the next chat ID for use by a switchboard.
+ *
+ * @return The chat ID.
+ */
+int msn_switchboard_get_chat_id(void);
+
+/**
  * Sets whether or not we were invited to this switchboard.
  *
  * @param swboard The switchboard.
--- a/libpurple/protocols/msnp9/msn.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/msn.c	Wed Feb 06 03:35:04 2008 +0000
@@ -27,6 +27,7 @@
 
 #include "msn.h"
 #include "accountopt.h"
+#include "eventloop.h"
 #include "msg.h"
 #include "page.h"
 #include "pluginpref.h"
@@ -122,15 +123,11 @@
 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);
+		list = g_list_append(list, purple_attention_type_new("Nudge", _("Nudge"),
+				_("%s has nudged you!"), _("Nudging %s...")));
 	}
 
 	return list;
@@ -351,7 +348,7 @@
 						_("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_DEFAULT_ACTION_NONE,
 						purple_connection_get_account(gc), NULL, NULL,
 						gc, 3,
 						_("Allow"), G_CALLBACK(enable_msn_pages_cb),
@@ -435,7 +432,7 @@
 	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->chat_id = msn_switchboard_get_chat_id();
 	swboard->conv = serv_got_joined_chat(gc, swboard->chat_id, "MSN Chat");
 	swboard->flag = MSN_SB_FLAG_IM;
 
@@ -560,8 +557,22 @@
 	 * you, which is the important information that this is trying to convey. */
 	if (full && user)
 	{
+		const char *phone;
+
 		purple_notify_user_info_add_pair(user_info, _("Blocked"),
 									   ((user->list_op & (1 << MSN_LIST_BL)) ? _("Yes") : _("No")));
+
+		phone = msn_user_get_home_phone(user);
+		if (phone != NULL)
+			purple_notify_user_info_add_pair(user_info, _("Home Phone Number"), phone);
+
+		phone = msn_user_get_work_phone(user);
+		if (phone != NULL)
+			purple_notify_user_info_add_pair(user_info, _("Work Phone Number"), phone);
+
+		phone = msn_user_get_mobile_phone(user);
+		if (phone != NULL)
+			purple_notify_user_info_add_pair(user_info, _("Mobile Phone Number"), phone);
 	}
 }
 
@@ -860,7 +871,7 @@
 		imdata->msg = body_str;
 		imdata->flags = flags;
 		imdata->when = time(NULL);
-		g_idle_add(msn_send_me_im, imdata);
+		purple_timeout_add(0, msn_send_me_im, imdata);
 	}
 
 	msn_message_destroy(msg);
--- a/libpurple/protocols/msnp9/notification.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/notification.c	Wed Feb 06 03:35:04 2008 +0000
@@ -840,6 +840,38 @@
 }
 
 static void
+bpr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	const char *type, *value, *passport;
+	MsnUser *user;
+
+	passport = cmd->params[1];
+	user = msn_userlist_find_user(cmdproc->session->userlist, passport);
+
+	g_return_if_fail(user != NULL);
+
+	type     = cmd->params[2];
+	value    = cmd->params[3];
+
+	if (value)
+	{
+		if (!strcmp(type, "MOB"))
+		{
+			if (!strcmp(value, "Y"))
+				user->mobile = TRUE;
+			else if (!strcmp(value, "N"))
+				user->mobile = FALSE;
+		}
+		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));
+	}
+}
+
+static void
 reg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
 	MsnSession *session;
@@ -1012,7 +1044,7 @@
 	{
 		purple_debug_error("msn",
 						 "Error opening temp passport file: %s\n",
-						 strerror(errno));
+						 g_strerror(errno));
 	}
 	else
 	{
@@ -1061,7 +1093,7 @@
 		{
 			purple_debug_error("msn",
 							 "Error closing temp passport file: %s\n",
-							 strerror(errno));
+							 g_strerror(errno));
 
 			g_unlink(session->passport_info.file);
 			g_free(session->passport_info.file);
@@ -1435,6 +1467,7 @@
 	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, "BPR", bpr_cmd);
 
 	msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd);
 	msn_table_add_cmd(cbs_table, NULL, "REM", rem_cmd);
--- a/libpurple/protocols/msnp9/servconn.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/servconn.c	Wed Feb 06 03:35:04 2008 +0000
@@ -387,12 +387,13 @@
 	session = servconn->session;
 
 	len = read(servconn->fd, buf, sizeof(buf) - 1);
+	servconn->session->account->gc->last_received = time(NULL);
 
 	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));
+		purple_debug_error("msn", "servconn read error, len: %d error: %s\n", len, g_strerror(errno));
 		msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_READ);
 
 		return;
--- a/libpurple/protocols/msnp9/session.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/session.c	Wed Feb 06 03:35:04 2008 +0000
@@ -44,7 +44,6 @@
 								 purple_account_get_username(account), NULL);
 
 	session->protocol_ver = 9;
-	session->conv_seq = 1;
 
 	return session;
 }
@@ -398,8 +397,13 @@
 	PurpleStoredImage *img;
 	const char *passport;
 
-	if (session->logged_in)
+	if (session->logged_in) {
+		/* We are probably here because of a mid-session notification server XFR
+		 * We must send a CHG now, otherwise the servers default to invisible,
+		 * and prevent things happening, like sending IMs */
+		msn_change_status(session);
 		return;
+	}
 
 	account = session->account;
 	gc = purple_account_get_connection(account);
--- a/libpurple/protocols/msnp9/session.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/session.h	Wed Feb 06 03:35:04 2008 +0000
@@ -103,8 +103,6 @@
 	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;
--- a/libpurple/protocols/msnp9/slpcall.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/slpcall.c	Wed Feb 06 03:35:04 2008 +0000
@@ -34,7 +34,7 @@
  **************************************************************************/
 
 static char *
-rand_guid()
+rand_guid(void)
 {
 	return g_strdup_printf("%4X%4X-%4X-%4X-%4X-%4X%4X%4X",
 			rand() % 0xAAFF + 0x1111,
--- a/libpurple/protocols/msnp9/switchboard.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/switchboard.c	Wed Feb 06 03:35:04 2008 +0000
@@ -166,6 +166,14 @@
 	return swboard->session_id;
 }
 
+int
+msn_switchboard_get_chat_id(void)
+{
+	static int chat_id = 1;
+
+	return chat_id++;
+}
+
 void
 msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited)
 {
@@ -252,7 +260,7 @@
 				purple_conversation_destroy(swboard->conv);
 #endif
 
-			swboard->chat_id = cmdproc->session->conv_seq++;
+			swboard->chat_id = msn_switchboard_get_chat_id();
 			swboard->flag |= MSN_SB_FLAG_IM;
 			swboard->conv = serv_got_joined_chat(account->gc,
 												 swboard->chat_id,
--- a/libpurple/protocols/msnp9/switchboard.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/switchboard.h	Wed Feb 06 03:35:04 2008 +0000
@@ -167,6 +167,13 @@
 const char *msn_switchboard_get_session_id(MsnSwitchBoard *swboard);
 
 /**
+ * Returns the next chat ID for use by a switchboard.
+ *
+ * @return The chat ID.
+ */
+int msn_switchboard_get_chat_id(void);
+
+/**
  * Sets whether or not we were invited to this switchboard.
  *
  * @param swboard The switchboard.
--- a/libpurple/protocols/msnp9/sync.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/sync.c	Wed Feb 06 03:35:04 2008 +0000
@@ -206,6 +206,8 @@
 		{
 			if (!strcmp(value, "Y"))
 				user->mobile = TRUE;
+			else if (!strcmp(value, "N"))
+				user->mobile = FALSE;
 		}
 		else if (!strcmp(type, "PHH"))
 			msn_user_set_home_phone(user, purple_url_decode(value));
--- a/libpurple/protocols/msnp9/user.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/msnp9/user.c	Wed Feb 06 03:35:04 2008 +0000
@@ -36,7 +36,8 @@
 	user->userlist = userlist;
 
 	msn_user_set_passport(user, passport);
-	msn_user_set_friendly_name(user, friendly_name);
+	if (friendly_name != NULL)
+		msn_user_set_friendly_name(user, friendly_name);
 
 	return user;
 }
--- a/libpurple/protocols/myspace/myspace.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/myspace/myspace.c	Wed Feb 06 03:35:04 2008 +0000
@@ -133,7 +133,7 @@
 
 	types = NULL;
 
-    /* Statuses are almost all the same. Define a macro to reduce code repetition. */
+	/* Statuses are almost all the same. Define a macro to reduce code repetition. */
 #define _MSIM_ADD_NEW_STATUS(prim) status =                         \
 	purple_status_type_new_with_attrs(                          \
 	prim,   /* PurpleStatusPrimitive */                         \
@@ -158,6 +158,20 @@
 	_MSIM_ADD_NEW_STATUS(PURPLE_STATUS_OFFLINE);
 	_MSIM_ADD_NEW_STATUS(PURPLE_STATUS_INVISIBLE);
 
+	/* Except tune status is different... */
+	status = purple_status_type_new_with_attrs(
+			PURPLE_STATUS_TUNE,	/* primitive */
+			"tune",                 /* ID */
+			NULL,                   /* name - use default */
+			TRUE,                   /* savable */
+			TRUE,                   /* should be user_settable some day */
+			TRUE,                   /* independent */
+
+			PURPLE_TUNE_ARTIST, _("Artist"), purple_value_new(PURPLE_TYPE_STRING),
+			PURPLE_TUNE_TITLE, _("Title"), purple_value_new(PURPLE_TYPE_STRING),
+			NULL);
+
+	types = g_list_append(types, status);
 
 	return types;
 }
@@ -552,10 +566,8 @@
 		 * return 1 even if the message could not be sent, since I don't know if
 		 * it has failed yet--because the IM is only sent after the userid is
 		 * retrieved from the server (which happens after this function returns).
+		 * If an error does occur, it should be logged to the IM window.
 		 */
-		/* TODO: maybe if message is delayed, don't echo to conv window,
-		 * but do echo it to conv window manually once it is actually
-		 * sent? Would be complicated. */
 		rc = 1;
 	} else {
 		rc = -1;
@@ -563,19 +575,6 @@
 
 	g_free(message_msim);
 
-	/*
-	 * In MySpace, you login with your email address, but don't talk to other
-	 * users using their email address. So there is currently an asymmetry in the 
-	 * IM windows when using this plugin:
-	 *
-	 * you@example.com: hello
-	 * some_other_user: what's going on?
-	 * you@example.com: just coding a prpl
-	 *
-	 * TODO: Make the sent IM's appear as from the user's username, instead of
-	 * their email address. Purple uses the login (in MSIM, the email)--change this.
-	 */
-
 	return rc;
 }
 
@@ -602,7 +601,7 @@
 	g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
 	g_return_val_if_fail(who != NULL, FALSE);
 	g_return_val_if_fail(text != NULL, FALSE);
-   
+
 	from_username = session->account->username;
 
 	g_return_val_if_fail(from_username != NULL, FALSE);
@@ -611,7 +610,7 @@
 				  type, from_username, who, text);
 
 	msg = msim_msg_new(
-            "bm", MSIM_TYPE_INTEGER, GUINT_TO_POINTER(type),
+			"bm", MSIM_TYPE_INTEGER, GUINT_TO_POINTER(type),
 			"sesskey", MSIM_TYPE_INTEGER, GUINT_TO_POINTER(session->sesskey),
 			/* 't' will be inserted here */
 			"cv", MSIM_TYPE_INTEGER, GUINT_TO_POINTER(MSIM_CLIENT_VERSION),
@@ -664,7 +663,7 @@
 msim_incoming_bm(MsimSession *session, MsimMessage *msg)
 {
 	guint bm;
-   
+
 	bm = msim_msg_get_integer(msg, "bm");
 
 	msim_incoming_bm_record_cv(session, msg);
@@ -745,7 +744,10 @@
 
 	/* TODO: dump unknown msgs to file, so user can send them to me
 	 * if they wish, to help add support for new messages (inspired
-	 * by Alexandr Shutko, who maintains OSCAR protocol documentation). */
+	 * by Alexandr Shutko, who maintains OSCAR protocol documentation). 
+	 *
+	 * Filed enhancement ticket for libpurple as #4688.
+	 */
 
 	purple_debug_info("msim", "Unrecognized data on account for %s\n", 
 			(session && session->account && session->account->username) ? 
@@ -787,9 +789,6 @@
 			msg_text, username);
 
 	if (g_str_equal(msg_text, "%typing%")) {
-		/* TODO: find out if msim repeatedly sends typing messages, so we can 
-		 * give it a timeout. Right now, there does seem to be an inordinately 
-		 * amount of time between typing stopped-typing notifications. */
 		serv_got_typing(session->gc, username, 0, PURPLE_TYPING);
 		rc = TRUE;
 	} else if (g_str_equal(msg_text, "%stoptyping%")) {
@@ -797,6 +796,25 @@
 		rc = TRUE;
 	} else if (strstr(msg_text, "!!!ZAP_SEND!!!=RTE_BTN_ZAPS_")) {
 		rc = msim_incoming_zap(session, msg);
+	} else if (strstr(msg_text, "!!!GroupCount=")) {
+		/* TODO: support group chats. I think the number in msg_text has
+		 * something to do with the 'gid' field. */
+		purple_debug_info("msim", "msim_incoming_action: TODO: implement #4691, group chats: %s\n", msg_text);
+
+		rc = TRUE;
+	} else if (strstr(msg_text, "!!!Offline=")) {
+		/* TODO: support group chats. This one might mean a user
+		 * went offline or exited the chat. */
+		purple_debug_info("msim", "msim_incoming_action: TODO: implement #4691, group chats: %s\n", msg_text);
+
+		rc = TRUE;
+	} else if (msim_msg_get_integer(msg, "aid") != 0) {
+		purple_debug_info("msim", "TODO: implement #4691, group chat from %d on %d: %s\n",
+				msim_msg_get_integer(msg, "aid"),
+				msim_msg_get_integer(msg, "f"),
+				msg_text);
+
+		rc = TRUE;
 	} else {
 		msim_unrecognized(session, msg, 
 				"got to msim_incoming_action but unrecognized value for 'msg'");
@@ -959,6 +977,7 @@
 
 	if (!user) {
 		/* User isn't on blist, create a temporary user to store info. */
+		/* TODO: is this legit, or is it somehow responsible for #3444? */
 		PurpleBuddy *buddy;
 
 		user = g_new0(MsimUser, 1);
@@ -990,8 +1009,6 @@
 		g_free(user->headline);
 		g_free(user->display_name);
 		g_free(user->username);
-		g_free(user->band_name);
-		g_free(user->song_name);
 		g_free(user->image_url);
 		g_free(user);
 	}
@@ -1052,6 +1069,7 @@
 	guint status_code;
 	const gchar *message;
 	gchar *stripped;
+	gchar *unrecognized_msg;
 
 	session = (MsimSession *)account->gc->proto_data;
 
@@ -1083,6 +1101,12 @@
 			purple_debug_info("msim", "msim_set_status: unknown "
 					"status interpreting as online");
 			status_code = MSIM_STATUS_CODE_ONLINE;
+
+			unrecognized_msg = g_strdup_printf("msim_set_status, unrecognized status type: %d\n", 
+					purple_status_type_get_primitive(type));
+			msim_unrecognized(session, NULL, unrecognized_msg);
+			g_free(unrecognized_msg);
+
 			break;
 	}
 
@@ -1197,13 +1221,13 @@
 	/* Special elements name beginning with '_', we'll use internally within the
 	 * program (did not come directly from the wire). */
 	msg = msim_msg_append(msg, "_username", MSIM_TYPE_STRING, username); /* This makes 'msg' the owner of 'username' */
-  
+
 	/* TODO: attach more useful information, like ImageURL */
 
 	msim_process(session, msg);
 
 	/* TODO: Free copy cloned from  msim_preprocess_incoming(). */
-	//XXX msim_msg_free(msg);
+	/* msim_msg_free(msg); */
 	msim_msg_free(body);
 }
 
@@ -1211,16 +1235,17 @@
  *
  * @param wanted_uid
  *
- * @return Username of wanted_uid, if on blist, or NULL. Static string. 
+ * @return Username of wanted_uid, if on blist, or NULL. 
+ * 	This is a static string, so don't free it. Copy it if needed.
  *
  */
 static const gchar *
-msim_uid2username_from_blist(MsimSession *session, guint wanted_uid)
+msim_uid2username_from_blist(PurpleAccount *account, guint wanted_uid)
 {
 	GSList *buddies, *cur;
-	gchar *ret;
-
-	buddies = purple_find_buddies(session->account, NULL); 
+	const gchar *ret;
+
+	buddies = purple_find_buddies(account, NULL); 
 
 	if (!buddies)
 	{
@@ -1244,7 +1269,7 @@
 
 		if (uid == wanted_uid)
 		{
-			ret = g_strdup(name);
+			ret = name;
 			break;
 		}
 	}
@@ -1271,7 +1296,7 @@
 		/* 'f' = userid message is from, in buddy messages */
 		uid = msim_msg_get_integer(msg, "f");
 
-		username = msim_uid2username_from_blist(session, uid); 
+		username = msim_uid2username_from_blist(session->account, uid); 
 
 		if (username) {
 			/* Know username already, use it. */
@@ -1313,13 +1338,13 @@
 	g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
 
 	delta = time(NULL) - session->last_comm;
-	//purple_debug_info("msim", "msim_check_alive: delta=%d\n", delta);
+	/* purple_debug_info("msim", "msim_check_alive: delta=%d\n", delta); */
 	if (delta >= MSIM_KEEPALIVE_INTERVAL) {
 		errmsg = g_strdup_printf(_("Connection to server lost (no data received within %d seconds)"), (int)delta);
 
 		purple_debug_info("msim", "msim_check_alive: %s > interval of %d, presumed dead\n",
 				errmsg, MSIM_KEEPALIVE_INTERVAL);
-		purple_connection_error_reason (session->gc,
+		purple_connection_error_reason(session->gc,
 				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, errmsg);
 
 		purple_notify_error(session->gc, NULL, errmsg, NULL);
@@ -1741,7 +1766,7 @@
 static gboolean
 msim_web_challenge(MsimSession *session, MsimMessage *msg)
 {
-	/* TODO: web challenge, store token */
+	/* TODO: web challenge, store token. #2659. */
 	return FALSE;
 }
 
@@ -1832,13 +1857,14 @@
 	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 */
+			case MSIM_ERROR_INCORRECT_PASSWORD: /* 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 */
+			case MSIM_ERROR_LOGGED_IN_ELSEWHERE: /* Logged in elsewhere */
 				reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE;
 				if (!purple_account_get_remember_password(session->account))
 					purple_account_set_password(session->account, NULL);
@@ -1871,6 +1897,7 @@
 	gchar *status_headline, *status_headline_escaped;
 	gint status_code, purple_status_code;
 	gchar *username;
+	gchar *unrecognized_msg;
 
 	g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
 	g_return_val_if_fail(msg != NULL, FALSE);
@@ -1903,7 +1930,8 @@
 
 	blist = purple_get_blist();
 
-	/* Add buddy if not found */
+	/* Add buddy if not found.
+	 * TODO: Could this be responsible for #3444? */
 	user = msim_find_user(session, username);
 	if (!user) {
 		PurpleBuddy *buddy;
@@ -1915,7 +1943,7 @@
 
 		user = msim_get_user_from_buddy(buddy);
 
-		/* All buddies on list should have 'uid' integer associated with them. */
+		/* All buddies on list should have a UserID integer associated with them. */
 		purple_blist_node_set_int(&buddy->node, "UserID", msim_msg_get_integer(msg, "f"));
 		
 		msim_store_user_info(session, msg, NULL);
@@ -1938,7 +1966,7 @@
 
 	/* don't copy; let the MsimUser own the headline, memory-wise */
 	user->headline = status_headline_escaped;
-  
+
 	/* Set user status */
 	switch (status_code) {
 		case MSIM_STATUS_CODE_OFFLINE_OR_HIDDEN: 
@@ -1959,9 +1987,15 @@
 			break;
 
 		default:
-			purple_debug_info("msim", "msim_status for %s, unknown status code %d, treating as available\n",
+			purple_debug_info("msim", "msim_incoming_status for %s, unknown status code %d, treating as available\n",
 						username, status_code);
 			purple_status_code = PURPLE_STATUS_AVAILABLE;
+
+			unrecognized_msg = g_strdup_printf("msim_incoming_status, unrecognized status code: %d\n", 
+					status_code);
+			msim_unrecognized(session, NULL, unrecognized_msg);
+			g_free(unrecognized_msg);
+
 	}
 
 	purple_prpl_got_user_status(session->account, username, purple_primitive_get_id_from_type(purple_status_code), NULL);
@@ -2156,10 +2190,15 @@
 		gchar *msg;
 
 		msg = g_strdup_printf(_("No such user: %s"), username);
-		purple_notify_error(NULL, NULL, _("User lookup"), msg);
+		if (!purple_conv_present_error(username, session->account, msg)) { 
+			purple_notify_error(NULL, NULL, _("User lookup"), msg); 
+		}
+
 		g_free(msg);
 		g_free(username);
-		//msim_msg_free(msg);
+		/* TODO: free
+		 * msim_msg_free(msg);
+		 */
 		return;
 	}
 
@@ -2180,7 +2219,9 @@
 	g_free(uid_field_name);
 	g_free(uid_before);
 	g_free(username);
-	//msim_msg_free(msg);
+	/* TODO: free 
+	 * msim_msg_free(msg);
+	 */
 }
 
 /** Postprocess and send a message.
@@ -2222,8 +2263,7 @@
 			uid = 0;
 		}
 
-		if (!buddy || !uid)
-		{
+		if (!buddy || !uid) {
 			/* Don't have uid offhand - need to ask for it, and wait until hear back before sending. */
 			purple_debug_info("msim", ">>> msim_postprocess_outgoing: couldn't find username %s in blist\n",
 					username ? username : "(NULL)");
@@ -2244,7 +2284,9 @@
 	
 	rc = msim_msg_send(session, msg);
 
-	//msim_msg_free(msg);
+	/* TODO: free
+	 * msim_msg_free(msg);
+	 */
 
 	return rc;
 }
@@ -2304,7 +2346,7 @@
 			"blocklist", MSIM_TYPE_BOOLEAN, TRUE,
 			"sesskey", MSIM_TYPE_INTEGER, session->sesskey,
 			/* TODO: MsimMessage lists. Currently <uid> isn't replaced in lists. */
-			//"idlist", MSIM_TYPE_STRING, g_strdup("a-|<uid>|b-|<uid>"),
+			/* "idlist", MSIM_TYPE_STRING, g_strdup("a-|<uid>|b-|<uid>"), */
 			"idlist", MSIM_TYPE_LIST, blocklist_updates,
 			NULL);
 
@@ -2316,6 +2358,72 @@
 	msim_msg_free(blocklist_msg);
 }
 
+/**
+ * Returns a string of a username in canonical form. Basically removes all the
+ * spaces, lowercases the string, and looks up user IDs to usernames.
+ * Normalizing tom, TOM, Tom, and 6221 wil all return 'tom'.
+ *
+ * Borrowed this code from oscar_normalize. Added checking for 
+ * "if userid, get name before normalizing"
+ */
+const char *msim_normalize(const PurpleAccount *account, const char *str) {
+	static char normalized[BUF_LEN];
+	char *tmp1, *tmp2;
+	int i, j;
+	guint id;
+
+	g_return_val_if_fail(str != NULL, NULL);
+
+	if (msim_is_userid(str)) {
+		/* Have user ID, we need to get their username first :) */
+		const char *username;
+
+		/* If the account does not exist, we can't look up the user. */
+		if (!account)
+			return str;
+
+		id = atol(str);
+		username = msim_uid2username_from_blist((PurpleAccount *)account, id);
+		if (!username) {
+			/* Not in buddy list... scheisse... TODO: Manual Lookup! Bug #4631 */
+			/* Note: manual lookup using msim_lookup_user() is a problem inside 
+			 * msim_normalize(), because msim_lookup_user() calls a callback function
+			 * when the user information has been looked up, but msim_normalize() expects
+			 * the result immediately. */
+			strncpy(normalized, str, BUF_LEN);
+		} else {
+			strncpy(normalized, username, BUF_LEN);
+		}
+	} else {
+		/* Have username. */
+		strncpy(normalized, str, BUF_LEN);
+	}
+
+	/* Strip spaces. */
+	for (i=0, j=0; normalized[j]; i++, j++) {
+		while (normalized[j] == ' ')
+			j++;
+		normalized[i] = normalized[j];
+	}
+	normalized[i] = '\0';
+
+	/* Lowercase and perform UTF-8 normalization. */
+	tmp1 = g_utf8_strdown(normalized, -1);
+	tmp2 = g_utf8_normalize(tmp1, -1, G_NORMALIZE_DEFAULT);
+	g_snprintf(normalized, sizeof(normalized), "%s", tmp2);
+	g_free(tmp2);
+	g_free(tmp1);
+
+	/* TODO: re-add caps and spacing back to what the user wanted.
+	 * User can format their own names, for example 'msimprpl' is shown
+	 * as 'MsIm PrPl' in the official client.
+	 *
+	 * TODO: file a ticket to add this enhancement.
+	 */
+
+	return normalized;
+}
+
 /** Return whether the buddy can be messaged while offline.
  *
  * The protocol supports offline messages in just the same way as online
@@ -2364,31 +2472,30 @@
 	g_return_if_fail(cond == PURPLE_INPUT_READ);
 	g_return_if_fail(MSIM_SESSION_VALID(session));
 
-	/* Mark down that we got data, so don't timeout. */
+	/* Mark down that we got data, so we don't timeout. */
 	session->last_comm = time(NULL);
 
-	/* Only can handle so much data at once... 
-	 * If this happens, try recompiling with a higher MSIM_READ_BUF_SIZE.
-	 * Should be large enough to hold the largest protocol message.
-	 */
-	if (session->rxoff >= MSIM_READ_BUF_SIZE) {
-		purple_debug_error("msim", 
-				"msim_input_cb: %d-byte read buffer full! rxoff=%d\n",
-				MSIM_READ_BUF_SIZE, session->rxoff);
-		purple_connection_error_reason (gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Read buffer full"));
+	/* If approaching end of buffer, reallocate some more memory. */
+	if (session->rxsize < session->rxoff + MSIM_READ_BUF_SIZE) {
+		purple_debug_info("msim", 
+			"msim_input_cb: %d-byte read buffer full, rxoff=%d, " "growing by %d bytes\n",
+			session->rxsize, session->rxoff, MSIM_READ_BUF_SIZE);
+			session->rxsize += MSIM_READ_BUF_SIZE;
+			session->rxbuf = g_realloc(session->rxbuf, session->rxsize);
+		
 		return;
 	}
 
-	purple_debug_info("msim", "buffer at %d (max %d), reading up to %d\n",
-			session->rxoff, MSIM_READ_BUF_SIZE, 
-			MSIM_READ_BUF_SIZE - session->rxoff);
+	purple_debug_info("msim", "dynamic buffer at %d (max %d), reading up to %d\n",
+			session->rxoff, session->rxsize,
+			MSIM_READ_BUF_SIZE - session->rxoff - 1);
 
 	/* Read into buffer. On Win32, need recv() not read(). session->fd also holds
 	 * the file descriptor, but it sometimes differs from the 'source' parameter.
 	 */
-	n = recv(session->fd, session->rxbuf + session->rxoff, MSIM_READ_BUF_SIZE - session->rxoff, 0);
+	n = recv(session->fd, 
+		 session->rxbuf + session->rxoff, 
+		 session->rxsize - session->rxoff - 1, 0);
 
 	if (n < 0 && errno == EAGAIN) {
 		return;
@@ -2408,13 +2515,13 @@
 		return;
 	}
 
-	if (n + session->rxoff >= MSIM_READ_BUF_SIZE) {
+	if (n + session->rxoff > session->rxsize) {
 		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? */
+				n, n + session->rxoff, session->rxsize);
 		purple_connection_error_reason (gc,
 			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-			_("Read buffer full"));
+			_("Read buffer full (2)"));
+		return;
 	}
 
 	/* Null terminate */
@@ -2457,6 +2564,7 @@
 			purple_connection_error_reason (gc,
 				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
 				_("Unparseable message"));
+			break;
 		} else {
 			/* Process message and then free it (processing function should
 			 * clone message if it wants to keep it afterwards.) */
@@ -2469,10 +2577,11 @@
 		/* Move remaining part of buffer to beginning. */
 		session->rxoff -= strlen(session->rxbuf) + strlen(MSIM_FINAL_STRING);
 		memmove(session->rxbuf, end + strlen(MSIM_FINAL_STRING), 
-				MSIM_READ_BUF_SIZE - (end + strlen(MSIM_FINAL_STRING) - session->rxbuf));
-
-		/* Clear end of buffer */
-		//memset(end, 0, MSIM_READ_BUF_SIZE - (end - session->rxbuf));
+				session->rxsize - (end + strlen(MSIM_FINAL_STRING) - session->rxbuf));
+
+		/* Clear end of buffer 
+		 * memset(end, 0, MSIM_READ_BUF_SIZE - (end - session->rxbuf));
+		 */
 	}
 }
 
@@ -2675,7 +2784,7 @@
 	uid = msim_msg_get_integer(contact_info, "ContactID");
 
 	if (!user_lookup_info) {
-		username = g_strdup(msim_uid2username_from_blist(session, uid));
+		username = g_strdup(msim_uid2username_from_blist(session->account, uid));
 		g_return_if_fail(username != NULL);
 	} else {
 		user_lookup_info_body = msim_msg_get_dictionary(user_lookup_info, "body");
@@ -2724,8 +2833,9 @@
 	msim_store_user_info(session, contact_info, NULL);
 
 	/* 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
@@ -2743,7 +2853,7 @@
 	g_return_val_if_fail(uid != 0, FALSE);
 
 	/* Lookup the username, since NickName and IMName is unreliable */
-	username = msim_uid2username_from_blist(session, uid);
+	username = msim_uid2username_from_blist(session->account, uid);
 	if (!username) {
 		gchar *uid_str;
 
@@ -2772,7 +2882,10 @@
 	msim_msg_dump("msim_got_contact_list: reply=%s", reply);
 
 	body = msim_msg_get_dictionary(reply, "body");
-	g_return_if_fail(body != NULL);
+	if (!body) {
+		/* No friends. Not an error. */
+		return;
+	}
 
 	buddy_count = 0;
 
@@ -2912,8 +3025,7 @@
 	menu = g_list_append(menu, act);
 #endif
 
-	act = purple_plugin_action_new(g_strdup_printf("%s",
-				_("Add friends from MySpace.com")), msim_import_friends);
+	act = purple_plugin_action_new(_("Add friends from MySpace.com"), msim_import_friends);
 	menu = g_list_append(menu, act);
 
 	return menu;
@@ -2971,7 +3083,7 @@
 	NULL,              /* rename_group */
 	NULL,              /* buddy_free */
 	NULL,              /* convo_closed */
-	NULL,              /* normalize */
+	msim_normalize,    /* normalize */
 	NULL,              /* set_buddy_icon */
 	NULL,              /* remove_group */
 	NULL,              /* get_cb_real_name */
--- a/libpurple/protocols/myspace/myspace.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/myspace/myspace.h	Wed Feb 06 03:35:04 2008 +0000
@@ -180,7 +180,9 @@
 #define MSIM_CONTACT_LIST_IMPORT_ALL_FRIENDS	1
 #define MSIM_CONTACT_LIST_IMPORT_TOP_FRIENDS	2
 
-#define MsimAttentionType PurpleAttentionType
+/* Error codes */
+#define MSIM_ERROR_INCORRECT_PASSWORD           260
+#define MSIM_ERROR_LOGGED_IN_ELSEWHERE          6
 
 /* Functions */
 gboolean msim_load(PurplePlugin *plugin);
@@ -201,6 +203,8 @@
 void msim_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group);
 void msim_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group);
 
+const char *msim_normalize(const PurpleAccount *account, const char *str);
+
 gboolean msim_offline_message(const PurpleBuddy *buddy);
 
 void msim_close(PurpleConnection *gc);
--- a/libpurple/protocols/myspace/session.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/myspace/session.c	Wed Feb 06 03:35:04 2008 +0000
@@ -59,7 +59,8 @@
 	session->server_info = NULL;
 
 	session->rxoff = 0;
-	session->rxbuf = g_new0(gchar, MSIM_READ_BUF_SIZE);
+	session->rxsize = MSIM_READ_BUF_SIZE;
+	session->rxbuf = g_new0(gchar, session->rxsize);
 	session->next_rid = 1;
 	session->last_comm = time(NULL);
 	session->inbox_status = 0;
--- a/libpurple/protocols/myspace/session.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/myspace/session.h	Wed Feb 06 03:35:04 2008 +0000
@@ -42,6 +42,7 @@
 
 	gchar *rxbuf;                       /**< Receive buffer */
 	guint rxoff;                        /**< Receive buffer offset */
+	guint rxsize;                       /**< Receive buffer size */
 	guint next_rid;                     /**< Next request/response ID */
 	time_t last_comm;                   /**< Time received last communication */
 	guint inbox_status;                 /**< Bit field of inbox notifications */
--- a/libpurple/protocols/myspace/user.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/myspace/user.c	Wed Feb 06 03:35:04 2008 +0000
@@ -20,7 +20,7 @@
 #include "myspace.h"
 
 static void msim_store_user_info_each(const gchar *key_str, gchar *value_str, MsimUser *user);
-static gchar *msim_format_now_playing(gchar *band, gchar *song);
+static gchar *msim_format_now_playing(const gchar *band, const gchar *song);
 static void msim_downloaded_buddy_icon(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text,
 		gsize len, const gchar *error_message);
 
@@ -28,7 +28,7 @@
  * @return Return a new string (must be g_free()'d), or NULL.
  */
 static gchar *
-msim_format_now_playing(gchar *band, gchar *song)
+msim_format_now_playing(const gchar *band, const gchar *song)
 {
 	if ((band && *band) || (song && *song)) {
 		return g_strdup_printf("%s - %s",
@@ -85,6 +85,7 @@
 void
 msim_append_user_info(MsimSession *session, PurpleNotifyUserInfo *user_info, MsimUser *user, gboolean full)
 {
+	PurplePresence *presence;
 	gchar *str;
 	guint uid;
 	guint cv;
@@ -128,11 +129,22 @@
 		purple_notify_user_info_add_pair(user_info, _("Headline"), user->headline);
 	}
 
-	str = msim_format_now_playing(user->band_name, user->song_name);
-	if (str && *str) {
-		purple_notify_user_info_add_pair(user_info, _("Song"), str);
+	presence = purple_buddy_get_presence(user->buddy);
+
+	if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) {
+		PurpleStatus *status;
+		const char *artist, *title;
+		
+		status = purple_presence_get_status(presence, "tune");
+		title = purple_status_get_attr_string(status, PURPLE_TUNE_TITLE);
+		artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST);
+
+		str = msim_format_now_playing(artist, title);
+		if (str && *str) {
+			purple_notify_user_info_add_pair(user_info, _("Song"), str);
+		}
+		g_free(str);
 	}
-	g_free(str);
 
 	/* Note: total friends only available if looked up by uid, not username. */
 	if (user->total_friends) {
@@ -161,6 +173,59 @@
 	}
 }
 
+/** Set the currently playing song artist and or title.
+ *
+ * @param user User associated with the now playing information.
+ *
+ * @param new_artist New artist to set, or NULL/empty to not change artist.
+ *
+ * @param new_title New title to set, or NULL/empty to not change title.
+ *
+ * If new_artist and new_title are NULL/empty, deactivate PURPLE_STATUS_TUNE.
+ *
+ * This function is useful because it lets you set the artist or title
+ * individually, which purple_prpl_got_user_status() doesn't do.
+ */
+static void msim_set_artist_or_title(MsimUser *user, const char *new_artist, const char *new_title)
+{
+	PurplePresence *presence;
+	const char *prev_artist, *prev_title;
+
+	prev_artist = NULL;
+	prev_title = NULL;
+
+	if (new_artist && !strlen(new_artist))
+		new_artist = NULL;
+	if (new_title && !strlen(new_title))
+		new_title = NULL;
+
+	if (!new_artist && !new_title) {
+		purple_prpl_got_user_status_deactive(user->buddy->account, user->buddy->name, "tune");
+		return;
+	}
+
+	presence = purple_buddy_get_presence(user->buddy);
+
+	if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) {
+		PurpleStatus *status;
+		
+		status = purple_presence_get_status(presence, "tune");
+		prev_title = purple_status_get_attr_string(status, PURPLE_TUNE_TITLE);
+		prev_artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST);
+	} 
+
+	if (!new_artist)
+		new_artist = prev_artist;
+	
+	if (!new_title)
+		new_title = prev_title;
+
+	purple_prpl_got_user_status(user->buddy->account, user->buddy->name, "tune",
+			PURPLE_TUNE_TITLE, new_title,
+			PURPLE_TUNE_ARTIST, new_artist,
+			NULL);
+}
+
 /** Store a field of information about a buddy. 
  *
  * @param key_str Key to store.
@@ -194,11 +259,9 @@
 		g_free(user->display_name);
 		user->display_name = value_str;
 	} else if (g_str_equal(key_str, "BandName")) {
-		g_free(user->band_name);
-		user->band_name = value_str;
+		msim_set_artist_or_title(user, value_str, NULL);
 	} else if (g_str_equal(key_str, "SongName")) {
-		g_free(user->song_name);
-		user->song_name = value_str;
+		msim_set_artist_or_title(user, NULL, value_str);
 	} else if (g_str_equal(key_str, "UserName") || g_str_equal(key_str, "IMName") || g_str_equal(key_str, "NickName")) {
 		/* Ignore because PurpleBuddy knows this already */
 		g_free(value_str);
--- a/libpurple/protocols/myspace/zap.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/myspace/zap.c	Wed Feb 06 03:35:04 2008 +0000
@@ -29,15 +29,12 @@
 msim_attention_types(PurpleAccount *acct)
 {
 	static GList *types = NULL;
-	MsimAttentionType* attn;
+	PurpleAttentionType* attn;
 
 	if (!types) {
-#define _MSIM_ADD_NEW_ATTENTION(icn, nme, incoming, outgoing)              \
-		attn = g_new0(MsimAttentionType, 1);                       \
-		attn->icon_name = icn;                                     \
-		attn->name = nme;                                          \
-		attn->incoming_description = incoming;                     \
-		attn->outgoing_description = outgoing;                     \
+#define _MSIM_ADD_NEW_ATTENTION(icn, ulname, nme, incoming, outgoing) \
+		attn = purple_attention_type_new(ulname, nme, incoming, outgoing); \
+		purple_attention_type_set_icon_name(attn, icn); \
 		types = g_list_append(types, attn);
 
 		/* TODO: icons for each zap */
@@ -48,37 +45,46 @@
 		 * 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." */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("Zap"), _("%s has zapped you!"), _("Zapping %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "Zap", _("Zap"), _("%s has zapped you!"),
+				_("Zapping %s..."));
 
 		/* Whack means "to hit or strike someone with a sharp blow" */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("Whack"), _("%s has whacked you!"), _("Whacking %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "Whack", _("Whack"),
+				_("%s has whacked you!"), _("Whacking %s..."));
 
 		/* 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. */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("Torch"), _("%s has torched you!"), _("Torching %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "Torch", _("Torch"),
+				_("%s has torched you!"), _("Torching %s..."));
 
 		/* Smooch means "to kiss someone, often enthusiastically" */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("Smooch"), _("%s has smooched you!"), _("Smooching %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "Smooch", _("Smooch"),
+				_("%s has smooched you!"), _("Smooching %s..."));
 
 		/* A hug is a display of affection; wrapping your arms around someone */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("Hug"), _("%s has hugged you!"), _("Hugging %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "Hug", _("Hug"), _("%s has hugged you!"),
+				_("Hugging %s..."));
 
 		/* Slap means "to hit someone with an open/flat hand" */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("Slap"), _("%s has slapped you!"), _("Slapping %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "Slap", _("Slap"),
+				_("%s has slapped you!"), _("Slapping %s..."));
 
 		/* Goose means "to pinch someone on their butt" */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("Goose"), _("%s has goosed you!"), _("Goosing %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "Goose", _("Goose"),
+				_("%s has goosed you!"), _("Goosing %s..."));
 
 		/* 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. */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("High-five"), _("%s has high-fived you!"), _("High-fiving %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "High-five", _("High-five"),
+				_("%s has high-fived you!"), _("High-fiving %s..."));
 
 		/* 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. */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("Punk"), _("%s has punk'd you!"), _("Punking %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "Punk", _("Punk"),
+				_("%s has punk'd you!"), _("Punking %s..."));
 
 		/* Raspberry is a slang term for the vibrating sound made
 		 * when you stick your tongue out of your mouth with your
@@ -87,7 +93,8 @@
 		 * gesture, so it does not carry a harsh negative
 		 * connotation.  It is generally used in a playful tone
 		 * with friends. */
-		_MSIM_ADD_NEW_ATTENTION(NULL, _("Raspberry"), _("%s has raspberried you!"), _("Raspberrying %s..."));
+		_MSIM_ADD_NEW_ATTENTION(NULL, "Raspberry", _("Raspberry"),
+				_("%s has raspberried you!"), _("Raspberrying %s..."));
 	}
 
 	return types;
@@ -99,14 +106,14 @@
 {
 	GList *types;
 	MsimSession *session;
-	MsimAttentionType *attn;
+	PurpleAttentionType *attn;
 	PurpleBuddy *buddy;
 
 	session = (MsimSession *)gc->proto_data;
 
 	/* Look for this attention type, by the code index given. */
 	types = msim_attention_types(gc->account);
-	attn = (MsimAttentionType *)g_list_nth_data(types, code);
+	attn = (PurpleAttentionType *)g_list_nth_data(types, code);
 
 	if (!attn) {
 		purple_debug_info("msim_send_attention", "got invalid zap code %d\n", code);
@@ -200,12 +207,12 @@
 	i = 0;
 	do
 	{
-		MsimAttentionType *attn;
+		PurpleAttentionType *attn;
 
-		attn = (MsimAttentionType *)types->data;
+		attn = (PurpleAttentionType *)types->data;
 
-		act = purple_menu_action_new(attn->name, PURPLE_CALLBACK(msim_send_zap_from_menu),
-				GUINT_TO_POINTER(i), NULL);
+		act = purple_menu_action_new(purple_attention_type_get_name(attn),
+				PURPLE_CALLBACK(msim_send_zap_from_menu), GUINT_TO_POINTER(i), NULL);
 		zap_menu = g_list_append(zap_menu, act);
 
 		++i;
--- a/libpurple/protocols/novell/nmfield.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/novell/nmfield.c	Wed Feb 06 03:35:04 2008 +0000
@@ -164,9 +164,7 @@
 		case NMFIELD_TYPE_BINARY:
 		case NMFIELD_TYPE_UTF8:
 		case NMFIELD_TYPE_DN:
-			if (field->ptr_value != NULL) {
-				g_free(field->ptr_value);
-			}
+			g_free(field->ptr_value);
 			break;
 
 		case NMFIELD_TYPE_ARRAY:
--- a/libpurple/protocols/novell/novell.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/novell/novell.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1029,7 +1029,7 @@
  ******************************************************************************/
 
 static char *
-_user_agent_string()
+_user_agent_string(void)
 {
 
 #if !defined(_WIN32)
@@ -1920,6 +1920,7 @@
 	parms = g_slist_append(parms, nm_event_get_conference(event));
 
 	/* Prompt the user */
+	/* TODO: Would it be better to use serv_got_chat_invite() here? */
 	gc = purple_account_get_connection(user->client_data);
 	purple_request_action(gc, title, primary, secondary,
 						PURPLE_DEFAULT_ACTION_NONE,
--- a/libpurple/protocols/oscar/family_auth.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/family_auth.c	Wed Feb 06 03:35:04 2008 +0000
@@ -196,6 +196,10 @@
  *   unknown= 0x0000008b
  *   serverstore = 0x01
  *
+ * @param truncate_pass Truncate the password to 8 characters.  This
+ *        usually happens for AOL accounts.  We are told that we
+ *        should truncate it if the 0x0017/0x0007 SNAC contains
+ *        a TLV of type 0x0026 with data 0x0000.
  */
 int
 aim_send_login(OscarData *od, FlapConnection *conn, const char *sn, const char *password, gboolean truncate_pass, ClientInfo *ci, const char *key)
@@ -522,8 +526,8 @@
 
 	/*
 	 * If the truncate_pass TLV exists then we should truncate the
-	 * user's password to 8 characters.  This flag is sent when you
-	 * try to log in with an AOL user's screen name.
+	 * user's password to 8 characters.  This flag is sent to us
+	 * when logging in with an AOL user's screen name.
 	 */
 	truncate_pass = aim_tlv_gettlv(tlvlist, 0x0026, 1) != NULL;
 
--- a/libpurple/protocols/oscar/family_buddy.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/family_buddy.c	Wed Feb 06 03:35:04 2008 +0000
@@ -219,8 +219,9 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, &userinfo);
 
-	if (snac->subtype == SNAC_SUBTYPE_BUDDY_ONCOMING)
-		aim_locate_requestuserinfo(od, userinfo.sn);
+	if (snac->subtype == SNAC_SUBTYPE_BUDDY_ONCOMING && userinfo.flags & AIM_FLAG_AWAY)
+		aim_locate_autofetch_away_message(od, userinfo.sn);
+
 	aim_info_free(&userinfo);
 
 	return ret;
--- a/libpurple/protocols/oscar/family_icbm.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/family_icbm.c	Wed Feb 06 03:35:04 2008 +0000
@@ -51,6 +51,9 @@
 #include "win32dep.h"
 #endif
 
+#include "util.h"
+
+
 /**
  * Add a standard ICBM header to the given bstream with the given
  * information.
@@ -2335,11 +2338,166 @@
 	sn = byte_stream_getstr(bs, snlen);
 	reason = byte_stream_get16(bs);
 
-	if (channel == 0x0002) { /* File transfer declined */
+	if (channel == 0x0002)
+	{
+		/* parse status note text */
+
+		struct aim_icq_info *info = NULL;
+		struct aim_icq_info *prev_info = NULL;
+		char *response = NULL;
+		char *encoding = NULL;
+		char *stripped_encoding = NULL;
+		char *status_note_text = NULL;
+		char *stripped_status_note_text = NULL;
+		char *status_note = NULL;
+
+		/*
+		 * TODO: Using a while statement here is kind of an ugly hack
+		 *       to be able to use 'break'.  We might as well be using
+		 *       'goto'.  Should probably get rid of this.
+		 */
+		while (reason == 0x0003) /* channel-specific */
+		{
+			guint32 length;
+			guint16 version;
+			guint32 capability;
+			guint8 message_type;
+			guint16 status_code;
+			guint16 text_length;
+			guint32 request_length;
+			guint32 response_length;
+			guint32 encoding_length;
+			PurpleAccount *account;
+			PurpleBuddy *buddy;
+			PurplePresence *presence;
+			PurpleStatus *status;
+
+			for (info = od->icq_info; info != NULL; info = info->next)
+			{
+				if (memcmp(&info->icbm_cookie, cookie, 8) == 0)
+				{
+					if (prev_info == NULL)
+						od->icq_info = info->next;
+					else
+						prev_info->next = info->next;
+
+					break;
+				}
+
+				prev_info = info;
+			}
+
+			if (info == NULL)
+				break;
+
+			if ((length = byte_stream_getle16(bs)) != 27)
+			{
+				purple_debug_misc("oscar", "clientautoresp: incorrect header size; expected 27, received %u.\n", length);
+				break;
+			}
+			if ((version = byte_stream_getle16(bs)) != 9)
+			{
+				purple_debug_misc("oscar", "clientautoresp: incorrect version; expected 9, received %u.\n", version);
+				break;
+			}
+			capability = aim_locate_getcaps(od, bs, 0x10);
+			if (capability != OSCAR_CAPABILITY_EMPTY)
+			{
+				purple_debug_misc("oscar", "clientautoresp: plugin ID is not null.\n");
+				break;
+			}
+			byte_stream_advance(bs, 2); /* unknown */
+			byte_stream_advance(bs, 4); /* client capabilities flags */
+			byte_stream_advance(bs, 1); /* unknown */
+			byte_stream_advance(bs, 2); /* downcouner? */
+
+			if ((length = byte_stream_getle16(bs)) != 14)
+			{
+				purple_debug_misc("oscar", "clientautoresp: incorrect header size; expected 14, received %u.\n", length);
+				break;
+			}
+			byte_stream_advance(bs, 2); /* downcounter? */
+			byte_stream_advance(bs, 12); /* unknown */
+
+			if ((message_type = byte_stream_get8(bs)) != 0x1a)
+			{
+				purple_debug_misc("oscar", "clientautoresp: incorrect message type; expected 0x1a, received 0x%x.\n", message_type);
+				break;
+			}
+			byte_stream_advance(bs, 1); /* message flags */
+			if ((status_code = byte_stream_getle16(bs)) != 0)
+			{
+				purple_debug_misc("oscar", "clientautoresp: incorrect status code; expected 0, received %u.\n", status_code);
+				break;
+			}
+			byte_stream_advance(bs, 2); /* priority code */
+
+			text_length = byte_stream_getle16(bs);
+			byte_stream_advance(bs, text_length); /* text */
+
+			length = byte_stream_getle16(bs);
+			byte_stream_advance(bs, 18); /* unknown */
+			if (length != 18 + 4 + (request_length = byte_stream_getle32(bs)) + 17)
+			{
+				purple_debug_misc("oscar", "clientautoresp: incorrect block; expected length is %u, got %u.\n", 18 + 4 + request_length + 17, length);
+				break;
+			}
+			byte_stream_advance(bs, request_length); /* x request */
+			byte_stream_advance(bs, 17); /* unknown */
+
+			length = byte_stream_getle32(bs);
+			response_length = byte_stream_getle32(bs);
+			response = byte_stream_getstr(bs, response_length);
+			if (length != 4 + response_length + 4 + (encoding_length = byte_stream_getle32(bs)))
+			{
+				purple_debug_misc("oscar", "clientautoresp: incorrect block; expected length is %u, got %u.\n", 4 + response_length + 4 + encoding_length, length);
+				break;
+			}
+			encoding = byte_stream_getstr(bs, encoding_length);
+
+			account = purple_connection_get_account(od->gc);
+			stripped_encoding = oscar_encoding_extract(encoding);
+			status_note_text = oscar_encoding_to_utf8(account, stripped_encoding, response, response_length);
+			stripped_status_note_text = purple_markup_strip_html(status_note_text);
+
+			if (stripped_status_note_text != NULL && stripped_status_note_text[0] != 0)
+				status_note = g_strdup_printf("%s: %s", info->status_note_title, stripped_status_note_text);
+			else
+				status_note = g_strdup(info->status_note_title);
+
+			buddy = purple_find_buddy(account, sn);
+			if (buddy == NULL)
+			{
+				purple_debug_misc("oscar", "clientautoresp: buddy %s was not found.\n", sn);
+				break;
+			}
+
+			purple_debug_misc("oscar", "clientautoresp: setting status message to \"%s\".\n", status_note);
+
+			presence = purple_buddy_get_presence(buddy);
+			status = purple_presence_get_active_status(presence);
+
+			purple_prpl_got_user_status(account, sn,
+					purple_status_get_id(status),
+					"message", status_note, NULL);
+
+			break;
+		}
+
+		g_free(status_note);
+		g_free(stripped_status_note_text);
+		g_free(status_note_text);
+		g_free(stripped_encoding);
+		g_free(encoding);
+		g_free(response);
+		g_free(info->status_note_title);
+		g_free(info);
+
 		byte_stream_get16(bs); /* Unknown */
 		byte_stream_get16(bs); /* Unknown */
 		if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 			ret = userfunc(od, conn, frame, channel, sn, reason, cookie);
+
 	} else if (channel == 0x0004) { /* ICQ message */
 		switch (reason) {
 			case 0x0003: { /* ICQ status message.  Maybe other stuff too, you never know with these people. */
--- a/libpurple/protocols/oscar/family_icq.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/family_icq.c	Wed Feb 06 03:35:04 2008 +0000
@@ -435,6 +435,65 @@
 	return 0;
 }
 
+/*
+ * getstatusnote may be a misleading name because the response
+ * contains a lot of different information but currently it's only
+ * used to get that.
+ */
+int aim_icq_getstatusnote(OscarData *od, const char *uin, guint8 *note_hash, guint16 note_hash_len)
+{
+	FlapConnection *conn;
+	FlapFrame *frame;
+	aim_snacid_t snacid;
+	int bslen;
+
+	purple_debug_misc("oscar", "aim_icq_getstatusnote: requesting status note for %s.\n", uin);
+
+	if (!od || !(conn = flap_connection_findbygroup(od, 0x0015)))
+	{
+		purple_debug_misc("oscar", "aim_icq_getstatusnote: no connection.\n");
+		return -EINVAL;
+	}
+
+	bslen = 2 + 4 + 2 + 2 + 2 + 2 + 58 + strlen(uin);
+
+	frame = flap_frame_new(od, 0x02, 10 + 4 + bslen);
+
+	snacid = aim_cachesnac(od, 0x0015, 0x0002, 0x0000, NULL, 0);
+	aim_putsnac(&frame->data, 0x0015, 0x0002, 0x0000, snacid);
+
+	/* For simplicity, don't bother using a tlvlist */
+	byte_stream_put16(&frame->data, 0x0001);
+	byte_stream_put16(&frame->data, bslen);
+
+	byte_stream_putle16(&frame->data, bslen - 2);
+	byte_stream_putle32(&frame->data, atoi(od->sn));
+	byte_stream_putle16(&frame->data, 0x07d0); /* I command thee. */
+	byte_stream_putle16(&frame->data, snacid); /* eh. */
+	byte_stream_putle16(&frame->data, 0x0fa0); /* shrug. */
+	byte_stream_putle16(&frame->data, 58 + strlen(uin));
+
+	byte_stream_put32(&frame->data, 0x05b90002);    /* don't ask */
+	byte_stream_put32(&frame->data, 0x80000000);
+	byte_stream_put32(&frame->data, 0x00000006);
+	byte_stream_put32(&frame->data, 0x00010002);
+	byte_stream_put32(&frame->data, 0x00020000);
+	byte_stream_put32(&frame->data, 0x04e30000);
+	byte_stream_put32(&frame->data, 0x00020002);
+	byte_stream_put32(&frame->data, 0x00000001);
+
+	byte_stream_put16(&frame->data, 24 + strlen(uin));
+	byte_stream_put32(&frame->data, 0x003c0010);
+	byte_stream_putraw(&frame->data, note_hash, 16); /* status note hash */
+	byte_stream_put16(&frame->data, 0x0032);        /* buddy uin */
+	byte_stream_put16(&frame->data, strlen(uin));
+	byte_stream_putstr(&frame->data, uin);
+
+	flap_connection_send(conn, frame);
+
+	return 0;
+}
+
 static void aim_icq_freeinfo(struct aim_icq_info *info) {
 	int i;
 
@@ -467,6 +526,7 @@
 	g_free(info->workposition);
 	g_free(info->workwebpage);
 	g_free(info->info);
+	g_free(info->status_note_title);
 	g_free(info);
 }
 
@@ -641,6 +701,178 @@
 			info->email = byte_stream_getstr(&qbs, byte_stream_getle16(&qbs));
 			/* Then 0x00 02 00 00 00 00 00 */
 		} break;
+
+		/* status note title and send request for status note text */
+		case 0x0fb4: {
+			GSList *tlvlist;
+			aim_tlv_t *tlv;
+			FlapConnection *conn;
+			char *uin = NULL;
+			char *status_note_title = NULL;
+
+			conn = flap_connection_findbygroup(od, 0x0004);
+			if (conn == NULL)
+			{
+				purple_debug_misc("oscar", "icq/0x0fb4: flap connection was not found.\n");
+				break;
+			}
+
+			byte_stream_advance(&qbs, 0x02); /* length */
+			byte_stream_advance(&qbs, 0x2f); /* unknown stuff */
+
+			tlvlist = aim_tlvlist_read(&qbs);
+
+			tlv = aim_tlv_gettlv(tlvlist, 0x0032, 1);
+			if (tlv != NULL)
+				/* Get user number */
+				uin = aim_tlv_getvalue_as_string(tlv);
+
+			tlv = aim_tlv_gettlv(tlvlist, 0x0226, 1);
+			if (tlv != NULL)
+				/* Get status note title */
+				status_note_title = aim_tlv_getvalue_as_string(tlv);
+
+			aim_tlvlist_free(tlvlist);
+
+			if (uin == NULL || status_note_title == NULL)
+			{
+				purple_debug_misc("oscar", "icq/0x0fb4: uin or "
+						"status_note_title was not found\n");
+				g_free(uin);
+				g_free(status_note_title);
+				break;
+			}
+
+			if (status_note_title[0] == '\0')
+			{
+				PurpleAccount *account;
+				PurpleBuddy *buddy;
+				PurplePresence *presence;
+				PurpleStatus *status;
+
+				account = purple_connection_get_account(od->gc);
+				buddy = purple_find_buddy(account, uin);
+				presence = purple_buddy_get_presence(buddy);
+				status = purple_presence_get_active_status(presence);
+
+				purple_prpl_got_user_status(account, uin,
+						purple_status_get_id(status),
+						"message", NULL, NULL);
+
+				g_free(status_note_title);
+			}
+			else
+			{
+				struct aim_icq_info *info;
+				guint32 data_len;
+				FlapFrame *frame;
+				aim_snacid_t snacid;
+				guchar cookie[8];
+
+				info = g_new0(struct aim_icq_info, 1);
+
+				if (info == NULL)
+				{
+					g_free(uin);
+					g_free(status_note_title);
+
+					break;
+				}
+
+				data_len = 13 + strlen(uin) + 30 + 6 + 4 + 55 + 85 + 4;
+				frame = flap_frame_new(od, 0x0002, 10 + 4 + data_len);
+				snacid = aim_cachesnac(od, 0x0004, 0x0006, 0x0000, NULL, 0);
+
+				aim_putsnac(&frame->data, 0x0004, 0x0006, 0x0000, snacid);
+
+				aim_icbm_makecookie(cookie);
+
+				byte_stream_putraw(&frame->data, cookie, 8); /* ICBM cookie */
+				byte_stream_put16(&frame->data, 0x0002); /* message channel */
+				byte_stream_put8(&frame->data, strlen(uin)); /* uin */
+				byte_stream_putstr(&frame->data, uin);
+
+				byte_stream_put16(&frame->data, 0x0005); /* rendez vous data */
+				byte_stream_put16(&frame->data, 0x00b2);
+				byte_stream_put16(&frame->data, 0x0000); /* request */
+				byte_stream_putraw(&frame->data, cookie, 8); /* ICBM cookie */
+				byte_stream_put32(&frame->data, 0x09461349); /* ICQ server relaying */
+				byte_stream_put16(&frame->data, 0x4c7f);
+				byte_stream_put16(&frame->data, 0x11d1);
+				byte_stream_put32(&frame->data, 0x82224445);
+				byte_stream_put32(&frame->data, 0x53540000);
+
+				byte_stream_put16(&frame->data, 0x000a); /* unknown TLV */
+				byte_stream_put16(&frame->data, 0x0002);
+				byte_stream_put16(&frame->data, 0x0001);
+
+				byte_stream_put16(&frame->data, 0x000f); /* unknown TLV */
+				byte_stream_put16(&frame->data, 0x0000);
+
+				byte_stream_put16(&frame->data, 0x2711); /* extended data */
+				byte_stream_put16(&frame->data, 0x008a);
+				byte_stream_putle16(&frame->data, 0x001b); /* length */
+				byte_stream_putle16(&frame->data, 0x0009); /* version */
+				byte_stream_putle32(&frame->data, 0x00000000); /* plugin: none */
+				byte_stream_putle32(&frame->data, 0x00000000);
+				byte_stream_putle32(&frame->data, 0x00000000);
+				byte_stream_putle32(&frame->data, 0x00000000);
+				byte_stream_putle16(&frame->data, 0x0000); /* unknown */
+				byte_stream_putle32(&frame->data, 0x00000000); /* client capabilities flags */
+				byte_stream_put8(&frame->data, 0x00); /* unknown */
+				byte_stream_putle16(&frame->data, 0x0064); /* downcounter? */
+				byte_stream_putle16(&frame->data, 0x000e); /* length */
+				byte_stream_putle16(&frame->data, 0x0064); /* downcounter? */
+				byte_stream_putle32(&frame->data, 0x00000000); /* unknown */
+				byte_stream_putle32(&frame->data, 0x00000000);
+				byte_stream_putle32(&frame->data, 0x00000000);
+				byte_stream_put8(&frame->data, 0x1a); /* message type: plugin message descibed by text string */
+				byte_stream_put8(&frame->data, 0x00); /* message flags */
+				byte_stream_putle16(&frame->data, 0x0000); /* status code */
+				byte_stream_putle16(&frame->data, 0x0001); /* priority code */
+				byte_stream_putle16(&frame->data, 0x0000); /* text length */
+
+				byte_stream_put8(&frame->data, 0x3a); /* message dump */
+				byte_stream_put32(&frame->data, 0x00811a18);
+				byte_stream_put32(&frame->data, 0xbc0e6c18);
+				byte_stream_put32(&frame->data, 0x47a5916f);
+				byte_stream_put32(&frame->data, 0x18dcc76f);
+				byte_stream_put32(&frame->data, 0x1a010013);
+				byte_stream_put32(&frame->data, 0x00000041);
+				byte_stream_put32(&frame->data, 0x77617920);
+				byte_stream_put32(&frame->data, 0x53746174);
+				byte_stream_put32(&frame->data, 0x7573204d);
+				byte_stream_put32(&frame->data, 0x65737361);
+				byte_stream_put32(&frame->data, 0x67650100);
+				byte_stream_put32(&frame->data, 0x00000000);
+				byte_stream_put32(&frame->data, 0x00000000);
+				byte_stream_put32(&frame->data, 0x00000000);
+				byte_stream_put32(&frame->data, 0x00000015);
+				byte_stream_put32(&frame->data, 0x00000000);
+				byte_stream_put32(&frame->data, 0x0000000d);
+				byte_stream_put32(&frame->data, 0x00000074);
+				byte_stream_put32(&frame->data, 0x6578742f);
+				byte_stream_put32(&frame->data, 0x782d616f);
+				byte_stream_put32(&frame->data, 0x6c727466);
+
+				byte_stream_put16(&frame->data, 0x0003); /* server ACK requested */
+				byte_stream_put16(&frame->data, 0x0000);
+
+				info->uin = atoi(uin);
+				info->status_note_title = status_note_title;
+
+				memcpy(&info->icbm_cookie, cookie, 8);
+
+				info->next = od->icq_info;
+				od->icq_info = info;
+
+				flap_connection_send(conn, frame);
+			}
+
+			g_free(uin);
+
+		} break;
+
 		} /* End switch statement */
 
 		if (!(snac->flags & 0x0001)) {
--- a/libpurple/protocols/oscar/family_locate.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/family_locate.c	Wed Feb 06 03:35:04 2008 +0000
@@ -320,10 +320,10 @@
 		cur->away_encoding = g_strdup(userinfo->away_encoding);
 		cur->away_len = userinfo->away_len;
 
-	} else if (!(userinfo->flags & AIM_FLAG_AWAY)) {
+	} else {
 		/*
-		 * We don't have an away message specified in this user_info block.
-		 * If the user is not away, clear any cached away message now.
+		 * We don't have an away message specified in this user_info
+		 * block, so clear any cached away message now.
 		 */
 		if (cur->away) {
 			g_free(cur->away);
@@ -347,41 +347,6 @@
 		userfunc(od, conn, NULL, cur);
 }
 
-void
-aim_locate_dorequest(OscarData *od)
-{
-	struct userinfo_node *cur = od->locate.torequest;
-
-	if (od->locate.waiting_for_response == TRUE)
-		return;
-
-	od->locate.waiting_for_response = TRUE;
-	aim_locate_getinfoshort(od, cur->sn, 0x00000003);
-
-	/* Move this node to the "requested" queue */
-	od->locate.torequest = cur->next;
-	cur->next = od->locate.requested;
-	od->locate.requested = cur;
-}
-
-static gboolean
-purple_reqinfo_timeout_cb(void *data)
-{
-	OscarData *od;
-
-	od = data;
-
-	if (od->locate.torequest == NULL)
-	{
-		od->getinfotimer = 0;
-		return FALSE;
-	}
-
-	aim_locate_dorequest(od);
-
-	return TRUE;
-}
-
 /**
  * Remove this screen name from our queue.  If this info was requested
  * by our info request queue, then pop the next element off of the queue.
@@ -417,43 +382,26 @@
 			cur = cur->next;
 	}
 
-	if (!was_explicit) {
-		od->locate.waiting_for_response = FALSE;
-
-		/*
-		 * Wait a little while then call aim_locate_dorequest(od).
-		 * This keeps us from hitting the rate limit due to
-		 * requesting away messages and info too quickly.
-		 */
-		if (od->getinfotimer == 0)
-			od->getinfotimer = purple_timeout_add(500,
-					purple_reqinfo_timeout_cb, od);
-	}
-
 	return was_explicit;
 }
 
 void
-aim_locate_requestuserinfo(OscarData *od, const char *sn)
+aim_locate_autofetch_away_message(OscarData *od, const char *sn)
 {
 	struct userinfo_node *cur;
 
-	/* Make sure we aren't already requesting info for this buddy */
-	cur = od->locate.torequest;
-	while (cur != NULL) {
+	/* Make sure we haven't already made an info request for this buddy */
+	for (cur = od->locate.requested; cur != NULL; cur = cur->next)
 		if (aim_sncmp(sn, cur->sn) == 0)
 			return;
-		cur = cur->next;
-	}
 
 	/* Add a new node to our request queue */
 	cur = (struct userinfo_node *)g_malloc(sizeof(struct userinfo_node));
 	cur->sn = g_strdup(sn);
-	cur->next = od->locate.torequest;
-	od->locate.torequest = cur;
+	cur->next = od->locate.requested;
+	od->locate.requested = cur;
 
-	/* Actually request some info up in this piece */
-	aim_locate_dorequest(od);
+	aim_locate_getinfoshort(od, cur->sn, 0x00000002);
 }
 
 aim_userinfo_t *aim_locate_finduserinfo(OscarData *od, const char *sn) {
--- a/libpurple/protocols/oscar/flap_connection.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/flap_connection.c	Wed Feb 06 03:35:04 2008 +0000
@@ -360,7 +360,7 @@
 
 	conn = data;
 	od = conn->od;
-	account = (PURPLE_CONNECTION_IS_VALID(od->gc) ? purple_connection_get_account(od->gc) : NULL);
+	account = purple_connection_get_account(od->gc);
 
 	purple_debug_info("oscar", "Destroying oscar connection of "
 			"type 0x%04hx.  Disconnect reason is %d\n",
@@ -375,8 +375,8 @@
 	 * TODO: If we don't have a SNAC_FAMILY_LOCATE connection then
 	 * we should try to request one instead of disconnecting.
 	 */
-	if (account && !account->disconnecting &&
-		((od->oscar_connections == NULL) || (!flap_connection_getbytype(od, SNAC_FAMILY_LOCATE))))
+	if (!account->disconnecting && ((od->oscar_connections == NULL)
+			|| (!flap_connection_getbytype(od, SNAC_FAMILY_LOCATE))))
 	{
 		/* No more FLAP connections!  Sign off this PurpleConnection! */
 		gchar *tmp;
@@ -817,6 +817,7 @@
 						OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
 				break;
 			}
+			conn->od->gc->last_received = time(NULL);
 
 			/* If we don't even have a complete FLAP header then do nothing */
 			conn->header_received += read;
--- a/libpurple/protocols/oscar/libaim.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/libaim.c	Wed Feb 06 03:35:04 2008 +0000
@@ -92,11 +92,11 @@
 	NULL,					/* whiteboard_prpl_ops */
 	NULL,					/* send_raw */
 	NULL,					/* roomlist_room_serialize */
+	NULL,					/* unregister_user */
+	NULL,					/* send_attention */
+	NULL,					/* get_attention_types */
 
 	/* padding */
-	NULL,
-	NULL,
-	NULL,
 	NULL
 };
 
--- a/libpurple/protocols/oscar/libicq.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/libicq.c	Wed Feb 06 03:35:04 2008 +0000
@@ -92,11 +92,11 @@
 	NULL,					/* whiteboard_prpl_ops */
 	NULL,					/* send_raw */
 	NULL,					/* roomlist_room_serialize */
+	NULL,					/* unregister_user */
+	NULL,					/* send_attention */
+	NULL,					/* get_attention_types */
 
 	/* padding */
-	NULL,
-	NULL,
-	NULL,
 	NULL
 };
 
--- a/libpurple/protocols/oscar/oscar.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Wed Feb 06 03:35:04 2008 +0000
@@ -7,6 +7,7 @@
  * Some code copyright (C) 2001-2007, Mark Doliner <thekingant@users.sourceforge.net>
  * Some code copyright (C) 2005, Jonathan Clark <ardentlygnarly@users.sourceforge.net>
  * Some code copyright (C) 2007, ComBOTS Product GmbH (htfv) <foss@combots.com>
+ * Some code copyright (C) 2008, Aman Gupta
  *
  * Most libfaim code copyright (C) 1998-2001 Adam Fritzler <afritz@auk.cx>
  * Some libfaim code copyright (C) 2001-2004 Mark Doliner <thekingant@users.sourceforge.net>
@@ -196,7 +197,6 @@
 
 static void purple_icons_fetch(PurpleConnection *gc);
 
-static void recent_buddies_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data);
 void oscar_set_info(PurpleConnection *gc, const char *info);
 static void oscar_set_info_and_status(PurpleAccount *account, gboolean setinfo, const char *rawinfo, gboolean setstatus, PurpleStatus *status);
 static void oscar_set_extendedstatus(PurpleConnection *gc);
@@ -1181,6 +1181,48 @@
 	return 1;
 }
 
+static void
+idle_reporting_pref_cb(const char *name, PurplePrefType type,
+		gconstpointer value, gpointer data)
+{
+	PurpleConnection *gc;
+	OscarData *od;
+	gboolean report_idle;
+	guint32 presence;
+
+	gc = data;
+	od = gc->proto_data;
+	report_idle = strcmp((const char *)value, "none") != 0;
+	presence = aim_ssi_getpresence(od->ssi.local);
+
+	if (report_idle)
+		aim_ssi_setpresence(od, presence | 0x400);
+	else
+		aim_ssi_setpresence(od, presence & ~0x400);
+}
+
+/**
+ * Should probably make a "Use recent buddies group" account preference
+ * so that this option is surfaced to the user.
+ */
+static void
+recent_buddies_pref_cb(const char *name, PurplePrefType type,
+		gconstpointer value, gpointer data)
+{
+	PurpleConnection *gc;
+	OscarData *od;
+	guint32 presence;
+
+	gc = data;
+	od = gc->proto_data;
+	presence = aim_ssi_getpresence(od->ssi.local);
+
+	if (value)
+		aim_ssi_setpresence(od, presence & ~AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES);
+	else
+		aim_ssi_setpresence(od, presence | AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES);
+}
+
 void
 oscar_login(PurpleAccount *account)
 {
@@ -1271,7 +1313,8 @@
 	}
 
 	/* Connect to core Purple signals */
-	purple_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc);
+	purple_prefs_connect_callback(gc, "/purple/away/idle_reporting", idle_reporting_pref_cb, gc);
+	purple_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_pref_cb, gc);
 
 	newconn = flap_connection_new(od, SNAC_FAMILY_AUTH);
 	newconn->connect_data = purple_proxy_connect(NULL, account,
@@ -1516,6 +1559,7 @@
 {
 	struct pieceofcrap *pos = data;
 	gchar *buf;
+	ssize_t result;
 
 	if (!PURPLE_CONNECTION_IS_VALID(pos->gc))
 	{
@@ -1527,8 +1571,8 @@
 	pos->fd = source;
 
 	if (source < 0) {
-		buf = g_strdup_printf(_("You may be disconnected shortly.  You may want to use TOC until "
-			"this is fixed.  Check %s for updates."), PURPLE_WEBSITE);
+		buf = g_strdup_printf(_("You may be disconnected shortly.  "
+				"Check %s for updates."), PURPLE_WEBSITE);
 		purple_notify_warning(pos->gc, NULL,
 							_("Unable to get a valid AIM login hash."),
 							buf);
@@ -1540,7 +1584,18 @@
 
 	buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n",
 			pos->offset, pos->len, pos->modname ? pos->modname : "");
-	write(pos->fd, buf, strlen(buf));
+	result = send(pos->fd, buf, strlen(buf), 0);
+	if (result != strlen(buf)) {
+		if (result < 0)
+			purple_debug_error("oscar", "Error writing %" G_GSIZE_FORMAT
+					" bytes to fetch AIM hash data: %s\n",
+					strlen(buf), g_strerror(errno));
+		else
+			purple_debug_error("oscar", "Tried to write %"
+					G_GSIZE_FORMAT " bytes to fetch AIM hash data but "
+					"instead wrote %" G_GSIZE_FORMAT " bytes\n",
+					strlen(buf), result);
+	}
 	g_free(buf);
 	g_free(pos->modname);
 	pos->inpa = purple_input_add(pos->fd, PURPLE_INPUT_READ, damn_you, pos);
@@ -1722,8 +1777,6 @@
 	int type = 0;
 	gboolean buddy_is_away = FALSE;
 	const char *status_id;
-	gboolean have_status_message = FALSE;
-	char *message = NULL;
 	va_list ap;
 	aim_userinfo_t *info;
 
@@ -1771,21 +1824,6 @@
 			status_id = OSCAR_STATUS_ID_AVAILABLE;
 	}
 
-	/*
-	 * Handle the available message.  If info->status is NULL then the user
-	 * may or may not have an available message, so don't do anything.  If
-	 * info->status is set to the empty string, then the user's client DOES
-	 * support available messages and the user DOES NOT have one set.
-	 * Otherwise info->status contains the available message.
-	 */
-	if (info->status != NULL)
-	{
-		have_status_message = TRUE;
-		if (info->status[0] != '\0')
-			message = oscar_encoding_to_utf8(account, info->status_encoding,
-											 info->status, info->status_len);
-	}
-
 	if (info->flags & AIM_FLAG_WIRELESS)
 	{
 		purple_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_MOBILE, NULL);
@@ -1793,37 +1831,30 @@
 		purple_prpl_got_user_status_deactive(account, info->sn, OSCAR_STATUS_ID_MOBILE);
 	}
 
-	if (have_status_message)
+	if (strcmp(status_id, OSCAR_STATUS_ID_AVAILABLE) == 0)
 	{
-		if ((!strcmp(status_id, OSCAR_STATUS_ID_AVAILABLE)) && (info->itmsurl != NULL))
-		{
-			char *itmsurl;
+		char *message = NULL;
+		char *itmsurl = NULL;
+
+		if (info->status != NULL && info->status[0] != '\0')
+			/* Grab the available message */
+			message = oscar_encoding_to_utf8(account, info->status_encoding,
+					info->status, info->status_len);
+
+		if (info->itmsurl_encoding && info->itmsurl && info->itmsurl_len)
+			/* Grab the iTunes Music Store URL */
 			itmsurl = oscar_encoding_to_utf8(account, info->itmsurl_encoding,
 					info->itmsurl, info->itmsurl_len);
-			purple_prpl_got_user_status(account, info->sn, status_id,
-					"message", message, "itmsurl", itmsurl, NULL);
-			g_free(itmsurl);
-		}
-		else
-		{
-			purple_prpl_got_user_status(account, info->sn, status_id,
-					"message", message, NULL);
-		}
+
+		purple_prpl_got_user_status(account, info->sn, status_id,
+				"message", message, "itmsurl", itmsurl, NULL);
+
 		g_free(message);
+		g_free(itmsurl);
 	}
 	else
 	{
-		PurpleBuddy *b = purple_find_buddy(account, info->sn);
-		PurpleStatus *status = NULL;
-		const char *active_status_id = NULL;
-
-		if (b != NULL) {
-			status = purple_presence_get_active_status(purple_buddy_get_presence(b));
-			active_status_id = purple_status_get_id(status);
-		}
-
-		if (!active_status_id || strcmp(active_status_id, status_id))
-			purple_prpl_got_user_status(account, info->sn, status_id, NULL);
+		purple_prpl_got_user_status(account, info->sn, status_id, NULL);
 	}
 
 	/* Login time stuff */
@@ -1879,6 +1910,31 @@
 		g_free(b16);
 	}
 
+	/*
+	 * If we didn't receive a status message with the status change,
+	 * or if the message is empty, and we have a note hash, then
+	 * query the ICQ6 status note.
+	 *
+	 * TODO: We should probably always query the status note regardless
+	 *       of whether they have a status message set, and we should
+	 *       figure out a way to display both the status note and the
+	 *       status message at the same time.
+	 */
+	if (info->status == NULL || info->status[0] == '\0')
+	{
+		struct aim_ssi_item *ssi_item;
+		aim_tlv_t *note_hash;
+
+		ssi_item = aim_ssi_itemlist_finditem(od->ssi.local,
+				NULL, info->sn, AIM_SSI_TYPE_BUDDY);
+		if (ssi_item != NULL)
+		{
+			note_hash = aim_tlv_gettlv(ssi_item->data, 0x015c, 1);
+			if (note_hash != NULL)
+				aim_icq_getstatusnote(od, info->sn, note_hash->value, note_hash->length);
+		}
+	}
+
 	return 1;
 }
 
@@ -3000,7 +3056,7 @@
 
 	if (!aim_snvalid_icq(userinfo->sn))
 	{
-		if (strcmp(purple_buddy_get_name(b), userinfo->sn))
+		if (strcmp(purple_buddy_get_name(b), userinfo->sn) != 0)
 			serv_got_alias(gc, purple_buddy_get_name(b), userinfo->sn);
 		else
 			serv_got_alias(gc, purple_buddy_get_name(b), NULL);
@@ -3009,23 +3065,19 @@
 	presence = purple_buddy_get_presence(b);
 	status = purple_presence_get_active_status(presence);
 
-	if (!purple_status_is_available(status) && purple_status_is_online(status))
+	if (purple_status_is_online(status) && !purple_status_is_available(status) &&
+			userinfo->flags & AIM_FLAG_AWAY && userinfo->away_len > 0 &&
+			userinfo->away != NULL && userinfo->away_encoding != NULL)
 	{
-		if ((userinfo->flags & AIM_FLAG_AWAY) &&
-			(userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) {
-			gchar *charset = oscar_encoding_extract(userinfo->away_encoding);
-			message = oscar_encoding_to_utf8(account, charset,
-			                                 userinfo->away,
-			                                 userinfo->away_len);
-			g_free(charset);
-			purple_status_set_attr_string(status, "message", message);
-			g_free(message);
-		}
-		else
-			/* Set an empty message so that we know not to show "pending" */
-			purple_status_set_attr_string(status, "message", "");
-
-		purple_blist_update_buddy_status(b, status);
+		gchar *charset = oscar_encoding_extract(userinfo->away_encoding);
+		message = oscar_encoding_to_utf8(account, charset,
+		                                 userinfo->away,
+		                                 userinfo->away_len);
+		g_free(charset);
+		purple_prpl_got_user_status(account, userinfo->sn,
+				purple_status_get_id(status),
+				"message", message, NULL);
+		g_free(message);
 	}
 
 	return 1;
@@ -4444,7 +4496,6 @@
 	PurplePresence *presence;
 	PurpleStatusType *status_type;
 	PurpleStatusPrimitive primitive;
-	gboolean invisible;
 
 	char *htmlinfo;
 	char *info_encoding = NULL;
@@ -4459,7 +4510,6 @@
 	status_type = purple_status_get_type(status);
 	primitive = purple_status_type_get_primitive(status_type);
 	presence = purple_account_get_presence(account);
-	invisible = purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE);
 
 	if (!setinfo)
 	{
@@ -4520,12 +4570,11 @@
 		/* This is needed for us to un-set any previous away message. */
 		away = g_strdup("");
 	}
-	else if ((primitive == PURPLE_STATUS_AWAY) ||
-			 (primitive == PURPLE_STATUS_EXTENDED_AWAY))
+	else
 	{
 		htmlaway = purple_status_get_attr_string(status, "message");
 		if ((htmlaway == NULL) || (*htmlaway == '\0'))
-			htmlaway = _("Away");
+			htmlaway = purple_status_type_get_name(status_type);
 		away = purple_prpl_oscar_convert_to_infotext(htmlaway, &awaylen, &away_encoding);
 
 		if (awaylen > od->rights.maxawaymsglen)
@@ -4898,9 +4947,21 @@
 			}
 		}
 		/* Presence settings (idle time visibility) */
-		if ((tmp = aim_ssi_getpresence(od->ssi.local)) != 0xFFFFFFFF)
-			if (!(tmp & 0x400))
+		tmp = aim_ssi_getpresence(od->ssi.local);
+		if (tmp != 0xFFFFFFFF) {
+			const char *idle_reporting_pref;
+			gboolean report_idle;
+
+			idle_reporting_pref = purple_prefs_get_string("/purple/away/idle_reporting");
+			report_idle = strcmp(idle_reporting_pref, "none") != 0;
+
+			if (report_idle)
 				aim_ssi_setpresence(od, tmp | 0x400);
+			else
+				aim_ssi_setpresence(od, tmp & ~0x400);
+		}
+
+
 	} /* end pruning buddies from local list */
 
 	/* Add from server list to local list */
@@ -5099,6 +5160,8 @@
 	char *gname, *gname_utf8, *alias, *alias_utf8;
 	PurpleBuddy *b;
 	PurpleGroup *g;
+	struct aim_ssi_item *ssi_item;
+	aim_tlv_t *note_hash;
 	va_list ap;
 	guint16 snac_subtype, type;
 	const char *name;
@@ -5166,6 +5229,21 @@
 
 	}
 
+	ssi_item = aim_ssi_itemlist_finditem(od->ssi.local,
+			gname, name, AIM_SSI_TYPE_BUDDY);
+	if (ssi_item != NULL)
+	{
+		note_hash = aim_tlv_gettlv(ssi_item->data, 0x015c, 1);
+		if (note_hash != NULL)
+			aim_icq_getstatusnote(od, name, note_hash->value, note_hash->length);
+	}
+	else
+	{
+		purple_debug_error("oscar", "purple_ssi_parseaddmod: "
+				"Could not find ssi item for oncoming buddy %s, "
+				"group %s\n", name, gname);
+	}
+
 	g_free(gname_utf8);
 	g_free(alias_utf8);
 
@@ -5959,7 +6037,7 @@
 			_("Because this reveals your IP address, it "
 			  "may be considered a security risk.  Do you "
 			  "wish to continue?"),
-			0,
+			0, /* Default action is "connect" */
 			purple_connection_get_account(gc), data->who, NULL,
 			data, 2,
 			_("C_onnect"), G_CALLBACK(oscar_ask_directim_yes_cb),
@@ -6522,33 +6600,6 @@
 	}
 }
 
-static void
-recent_buddies_cb(const char *name, PurplePrefType type,
-				  gconstpointer value, gpointer data)
-{
-	PurpleConnection *gc = data;
-	OscarData *od = gc->proto_data;
-	guint32 presence;
-
-	presence = aim_ssi_getpresence(od->ssi.local);
-
-	if (value) {
-		presence &= ~AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES;
-		aim_ssi_setpresence(od, presence);
-	} else {
-		presence |= AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES;
-		aim_ssi_setpresence(od, presence);
-	}
-}
-
-#ifdef USE_PRPL_PREFERENCES
-	ppref = purple_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/recent_buddies", _("Use recent buddies group"));
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/show_idle", _("Show how long you have been idle"));
-	purple_plugin_pref_frame_add(frame, ppref);
-#endif
-
 const char *
 oscar_normalize(const PurpleAccount *account, const char *str)
 {
@@ -6711,7 +6762,7 @@
 	/* Preferences */
 	purple_prefs_add_none("/plugins/prpl/oscar");
 	purple_prefs_add_bool("/plugins/prpl/oscar/recent_buddies", FALSE);
-	purple_prefs_add_bool("/plugins/prpl/oscar/show_idle", FALSE);
+	purple_prefs_remove("/plugins/prpl/oscar/show_idle");
 	purple_prefs_remove("/plugins/prpl/oscar/always_use_rv_proxy");
 
 	/* protocol handler */
--- a/libpurple/protocols/oscar/oscar.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/oscar.h	Wed Feb 06 03:35:04 2008 +0000
@@ -3,8 +3,6 @@
  * This file is the legal property of its developers.
  * Please see the AUTHORS file distributed alongside this file.
  *
- * Some code copyright (C) 2007, ComBOTS Product GmbH (htfv) <foss@combots.com>
- *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
@@ -311,7 +309,7 @@
 }
 
 #define CLIENTINFO_AIM_KNOWNGOOD CLIENTINFO_AIM_5_1_3036
-#define CLIENTINFO_ICQ_KNOWNGOOD CLIENTINFO_ICQ_5_45_3777
+#define CLIENTINFO_ICQ_KNOWNGOOD CLIENTINFO_ICQBASIC_14_34_3000
 
 typedef enum
 {
@@ -468,7 +466,6 @@
 
 	gboolean icq;
 	guint getblisttimer;
-	guint getinfotimer;
 
 	struct {
 		guint maxwatchers; /* max users who can watch you */
@@ -513,9 +510,7 @@
 
 	struct {
 		struct aim_userinfo_s *userinfo;
-		struct userinfo_node *torequest;
 		struct userinfo_node *requested;
-		gboolean waiting_for_response;
 	} locate;
 
 	/* Server-stored information (ssi) */
@@ -1079,7 +1074,7 @@
 /* 0x000f */ int aim_locate_setinterests(OscarData *od, const char *interest1, const char *interest2, const char *interest3, const char *interest4, const char *interest5, guint16 privacy);
 /* 0x0015 */ int aim_locate_getinfoshort(OscarData *od, const char *sn, guint32 flags);
 
-void aim_locate_requestuserinfo(OscarData *od, const char *sn);
+void aim_locate_autofetch_away_message(OscarData *od, const char *sn);
 guint32 aim_locate_getcaps(OscarData *od, ByteStream *bs, int len);
 guint32 aim_locate_getcaps_short(OscarData *od, ByteStream *bs, int len);
 void aim_info_free(aim_userinfo_t *);
@@ -1329,6 +1324,10 @@
 
 	/* we keep track of these in a linked list because we're 1337 */
 	struct aim_icq_info *next;
+
+	/* status note info */
+	guint8 icbm_cookie[8];
+	char *status_note_title;
 };
 
 int aim_icq_reqofflinemsgs(OscarData *od);
@@ -1339,7 +1338,7 @@
 int aim_icq_getalias(OscarData *od, const char *uin);
 int aim_icq_getallinfo(OscarData *od, const char *uin);
 int aim_icq_sendsms(OscarData *od, const char *name, const char *msg, const char *alias);
-
+int aim_icq_getstatusnote(OscarData *od, const char *uin, guint8 *note_hash, guint16 note_hash_len);
 
 
 /* 0x0017 - family_auth.c */
--- a/libpurple/protocols/oscar/oscar_data.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/oscar_data.c	Wed Feb 06 03:35:04 2008 +0000
@@ -97,8 +97,6 @@
 	g_free(od->oldp);
 	if (od->getblisttimer > 0)
 		purple_timeout_remove(od->getblisttimer);
-	if (od->getinfotimer > 0)
-		purple_timeout_remove(od->getinfotimer);
 	while (od->oscar_connections != NULL)
 		flap_connection_destroy(od->oscar_connections->data,
 				OSCAR_DISCONNECT_DONE, NULL);
--- a/libpurple/protocols/oscar/peer.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/oscar/peer.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1041,7 +1041,7 @@
 						  "Images.  Because your IP address will be "
 						  "revealed, this may be considered a privacy "
 						  "risk."),
-						PURPLE_DEFAULT_ACTION_NONE,
+						0, /* Default action is "connect" */
 						account, sn, NULL,
 						conn, 2,
 						_("C_onnect"), G_CALLBACK(peer_connection_got_proposition_yes_cb),
--- a/libpurple/protocols/qq/file_trans.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/qq/file_trans.c	Wed Feb 06 03:35:04 2008 +0000
@@ -59,7 +59,7 @@
 	return key;
 }
 		
-static guint32 _gen_file_key()
+static guint32 _gen_file_key(void)
 {
 	guint8 seed;
 	
@@ -97,6 +97,7 @@
 	guint8 *buffer;
 	PurpleCipher *cipher;
 	PurpleCipherContext *context;
+	size_t wc;
 
 	const gint QQ_MAX_FILE_MD5_LENGTH = 10002432;
 
@@ -109,15 +110,20 @@
 
 	buffer = g_newa(guint8, filelen);
 	g_return_if_fail(buffer != NULL);
-	fread(buffer, filelen, 1, fp);
+	wc = fread(buffer, filelen, 1, fp);
+	fclose(fp);
+	if (wc != 1) {
+		purple_debug_error("qq", "Unable to read file: %s\n", filename);
+
+		/* TODO: XXX: Really, the caller should be modified to deal with this properly. */
+		return;
+	}
 
 	cipher = purple_ciphers_find_cipher("md5");
 	context = purple_cipher_context_new(cipher, NULL);
 	purple_cipher_context_append(context, buffer, filelen);
 	purple_cipher_context_digest(context, 16, md5, NULL);
 	purple_cipher_context_destroy(context);
-
-	fclose(fp);
 }
 
 static void _qq_get_file_header(guint8 *buf, guint8 **cursor, gint buflen, qq_file_header *fh)
--- a/libpurple/protocols/qq/group_im.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/qq/group_im.c	Wed Feb 06 03:35:04 2008 +0000
@@ -135,7 +135,7 @@
 
 	purple_request_action(gc, _("QQ Qun Operation"),
 			    msg, reason,
-			    2,
+			    PURPLE_DEFAULT_ACTION_NONE,
 				purple_connection_get_account(gc), nombre, NULL,
 				g, 3,
 			    _("Approve"),
--- a/libpurple/protocols/qq/group_opt.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/qq/group_opt.c	Wed Feb 06 03:35:04 2008 +0000
@@ -96,7 +96,8 @@
 	g_return_if_fail(g != NULL && g->gc != NULL && g->member > 0);
 
 	qq_send_packet_get_info(g->gc, g->member, TRUE);	/* we want to see window */
-	purple_request_action(g->gc, NULL, _("Do you want to approve the request?"), "", 2,
+	purple_request_action(g->gc, NULL, _("Do you want to approve the request?"), "",
+					PURPLE_DEFAULT_ACTION_NONE,
 					purple_connection_get_account(g->gc), NULL, NULL,
 					g, 2,
 					_("Reject"), G_CALLBACK(qq_group_reject_application_with_struct),
--- a/libpurple/protocols/qq/login_logout.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/qq/login_logout.c	Wed Feb 06 03:35:04 2008 +0000
@@ -485,11 +485,15 @@
 			PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password."));
 		break;
 	case QQ_LOGIN_REPLY_MISC_ERROR:
-		purple_connection_error_reason(gc,
-			PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login, check debug log"));
+			if (purple_debug_is_enabled())
+				purple_connection_error_reason(gc,
+					PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login. Check debug log."));
+			else
+				purple_connection_error_reason(gc,
+					PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login"));				
 		break;
 	case QQ_LOGIN_REPLY_OK:
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login replys OK, everything is fine\n");
+		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login repliess OK; everything is fine\n");
 		break;
 	case QQ_LOGIN_REPLY_REDIRECT:
 		/* the redirect has been done in _qq_process_login_reply */
--- a/libpurple/protocols/qq/sys_msg.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/qq/sys_msg.c	Wed Feb 06 03:35:04 2008 +0000
@@ -84,7 +84,8 @@
 
 	nombre = uid_to_purple_name(uid);
 	purple_request_action
-	    (gc, NULL, _("Do you want to approve the request?"), "", 2,
+	    (gc, NULL, _("Do you want to approve the request?"), "",
+		PURPLE_DEFAULT_ACTION_NONE,
 		 purple_connection_get_account(gc), nombre, NULL,
 		 g, 2,
 	     _("Reject"), G_CALLBACK(qq_reject_add_request_with_gc_and_uid),
@@ -107,7 +108,8 @@
 	qq_send_packet_get_info(gc, uid, TRUE);	/* we want to see window */
 	nombre = uid_to_purple_name(uid);
 	purple_request_action
-	    (gc, NULL, _("Do you want to add this buddy?"), "", 2,
+	    (gc, NULL, _("Do you want to add this buddy?"), "",
+		PURPLE_DEFAULT_ACTION_NONE,
 		 purple_connection_get_account(gc), nombre, NULL,
 		 g, 2,
 	     _("Cancel"), NULL,
@@ -166,7 +168,8 @@
 		message = g_strdup_printf(_("You have been added by %s"), from);
 		_qq_sys_msg_log_write(gc, message, from);
 		purple_request_action(gc, NULL, message,
-				    _("Would you like to add him?"), 2,
+				    _("Would you like to add him?"),
+					PURPLE_DEFAULT_ACTION_NONE,
 					purple_connection_get_account(gc), name, NULL,
 					g, 3,
 				    _("Cancel"), NULL,
@@ -240,7 +243,7 @@
 	_qq_sys_msg_log_write(gc, message, from);
 
 	purple_request_action
-	    (gc, NULL, message, reason, 2,
+	    (gc, NULL, message, reason, PURPLE_DEFAULT_ACTION_NONE,
 		purple_connection_get_account(gc), name, NULL,
 		 g, 3,
 	     _("Reject"),
@@ -260,7 +263,7 @@
 		g2->uid = strtol(from, NULL, 10);
 		message = g_strdup_printf(_("%s is not in your buddy list"), from);
 		purple_request_action(gc, NULL, message,
-				    _("Would you like to add him?"), 2,
+				    _("Would you like to add him?"), PURPLE_DEFAULT_ACTION_NONE,
 					purple_connection_get_account(gc), name, NULL,
 					g2, 3,
 					_("Cancel"), NULL,
--- a/libpurple/protocols/sametime/sametime.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/sametime/sametime.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1695,7 +1695,9 @@
   int len;
 
   len = read(sock, buf, BUF_LEN);
-  if(len > 0) mwSession_recv(session, buf, len);
+  if(len > 0) {
+    mwSession_recv(session, buf, len);
+  }
 
   return len;
 }
@@ -2286,6 +2288,7 @@
 
   PurpleXfer *xfer;
   FILE *fp;
+  size_t wc;
 
   xfer = mwFileTransfer_getClientData(ft);
   g_return_if_fail(xfer != NULL);
@@ -2294,7 +2297,12 @@
   g_return_if_fail(fp != NULL);
 
   /* we must collect and save our precious data */
-  fwrite(data->data, 1, data->len, fp);
+  wc = fwrite(data->data, 1, data->len, fp);
+  if (wc != data->len) {
+    DEBUG_ERROR("failed to write data\n");
+    purple_xfer_cancel_local(xfer);
+    return;
+  }
 
   /* update the progress */
   xfer->bytes_sent += data->len;
@@ -3806,7 +3814,7 @@
 }
 
 
-static int mw_rand() {
+static int mw_rand(void) {
   static int seed = 0;
 
   /* for diversity, not security. don't touch */
@@ -3818,7 +3826,7 @@
 
 
 /** generates a random-ish content id string */
-static char *im_mime_content_id() {
+static char *im_mime_content_id(void) {
   return g_strdup_printf("%03x@%05xmeanwhile",
 			 mw_rand() & 0xfff, mw_rand() & 0xfffff);
 }
@@ -3826,7 +3834,7 @@
 
 /** generates a multipart/related content type with a random-ish
     boundary value */
-static char *im_mime_content_type() {
+static char *im_mime_content_type(void) {
   return g_strdup_printf("multipart/related; boundary=related_MW%03x_%04x",
                          mw_rand() & 0xfff, mw_rand() & 0xffff);
 }
--- a/libpurple/protocols/silc10/ops.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/silc10/ops.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1697,27 +1697,32 @@
 		return;
 		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;
 	}
 
@@ -1746,7 +1751,8 @@
 
 	/* 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));
--- a/libpurple/protocols/silc10/silc.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/silc10/silc.c	Wed Feb 06 03:35:04 2008 +0000
@@ -158,7 +158,9 @@
 	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"));
 		return;
 	}
 
@@ -179,7 +181,8 @@
 							  "silc.silcnet.org"),
 			  purple_account_get_int(account, "port", 706), sg);
 	if (!conn) {
-		purple_connection_error(gc, _("Cannot initialize SILC Client connection"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+			_("Cannot initialize SILC Client connection"));
 		gc->proto_data = NULL;
 		return;
 	}
@@ -264,7 +267,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;
 	}
 
@@ -309,15 +313,15 @@
 
 	/* Init SILC client */
 	if (!silc_client_init(client)) {
-		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"));
 		return;
 	}
 
 	/* 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, _("Cannot find/access ~/.silc directory"));
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+		                             _("Error loading SILC key pair"));
 		return;
 	}
 
@@ -332,7 +336,8 @@
 				(gc->password == NULL) ? "" : gc->password, &client->pkcs,
 				&client->public_key, &client->private_key)) {
 		g_snprintf(pkd, sizeof(pkd), _("Could not load SILC key pair: %s"), g_strerror(errno));
-		purple_connection_error(gc, pkd);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+		                             _("Could not load SILC key pair"));
 		return;
 	}
 
@@ -352,7 +357,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"));
 		return;
 	}
 
--- a/libpurple/protocols/simple/simple.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/simple/simple.c	Wed Feb 06 03:35:04 2008 +0000
@@ -45,17 +45,17 @@
 #include "dnssrv.h"
 #include "ntlm.h"
 
-static char *gentag() {
+static char *gentag(void) {
 	return g_strdup_printf("%04d%04d", rand() & 0xFFFF, rand() & 0xFFFF);
 }
 
-static char *genbranch() {
+static char *genbranch(void) {
 	return g_strdup_printf("z9hG4bK%04X%04X%04X%04X%04X",
 		rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF,
 		rand() & 0xFFFF, rand() & 0xFFFF);
 }
 
-static char *gencallid() {
+static char *gencallid(void) {
 	return g_strdup_printf("%04Xg%04Xa%04Xi%04Xm%04Xt%04Xb%04Xx%04Xx",
 		rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF,
 		rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF,
@@ -1356,10 +1356,21 @@
 }
 
 static gboolean process_publish_response(struct simple_account_data *sip, struct sipmsg *msg, struct transaction *tc) {
+
+	const gchar *etag = NULL;
+
 	if(msg->response != 200 && msg->response != 408) {
 		/* never send again */
 		sip->republish = -1;
 	}
+
+	etag = sipmsg_find_header(msg, "SIP-Etag");
+	if (etag) {
+		/* we must store the etag somewhere. */
+		g_free(sip->publish_etag);
+		sip->publish_etag = g_strdup(etag);
+	}
+
 	return TRUE;
 }
 
@@ -1368,10 +1379,12 @@
 	gchar *uri = g_strdup_printf("sip:%s@%s", sip->username, sip->servername);
 	gchar *doc = gen_pidf(sip, TRUE);
 
-	add_headers = g_strdup_printf("%s%d%s",
-		"Expires: ",
-		PUBLISH_EXPIRATION,
-		"\r\nEvent: presence\r\n"
+	add_headers = g_strdup_printf("%s%s%s%s%d\r\n%s",
+		sip->publish_etag ? "SIP-If-Match: " : "",
+		sip->publish_etag ? sip->publish_etag : "",
+		sip->publish_etag ? "\r\n" : "",
+		"Expires: ", PUBLISH_EXPIRATION,
+		"Event: presence\r\n"
 		"Content-Type: application/pidf+xml\r\n");
 
 	send_sip_request(sip->gc, "PUBLISH", uri, uri,
@@ -1384,14 +1397,23 @@
 
 static void send_closed_publish(struct simple_account_data *sip) {
 	gchar *uri = g_strdup_printf("sip:%s@%s", sip->username, sip->servername);
-	gchar *doc = gen_pidf(sip, FALSE);
-	send_sip_request(sip->gc, "PUBLISH", uri, uri,
-		"Expires: 600\r\nEvent: presence\r\n"
-		"Content-Type: application/pidf+xml\r\n",
+	gchar *add_headers, *doc;
+
+	add_headers = g_strdup_printf("%s%s%s%s",
+		sip->publish_etag ? "SIP-If-Match: " : "",
+		sip->publish_etag ? sip->publish_etag : "",
+		sip->publish_etag ? "\r\n" : "",
+		"Expires: 600\r\n"
+		"Event: presence\r\n"
+		"Content-Type: application/pidf+xml\r\n");
+
+	doc = gen_pidf(sip, FALSE);
+	send_sip_request(sip->gc, "PUBLISH", uri, uri, add_headers,
 		doc, NULL, process_publish_response);
 	/*sip->republish = time(NULL) + 500;*/
 	g_free(uri);
 	g_free(doc);
+	g_free(add_headers);
 }
 
 static void process_incoming_subscribe(struct simple_account_data *sip, struct sipmsg *msg) {
@@ -1653,7 +1675,7 @@
 		if(sip->fd == source) sip->fd = -1;
 		return;
 	}
-
+	gc->last_received = time(NULL);
 	conn->inbufused += len;
 	conn->inbuf[conn->inbufused] = '\0';
 
@@ -1948,6 +1970,7 @@
 		g_free(sip->proxy.target);
 		g_free(sip->proxy.realm);
 		g_free(sip->proxy.digest_session_key);
+		g_free(sip->publish_etag);
 		if(sip->txbuf)
 			purple_circ_buffer_destroy(sip->txbuf);
 		g_free(sip->realhostname);
@@ -1960,13 +1983,6 @@
 	gc->proto_data = NULL;
 }
 
-/* not needed since privacy is checked for every subscribe */
-static void dummy_add_deny(PurpleConnection *gc, const char *name) {
-}
-
-static void dummy_permit_deny(PurpleConnection *gc) {
-}
-
 static PurplePluginProtocolInfo prpl_info =
 {
 	0,
@@ -1994,11 +2010,11 @@
 	NULL,					/* add_buddies */
 	simple_remove_buddy,	/* remove_buddy */
 	NULL,					/* remove_buddies */
-	dummy_add_deny,			/* add_permit */
-	dummy_add_deny,			/* add_deny */
-	dummy_add_deny,			/* rem_permit */
-	dummy_add_deny,			/* rem_deny */
-	dummy_permit_deny,		/* set_permit_deny */
+	NULL,					/* add_permit */
+	NULL,					/* add_deny */
+	NULL,					/* rem_permit */
+	NULL,					/* rem_deny */
+	NULL,					/* set_permit_deny */
 	NULL,					/* join_chat */
 	NULL,					/* reject_chat */
 	NULL,					/* get_chat_name */
--- a/libpurple/protocols/simple/simple.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/simple/simple.h	Wed Feb 06 03:35:04 2008 +0000
@@ -112,6 +112,7 @@
 	int registerexpire;
 	gchar *realhostname;
 	int realport; /* port and hostname from SRV record */
+	gchar *publish_etag;
 };
 
 struct sip_connection {
--- a/libpurple/protocols/yahoo/util.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/yahoo/util.c	Wed Feb 06 03:35:04 2008 +0000
@@ -31,6 +31,70 @@
 #include "yahoo.h"
 
 #include <string.h>
+/*
+ * Returns cookies formatted as a null terminated string for the given connection.
+ * Must g_free return value.
+ * 
+ * TODO:will work, but must test for strict correctness
+ */
+gchar* yahoo_get_cookies(PurpleConnection *gc)
+{
+	gchar *ans = NULL;
+	gchar *cur;
+	char firstflag = 1;
+	gchar *t1,*t2,*t3;
+	GSList *tmp;
+	GSList *cookies;
+	cookies = ((struct yahoo_data*)(gc->proto_data))->cookies;
+	tmp = cookies;
+	while(tmp)
+	{
+		cur = tmp->data;
+		t1 = ans;
+		t2 = g_strrstr(cur, ";expires=");
+		if(t2 == NULL)
+			t2 = g_strrstr(cur, "; expires=");
+		if(t2 == NULL)
+		{
+			if(firstflag)
+				ans = g_strdup_printf("%c=%s", cur[0], cur+2);
+			else
+				ans = g_strdup_printf("%s; %c=%s", t1, cur[0], cur+2);
+		}
+		else
+		{
+			t3 = strstr(t2+1, ";");
+			if(t3 != NULL)
+			{
+				t2[0] = '\0';
+
+				if(firstflag)
+					ans = g_strdup_printf("%c=%s%s", cur[0], cur+2, t3);
+				else
+					ans = g_strdup_printf("%s; %c=%s%s", t1, cur[0], cur+2, t3);
+
+				t2[0] = ';';
+			}
+			else
+			{
+				t2[0] = '\0';
+
+				if(firstflag)
+					ans = g_strdup_printf("%c=%s", cur[0], cur+2);
+				else
+					ans = g_strdup_printf("%s; %c=%s", t1, cur[0], cur+2);
+
+				t2[0] = ';';
+			}
+		}
+		if(firstflag)
+			firstflag = 0;
+		else
+			g_free(t1);
+		tmp = g_slist_next(tmp);
+	}
+	return ans;
+}
 
 /**
  * Encode some text to send to the yahoo server.
@@ -100,6 +164,25 @@
 		return g_strdup("");
 }
 
+char *yahoo_convert_to_numeric(const char *str)
+{
+	GString *gstr = NULL;
+	char *retstr;
+	const unsigned char *p;
+
+	gstr = g_string_sized_new(strlen(str) * 6 + 1);
+
+	for (p = (unsigned char *)str; *p; p++) {
+		g_string_append_printf(gstr, "&#%u;", *p);
+	}
+
+	retstr = gstr->str;
+
+	g_string_free(gstr, FALSE);
+
+	return retstr;
+}
+
 /*
  * I found these on some website but i don't know that they actually
  * work (or are supposed to work). I didn't implement them yet.
--- a/libpurple/protocols/yahoo/yahoo.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoo.c	Wed Feb 06 03:35:04 2008 +0000
@@ -61,58 +61,6 @@
 #endif
 static void yahoo_set_status(PurpleAccount *account, PurpleStatus *status);
 
-static void
-yahoo_add_permit(PurpleConnection *gc, const char *who)
-{
-	purple_debug_info("yahoo",
-			"Permitting ID %s local contact rights for account %s\n", who, gc->account);
-	purple_privacy_permit_add(gc->account,who,TRUE);
-}
-
-static void
-yahoo_rem_permit(PurpleConnection *gc, const char *who)
-{
-	purple_debug_info("yahoo",
-			"Denying ID %s local contact rights for account %s\n", who, gc->account);
-	purple_privacy_permit_remove(gc->account,who,TRUE);
-}
-
-gboolean
-yahoo_privacy_check(PurpleConnection *gc, const char *who)
-{
-	/* returns TRUE if allowed through, FALSE otherwise */
-	gboolean permitted;
-
-	permitted = purple_privacy_check(gc->account, who);
-
-	/* print some debug info */
-	if (!permitted) {
-		char *deb = NULL;
-		switch (gc->account->perm_deny)
-		{
-			case PURPLE_PRIVACY_DENY_ALL:
-				deb = "PURPLE_PRIVACY_DENY_ALL";
-			break;
-			case PURPLE_PRIVACY_DENY_USERS:
-				deb = "PURPLE_PRIVACY_DENY_USERS";
-			break;
-			case PURPLE_PRIVACY_ALLOW_BUDDYLIST:
-				deb = "PURPLE_PRIVACY_ALLOW_BUDDYLIST";
-			break;
-		}
-		if(deb)
-			purple_debug_info("yahoo",
-				"%s blocked data received from %s (%s)\n",
-				gc->account->username,who, deb);
-	} else if (gc->account->perm_deny == PURPLE_PRIVACY_ALLOW_USERS) {
-		purple_debug_info("yahoo",
-			"%s allowed data received from %s (PURPLE_PRIVACY_ALLOW_USERS)\n",
-			gc->account->username,who);
-	}
-
-	return permitted;
-}
-
 static void yahoo_update_status(PurpleConnection *gc, const char *name, YahooFriend *f)
 {
 	char *status = NULL;
@@ -392,6 +340,10 @@
 		case 97: /* Unicode status message */
 			unicode = !strcmp(pair->value, "1");
 			break;
+		case 244: /* client version number. Yahoo Client Detection */
+			if(f && strtol(pair->value, NULL, 10))
+				f->version_id = strtol(pair->value, NULL, 10);
+			break;
 
 		default:
 			purple_debug(PURPLE_DEBUG_ERROR, "yahoo",
@@ -493,16 +445,16 @@
 static void yahoo_process_cookie(struct yahoo_data *yd, char *c)
 {
 	if (c[0] == 'Y') {
-		g_free(yd->cookie_y);
+		if (yd->cookie_y)
+			g_free(yd->cookie_y);
 		yd->cookie_y = _getcookie(c);
 	} else if (c[0] == 'T') {
-		g_free(yd->cookie_t);
+		if (yd->cookie_t)
+			g_free(yd->cookie_t);
 		yd->cookie_t = _getcookie(c);
-	} else if (c[0] == 'C') {
-		g_free(yd->cookie_c);
-		yd->cookie_c = _getcookie(c);
 	} else
-		purple_debug_info("yahoo", "Ignoring unrecognized cookie '%c'\n", c[0]);
+		purple_debug_info("yahoo", "Unrecognized cookie '%c'\n", c[0]);
+	yd->cookies = g_slist_prepend(yd->cookies, g_strdup(c));
 }
 
 static void yahoo_process_list_15(PurpleConnection *gc, struct yahoo_packet *pkt)
@@ -510,6 +462,7 @@
 	GSList *l = pkt->hash;
 
 	PurpleAccount *account = purple_connection_get_account(gc);
+	struct yahoo_data *yd = gc->proto_data;
 	GHashTable *ht;
 	char *grp = NULL;
 	char *norm_bud = NULL;
@@ -575,6 +528,9 @@
 				purple_debug_info("yahoo", "Setting protocol to %d\n", f->protocol);
 			}
 			break;
+		case 59: /* somebody told cookies come here too, but im not sure */
+			yahoo_process_cookie(yd, pair->value);
+			break;
 		case 317: /* Stealth Setting */
 			if (f && (strtol(pair->value, NULL, 10) == 2)) {
 				f->presence = YAHOO_PRESENCE_PERM_OFFLINE;
@@ -692,7 +648,7 @@
 		for (bud = buddies; bud && *bud; bud++) {
 			/* The server is already ignoring the user */
 			got_serv_list = TRUE;
-			purple_privacy_deny_add(gc->account, *bud, 1);
+			purple_privacy_deny_add(account, *bud, 1);
 		}
 		g_strfreev(buddies);
 
@@ -701,13 +657,13 @@
 	}
 
 	if (got_serv_list &&
-		((gc->account->perm_deny != PURPLE_PRIVACY_ALLOW_BUDDYLIST) &&
-		(gc->account->perm_deny != PURPLE_PRIVACY_DENY_ALL) &&
-		(gc->account->perm_deny != PURPLE_PRIVACY_ALLOW_USERS)))
+		((account->perm_deny != PURPLE_PRIVACY_ALLOW_BUDDYLIST) &&
+		(account->perm_deny != PURPLE_PRIVACY_DENY_ALL) &&
+		(account->perm_deny != PURPLE_PRIVACY_ALLOW_USERS)))
 	{
-		gc->account->perm_deny = PURPLE_PRIVACY_DENY_USERS;
+		account->perm_deny = PURPLE_PRIVACY_DENY_USERS;
 		purple_debug_info("yahoo", "%s privacy defaulting to PURPLE_PRIVACY_DENY_USERS.\n",
-		      gc->account->username);
+				account->username);
 	}
 
 	if (yd->tmp_serv_plist) {
@@ -716,7 +672,7 @@
 			f = yahoo_friend_find(gc, *bud);
 			if (f) {
 				purple_debug_info("yahoo", "%s setting presence for %s to PERM_OFFLINE\n",
-								 gc->account->username, *bud);
+						account->username, *bud);
 				f->presence = YAHOO_PRESENCE_PERM_OFFLINE;
 			}
 		}
@@ -731,6 +687,7 @@
 
 static void yahoo_process_notify(PurpleConnection *gc, struct yahoo_packet *pkt)
 {
+	PurpleAccount *account;
 	char *msg = NULL;
 	char *from = NULL;
 	char *stat = NULL;
@@ -738,6 +695,8 @@
 	YahooFriend *f = NULL;
 	GSList *l = pkt->hash;
 
+	account = purple_connection_get_account(gc);
+
 	while (l) {
 		struct yahoo_pair *pair = l->data;
 		if (pair->key == 4)
@@ -755,13 +714,14 @@
 		return;
 
 	if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING"))
-		&& (yahoo_privacy_check(gc, from)))  {
+		&& (purple_privacy_check(account, from)))
+	{
 		if (*stat == '1')
 			serv_got_typing(gc, from, 0, PURPLE_TYPING);
 		else
 			serv_got_typing_stopped(gc, from);
 	} else if (!g_ascii_strncasecmp(msg, "GAME", strlen("GAME"))) {
-		PurpleBuddy *bud = purple_find_buddy(gc->account, from);
+		PurpleBuddy *bud = purple_find_buddy(account, from);
 
 		if (!bud) {
 			purple_debug(PURPLE_DEBUG_WARNING, "yahoo",
@@ -781,7 +741,7 @@
 				yahoo_update_status(gc, from, f);
 		}
 	} else if (!g_ascii_strncasecmp(msg, "WEBCAMINVITE", strlen("WEBCAMINVITE"))) {
-                PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, gc->account);
+		PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, account);
 		char *buf = g_strdup_printf(_("%s has sent you a webcam invite, which is not yet supported."), from);
 		purple_conversation_write(conv, NULL, buf, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL));
 		g_free(buf);
@@ -800,13 +760,15 @@
 
 static void yahoo_process_message(PurpleConnection *gc, struct yahoo_packet *pkt)
 {
+	PurpleAccount *account;
 	struct yahoo_data *yd = gc->proto_data;
 	GSList *l = pkt->hash;
 	GSList *list = NULL;
 	struct _yahoo_im *im = NULL;
-
 	const char *imv = NULL;
 
+	account = purple_connection_get_account(gc);
+
 	if (pkt->status <= 1 || pkt->status == 5) {
 		while (l != NULL) {
 			struct yahoo_pair *pair = l->data;
@@ -851,20 +813,20 @@
 		{
 			PurpleWhiteboard *wb;
 
-			if (!yahoo_privacy_check(gc, im->from)) {
+			if (!purple_privacy_check(account, im->from)) {
 				purple_debug_info("yahoo", "Doodle request from %s dropped.\n", im->from);
 				return;
 			}
 
 			/* I'm not sure the following ever happens -DAA */
 
-			wb = purple_whiteboard_get_session(gc->account, im->from);
+			wb = purple_whiteboard_get_session(account, im->from);
 
 			/* If a Doodle session doesn't exist between this user */
 			if(wb == NULL)
 			{
 				doodle_session *ds;
-				wb = purple_whiteboard_create(gc->account, im->from, DOODLE_STATE_REQUESTED);
+				wb = purple_whiteboard_create(account, im->from, DOODLE_STATE_REQUESTED);
 				ds = wb->proto_data;
 				ds->imv_key = g_strdup(imv);
 
@@ -884,7 +846,7 @@
 			continue;
 		}
 
-		if (!yahoo_privacy_check(gc, im->from)) {
+		if (!purple_privacy_check(account, im->from)) {
 			purple_debug_info("yahoo", "Message from %s dropped.\n", im->from);
 			return;
 		}
@@ -900,11 +862,9 @@
 		purple_util_chrreplace(m, '\r', '\n');
 
 		if (!strcmp(m, "<ding>")) {
-			PurpleAccount *account;
 			PurpleConversation *c;
 			char *username;
 
-			account = purple_connection_get_account(gc);
 			c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, im->from, account);
 			if (c == NULL)
 				c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, im->from);
@@ -967,15 +927,19 @@
 };
 
 static void
-yahoo_buddy_add_authorize_cb(gpointer data) {
+yahoo_buddy_add_authorize_cb(gpointer data)
+{
 	struct yahoo_add_request *add_req = data;
-
 	struct yahoo_packet *pkt;
 	struct yahoo_data *yd = add_req->gc->proto_data;
 
 	pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15, YAHOO_STATUS_AVAILABLE, 0);
-	yahoo_packet_hash(pkt, "ssiii", 1, add_req->id, 5, add_req->who, 241, add_req->protocol,
-	                  13, 1, 334, 0);
+	yahoo_packet_hash(pkt, "ssiii",
+					  1, add_req->id,
+					  5, add_req->who,
+					  241, add_req->protocol,
+					  13, 1,
+					  334, 0);
 	yahoo_packet_send_and_free(pkt, yd);
 
 	g_free(add_req->id);
@@ -984,10 +948,11 @@
 }
 
 static void
-yahoo_buddy_add_deny_cb(struct yahoo_add_request *add_req, const char *msg) {
+yahoo_buddy_add_deny_cb(struct yahoo_add_request *add_req, const char *msg)
+{
+	struct yahoo_data *yd = add_req->gc->proto_data;
 	struct yahoo_packet *pkt;
 	char *encoded_msg = NULL;
-	struct yahoo_data *yd = add_req->gc->proto_data;
 	PurpleAccount *account = purple_connection_get_account(add_req->gc);
 
 	if (msg && *msg)
@@ -1054,9 +1019,12 @@
 }
 
 static void yahoo_buddy_auth_req_15(PurpleConnection *gc, struct yahoo_packet *pkt) {
+	PurpleAccount *account;
 	GSList *l = pkt->hash;
 	const char *msg = NULL;
 
+	account = purple_connection_get_account(gc);
+
 	/* Buddy authorized/declined our addition */
 	if (pkt->status == 1) {
 		const char *who = NULL;
@@ -1126,7 +1094,8 @@
 		if (add_req->id && add_req->who) {
 			char *alias = NULL, *dec_msg = NULL;
 
-			if (!yahoo_privacy_check(gc, add_req->who)) {
+			if (!purple_privacy_check(account, add_req->who))
+			{
 				purple_debug_misc("yahoo", "Auth. request from %s dropped and automatically denied due to privacy settings!\n",
 						  add_req->who);
 				yahoo_buddy_add_deny_cb(add_req, NULL);
@@ -1146,11 +1115,12 @@
 			/* DONE! this is almost exactly the same as what MSN does,
 			 * this should probably be moved to the core.
 			 */
-			 purple_account_request_authorization(purple_connection_get_account(gc), add_req->who, add_req->id,
-						    alias, dec_msg, purple_find_buddy(purple_connection_get_account(gc), add_req->who) != NULL,
-						    yahoo_buddy_add_authorize_cb,
-						    yahoo_buddy_add_deny_reason_cb,
-						    add_req);
+			 purple_account_request_authorization(account, add_req->who, add_req->id,
+					alias, dec_msg,
+					purple_find_buddy(account, add_req->who) != NULL,
+					yahoo_buddy_add_authorize_cb,
+					yahoo_buddy_add_deny_reason_cb,
+					add_req);
 			g_free(alias);
 			g_free(dec_msg);
 		} else {
@@ -1165,10 +1135,13 @@
 
 /* I don't think this happens anymore in Version 15 */
 static void yahoo_buddy_added_us(PurpleConnection *gc, struct yahoo_packet *pkt) {
+	PurpleAccount *account;
 	struct yahoo_add_request *add_req;
 	char *msg = NULL;
 	GSList *l = pkt->hash;
 
+	account = purple_connection_get_account(gc);
+
 	add_req = g_new0(struct yahoo_add_request, 1);
 	add_req->gc = gc;
 
@@ -1194,7 +1167,7 @@
 	if (add_req->id && add_req->who) {
 		char *dec_msg = NULL;
 
-		if (!yahoo_privacy_check(gc, add_req->who)) {
+		if (!purple_privacy_check(account, add_req->who)) {
 			purple_debug_misc("yahoo", "Auth. request from %s dropped and automatically denied due to privacy settings!\n",
 					  add_req->who);
 			yahoo_buddy_add_deny_cb(add_req, NULL);
@@ -1207,11 +1180,11 @@
 		/* DONE! this is almost exactly the same as what MSN does,
 		 * this should probably be moved to the core.
 		 */
-		 purple_account_request_authorization(purple_connection_get_account(gc), add_req->who, add_req->id,
-                                                    NULL, dec_msg, purple_find_buddy(purple_connection_get_account(gc),add_req->who) != NULL,
-						    yahoo_buddy_add_authorize_cb,
-						    yahoo_buddy_add_deny_reason_cb,
-                                                    add_req);
+		 purple_account_request_authorization(account, add_req->who, add_req->id,
+				NULL, dec_msg,
+				purple_find_buddy(account,add_req->who) != NULL,
+						yahoo_buddy_add_authorize_cb,
+						yahoo_buddy_add_deny_reason_cb, add_req);
 		g_free(dec_msg);
 	} else {
 		g_free(add_req->id);
@@ -1498,7 +1471,13 @@
 	to_y64(result96, digest, 16);
 
 	pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP,	YAHOO_STATUS_AVAILABLE, 0);
-	yahoo_packet_hash(pack, "ssss", 0, name, 6, result6, 96, result96, 1, name);
+	yahoo_packet_hash(pack, "ssssss",
+					  0, name,
+					  6, result6,
+					  96, result96,
+					  1, name,
+					  244, YAHOO_CLIENT_VERSION_ID,
+					  135, YAHOO_CLIENT_VERSION);
 	yahoo_packet_send_and_free(pack, yd);
 
 	g_free(hash_string_p);
@@ -1517,11 +1496,11 @@
 	char *enc_pass;
 	struct yahoo_data *yd = gc->proto_data;
 
-	PurpleCipher			*md5_cipher;
+	PurpleCipher		*md5_cipher;
 	PurpleCipherContext	*md5_ctx;
 	guchar				md5_digest[16];
 
-	PurpleCipher			*sha1_cipher;
+	PurpleCipher		*sha1_cipher;
 	PurpleCipherContext	*sha1_ctx1;
 	PurpleCipherContext	*sha1_ctx2;
 
@@ -1533,7 +1512,7 @@
 	char				*delimit_lookup		= ",;";
 
 	char				*password_hash		= (char *)g_malloc(25);
-	char				*crypt_hash		= (char *)g_malloc(25);
+	char				*crypt_hash			= (char *)g_malloc(25);
 	char				*crypt_result		= NULL;
 
 	unsigned char		pass_hash_xor1[64];
@@ -1587,7 +1566,7 @@
 
 	magic_ptr = seed;
 
-	while (*magic_ptr != (int)NULL) {
+	while (*magic_ptr != '\0') {
 		char   *loc;
 
 		/* Ignore parentheses. */
@@ -1640,7 +1619,7 @@
 	 * dust on the values.
 	 */
 
-	for (magic_cnt = magic_len-2; magic_cnt >= 0; magic_cnt--) {
+	for (magic_cnt = magic_len - 2; magic_cnt >= 0; magic_cnt--) {
 		unsigned char	byte1;
 		unsigned char	byte2;
 
@@ -1656,7 +1635,7 @@
 		byte1 ^= byte2;
 
 		magic[magic_cnt+1] = byte1;
-			}
+	}
 
 	/*
 	 * Magic: Phase 3.  This computes 20 bytes.  The first 4 bytes are used as our magic
@@ -1671,8 +1650,8 @@
 	x = 0;
 
 	do {
-		unsigned int	bl = 0;
-		unsigned int	cl = magic[magic_cnt++];
+		unsigned int bl = 0;
+		unsigned int cl = magic[magic_cnt++];
 
 		if (magic_cnt >= magic_len)
 			break;
@@ -1697,17 +1676,18 @@
 
 	/* First four bytes are magic key. */
 	memcpy(&magic_key_char[0], comparison_src, 4);
-	magic_4 = magic_key_char[0] | (magic_key_char[1]<<8) | (magic_key_char[2]<<16) | (magic_key_char[3]<<24);
+	magic_4 = magic_key_char[0] | (magic_key_char[1] << 8) |
+			(magic_key_char[2] << 16) | (magic_key_char[3] << 24);
 
 	/*
 	 * Magic: Phase 4.  Determine what function to use later by getting outside/inside
 	 * loop values until we match our previous buffer.
 	 */
 	for (x = 0; x < 65535; x++) {
-		int			leave = 0;
+		int leave = 0;
 
 		for (y = 0; y < 5; y++) {
-			unsigned char	test[3];
+			unsigned char test[3];
 
 			/* Calculate buffer. */
 			test[0] = x;
@@ -1943,8 +1923,13 @@
 	}
 	purple_debug_info("yahoo", "yahoo status: %d\n", yd->current_status);
 	pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP,	yd->current_status, 0);
-	yahoo_packet_hash(pack, "sssss", 0, name, 6, resp_6, 96, resp_96, 1,
-	                  name, 135, "6,0,0,1710");
+	yahoo_packet_hash(pack, "ssssss",
+					  0, name,
+					  6, resp_6,
+					  96, resp_96,
+					  1, name,
+					  244, YAHOO_CLIENT_VERSION_ID,
+					  135, YAHOO_CLIENT_VERSION);
 	if (yd->picture_checksum)
 		yahoo_packet_hash_int(pack, 192, yd->picture_checksum);
 
@@ -2256,9 +2241,12 @@
 
 static void yahoo_process_audible(PurpleConnection *gc, struct yahoo_packet *pkt)
 {
+	PurpleAccount *account;
 	char *who = NULL, *msg = NULL, *id = NULL;
 	GSList *l = pkt->hash;
 
+	account = purple_connection_get_account(gc);
+
 	while (l) {
 		struct yahoo_pair *pair = l->data;
 
@@ -2294,9 +2282,9 @@
 		purple_debug_misc("yahoo", "Warning, nonutf8 audible, ignoring!\n");
 		return;
 	}
-	if (!yahoo_privacy_check(gc, who)) {
+	if (!purple_privacy_check(account, who)) {
 		purple_debug_misc("yahoo", "Audible message from %s for %s dropped!\n",
-		      gc->account->username, who);
+				purple_account_get_username(account), who);
 		return;
 	}
 	if (id) {
@@ -2434,12 +2422,16 @@
 	case YAHOO_SERVICE_AUDIBLE:
 		yahoo_process_audible(gc, pkt);
 		break;
-	case YAHOO_SERVICE_Y7_FILETRANSFER:
-		yahoo_process_y7_filetransfer(gc, pkt);
+	case YAHOO_SERVICE_FILETRANS_15:
+		yahoo_process_filetrans_15(gc, pkt);
 		break;
-	case YAHOO_SERVICE_Y7_FILETRANSFER_INFO:
-		yahoo_process_y7_filetransfer_info(gc, pkt);
+	case YAHOO_SERVICE_FILETRANS_INFO_15:
+		yahoo_process_filetrans_info_15(gc, pkt);
 		break;
+	case YAHOO_SERVICE_FILETRANS_ACC_15:
+		yahoo_process_filetrans_acc_15(gc, pkt);
+		break;
+
 	default:
 		purple_debug(PURPLE_DEBUG_ERROR, "yahoo",
 				   "Unhandled service 0x%02x\n", pkt->service);
@@ -2473,7 +2465,7 @@
 				_("Server closed the connection."));
 		return;
 	}
-
+	gc->last_received = time(NULL);
 	yd->rxqueue = g_realloc(yd->rxqueue, len + yd->rxlen);
 	memcpy(yd->rxqueue + yd->rxlen, buf, len);
 	yd->rxlen += len;
@@ -2661,11 +2653,15 @@
 	s = g_string_sized_new(len);
 
 	while ((i = strstr(i, "Set-Cookie: "))) {
+
 		i += strlen("Set-Cookie: ");
 		for (;*i != ';' && *i != '\0'; i++)
 			g_string_append_c(s, *i);
-
+        
 		g_string_append(s, "; ");
+		/* Should these cookies be included too when trying for xfer?
+		 * It seems to work without these
+		 */
 	}
 
 	yd->auth = g_string_free(s, FALSE);
@@ -2955,6 +2951,7 @@
 	yd->txbuf = purple_circ_buffer_new(0);
 	yd->friends = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, yahoo_friend_free);
 	yd->imvironments = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+	yd->xfer_peer_idstring_map = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
 	yd->confs = NULL;
 	yd->conf_id = 2;
 
@@ -3009,17 +3006,23 @@
 	}
 	g_slist_free(yd->confs);
 
+	for (l = yd->cookies; l; l = l->next) {
+		g_free(l->data);
+		l->data=NULL;
+	}
+	g_slist_free(yd->cookies);
+
 	yd->chat_online = 0;
 	if (yd->in_chat)
 		yahoo_c_leave(gc, 1); /* 1 = YAHOO_CHAT_ID */
 
 	g_hash_table_destroy(yd->friends);
 	g_hash_table_destroy(yd->imvironments);
+	g_hash_table_destroy(yd->xfer_peer_idstring_map);
 	g_free(yd->chat_name);
 
 	g_free(yd->cookie_y);
 	g_free(yd->cookie_t);
-	g_free(yd->cookie_c);
 
 	if (yd->txhandler)
 		purple_input_remove(yd->txhandler);
@@ -3829,12 +3832,10 @@
 	yahoo_packet_send_and_free(pkt, yd);
 }
 
-/* XXX - What's the deal with PurpleGroup *foo? */
-static void yahoo_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *foo)
+static void yahoo_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *g)
 {
 	struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data;
 	struct yahoo_packet *pkt;
-	PurpleGroup *g;
 	const char *group = NULL;
 	char *group2;
 	YahooFriend *f;
@@ -3842,20 +3843,17 @@
 	if (!yd->logged_in)
 		return;
 
-	if (!yahoo_privacy_check(gc, purple_buddy_get_name(buddy)))
+	if (!purple_privacy_check(purple_connection_get_account(gc),
+			purple_buddy_get_name(buddy)))
 		return;
 
 	f = yahoo_friend_find(gc, purple_buddy_get_name(buddy));
 
-	if (foo)
-		group = foo->name;
-	if (!group) {
-		g = purple_buddy_get_group(buddy);
-		if (g)
-			group = g->name;
-		else
-			group = "Buddies";
-	}
+	g = purple_buddy_get_group(buddy);
+	if (g)
+		group = g->name;
+	else
+		group = "Buddies";
 
 	group2 = yahoo_string_encode(gc, group, NULL);
 	pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0);
@@ -3917,10 +3915,6 @@
 
 	if (!yd->logged_in)
 		return;
-	/* It seems to work better without this */
-
-	/* if (gc->account->perm_deny != 4)
-		return; */
 
 	if (!who || who[0] == '\0')
 		return;
@@ -3946,34 +3940,27 @@
 	yahoo_packet_send_and_free(pkt, yd);
 }
 
-static void yahoo_set_permit_deny(PurpleConnection *gc) {
-	PurpleAccount *acct;
+static void yahoo_set_permit_deny(PurpleConnection *gc)
+{
+	PurpleAccount *account;
 	GSList *deny;
 
-	acct = gc->account;
-
-	switch (acct->perm_deny) {
-		/* privacy 1 */
+	account = purple_connection_get_account(gc);
+
+	switch (account->perm_deny)
+	{
 		case PURPLE_PRIVACY_ALLOW_ALL:
-			for (deny = acct->deny;deny;deny = deny->next)
+			for (deny = account->deny; deny; deny = deny->next)
 				yahoo_rem_deny(gc, deny->data);
 			break;
-		/* privacy 3 */
-		case PURPLE_PRIVACY_ALLOW_USERS:
-			for (deny = acct->deny;deny;deny = deny->next)
-				yahoo_rem_deny(gc, deny->data);
-			break;
-		/* privacy 5 */
+
 		case PURPLE_PRIVACY_ALLOW_BUDDYLIST:
-		/* privacy 4 */
+		case PURPLE_PRIVACY_ALLOW_USERS:
 		case PURPLE_PRIVACY_DENY_USERS:
-			for (deny = acct->deny;deny;deny = deny->next)
+		case PURPLE_PRIVACY_DENY_ALL:
+			for (deny = account->deny; deny; deny = deny->next)
 				yahoo_add_deny(gc, deny->data);
 			break;
-		/* privacy 2 */
-		case PURPLE_PRIVACY_DENY_ALL:
-		default:
-			break;
 	}
 }
 
@@ -4121,17 +4108,13 @@
 
 GList *yahoo_attention_types(PurpleAccount *account)
 {
-	PurpleAttentionType *attn;
 	static GList *list = NULL;
 
 	if (!list) {
 		/* Yahoo only supports one attention command: the 'buzz'. */
 		/* This is index number YAHOO_BUZZ. */
-		attn = g_new0(PurpleAttentionType, 1);
-		attn->name = _("Buzz");
-		attn->incoming_description = _("%s has buzzed you!");
-		attn->outgoing_description = _("Buzzing %s...");
-		list = g_list_append(list, attn);
+		list = g_list_append(list, purple_attention_type_new("Buzz", _("Buzz"),
+				_("%s has buzzed you!"), _("Buzzing %s...")));
 	}
 
 	return list;
@@ -4307,9 +4290,9 @@
 	NULL, /* add_buddies */
 	yahoo_remove_buddy,
 	NULL, /*remove_buddies */
-	yahoo_add_permit,
+	NULL, /* add_permit */
 	yahoo_add_deny,
-	yahoo_rem_permit,
+	NULL, /* rem_permit */
 	yahoo_rem_deny,
 	yahoo_set_permit_deny,
 	yahoo_c_join,
--- a/libpurple/protocols/yahoo/yahoo.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoo.h	Wed Feb 06 03:35:04 2008 +0000
@@ -34,6 +34,8 @@
 #define YAHOO_MAIL_URL "https://login.yahoo.com/config/login?.src=ym"
 #define YAHOO_XFER_HOST "filetransfer.msg.yahoo.com"
 #define YAHOO_XFER_PORT 80
+#define YAHOO_XFER_RELAY_HOST "relay.msg.yahoo.com"
+#define YAHOO_XFER_RELAY_PORT 80
 #define YAHOO_ROOMLIST_URL "http://insider.msg.yahoo.com/ycontent/"
 #define YAHOO_ROOMLIST_LOCALE "us"
 /* really we should get the list of servers from
@@ -43,6 +45,11 @@
 #define YAHOOJP_MAIL_URL "http://mail.yahoo.co.jp/"
 #define YAHOOJP_XFER_HOST "filetransfer.msg.yahoo.co.jp"
 #define YAHOOJP_WEBCAM_HOST "wc.yahoo.co.jp"
+/*not sure, must test:*/
+#define YAHOOJP_XFER_RELAY_HOST "relay.msg.yahoo.com" 
+#define YAHOOJP_XFER_RELAY_PORT 80
+#define YAHOOJP_ROOMLIST_URL "http://insider.msg.yahoo.co.jp/ycontent/"
+#define YAHOOJP_ROOMLIST_LOCALE "ja"
 
 #define YAHOO_AUDIBLE_URL "http://us.dl1.yimg.com/download.yahoo.com/dl/aud"
 
@@ -67,6 +74,9 @@
 #define YAHOO_STATUS_TYPE_INVISIBLE "invisible"
 #define YAHOO_STATUS_TYPE_MOBILE "mobile"
 
+#define YAHOO_CLIENT_VERSION_ID "2097087"
+#define YAHOO_CLIENT_VERSION "8.1.0.421"
+
 /* Index into attention types list. */
 #define YAHOO_BUZZ 0
 
@@ -86,7 +96,8 @@
 	YAHOO_STATUS_IDLE = 999,
 	YAHOO_STATUS_WEBLOGIN = 0x5a55aa55,
 	YAHOO_STATUS_OFFLINE = 0x5a55aa56, /* don't ask */
-	YAHOO_STATUS_TYPING = 0x16
+	YAHOO_STATUS_TYPING = 0x16,
+	YAHOO_STATUS_DISCONNECTED = 0xffffffff /* in ymsg 15. doesnt mean the normal sense of 'disconnected' */
 };
 
 struct yahoo_buddy_icon_upload_data {
@@ -134,7 +145,6 @@
 	gsize auth_written;
 	char *cookie_y;
 	char *cookie_t;
-	char *cookie_c;
 	int session_id;
 	gboolean jp;
 	gboolean wm; /* connected w/ web messenger method */
@@ -154,6 +164,8 @@
 	 * for when we lookup people profile or photo information.
 	 */
 	GSList *url_datas;
+	GHashTable *xfer_peer_idstring_map;/*Hey, i dont know, but putting this HashTable next to friends gives a run time fault...*/
+	GSList *cookies;/*contains all cookies, including _y and _t*/
 };
 
 #define YAHOO_MAX_STATUS_MESSAGE_LENGTH (255)
@@ -206,20 +218,19 @@
  */
 char *yahoo_string_decode(PurpleConnection *gc, const char *str, gboolean utf8);
 
+char *yahoo_convert_to_numeric(const char *str);
+
 /* previously-static functions, now needed for yahoo_profile.c */
 void yahoo_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full);
 
 /* yahoo_profile.c */
 void yahoo_get_info(PurpleConnection *gc, const char *name);
 
-/**
- * Check to see whether the sender is permitted to send
- *
- * @param gc The gc handle.
- * @param who The sender of the packet to check
+/* needed for xfer, thought theyd be useful for other enhancements later on
+   Returns list of cookies stored in yahoo_data formatted as a single null terminated string
+   returned value must be g_freed
 */
-gboolean yahoo_privacy_check
-	(PurpleConnection *gc, const char *who);
+gchar* yahoo_get_cookies(PurpleConnection *gc);
 
 gboolean yahoo_send_attention(PurpleConnection *gc, const char *username, guint type);
 GList *yahoo_attention_types(PurpleAccount *account);
--- a/libpurple/protocols/yahoo/yahoo_aliases.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoo_aliases.c	Wed Feb 06 03:35:04 2008 +0000
@@ -37,6 +37,8 @@
 /* I hate hardcoding this stuff, but Yahoo never sends us anything to use.  Someone in the know may be able to tweak this URL */
 #define YAHOO_ALIAS_FETCH_URL "http://address.yahoo.com/yab/us?v=XM&prog=ymsgr&.intl=us&diffs=1&t=0&tags=short&rt=0&prog-ver=8.1.0.249&useutf8=1&legenc=codepage-1252"
 #define YAHOO_ALIAS_UPDATE_URL "http://address.yahoo.com/yab/us?v=XM&prog=ymsgr&.intl=us&sync=1&tags=short&noclear=1&useutf8=1&legenc=codepage-1252"
+#define YAHOOJP_ALIAS_FETCH_URL "http://address.yahoo.co.jp/yab/jp?v=XM&prog=ymsgr&.intl=jp&diffs=1&t=0&tags=short&rt=0&prog-ver=7.0.0.7"
+#define YAHOOJP_ALIAS_UPDATE_URL "http://address.yahoo.co.jp/yab/jp?v=XM&prog=ymsgr&.intl=jp&sync=1&tags=short&noclear=1"
 
 void yahoo_update_alias(PurpleConnection *gc, const char *who, const char *alias);
 
@@ -90,7 +92,10 @@
 				id = xmlnode_get_attrib(item,"id");
 
 		                /* Yahoo stores first and last names separately, lets put them together into a full name */
-				full_name = g_strstrip(g_strdup_printf("%s %s", (fn != NULL ? fn : "") , (ln != NULL ? ln : "")));
+				if (yd->jp)
+					full_name = g_strstrip(g_strdup_printf("%s %s", (ln != NULL ? ln : "") , (fn != NULL ? fn : "")));
+				else
+					full_name = g_strstrip(g_strdup_printf("%s %s", (fn != NULL ? fn : "") , (ln != NULL ? ln : "")));
 				nick_name = (nn != NULL ? g_strstrip(g_strdup_printf("%s", nn)) : NULL);
 
 				if (nick_name != NULL)
@@ -139,7 +144,7 @@
 {
 	struct yahoo_data *yd = gc->proto_data;
 	struct callback_data *cb;
-	const char *url = YAHOO_ALIAS_FETCH_URL;
+	const char *url;
 	char *request, *webpage, *webaddress;
 	PurpleUtilFetchUrlData *url_data;
 
@@ -148,6 +153,7 @@
 	cb->gc = gc;
 
 	/*  Build all the info to make the web request */
+	url = yd->jp ? YAHOOJP_ALIAS_FETCH_URL : YAHOO_ALIAS_FETCH_URL;
 	purple_url_parse(url, &webaddress, NULL, &webpage, NULL, NULL);
 	request = g_strdup_printf("GET /%s HTTP/1.1\r\n"
 				 "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
@@ -221,14 +227,15 @@
 	struct yahoo_data *yd;
 	struct YahooUser *yu;
 	char *content, *url, *request, *webpage, *webaddress, *strtmp;
+	char *escaped_alias, *alias_jp, *converted_alias_jp;
 	int inttmp;
 	struct callback_data *cb;
 	PurpleBuddy *buddy;
 	PurpleUtilFetchUrlData *url_data;
 
-	g_return_if_fail(alias!= NULL);
-	g_return_if_fail(who!=NULL);
-	g_return_if_fail(gc!=NULL);
+	g_return_if_fail(alias != NULL);
+	g_return_if_fail(who != NULL);
+	g_return_if_fail(gc != NULL);
 
 	purple_debug_info("yahoo", "Sending '%s' as new alias for user '%s'.\n",alias, who);
 
@@ -247,12 +254,25 @@
 	cb->gc = gc;
 
 	/*  Build all the info to make the web request */
-	url = g_strdup(YAHOO_ALIAS_UPDATE_URL);
+	url = yd->jp? YAHOOJP_ALIAS_UPDATE_URL: YAHOO_ALIAS_UPDATE_URL;
 	purple_url_parse(url, &webaddress, &inttmp, &webpage, &strtmp, &strtmp);
 
-	content = g_strdup_printf("<?xml version=\"1.0\" encoding=\"utf-8\"?><ab k=\"%s\" cc=\"1\">\n"
-				  "<ct e=\"1\"  yi='%s' id='%s' nn='%s' pr='0' />\n</ab>\r\n",
-				  gc->account->username, who, yu->id, g_markup_escape_text(alias, strlen(alias)));
+	if (yd->jp) {
+		alias_jp = g_convert(alias, strlen(alias), "EUC-JP", "UTF-8", NULL, NULL, NULL);
+		converted_alias_jp = yahoo_convert_to_numeric(alias_jp);
+		content = g_strdup_printf("<ab k=\"%s\" cc=\"1\">\n"
+		                          "<ct e=\"1\"  yi='%s' id='%s' nn='%s' pr='0' />\n</ab>\r\n",
+		                          gc->account->username, who, yu->id, converted_alias_jp);
+		free(converted_alias_jp);
+		g_free(alias_jp);
+	}
+	else {
+		escaped_alias = g_markup_escape_text(alias, strlen(alias));
+		content = g_strdup_printf("<?xml version=\"1.0\" encoding=\"utf-8\"?><ab k=\"%s\" cc=\"1\">\n"
+		                          "<ct e=\"1\"  yi='%s' id='%s' nn='%s' pr='0' />\n</ab>\r\n",
+		                          gc->account->username, who, yu->id, escaped_alias);
+		g_free(escaped_alias);
+	}
 
 	request = g_strdup_printf("POST /%s HTTP/1.1\r\n"
 				  "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
@@ -271,7 +291,6 @@
 	}
 
 	g_free(content);
-	g_free(url);
 	g_free(request);
 }
 
--- a/libpurple/protocols/yahoo/yahoo_filexfer.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoo_filexfer.c	Wed Feb 06 03:35:04 2008 +0000
@@ -21,6 +21,7 @@
  */
 
 #include "internal.h"
+#include "dnsquery.h"
 
 #include "prpl.h"
 #include "util.h"
@@ -32,6 +33,7 @@
 #include "yahoo_packet.h"
 #include "yahoo_filexfer.h"
 #include "yahoo_doodle.h"
+#include "yahoo_friend.h"
 
 struct yahoo_xfer_data {
 	gchar *host;
@@ -46,81 +48,65 @@
 	guint tx_handler;
 	gchar *rxqueue;
 	guint rxlen;
+	gchar *xfer_peer_idstring;
+	gchar *xfer_idstring_for_relay;
+	int version; /*0 for old, 15 for Y7(YMSG 15)*/
+	int info_val_249;
 
-	gboolean y7;	/* true for Y7 transfers (receive only for now) */
-	gchar *token;
-	gchar *tid;
+	enum {
+		STARTED = 0,
+		HEAD_REQUESTED,
+		HEAD_REPLY_RECEIVED,
+		TRANSFER_PHASE,
+		ACCEPTED
+	} status_15;
+
+	/* contains all filenames, in case of multiple transfers, with the first
+	 * one in the list being the current file's name (ymsg15) */
+	GSList *filename_list;
+	GSList *size_list; /*corresponds to filename_list, with size as **STRING** */
+	gboolean firstoflist;
 };
 
 static void yahoo_xfer_data_free(struct yahoo_xfer_data *xd)
 {
+	PurpleConnection *gc;
+	struct yahoo_data *yd;
+	PurpleXfer *xfer;
+	GSList *l;
+
+	gc = xd->gc;
+	yd = gc->proto_data;
+
+	/*remove entry from map*/
+	if(xd->xfer_peer_idstring) {
+		xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, xd->xfer_peer_idstring);
+		if(xfer)
+			g_hash_table_remove(yd->xfer_peer_idstring_map, xd->xfer_peer_idstring);
+	}
+
+	/*empty file & filesize list*/
+	for (l = xd->filename_list; l; l = l->next) {
+		g_free(l->data);
+		l->data=NULL;
+	}
+	for (l = xd->size_list; l; l = l->next) {
+		g_free(l->data);
+		l->data=NULL;
+	}
+	g_slist_free(xd->filename_list);
+	g_slist_free(xd->size_list);
+
 	g_free(xd->host);
 	g_free(xd->path);
 	g_free(xd->txbuf);
-	g_free(xd->token);
-	g_free(xd->tid);
+	g_free(xd->xfer_peer_idstring);
+	g_free(xd->xfer_idstring_for_relay);
 	if (xd->tx_handler)
 		purple_input_remove(xd->tx_handler);
 	g_free(xd);
 }
 
-
-static void yahoo_xfer_y7_request_next_file(PurpleXfer *xfer)
-{
-	struct yahoo_packet *pack;
-	struct yahoo_xfer_data *xd = xfer->data;
-	PurpleConnection *gc = xd->gc;
-	struct yahoo_data *yd = gc->proto_data;
-
-	g_return_if_fail(xd->y7);
-
-	pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT, YAHOO_STATUS_AVAILABLE, 0);
-	yahoo_packet_hash(pack, "sssi",
-		1, purple_connection_get_display_name(xd->gc),
-		5, xfer->who,
-		265, xd->tid,
-		271, 1);
-	yahoo_packet_send_and_free(pack, yd);
-}
-
-static void yahoo_xfer_y7_cancel_receive(PurpleXfer *xfer)
-{
-	struct yahoo_packet *pack;
-	struct yahoo_xfer_data *xd = xfer->data;
-	PurpleConnection *gc = xd->gc;
-	struct yahoo_data *yd = gc->proto_data;
-
-	g_return_if_fail(xd->y7);
-
-	pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT, -1, 0);
-	yahoo_packet_hash(pack, "sssi",
-		1, purple_connection_get_display_name(gc),
-		5, xfer->who,
-		265, xd->tid,
-		66, -1);
-	yahoo_packet_send_and_free(pack, yd);
-}
-
-static void yahoo_xfer_y7_accept_file(PurpleXfer *xfer)
-{
-	struct yahoo_packet *pack;
-	struct yahoo_xfer_data *xd = xfer->data;
-	PurpleConnection *gc = xd->gc;
-	struct yahoo_data *yd = gc->proto_data;
-
-	g_return_if_fail(xd->y7);
-
-	pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT, YAHOO_STATUS_AVAILABLE, 0);
-	yahoo_packet_hash(pack, "ssssis",
-		1, purple_connection_get_display_name(gc),
-		5, xfer->who,				/* XXX this needs an accessor */
-		265, xd->tid,
-		27, purple_xfer_get_filename(xfer),	/* XXX this might be of incorrect encoding */
-		249, 3,
-		251, xd->token);
-	yahoo_packet_send_and_free(pack, yd);
-}
-
 static void yahoo_receivefile_send_cb(gpointer data, gint source, PurpleInputCondition condition)
 {
 	PurpleXfer *xfer;
@@ -160,7 +146,6 @@
 {
 	PurpleXfer *xfer;
 	struct yahoo_xfer_data *xd;
-	struct yahoo_data *yd;
 
 	purple_debug(PURPLE_DEBUG_INFO, "yahoo",
 			   "AAA - in yahoo_receivefile_connected\n");
@@ -176,22 +161,11 @@
 	}
 
 	xfer->fd = source;
-	yd = xd->gc->proto_data;
 
 	/* The first time we get here, assemble the tx buffer */
 	if (xd->txbuflen == 0) {
-		if (!xd->y7)
-			xd->txbuf = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n",
-				      xd->path, xd->host);
-		else
-			xd->txbuf = g_strdup_printf("GET /%s HTTP/1.0\r\n"
-				"Connection: close\r\n"
-				"Accept: */*\r\n"
-				"Host: %s\r\n"
-				"Cookie: Y=%s; T=%s\r\n"
-				"\r\n",
-				xd->path, xd->host, yd->cookie_y, yd->cookie_t);
-		purple_debug(PURPLE_DEBUG_INFO, "yahoo_filexfer", "HTTP request: [%s]\n", xd->txbuf);
+		xd->txbuf = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n",
+			      xd->path, xd->host);
 		xd->txbuflen = strlen(xd->txbuf);
 		xd->txbuf_written = 0;
 	}
@@ -356,9 +330,6 @@
 			}
 		}
 	} else {
-		if (xfer_data->y7)
-			yahoo_xfer_y7_accept_file(xfer);
-
 		xfer->fd = -1;
 		if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port,
 		                              yahoo_receivefile_connected, xfer) == NULL) {
@@ -369,23 +340,67 @@
 	}
 }
 
+static void yahoo_xfer_init_15(PurpleXfer *xfer)
+{
+	struct yahoo_xfer_data *xfer_data;
+	PurpleConnection *gc;
+	PurpleAccount *account;
+	struct yahoo_data *yd;
+	struct yahoo_packet *pkt;
+
+	xfer_data = xfer->data;
+	gc = xfer_data->gc;
+	yd = gc->proto_data;
+	account = purple_connection_get_account(gc);
+
+	if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND)	{
+		gchar *filename;
+		filename = g_path_get_basename(purple_xfer_get_local_filename(xfer));
+		pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
+							   YAHOO_STATUS_AVAILABLE,
+							   yd->session_id);
+		yahoo_packet_hash(pkt, "sssiiiisiii",
+			1, purple_normalize(account, purple_account_get_username(account)),
+			5, xfer->who,
+			265, xfer_data->xfer_peer_idstring,
+			222, 1,
+			266, 1,
+			302, 268,
+			300, 268,
+			27,  filename,
+			28,  xfer->size,
+			301, 268,
+			303, 268);
+		g_free(filename); 
+	} else {
+		if(xfer_data->firstoflist == TRUE) {
+			pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
+				YAHOO_STATUS_AVAILABLE, yd->session_id);
+	
+			yahoo_packet_hash(pkt, "sssi",
+				1, purple_normalize(account, purple_account_get_username(account)),
+				5, xfer->who,
+				265, xfer_data->xfer_peer_idstring,
+				222, 3);
+		} else {
+			pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15,
+				YAHOO_STATUS_AVAILABLE, yd->session_id);
+	
+			yahoo_packet_hash(pkt, "sssi",
+				1, purple_normalize(account, purple_account_get_username(account)),
+				5, xfer->who,
+				265, xfer_data->xfer_peer_idstring,
+				271, 1);
+		}
+	}
+	yahoo_packet_send_and_free(pkt, yd);
+}
+
 static void yahoo_xfer_start(PurpleXfer *xfer)
 {
 	/* We don't need to do anything here, do we? */
 }
 
-static void yahoo_xfer_end(PurpleXfer *xfer)
-{
-	struct yahoo_xfer_data *xfer_data;
-
-	xfer_data = xfer->data;
-
-	if (xfer_data)
-		yahoo_xfer_data_free(xfer_data);
-	xfer->data = NULL;
-
-}
-
 static guint calculate_length(const gchar *l, size_t len)
 {
 	int i;
@@ -418,8 +433,6 @@
 		if ((purple_xfer_get_size(xfer) > 0) &&
 		    (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer))) {
 			purple_xfer_set_completed(xfer, TRUE);
-			if (xd->y7)
-				yahoo_xfer_y7_request_next_file(xfer);
 			return 0;
 		} else
 			return -1;
@@ -499,6 +512,42 @@
 
 	xfer_data = xfer->data;
 
+	if(purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL && xfer_data->version == 15)
+	{
+		PurpleConnection *gc;
+		PurpleAccount *account;
+		struct yahoo_data *yd;
+		struct yahoo_packet *pkt;
+
+		gc = xfer_data->gc;
+		yd = gc->proto_data;
+		account = purple_connection_get_account(gc);
+		if(xfer_data->xfer_idstring_for_relay) /* hack to see if file trans acc/info packet has been received */
+		{
+			pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15,
+								   YAHOO_STATUS_DISCONNECTED,
+								   yd->session_id);
+			yahoo_packet_hash(pkt, "sssi",
+				1, purple_normalize(account, purple_account_get_username(account)),
+				5, xfer->who,
+				265, xfer_data->xfer_peer_idstring,
+				66, -1);
+		}
+		else
+		{
+			pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
+								   YAHOO_STATUS_AVAILABLE,
+								   yd->session_id);
+			yahoo_packet_hash(pkt, "sssi",
+				1, purple_normalize(account, purple_account_get_username(account)),
+				5, xfer->who,
+				265, xfer_data->xfer_peer_idstring,
+				222, 2);
+		}
+		yahoo_packet_send_and_free(pkt, yd);
+	}
+
+
 	if (xfer_data)
 		yahoo_xfer_data_free(xfer_data);
 	xfer->data = NULL;
@@ -510,22 +559,145 @@
 
 	xfer_data = xfer->data;
 
-	if (xfer_data) {
-		if (xfer_data->y7)
-			yahoo_xfer_y7_cancel_receive(xfer);
+	if(purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL && xfer_data->version == 15)
+	{
+
+		PurpleConnection *gc;
+		PurpleAccount *account;
+		struct yahoo_data *yd;
+		struct yahoo_packet *pkt;
+
+		gc = xfer_data->gc;
+		yd = gc->proto_data;
+		account = purple_connection_get_account(gc);
+		if(!xfer_data->xfer_idstring_for_relay) /* hack to see if file trans acc/info packet has been received */
+		{
+			pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
+								   YAHOO_STATUS_AVAILABLE,
+								   yd->session_id);
+			yahoo_packet_hash(pkt, "sssi",
+				1, purple_normalize(account, purple_account_get_username(account)),
+				5, xfer->who,
+				265, xfer_data->xfer_peer_idstring,
+				222, 4);
+		}
+		else
+		{
+			pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
+								   YAHOO_STATUS_DISCONNECTED,
+								   yd->session_id);
+			yahoo_packet_hash(pkt, "sssi",
+				1, purple_normalize(account, purple_account_get_username(account)),
+				5, xfer->who,
+				265, xfer_data->xfer_peer_idstring,
+				66, -1);
+		}
+		yahoo_packet_send_and_free(pkt, yd);
+	}
+
+	if (xfer_data)
 		yahoo_xfer_data_free(xfer_data);
-	}
 	xfer->data = NULL;
 }
 
-static void yahoo_xfer_request_denied(PurpleXfer *xfer)
+static void yahoo_xfer_end(PurpleXfer *xfer_old)
 {
 	struct yahoo_xfer_data *xfer_data;
+	PurpleXfer *xfer = NULL;
+	PurpleConnection *gc;
+	struct yahoo_data *yd;
 
-	xfer_data = xfer->data;
+	xfer_data = xfer_old->data;
+	if(xfer_data && xfer_data->version == 15
+	   && purple_xfer_get_type(xfer_old) == PURPLE_XFER_RECEIVE
+	   && xfer_data->filename_list) {
+		
+		/* removing top of filename & size list completely */
+		g_free( xfer_data->filename_list->data );
+		g_free( xfer_data->size_list->data );
+		   
+		xfer_data->filename_list->data = NULL;
+		xfer_data->size_list->data = NULL;
+		   
+		xfer_data->filename_list = g_slist_delete_link(xfer_data->filename_list, xfer_data->filename_list);
+		xfer_data->size_list = g_slist_delete_link(xfer_data->size_list, xfer_data->size_list);
+
+		/* if there are still more files */
+		if(xfer_data->filename_list)
+		{
+			gchar* filename;
+			long filesize;
+
+			filename = xfer_data->filename_list->data;
+			filesize = atol( xfer_data->size_list->data );
+
+			gc = xfer_data->gc;
+			yd = gc->proto_data;
 
-	if (xfer_data->y7)
-		yahoo_xfer_y7_cancel_receive(xfer);
+			/* setting up xfer_data for next file's tranfer */
+			g_free(xfer_data->host);
+			g_free(xfer_data->path);
+			g_free(xfer_data->txbuf);
+			g_free(xfer_data->rxqueue);
+			g_free(xfer_data->xfer_idstring_for_relay);
+			if (xfer_data->tx_handler)
+				purple_input_remove(xfer_data->tx_handler);
+			xfer_data->host = NULL;
+			xfer_data->host = NULL;
+			xfer_data->port = 0;
+			xfer_data->expires = 0;
+			xfer_data->started = FALSE;
+			xfer_data->txbuf = NULL;
+			xfer_data->txbuflen = 0;
+			xfer_data->txbuf_written = 0;
+			xfer_data->tx_handler = 0;
+			xfer_data->rxqueue = NULL;
+			xfer_data->rxlen = 0;
+			xfer_data->xfer_idstring_for_relay = NULL;
+			xfer_data->info_val_249 = 0;
+			xfer_data->status_15 = STARTED;
+			xfer_data->firstoflist = FALSE;
+
+			/* Dereference xfer_data from old xfer */
+			xfer_old->data = NULL;
+
+			/* Build the file transfer handle. */
+			xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, xfer_old->who);
+
+			
+			if (xfer) {
+				/* Set the info about the incoming file. */
+				char *utf8_filename = yahoo_string_decode(gc, filename, TRUE);
+				purple_xfer_set_filename(xfer, utf8_filename);
+				g_free(utf8_filename);
+				purple_xfer_set_size(xfer, filesize);
+		
+				xfer->data = xfer_data;
+	
+				/* Setup our I/O op functions */
+				purple_xfer_set_init_fnc(xfer,        yahoo_xfer_init_15);
+				purple_xfer_set_start_fnc(xfer,       yahoo_xfer_start);
+				purple_xfer_set_end_fnc(xfer,         yahoo_xfer_end);
+				purple_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send);
+				purple_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv);
+				purple_xfer_set_read_fnc(xfer,        yahoo_xfer_read);
+				purple_xfer_set_write_fnc(xfer,       yahoo_xfer_write);
+				purple_xfer_set_request_denied_fnc(xfer,yahoo_xfer_cancel_recv);
+
+				/*update map to current xfer*/
+				g_hash_table_remove(yd->xfer_peer_idstring_map, xfer_data->xfer_peer_idstring);
+				g_hash_table_insert(yd->xfer_peer_idstring_map, xfer_data->xfer_peer_idstring, xfer);
+
+				/* Now perform the request */
+				purple_xfer_request(xfer);
+			}
+			return;
+		}
+	}
+	if (xfer_data)
+		yahoo_xfer_data_free(xfer_data);
+	xfer_old->data = NULL;
+
 }
 
 void yahoo_process_p2pfilexfer(PurpleConnection *gc, struct yahoo_packet *pkt)
@@ -721,165 +893,6 @@
 	}
 }
 
-void yahoo_process_y7_filetransfer(PurpleConnection *gc, struct yahoo_packet *pkt)
-{
-	struct yahoo_data *yd = gc->proto_data;
-	char *who = NULL, *name = NULL;
-	int ttype = 0;
-	char *tid = NULL;
-	GSList *l = pkt->hash;
-
-	while (l) {
-		struct yahoo_pair *pair = l->data;
-
-		switch (pair->key) {
-		case 4:
-			/* them */
-			who = pair->value;
-			break;
-		case 5:
-			/* us */
-			name = pair->value;
-			break;
-		case 222:
-			/* 1=send, 2=cancel, 3=accept, 4=reject */
-			if(pair->value)
-				ttype = atoi(pair->value);
-			break;
-		case 265:
-			/* transfer ID */
-			tid = pair->value;
-			break;
-		case 266:
-			/* number of files */
-			break;
-		case 27:
-			/* filename */
-			break;
-		case 28:
-			/* filesize */
-			break;
-		}
-
-		l = l->next;
-	}
-	if (ttype == 1 && tid) {
-		/* We auto-accept all offers here, and ask the user about each individual
-		 * file in yahoo_process_y7_filetransfer_info. This works fine for receiving
-		 * a single file; when receiving multiple canceling one in the middle
-		 * will also cancel the rest of them.
-		 * Maybe TODO: UI and API allowing transfer of multiple files as a package. */
-		struct yahoo_packet *pack;
-		pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER, YAHOO_STATUS_AVAILABLE, 0);
-		yahoo_packet_hash(pack, "sssi", 1, name, 5, who, 265, tid, 222, 3);
-		yahoo_packet_send_and_free(pack, yd);
-	}
-}
-
-void yahoo_process_y7_filetransfer_info(PurpleConnection *gc, struct yahoo_packet *pkt)
-{
-	struct yahoo_data *yd = gc->proto_data;
-	char *who = NULL, *name = NULL;
-	int medium = 0;
-	char *tid = NULL, *server_host = NULL, *server_token = NULL, *filename = NULL;
-	GSList *l = pkt->hash;
-	struct yahoo_packet *pack;
-	PurpleXfer *xfer;
-	struct yahoo_xfer_data *xfer_data;
-
-	while (l) {
-		struct yahoo_pair *pair = l->data;
-
-		switch (pair->key) {
-		case 4:
-			/* them */
-			who = pair->value;
-			break;
-		case 5:
-			/* us */
-			name = pair->value;
-			break;
-		case 249:
-			/* 1=p2p, 3=reflection server */
-			if(pair->value)
-				medium = atoi(pair->value);
-			break;
-		case 265:
-			/* transfer ID */
-			tid = pair->value;
-			break;
-		case 27:
-			filename = pair->value;
-			break;
-		case 250:
-			server_host = pair->value;
-			break;
-		case 251:
-			server_token = pair->value;
-			break;
-		}
-
-		l = l->next;
-	}
-	if (medium == 1) {
-		/* reject P2P transfers */
-		pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT, YAHOO_STATUS_AVAILABLE, 0);
-		yahoo_packet_hash(pack, "sssi", 1, name, 5, who, 265, tid, 66, -3);
-		yahoo_packet_send_and_free(pack, yd);
-		return;
-	}
-
-	if (medium != 3) {
-		purple_debug_error("yahoo", "Unexpected medium %d.\n", medium);
-		/* weird */
-		return;
-	}
-
-	/* Setup the Yahoo-specific file transfer data */
-	xfer_data = g_new0(struct yahoo_xfer_data, 1);
-	xfer_data->gc = gc;
-	xfer_data->host = g_strdup(server_host);
-	xfer_data->token = g_strdup(server_token);
-	xfer_data->tid = g_strdup(tid);
-	xfer_data->port = 80;
-	xfer_data->y7 = TRUE;
-	
-	/* TODO: full urlencode here */
-	server_token = purple_strreplace(server_token, "\002", "%02");
-	xfer_data->path = g_strdup_printf("relay?token=%s&sender=%s&recver=%s",
-		server_token, who, name);
-	g_free(server_token);
-
-	purple_debug_misc("yahoo_filexfer", "Host is %s, port is %d, path is %s.\n",
-	                xfer_data->host, xfer_data->port, xfer_data->path);
-
-	/* Build the file transfer handle. */
-	xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, who);
-	xfer->data = xfer_data;
-
-	/* Set the info about the incoming file. */
-	{
-		char *utf8_filename = yahoo_string_decode(gc, filename, TRUE);
-		purple_xfer_set_filename(xfer, utf8_filename);
-		g_free(utf8_filename);
-	}
-
-	/* purple_xfer_set_size(xfer, filesize); */
-
-	/* Setup our I/O op functions */
-	purple_xfer_set_init_fnc(xfer,        yahoo_xfer_init);
-	purple_xfer_set_start_fnc(xfer,       yahoo_xfer_start);
-	purple_xfer_set_end_fnc(xfer,         yahoo_xfer_end);
-	purple_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send);
-	purple_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv);
-	purple_xfer_set_read_fnc(xfer,        yahoo_xfer_read);
-	purple_xfer_set_write_fnc(xfer,       yahoo_xfer_write);
-	purple_xfer_set_request_denied_fnc(xfer, yahoo_xfer_request_denied);
-
-	/* Now perform the request */
-	purple_xfer_request(xfer);
-}
-
 PurpleXfer *yahoo_new_xfer(PurpleConnection *gc, const char *who)
 {
 	PurpleXfer *xfer;
@@ -909,15 +922,641 @@
 	return xfer;
 }
 
+static gchar* yahoo_xfer_new_xfer_id(void)
+{
+	gchar *ans;
+	int i,j;
+	ans = g_strnfill(24, ' ');
+	ans[23] = '$';
+	ans[22] = '$';
+	for(i = 0; i < 22; i++)
+	{
+		j = g_random_int_range (0,61);
+		if(j < 26)
+			ans[i] = j + 'a';
+		else if(j < 52)
+			ans[i] = j - 26 + 'A';
+		else
+			ans[i] = j - 52 + '0';
+	}
+	return ans;
+}
+
+static void yahoo_xfer_dns_connected_15(GSList *hosts, gpointer data, const char *error_message)
+{
+	PurpleXfer *xfer;
+	struct yahoo_xfer_data *xd;
+	struct sockaddr_in *addr;
+	struct yahoo_packet *pkt;
+	long actaddr;
+	long a,b,c,d;
+	PurpleConnection *gc;
+	PurpleAccount *account;
+	struct yahoo_data *yd;
+	gchar *url;
+	gchar *filename;
+
+	if (!(xfer = data))
+		return;
+	if (!(xd = xfer->data))
+		return;
+	gc = xd->gc;
+	account = purple_connection_get_account(gc);
+	yd = gc->proto_data;
+
+	if(!hosts)
+	{
+		purple_debug_error("yahoo", "Unable to find an IP address for relay.msg.yahoo.com\n");
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+	
+	/* Discard the length... */
+	hosts = g_slist_remove(hosts, hosts->data);
+	if(!hosts)
+	{
+		purple_debug_error("yahoo", "Unable to find an IP address for relay.msg.yahoo.com\n");
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+	
+	/*TODO:actually, u must try with addr no.1 , if its not working addr no.2 .....*/
+	addr = hosts->data;
+	actaddr = addr->sin_addr.s_addr;
+	d = actaddr % 256;
+	actaddr = (actaddr - d) / 256;
+	c = actaddr % 256;
+	actaddr = (actaddr - c) / 256;
+	b = actaddr % 256;
+	actaddr = (actaddr - b) / 256;
+	a = actaddr;
+	if(yd->jp)
+		xd->port = YAHOOJP_XFER_RELAY_PORT;
+	else
+		xd->port = YAHOO_XFER_RELAY_PORT;
+
+	url = g_strdup_printf("%ld.%ld.%ld.%ld", d, c, b, a);
+	if (!purple_url_parse(url, &(xd->host), &(xd->port), &(xd->path), NULL, NULL)) {
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+	g_free(url);
+	/* Free the address... */
+	g_free(hosts->data);
+	hosts = g_slist_remove(hosts, hosts->data);
+	addr = NULL;
+	while (hosts != NULL)
+	{
+		/* Discard the length... */
+		hosts = g_slist_remove(hosts, hosts->data);
+		/* Free the address... */
+		g_free(hosts->data);
+		hosts = g_slist_remove(hosts, hosts->data);
+	}
+
+	pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id);
+	filename = g_path_get_basename(purple_xfer_get_local_filename(xfer));
+
+	yahoo_packet_hash(pkt, "ssssis",
+		1, purple_normalize(account, purple_account_get_username(account)),
+		5, xfer->who,
+		265, xd->xfer_peer_idstring,
+		27,  filename,
+		249, 3,
+		250, xd->host);
+
+	g_free(filename);
+	yahoo_packet_send_and_free(pkt, yd);
+}
+
+
 void yahoo_send_file(PurpleConnection *gc, const char *who, const char *file)
 {
+	struct yahoo_xfer_data *xfer_data;
+	struct yahoo_data *yd;
+	int ver = 0;
 	PurpleXfer *xfer = yahoo_new_xfer(gc, who);
+	YahooFriend *yf = yahoo_friend_find(gc, who);
 
+	/* To determine whether client uses ymsg 15 i.e. client is higher than YM 7 */
+	if(yf && yf->version_id > 500000)
+		ver=15; 
 	g_return_if_fail(xfer != NULL);
 
+	if(ver == 15) {
+		yd = gc->proto_data;
+		xfer_data = xfer->data;
+		xfer_data->status_15 = STARTED;
+		purple_xfer_set_init_fnc(xfer, yahoo_xfer_init_15);
+		xfer_data->version = 15;
+		xfer_data->xfer_peer_idstring = yahoo_xfer_new_xfer_id();
+		g_hash_table_insert(yd->xfer_peer_idstring_map, xfer_data->xfer_peer_idstring, xfer);
+	}
+
 	/* Now perform the request */
 	if (file)
 		purple_xfer_request_accepted(xfer, file);
 	else
 		purple_xfer_request(xfer);
 }
+
+static void yahoo_xfer_connected_15(gpointer data, gint source, const gchar *error_message);/*using this in recv_cb*/
+static void yahoo_xfer_recv_cb_15(gpointer data, gint source, PurpleInputCondition condition)
+{
+	PurpleXfer *xfer;
+	struct yahoo_xfer_data *xd;
+	int did;
+	gchar* buf;
+	gchar* t;
+	PurpleAccount *account;
+	PurpleConnection *gc;
+
+	xfer = data;
+	xd = xfer->data;
+	account = purple_connection_get_account(xd->gc);
+	gc = xd->gc;
+
+	buf=g_strnfill(1000, 0);
+	while((did = read(source, buf, 998)) > 0)
+	{
+		xd->txbuflen += did;
+		buf[did] = '\0';  
+		t = xd->txbuf;
+		xd->txbuf = g_strconcat(t,buf,NULL);
+		g_free(t);
+	}
+	g_free(buf);
+
+	if (did < 0 && errno == EAGAIN) return;
+	else if (did < 0) {
+		purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno);
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+
+	purple_input_remove(xd->tx_handler);
+	xd->tx_handler = 0;
+	xd->txbuflen = 0;
+
+	if(xd->status_15 == HEAD_REQUESTED) {
+		xd->status_15 = HEAD_REPLY_RECEIVED;
+		close(source);/*Is this required?*/
+		g_free(xd->txbuf);
+		xd->txbuf = NULL;
+		if (purple_proxy_connect(NULL, account, xd->host, xd->port, yahoo_xfer_connected_15, xfer) == NULL)
+		{
+			purple_notify_error(gc, NULL, _("File Transfer Failed"),
+				_("Unable to establish file descriptor."));
+			purple_xfer_cancel_remote(xfer);
+		}
+	} else {
+		purple_debug_error("yahoo","Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n",
+						   purple_xfer_get_type(xfer),
+						   xd->status_15);
+		return;
+	}
+}
+
+static void yahoo_xfer_send_cb_15(gpointer data, gint source, PurpleInputCondition condition)
+{
+	PurpleXfer *xfer;
+	struct yahoo_xfer_data *xd;
+	int remaining, written;
+
+	xfer = data;
+	xd = xfer->data;
+	remaining = xd->txbuflen - xd->txbuf_written;
+	written = write(source, xd->txbuf + xd->txbuf_written, remaining);
+
+	if (written < 0 && errno == EAGAIN)
+		written = 0;
+	else if (written <= 0) {
+		purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno);
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+
+	if (written < remaining) {
+		xd->txbuf_written += written;
+		return;
+	}
+
+	purple_input_remove(xd->tx_handler);
+	xd->tx_handler = 0;
+	g_free(xd->txbuf);
+	xd->txbuf = NULL;
+	xd->txbuflen = 0;
+	xd->txbuf_written = 0;
+
+	if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == STARTED)
+	{	
+		xd->status_15 = HEAD_REQUESTED;
+		xd->tx_handler = purple_input_add(source, PURPLE_INPUT_READ, yahoo_xfer_recv_cb_15, xfer);
+		yahoo_xfer_recv_cb_15(xfer, source, PURPLE_INPUT_READ);
+	}
+	else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED)
+	{
+		xd->status_15 = TRANSFER_PHASE;
+		xfer->fd = source;
+		purple_xfer_start(xfer, source, NULL, 0);
+	}
+	else if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && xd->status_15 == ACCEPTED)
+	{
+		xd->status_15 = TRANSFER_PHASE;
+		xfer->fd = source;
+		purple_xfer_start(xfer, source, NULL, 0);
+	}
+	else
+	{
+		purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15);
+		return;
+	}
+
+}
+
+
+static void yahoo_xfer_connected_15(gpointer data, gint source, const gchar *error_message)
+{
+	PurpleXfer *xfer;
+	struct yahoo_xfer_data *xd;
+	PurpleAccount *account;
+	struct yahoo_data* yd;
+
+	if (!(xfer = data))
+		return;
+	if (!(xd = xfer->data))
+		return;
+	yd = xd->gc->proto_data;
+	account = purple_connection_get_account(xd->gc);
+	if ((source < 0) || (xd->path == NULL) || (xd->host == NULL)) {
+		purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer),
+			xfer->who, _("Unable to connect."));
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+	/* The first time we get here, assemble the tx buffer */
+	if (xd->txbuflen == 0)
+	{
+		gchar* cookies;
+		cookies = yahoo_get_cookies(xd->gc);
+		if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && xd->status_15 == ACCEPTED)
+		{
+			xd->txbuf = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nContent-Length: %ld\r\nCache-Control: no-cache\r\n\r\n",
+										purple_url_encode(xd->xfer_idstring_for_relay),
+										purple_normalize(account, purple_account_get_username(account)),
+										xfer->who,
+										cookies,
+										xd->host,
+										(long int)xfer->size);
+		}
+		else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == STARTED)
+		{	
+			xd->txbuf = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nAccept:*/*\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost:%s\r\nContent-Length: 0\r\nCache-Control: no-cache\r\n\r\n",
+										purple_url_encode(xd->xfer_idstring_for_relay),
+										purple_normalize(account, purple_account_get_username(account)),
+										xfer->who,
+										cookies,
+										xd->host);
+		}
+		else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED)
+		{
+			xd->txbuf = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost:%s\r\nConnection: Keep-Alive\r\n\r\n",
+										purple_url_encode(xd->xfer_idstring_for_relay),
+										purple_normalize(account, purple_account_get_username(account)),
+										xfer->who,
+										cookies,
+										xd->host);
+		}
+		else
+		{
+			purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15);
+			g_free(cookies);
+			return;
+		}
+		xd->txbuflen = strlen(xd->txbuf);
+		xd->txbuf_written = 0;
+		g_free(cookies);
+	}
+
+	if (!xd->tx_handler)
+	{
+		xd->tx_handler = purple_input_add(source, PURPLE_INPUT_WRITE,
+			yahoo_xfer_send_cb_15, xfer);
+		yahoo_xfer_send_cb_15(xfer, source, PURPLE_INPUT_WRITE);
+	}
+}
+
+void yahoo_process_filetrans_15(PurpleConnection *gc, struct yahoo_packet *pkt)
+{
+	char *from = NULL;
+	char *to = NULL;
+	char *imv = NULL;
+	long val_222 = 0L;
+	PurpleXfer *xfer;
+	struct yahoo_data *yd;
+	struct yahoo_xfer_data *xfer_data;
+	char *service = NULL;
+	char *filename = NULL;
+	char *xfer_peer_idstring = NULL;
+	unsigned long filesize = 0L;
+	GSList *l;
+	GSList *filename_list = NULL;
+	GSList *size_list = NULL;
+	int nooffiles = 0;
+	
+	yd = gc->proto_data;
+
+	for (l = pkt->hash; l; l = l->next) {
+		struct yahoo_pair *pair = l->data;
+
+		switch (pair->key) {
+		case 4:
+			from = pair->value;
+			break;
+		case 5:
+			to = pair->value;
+			break;
+		case 265:
+			xfer_peer_idstring = pair->value;
+			break;
+		case 27:
+			filename_list = g_slist_prepend(filename_list, g_strdup(pair->value));
+			nooffiles++;
+			break;
+		case 28:
+			size_list = g_slist_prepend(size_list, g_strdup(pair->value));
+			break;
+		case 222:
+			val_222 = atol(pair->value);
+			/* 1=send, 2=cancel, 3=accept, 4=reject */ 
+			break;
+
+		/*check for p2p and imviron .... not sure it comes by this service packet. Since it was bundled with filexfer in old ymsg version, still keeping it.*/
+		case 49:
+			service = pair->value;
+			break;
+		case 63:
+			imv = pair->value;
+			break;
+		/*end check*/
+
+		}
+	}
+	if(!xfer_peer_idstring)
+		return;
+
+	if(val_222 == 2 || val_222 == 4)
+	{
+		xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map,
+								   xfer_peer_idstring);
+		if(!xfer) return;
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+	if(val_222 == 3)
+	{
+		xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map,
+								   xfer_peer_idstring);
+		if(!xfer)
+			return;
+		/*
+		*	In the file trans info packet tht we must reply with , we are supposed to mention the ip address...
+		*	purple connect does not give me a way of finding the ip address...
+		*	so, purple dnsquery is used... but retries, trying with next ip address etc. is not implemented..TODO
+		*/
+		if (yd->jp)
+		{
+			purple_dnsquery_a(YAHOOJP_XFER_RELAY_HOST, YAHOOJP_XFER_RELAY_PORT, yahoo_xfer_dns_connected_15, xfer);
+		}
+		else
+		{
+			purple_dnsquery_a(YAHOO_XFER_RELAY_HOST, YAHOO_XFER_RELAY_PORT, yahoo_xfer_dns_connected_15, xfer);
+		}
+		return;
+	}
+
+	/*processing for p2p and imviron .... not sure it comes by this service packet. Since it was bundled with filexfer in old ymsg version, still keeping it.*/
+	/*
+	* The remote user has changed their IMVironment.  We
+	* record it for later use.
+	*/
+	if (from && imv && service && (strcmp("IMVIRONMENT", service) == 0)) {
+		g_hash_table_replace(yd->imvironments, g_strdup(from), g_strdup(imv));
+		return;
+	}
+	
+	if (pkt->service == YAHOO_SERVICE_P2PFILEXFER) {
+		if (service && (strcmp("FILEXFER", service) != 0)) {
+			purple_debug_misc("yahoo", "unhandled service 0x%02x\n", pkt->service);
+			return;
+		}
+	}
+	/*end processing*/
+
+	if(!filename_list)
+		return;
+	/* have to change list into order in which client at other end sends */
+	filename_list = g_slist_reverse(filename_list);
+	size_list = g_slist_reverse(size_list);
+	filename = filename_list->data;
+	filesize = atol(size_list->data);
+
+	if(!from) return;
+	xfer_data = g_new0(struct yahoo_xfer_data, 1);
+	xfer_data->version = 15;
+	xfer_data->firstoflist = TRUE;
+	xfer_data->gc = gc;
+	xfer_data->xfer_peer_idstring = g_strdup(xfer_peer_idstring);
+	xfer_data->filename_list = filename_list;
+	xfer_data->size_list = size_list;
+	
+	/* Build the file transfer handle. */
+	xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, from);
+	xfer->message = NULL;
+
+	if (xfer)
+	{
+		/* Set the info about the incoming file. */
+		char *utf8_filename = yahoo_string_decode(gc, filename, TRUE);
+		purple_xfer_set_filename(xfer, utf8_filename);
+		g_free(utf8_filename);
+		purple_xfer_set_size(xfer, filesize);
+
+		xfer->data = xfer_data;
+
+
+		/* Setup our I/O op functions */
+		purple_xfer_set_init_fnc(xfer,        yahoo_xfer_init_15);
+		purple_xfer_set_start_fnc(xfer,       yahoo_xfer_start);
+		purple_xfer_set_end_fnc(xfer,         yahoo_xfer_end);
+		purple_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send);
+		purple_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv);
+		purple_xfer_set_read_fnc(xfer,        yahoo_xfer_read);
+		purple_xfer_set_write_fnc(xfer,       yahoo_xfer_write);
+		purple_xfer_set_request_denied_fnc(xfer,yahoo_xfer_cancel_recv);
+
+		g_hash_table_insert(yd->xfer_peer_idstring_map,
+							xfer_data->xfer_peer_idstring,
+							xfer);
+		
+		if(nooffiles > 1) {
+			gchar* message;
+			message = g_strdup_printf(_("%s is trying to send you a group of %d files.\n"), xfer->who, nooffiles);
+			purple_xfer_conversation_write(xfer, message, FALSE);
+			g_free(message);
+		}
+		/* Now perform the request */
+		purple_xfer_request(xfer);
+	}
+}
+
+void yahoo_process_filetrans_info_15(PurpleConnection *gc, struct yahoo_packet *pkt)
+{
+	char *from = NULL;
+	char *to = NULL;
+	char *url = NULL;
+	long val_249 = 0;
+	long val_66 = 0;
+	PurpleXfer *xfer;
+	struct yahoo_data *yd;
+	struct yahoo_xfer_data *xfer_data;
+	char *filename = NULL;
+	char *xfer_peer_idstring = NULL;
+	char *xfer_idstring_for_relay = NULL;
+	GSList *l;
+	struct yahoo_packet *pkt_to_send;
+	PurpleAccount *account;
+
+	yd = gc->proto_data;
+
+	for (l = pkt->hash; l; l = l->next) {
+		struct yahoo_pair *pair = l->data;
+
+		switch (pair->key) {
+		case 4:
+			from = pair->value;
+			break;
+		case 5:
+			to = pair->value;
+			break;
+		case 265:
+			xfer_peer_idstring = pair->value;
+			break;
+		case 27:
+			filename = pair->value;
+			break;
+		case 66:
+			val_66 = strtol(pair->value, NULL, 10);
+			break;
+		case 249:
+			val_249 = strtol(pair->value, NULL, 10); /*
+					* really pissed off with this- i hv seen 2 occurences of this
+					* being 1(its normally 3) - and in those cases, the url
+					* format and corresponding processing seems to be different
+					* (i havent tested - couldnt reproduce a 1), although i 
+					* guess its easier.
+					*/
+			break;
+		case 250:
+			url = pair->value;
+			break;
+		case 251:
+			xfer_idstring_for_relay = pair->value;
+			break;
+		}
+	}
+
+	if(!xfer_peer_idstring)
+		return;
+
+	xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, xfer_peer_idstring);
+
+	if(!xfer) return;
+
+	if(val_66==-1)
+	{
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+
+	xfer_data = xfer->data;
+
+	xfer_data->info_val_249 = val_249;
+	xfer_data->xfer_idstring_for_relay = g_strdup(xfer_idstring_for_relay);
+	if (!purple_url_parse(url, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL)) {
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+
+	account = purple_connection_get_account(xfer_data->gc);
+
+	pkt_to_send = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15,
+		YAHOO_STATUS_AVAILABLE, yd->session_id);
+
+	yahoo_packet_hash(pkt_to_send, "ssssisi",
+		1, purple_normalize(account, purple_account_get_username(account)),
+		5, xfer->who,
+		265, xfer_data->xfer_peer_idstring,
+		27, xfer->filename,
+		249, xfer_data->info_val_249,
+		251, xfer_data->xfer_idstring_for_relay,
+		222, 3);
+
+	yahoo_packet_send_and_free(pkt_to_send, yd);
+	if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port,
+		yahoo_xfer_connected_15, xfer) == NULL) {
+		purple_notify_error(gc, NULL, _("File Transfer Failed"),
+			_("Unable to establish file descriptor."));
+		purple_xfer_cancel_remote(xfer);
+		}
+
+}
+/*TODO: Check filename etc. No probs till some hacker comes in the way*/
+void yahoo_process_filetrans_acc_15(PurpleConnection *gc, struct yahoo_packet *pkt)
+{
+	gchar *xfer_peer_idstring = NULL;
+	gchar *xfer_idstring_for_relay = NULL;
+	PurpleXfer *xfer;
+	struct yahoo_data *yd;
+	struct yahoo_xfer_data *xfer_data;
+	GSList *l;
+	PurpleAccount *account;
+	long val_66 = 0;
+
+	yd = gc->proto_data;
+	for (l = pkt->hash; l; l = l->next) {
+		struct yahoo_pair *pair = l->data;
+
+		switch (pair->key) {
+		case 251:
+			xfer_idstring_for_relay = pair->value;
+			break;
+		case 265:
+			xfer_peer_idstring = pair->value;
+			break;
+		case 66:
+			val_66 = atol(pair->value);
+		}
+	}
+
+	xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, xfer_peer_idstring);
+	if(!xfer) return;
+
+	if(val_66 == -1 || !(xfer_idstring_for_relay))
+	{
+		purple_xfer_cancel_remote(xfer);
+		return;
+	}
+
+	xfer_data = xfer->data;
+	xfer_data->xfer_idstring_for_relay = g_strdup(xfer_idstring_for_relay);
+	xfer_data->status_15 = ACCEPTED;
+	account = purple_connection_get_account(gc);
+
+	if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port,
+		yahoo_xfer_connected_15, xfer) == NULL)
+	{
+		purple_notify_error(gc, NULL, _("File Transfer Failed"),_("Unable to connect"));
+			purple_xfer_cancel_remote(xfer);
+	}
+}
--- a/libpurple/protocols/yahoo/yahoo_filexfer.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoo_filexfer.h	Wed Feb 06 03:35:04 2008 +0000
@@ -30,16 +30,6 @@
 void yahoo_process_p2pfilexfer( PurpleConnection *gc, struct yahoo_packet *pkt );
 
 /**
- * Process ymsg version 7 file receive invites.
- */
-void yahoo_process_y7_filetransfer(PurpleConnection *gc, struct yahoo_packet *pkt);
-
-/**
- * Process ymsg version 7 file receive connection setups.
- */
-void yahoo_process_y7_filetransfer_info(PurpleConnection *gc, struct yahoo_packet *pkt);
-
-/**
  * Process ymsg file receive invites.
  */
 void yahoo_process_filetransfer(PurpleConnection *gc, struct yahoo_packet *pkt);
@@ -61,4 +51,8 @@
  */
 void yahoo_send_file(PurpleConnection *gc, const char *who, const char *file);
 
+void yahoo_process_filetrans_15(PurpleConnection *gc, struct yahoo_packet *pkt);
+void yahoo_process_filetrans_info_15(PurpleConnection *gc, struct yahoo_packet *pkt);
+void yahoo_process_filetrans_acc_15(PurpleConnection *gc, struct yahoo_packet *pkt);
+
 #endif
--- a/libpurple/protocols/yahoo/yahoo_friend.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoo_friend.h	Wed Feb 06 03:35:04 2008 +0000
@@ -48,6 +48,7 @@
 	gboolean bicon_sent_request;
 	YahooPresenceVisibility presence;
 	int protocol; /* 1=LCS, 2=MSN*/
+	long int version_id;
 } YahooFriend;
 
 YahooFriend *yahoo_friend_find(PurpleConnection *gc, const char *name);
--- a/libpurple/protocols/yahoo/yahoo_packet.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoo_packet.h	Wed Feb 06 03:35:04 2008 +0000
@@ -99,12 +99,12 @@
 	YAHOO_SERVICE_VERIFY_ID_EXISTS = 0xc8,
 	YAHOO_SERVICE_AUDIBLE = 0xd0,
 	YAHOO_SERVICE_AUTH_REQ_15 = 0xd6,
-	YAHOO_SERVICE_Y7_FILETRANSFER = 0xdc,
-	YAHOO_SERVICE_Y7_FILETRANSFER_INFO = 0xdd,
-	YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT = 0xde,
 	YAHOO_SERVICE_CHGRP_15 = 0xe7,
 	YAHOO_SERVICE_STATUS_15 = 0xf0,
 	YAHOO_SERVICE_LIST_15 = 0xf1,
+	YAHOO_SERVICE_FILETRANS_15 = 0xdc,
+	YAHOO_SERVICE_FILETRANS_INFO_15 = 0xdd,
+	YAHOO_SERVICE_FILETRANS_ACC_15 = 0xde,
 	YAHOO_SERVICE_WEBLOGIN = 0x0226,
 	YAHOO_SERVICE_SMS_MSG = 0x02ea
 };
--- a/libpurple/protocols/yahoo/yahoochat.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoochat.c	Wed Feb 06 03:35:04 2008 +0000
@@ -114,6 +114,7 @@
 
 void yahoo_process_conference_invite(PurpleConnection *gc, struct yahoo_packet *pkt)
 {
+	PurpleAccount *account;
 	GSList *l;
 	char *room = NULL;
 	char *who = NULL;
@@ -124,6 +125,8 @@
 	if (pkt->status == 2)
 		return; /* XXX */
 
+	account = purple_connection_get_account(gc);
+
 	members = g_string_sized_new(512);
 
 	for (l = pkt->hash; l; l = l->next) {
@@ -159,8 +162,9 @@
 		return;
 	}
 
-	if (!yahoo_privacy_check(gc, who) ||
-			(purple_account_get_bool(purple_connection_get_account(gc), "ignore_invites", FALSE))) {
+	if (!purple_privacy_check(account, who) ||
+			(purple_account_get_bool(account, "ignore_invites", FALSE)))
+	{
 		purple_debug_info("yahoo",
 		    "Invite to conference %s from %s has been dropped.\n", room, who);
 		g_free(room);
@@ -203,7 +207,8 @@
 			break;
 		}
 	}
-	if (!yahoo_privacy_check(gc, who)) {
+	if (!purple_privacy_check(purple_connection_get_account(gc), who))
+	{
 		g_free(room);
 		g_free(msg);
 		return;
@@ -664,11 +669,14 @@
 
 void yahoo_process_chat_addinvite(PurpleConnection *gc, struct yahoo_packet *pkt)
 {
+	PurpleAccount *account;
 	GSList *l;
 	char *room = NULL;
 	char *msg = NULL;
 	char *who = NULL;
 
+	account = purple_connection_get_account(gc);
+
 	for (l = pkt->hash; l; l = l->next) {
 		struct yahoo_pair *pair = l->data;
 
@@ -696,8 +704,9 @@
 	if (room && who) {
 		GHashTable *components;
 
-		if (!yahoo_privacy_check(gc, who) ||
-				(purple_account_get_bool(purple_connection_get_account(gc), "ignore_invites", FALSE))) {
+		if (!purple_privacy_check(account, who) ||
+				(purple_account_get_bool(account, "ignore_invites", FALSE)))
+		{
 			purple_debug_info("yahoo", "Invite to room %s from %s has been dropped.\n", room, who);
 			g_free(room);
 			g_free(msg);
@@ -1461,28 +1470,30 @@
 
 PurpleRoomlist *yahoo_roomlist_get_list(PurpleConnection *gc)
 {
-	struct yahoo_roomlist *yrl;
+	PurpleAccount *account;
 	PurpleRoomlist *rl;
-	const char *rll;
+	PurpleRoomlistField *f;
+	GList *fields = NULL;
+	struct yahoo_roomlist *yrl;
+	const char *rll, *rlurl;
 	char *url;
-	GList *fields = NULL;
-	PurpleRoomlistField *f;
 
-	rll = purple_account_get_string(purple_connection_get_account(gc),
-								  "room_list_locale", YAHOO_ROOMLIST_LOCALE);
+	account = purple_connection_get_account(gc);
 
-	if (rll != NULL && *rll != '\0') {
-		url = g_strdup_printf("%s?chatcat=0&intl=%s",
-	        purple_account_get_string(purple_connection_get_account(gc),
-	        "room_list", YAHOO_ROOMLIST_URL), rll);
-	} else {
-		url = g_strdup_printf("%s?chatcat=0",
-	        purple_account_get_string(purple_connection_get_account(gc),
-	        "room_list", YAHOO_ROOMLIST_URL));
+	/* for Yahoo Japan, it appears there is only one valid URL and locale */
+	if(purple_account_get_bool(account, "yahoojp", FALSE)) {
+		rll = YAHOOJP_ROOMLIST_LOCALE;
+		rlurl = YAHOOJP_ROOMLIST_URL;
+	}
+	else { /* but for the rest of the world that isn't the case */
+		rll = purple_account_get_string(account, "room_list_locale", YAHOO_ROOMLIST_LOCALE);
+		rlurl = purple_account_get_string(account, "room_list", YAHOO_ROOMLIST_URL);
 	}
 
+	url = g_strdup_printf("%s?chatcat=0&intl=%s", rlurl, rll);
+
 	yrl = g_new0(struct yahoo_roomlist, 1);
-	rl = purple_roomlist_new(purple_connection_get_account(gc));
+	rl = purple_roomlist_new(account);
 	yrl->list = rl;
 
 	purple_url_parse(url, &(yrl->host), NULL, &(yrl->path), NULL, NULL);
@@ -1508,7 +1519,7 @@
 
 	purple_roomlist_set_fields(rl, fields);
 
-	if (purple_proxy_connect(NULL, purple_connection_get_account(gc), yrl->host, 80,
+	if (purple_proxy_connect(NULL, account, yrl->host, 80,
 	                       yahoo_roomlist_got_connected, yrl) == NULL)
 	{
 		purple_notify_error(gc, NULL, _("Connection problem"), _("Unable to fetch room list."));
--- a/libpurple/protocols/zephyr/Zinternal.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/zephyr/Zinternal.c	Wed Feb 06 03:35:04 2008 +0000
@@ -33,8 +33,6 @@
 #include <utmp.h>
 #endif
 
-extern char *inet_ntoa ();
-
 int __Zephyr_fd = -1;
 int __Zephyr_open;
 int __Zephyr_port = -1;
@@ -144,7 +142,7 @@
 
 /* Return 1 if there is a packet waiting, 0 otherwise */
 
-static int Z_PacketWaiting()
+static int Z_PacketWaiting(void)
 {
     struct timeval tv;
     fd_set read;
@@ -158,7 +156,7 @@
 
 /* Wait for a complete notice to become available */
 
-Code_t Z_WaitForComplete()
+Code_t Z_WaitForComplete(void)
 {
     Code_t retval;
 
@@ -195,9 +193,7 @@
  * notices that haven't been touched in a while
  */
 
-static struct _Z_InputQ *Z_SearchQueue(uid, kind)
-    ZUnique_Id_t *uid;
-    ZNotice_Kind_t kind;
+static struct _Z_InputQ *Z_SearchQueue(ZUnique_Id_t *uid, ZNotice_Kind_t kind)
 {
     register struct _Z_InputQ *qptr;
     struct _Z_InputQ *next;
--- a/libpurple/protocols/zephyr/zephyr.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/protocols/zephyr/zephyr.c	Wed Feb 06 03:35:04 2008 +0000
@@ -53,7 +53,7 @@
 
 extern Code_t ZGetLocations(ZLocations_t *, int *);
 extern Code_t ZSetLocation(char *);
-extern Code_t ZUnsetLocation();
+extern Code_t ZUnsetLocation(void);
 extern Code_t ZGetSubscriptions(ZSubscription_t *, int*);
 extern char __Zephyr_realm[];
 typedef struct _zframe zframe;
@@ -156,13 +156,20 @@
 #endif
 
 static Code_t zephyr_subscribe_to(zephyr_account* zephyr, char* class, char *instance, char *recipient, char* galaxy) {
+	size_t result;
+	Code_t ret_val = -1;
 
 	if (use_tzc(zephyr)) {
 		/* ((tzcfodder . subscribe) ("class" "instance" "recipient")) */
 		gchar *zsubstr = g_strdup_printf("((tzcfodder . subscribe) (\"%s\" \"%s\" \"%s\"))\n",class,instance,recipient);
-		write(zephyr->totzc[ZEPHYR_FD_WRITE],zsubstr,strlen(zsubstr));
+		size_t len = strlen(zsubstr);
+		result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zsubstr,len);
+		if (result != len) {
+			purple_debug_error("zephyr", "Unable to write a message: %s\n", g_strerror(errno));
+		} else {
+			ret_val = ZERR_NONE;
+		}
 		g_free(zsubstr);
-		return ZERR_NONE;
 	}
 	else {
 		if (use_zeph02(zephyr)) {
@@ -170,13 +177,10 @@
 			sub.zsub_class = class;
 			sub.zsub_classinst = instance;
 			sub.zsub_recipient = recipient; 
-			return ZSubscribeTo(&sub,1,0);
-		} else {
-			/* This should not happen */
-			return -1;
+			ret_val = ZSubscribeTo(&sub,1,0);
 		}
 	}
-	return -1;
+	return ret_val;
 }
 
 char *local_zephyr_normalize(zephyr_account* zephyr,const char *);
@@ -854,52 +858,8 @@
 			
 			if (!g_ascii_strcasecmp(notice.z_opcode,"PING"))
 				serv_got_typing(gc,stripped_sender,ZEPHYR_TYPING_RECV_TIMEOUT, PURPLE_TYPING);
-			else {
-				/* Based on the values of
-				   account->permit_deny,
-				   account->permit, account>deny , and
-				   the buddylist */
-
-				GSList* l;
-				gboolean in_deny;
-
-				switch (gc->account->perm_deny) {
-				case PURPLE_PRIVACY_ALLOW_ALL: 
-					in_deny = 0; break;
-				case PURPLE_PRIVACY_DENY_ALL: 
-					in_deny = 1; break;
-				case PURPLE_PRIVACY_ALLOW_USERS: /* See if stripped_sender is in gc->account->permit and allow appropriately */
-					in_deny = 1;
-					for(l=gc->account->permit;l!=NULL;l=l->next) {
-						if (!purple_utf8_strcasecmp(stripped_sender, purple_normalize(gc->account, (char *)l->data))) {
-							in_deny=0;
-							break;
-						} 
-					}
-					break;
-				case PURPLE_PRIVACY_DENY_USERS: /* See if stripped_sender is in gc->account->deny and deny if so */ 
-					in_deny = 0;
-					for(l=gc->account->deny;l!=NULL;l=l->next) {
-						if (!purple_utf8_strcasecmp(stripped_sender, purple_normalize(gc->account, (char *)l->data))) {
-							in_deny=1;
-							break;
-						} 
-					}
-					break;
-				case PURPLE_PRIVACY_ALLOW_BUDDYLIST: 
-					in_deny = 1;
-					if (purple_find_buddy(gc->account,stripped_sender)!=NULL) {
-						in_deny = 0;
-					}
-					break;
-				default: 
-					in_deny=0; break;
-				}
-				
-				if (!in_deny) {
-					serv_got_im(gc, stripped_sender, buf3, flags, time(NULL));
-				}
-			}
+			else
+				serv_got_im(gc, stripped_sender, buf3, flags, time(NULL));
 
 			g_free(stripped_sender);
 		} else {
@@ -1373,7 +1333,11 @@
 					} else 
 						if (use_tzc(zephyr)) {
 							gchar *zlocstr = g_strdup_printf("((tzcfodder . zlocate) \"%s\")\n",chk);
-							write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,strlen(zlocstr));
+							size_t len = strlen(zlocstr);
+							size_t result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,len);
+							if (result != len) {
+								purple_debug_error("zephyr", "Unable to write a message: %s\n", g_strerror(errno));
+							}
 							g_free(zlocstr);
 						}
 				}
@@ -1386,7 +1350,7 @@
 
 #endif /* WIN32 */
 
-static char *get_exposure_level()
+static char *get_exposure_level(void)
 {
 	/* XXX add real error reporting */
 	char *exposure = ZGetVariable("exposure");
@@ -2058,7 +2022,7 @@
 static int zephyr_send_message(zephyr_account *zephyr,char* zclass, char* instance, char* recipient, const char *im, 
 			       const char *sig, char *opcode) ;
 
-static const char * zephyr_get_signature()
+static const char * zephyr_get_signature(void)
 {
 	/* XXX add zephyr error reporting */
 	const char * sig =ZGetVariable("zwrite-signature");
@@ -2193,6 +2157,8 @@
 	html_buf2 = purple_unescape_html(html_buf);
 
 	if(use_tzc(zephyr)) {
+		size_t len;
+		size_t result;
 		char* zsendstr;
 		/* CMU cclub tzc doesn't grok opcodes for now  */
 		char* tzc_sig = zephyr_tzc_escape_msg(sig);
@@ -2200,7 +2166,14 @@
 		zsendstr = g_strdup_printf("((tzcfodder . send) (class . \"%s\") (auth . t) (recipients (\"%s\" . \"%s\")) (message . (\"%s\" \"%s\"))	) \n",
 					   zclass, instance, recipient, tzc_sig, tzc_body);
 		/*		fprintf(stderr,"zsendstr = %s\n",zsendstr); */
-		write(zephyr->totzc[ZEPHYR_FD_WRITE],zsendstr,strlen(zsendstr));
+		len = strlen(zsendstr);
+		result = write(zephyr->totzc[ZEPHYR_FD_WRITE], zsendstr, len);
+		if (result != len) {
+			g_free(zsendstr);
+			g_free(html_buf2);
+			g_free(html_buf);
+			return errno;
+		}
 		g_free(zsendstr);
 	} else if (use_zeph02(zephyr)) {
 		ZNotice_t notice;
@@ -2221,6 +2194,9 @@
 		purple_debug_info("zephyr","About to send notice\n");
 		if (! ZSendNotice(&notice, ZAUTH) == ZERR_NONE) {
 			/* XXX handle errors here */
+			g_free(buf);
+			g_free(html_buf2);
+			g_free(html_buf);
 			return 0;
 		}
 		purple_debug_info("zephyr","notice sent\n");
@@ -2252,12 +2228,32 @@
 	return buf;
 }
 
+static const char *zephyr_normalize(const PurpleAccount *account, const char *who)
+{
+	static char buf[BUF_LEN];
+	PurpleConnection *gc;
+	char *tmp;
+
+	gc = purple_account_get_connection(account);
+	tmp = local_zephyr_normalize(gc->proto_data, who);
+
+	if (strlen(tmp) >= sizeof(buf)) {
+		g_free(tmp);
+		return NULL;
+	}
+
+	strcpy(buf, tmp);
+	g_free(tmp);
+
+	return buf;
+}
+
 static void zephyr_zloc(PurpleConnection *gc, const char *who)
 {
 	ZAsyncLocateData_t ald;
 	zephyr_account *zephyr = gc->proto_data;
 	gchar* normalized_who = local_zephyr_normalize(zephyr,who);
-	
+
 	if (use_zeph02(zephyr)) {
 		if (ZRequestLocations(normalized_who, &ald, UNACKED, ZAUTH) == ZERR_NONE) {
 			zephyr->pending_zloc_names = g_list_append(zephyr->pending_zloc_names,
@@ -2266,14 +2262,22 @@
 			/* XXX deal with errors somehow */
 		}
 	} else if (use_tzc(zephyr)) {
+		size_t len;
+		size_t result;
 		char* zlocstr = g_strdup_printf("((tzcfodder . zlocate) \"%s\")\n",normalized_who);
 		zephyr->pending_zloc_names = g_list_append(zephyr->pending_zloc_names, g_strdup(normalized_who));
-		write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,strlen(zlocstr));
+		len = strlen(zlocstr);
+		result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,len);
+		if (result != len) {
+			purple_debug_error("zephyr", "Unable to write a message: %s\n", g_strerror(errno));
+		}
 		g_free(zlocstr);
 	}
 }
 
 static void zephyr_set_status(PurpleAccount *account, PurpleStatus *status) {
+	size_t len;
+	size_t result;
 	zephyr_account *zephyr = purple_account_get_connection(account)->proto_data;
 	PurpleStatusPrimitive primitive = purple_status_type_get_primitive(purple_status_get_type(status));
 
@@ -2291,7 +2295,11 @@
 		}
 		else {
 			char *zexpstr = g_strdup_printf("((tzcfodder . set-location) (hostname . \"%s\") (exposure . \"%s\"))\n",zephyr->ourhost,zephyr->exposure);
-			write(zephyr->totzc[ZEPHYR_FD_WRITE],zexpstr,strlen(zexpstr));
+			len = strlen(zexpstr);
+			result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zexpstr,len);
+			if (result != len) {
+				purple_debug_error("zephyr", "Unable to write message: %s\n", g_strerror(errno));
+			}
 			g_free(zexpstr);
 		}
 	} 
@@ -2301,7 +2309,11 @@
 			ZSetLocation(EXPOSE_OPSTAFF);
 		} else {
 			char *zexpstr = g_strdup_printf("((tzcfodder . set-location) (hostname . \"%s\") (exposure . \"%s\"))\n",zephyr->ourhost,EXPOSE_OPSTAFF);
-			write(zephyr->totzc[ZEPHYR_FD_WRITE],zexpstr,strlen(zexpstr));
+			len = strlen(zexpstr);
+			result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zexpstr,len);
+			if (result != len) {
+				purple_debug_error("zephyr", "Unable to write message: %s\n", g_strerror(errno));
+			}
 			g_free(zexpstr);
 		}
 	}
@@ -2676,7 +2688,7 @@
 		return PURPLE_CMD_RET_FAILED;
 }
 
-static void zephyr_register_slash_commands()
+static void zephyr_register_slash_commands(void)
 {
 
 	purple_cmd_register("msg","ws", PURPLE_CMD_P_PRPL,
@@ -2746,36 +2758,6 @@
 }
 
 
-static void
-zephyr_add_deny(PurpleConnection *gc, const char *who)
-{
-	purple_privacy_deny_add(gc->account,who,1);
-}
-
-static void
-zephyr_remove_deny(PurpleConnection *gc, const char *who)
-{
-	purple_privacy_deny_remove(gc->account,who,1);
-}
-
-static void
-zephyr_add_permit(PurpleConnection *gc, const char *who)
-{
-	purple_privacy_permit_add(gc->account,who,1);
-}
-
-static void
-zephyr_remove_permit(PurpleConnection *gc, const char *who)
-{
-	purple_privacy_permit_remove(gc->account,who,1);
-}
-
-static void
-zephyr_set_permit_deny(PurpleConnection *gc)
-{
-	/* This doesn't have to do anything, since really, we can just check account->perm_deny when deciding whether to di */
-	return;
-}
 static int zephyr_resubscribe(PurpleConnection *gc)
 {
 	/* Resubscribe to the in-memory list of subscriptions and also
@@ -2884,11 +2866,11 @@
 	NULL,					/* add_buddies */
 	NULL,					/* remove_buddy */
 	NULL,					/* remove_buddies */
-	zephyr_add_permit,		/* add_permit */
-	zephyr_add_deny,		/* add_deny */
-	zephyr_remove_permit,	/* remove_permit */
-	zephyr_remove_deny,		/* remove_deny */
-	zephyr_set_permit_deny,	/* set_permit_deny */
+	NULL,					/* add_permit */
+	NULL,					/* add_deny */
+	NULL,					/* remove_permit */
+	NULL,					/* remove_deny */
+	NULL,					/* set_permit_deny */
 	zephyr_join_chat,		/* join_chat */
 	NULL,					/* reject_chat -- No chat invites*/
 	zephyr_get_chat_name,	/* get_chat_name */
@@ -2905,7 +2887,7 @@
 	NULL,					/* rename_group */
 	NULL,					/* buddy_free */
 	NULL,					/* convo_closed */
-	NULL,					/* normalize */
+	zephyr_normalize,		/* normalize */
 	NULL,					/* XXX set_buddy_icon */
 	NULL,					/* remove_group */
 	NULL,					/* XXX get_cb_real_name */
--- a/libpurple/prpl.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/prpl.c	Wed Feb 06 03:35:04 2008 +0000
@@ -29,6 +29,107 @@
 #include "util.h"
 
 /**************************************************************************/
+/** @name Attention Type API                                              */
+/**************************************************************************/
+PurpleAttentionType *
+purple_attention_type_new(const char *ulname, const char *name,
+						const char *inc_desc, const char *out_desc)
+{
+	PurpleAttentionType *attn = g_new0(PurpleAttentionType, 1);
+
+	purple_attention_type_set_name(attn, name);
+	purple_attention_type_set_incoming_desc(attn, inc_desc);
+	purple_attention_type_set_outgoing_desc(attn, out_desc);
+	purple_attention_type_set_unlocalized_name(attn, ulname);
+
+	return attn;
+}
+
+
+void
+purple_attention_type_set_name(PurpleAttentionType *type, const char *name)
+{
+	g_return_if_fail(type != NULL);
+
+	type->name = name;
+}
+
+void
+purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const char *desc)
+{
+	g_return_if_fail(type != NULL);
+
+	type->incoming_description = desc;
+}
+
+void
+purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const char *desc)
+{
+	g_return_if_fail(type != NULL);
+
+	type->outgoing_description = desc;
+}
+
+void
+purple_attention_type_set_icon_name(PurpleAttentionType *type, const char *name)
+{
+	g_return_if_fail(type != NULL);
+	
+	type->icon_name = name;
+}
+
+void
+purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const char *ulname)
+{
+	g_return_if_fail(type != NULL);
+
+	type->unlocalized_name = ulname;
+}
+
+const char *
+purple_attention_type_get_name(const PurpleAttentionType *type)
+{
+	g_return_val_if_fail(type != NULL, NULL);
+
+	return type->name;
+}
+
+const char *
+purple_attention_type_get_incoming_desc(const PurpleAttentionType *type)
+{
+	g_return_val_if_fail(type != NULL, NULL);
+
+	return type->incoming_description;
+}
+
+const char *
+purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type)
+{
+	g_return_val_if_fail(type != NULL, NULL);
+
+	return type->outgoing_description;
+}
+
+const char *
+purple_attention_type_get_icon_name(const PurpleAttentionType *type)
+{
+	g_return_val_if_fail(type != NULL, NULL);
+
+	if(type->icon_name == NULL || *(type->icon_name) == '\0')
+		return NULL;
+
+	return type->icon_name;
+}
+
+const char *
+purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type)
+{
+	g_return_val_if_fail(type != NULL, NULL);
+
+	return type->unlocalized_name;
+}
+
+/**************************************************************************/
 /** @name Protocol Plugin API  */
 /**************************************************************************/
 void
--- a/libpurple/prpl.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/prpl.h	Wed Feb 06 03:35:04 2008 +0000
@@ -99,9 +99,9 @@
 	const char *incoming_description;  /**< Shown when sent */
 	const char *outgoing_description;  /**< Shown when receied */
 	const char *icon_name;             /**< Icon to display (optional) */
+	const char *unlocalized_name;      /**< Unlocalized name for UIs needing it */
 
 	/* Reserved fields for future purposes */
-	gpointer _reserved1;
 	gpointer _reserved2;
 	gpointer _reserved3;
 	gpointer _reserved4;
@@ -412,6 +412,127 @@
 #endif
 
 /**************************************************************************/
+/** @name Attention Type API                                              */
+/**************************************************************************/
+/*@{*/
+
+/**
+ * Creates a new #PurpleAttentionType object and sets its mandatory parameters.
+ *
+ * @param ulname A non-localized string that can be used by UIs in need of such
+ *               non-localized strings.  This should be the same as @a name,
+ *               without localization.
+ * @param name A localized string that the UI may display for the event. This
+ *             should be the same string as @a ulname, with localization.
+ * @param inc_desc A localized description shown when the event is received.
+ * @param out_desc A localized description shown when the event is sent.
+ * @return A pointer to the new object.
+ * @since 2.4.0
+ */
+PurpleAttentionType *purple_attention_type_new(const char *ulname, const char *name,
+								const char *inc_desc, const char *out_desc);
+
+/**
+ * Sets the displayed name of the attention-demanding event.
+ *
+ * @param type The attention type.
+ * @param name The localized name that will be displayed by UIs. This should be
+ *             the same string given as the unlocalized name, but with
+ *             localization.
+ * @since 2.4.0
+ */
+void purple_attention_type_set_name(PurpleAttentionType *type, const char *name);
+
+/**
+ * Sets the description of the attention-demanding event shown in  conversations
+ * when the event is received.
+ *
+ * @param type The attention type.
+ * @param desc The localized description for incoming events.
+ * @since 2.4.0
+ */
+void purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const char *desc);
+
+/**
+ * Sets the description of the attention-demanding event shown in conversations
+ * when the event is sent.
+ *
+ * @param type The attention type.
+ * @param desc The localized description for outgoing events.
+ * @since 2.4.0
+ */
+void purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const char *desc);
+
+/**
+ * Sets the name of the icon to display for the attention event; this is optional.
+ *
+ * @param type The attention type.
+ * @param name The icon's name.
+ * @note Icons are optional for attention events.
+ * @since 2.4.0
+ */
+void purple_attention_type_set_icon_name(PurpleAttentionType *type, const char *name);
+
+/**
+ * Sets the unlocalized name of the attention event; some UIs may need this,
+ * thus it is required.
+ *
+ * @param type The attention type.
+ * @param ulname The unlocalized name.  This should be the same string given as
+ *               the localized name, but without localization.
+ * @since 2.4.0
+ */
+void purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const char *ulname);
+
+/**
+ * Get the attention type's name as displayed by the UI.
+ *
+ * @param type The attention type.
+ * @return The name.
+ * @since 2.4.0
+ */
+const char *purple_attention_type_get_name(const PurpleAttentionType *type);
+
+/**
+ * Get the attention type's description shown when the event is received.
+ *
+ * @param type The attention type.
+ * @return The description.
+ * @since 2.4.0
+ */
+const char *purple_attention_type_get_incoming_desc(const PurpleAttentionType *type);
+
+/**
+ * Get the attention type's description shown when the event is sent.
+ *
+ * @param type The attention type.
+ * @return The description.
+ * @since 2.4.0
+ */
+const char *purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type);
+
+/**
+ * Get the attention type's icon name.
+ *
+ * @param type The attention type.
+ * @return The icon name or @c NULL if unset/empty.
+ * @note Icons are optional for attention events.
+ * @since 2.4.0
+ */
+const char *purple_attention_type_get_icon_name(const PurpleAttentionType *type);
+
+/**
+ * Get the attention type's unlocalized name; this is useful for some UIs.
+ *
+ * @param type The attention type
+ * @return The unlocalized name.
+ * @since 2.4.0
+ */
+const char *purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type);
+
+/*@}*/
+
+/**************************************************************************/
 /** @name Protocol Plugin API                                             */
 /**************************************************************************/
 /*@{*/
--- a/libpurple/purple-remote	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/purple-remote	Wed Feb 06 03:35:04 2008 +0000
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 
 import dbus
 import re
--- a/libpurple/purple-send	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/purple-send	Wed Feb 06 03:35:04 2008 +0000
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 METHOD_NAME=$1
 
--- a/libpurple/purple-send-async	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/purple-send-async	Wed Feb 06 03:35:04 2008 +0000
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 METHOD_NAME=$1
 
--- a/libpurple/purple-url-handler	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/purple-url-handler	Wed Feb 06 03:35:04 2008 +0000
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 
 import dbus
 import re
--- a/libpurple/request.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/request.h	Wed Feb 06 03:35:04 2008 +0000
@@ -1318,6 +1318,8 @@
  * @param secondary      Secondary information, or @c NULL if there is none.
  * @param default_action The default action, zero-indexed; if the third action
  *                       supplied should be the default, supply <tt>2</tt>.
+ *                       The should be the action that users are most likely
+ *                       to select.
  * @param account        The #PurpleAccount associated with this request, or @c
  *                       NULL if none is.
  * @param who            The username of the buddy associated with this request,
@@ -1356,6 +1358,8 @@
  * @param secondary      Secondary information, or @c NULL if there is none.
  * @param default_action The default action, zero-indexed; if the third action
  *                       supplied should be the default, supply <tt>2</tt>.
+ *                       The should be the action that users are most likely
+ *                       to select.
  * @param account        The #PurpleAccount associated with this request, or @c
  *                       NULL if none is.
  * @param who            The username of the buddy associated with this request,
--- a/libpurple/roomlist.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/roomlist.c	Wed Feb 06 03:35:04 2008 +0000
@@ -169,20 +169,25 @@
 
 PurpleRoomlist *purple_roomlist_get_list(PurpleConnection *gc)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
 	g_return_val_if_fail(gc != NULL, NULL);
 
-	if (gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->roomlist_get_list)
+	if(prpl != NULL)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->roomlist_get_list)
 		return prpl_info->roomlist_get_list(gc);
+
 	return NULL;
 }
 
 void purple_roomlist_cancel_get_list(PurpleRoomlist *list)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleConnection *gc;
 
@@ -192,15 +197,19 @@
 
 	g_return_if_fail(gc != NULL);
 
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->roomlist_cancel)
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->roomlist_cancel)
 		prpl_info->roomlist_cancel(list);
 }
 
 void purple_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleConnection *gc;
 
@@ -211,13 +220,21 @@
 	gc = purple_account_get_connection(list->account);
 	g_return_if_fail(gc != NULL);
 
-	if (gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
+
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
-	if (prpl_info && prpl_info->roomlist_expand_category)
+	if(prpl_info && prpl_info->roomlist_expand_category)
 		prpl_info->roomlist_expand_category(list, category);
 }
 
+GList * purple_roomlist_get_fields(PurpleRoomlist *list)
+{
+	return list->fields;
+}
+
 /*@}*/
 
 /**************************************************************************/
@@ -293,6 +310,26 @@
 	g_hash_table_destroy(components);
 }
 
+PurpleRoomlistRoomType purple_roomlist_room_get_type(PurpleRoomlistRoom *room)
+{
+	return room->type;
+}
+
+const char * purple_roomlist_room_get_name(PurpleRoomlistRoom *room)
+{
+	return room->name;
+}
+
+PurpleRoomlistRoom * purple_roomlist_room_get_parent(PurpleRoomlistRoom *room)
+{
+	return room->parent;
+}
+
+GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom *room)
+{
+	return room->fields;
+}
+
 /*@}*/
 
 /**************************************************************************/
@@ -319,6 +356,21 @@
 	return f;
 }
 
+PurpleRoomlistFieldType purple_roomlist_field_get_type(PurpleRoomlistField *field)
+{
+	return field->type;
+}
+
+const char * purple_roomlist_field_get_label(PurpleRoomlistField *field)
+{
+	return field->label;
+}
+
+gboolean purple_roomlist_field_get_hidden(PurpleRoomlistField *field)
+{
+	return field->hidden;
+}
+
 /*@}*/
 
 /**************************************************************************/
--- a/libpurple/roomlist.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/roomlist.h	Wed Feb 06 03:35:04 2008 +0000
@@ -237,6 +237,15 @@
  */
 void purple_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category);
 
+/**
+ * Get the list of fields for a roomlist.
+ *
+ * @param roomlist  The roomlist, which must not be @c NULL.
+ * @constreturn A list of fields
+ * @since 2.4.0
+ */
+GList * purple_roomlist_get_fields(PurpleRoomlist *roomlist);
+
 /*@}*/
 
 /**************************************************************************/
@@ -273,6 +282,39 @@
  */
 void purple_roomlist_room_join(PurpleRoomlist *list, PurpleRoomlistRoom *room);
 
+/**
+ * Get the type of a room.
+ * @param room  The room, which must not be @c NULL.
+ * @return The type of the room.
+ * @since 2.4.0
+ */
+PurpleRoomlistRoomType purple_roomlist_room_get_type(PurpleRoomlistRoom *room);
+
+/**
+ * Get the name of a room.
+ * @param room  The room, which must not be @c NULL.
+ * @return The name of the room.
+ * @since 2.4.0
+ */
+const char * purple_roomlist_room_get_name(PurpleRoomlistRoom *room);
+
+/**
+ * Get the parent of a room.
+ * @param room  The room, which must not be @c NULL.
+ * @return The parent of the room, which can be @c NULL.
+ * @since 2.4.0
+ */
+PurpleRoomlistRoom * purple_roomlist_room_get_parent(PurpleRoomlistRoom *room);
+
+/**
+ * Get the list of fields for a room.
+ *
+ * @param room  The room, which must not be @c NULL.
+ * @constreturn A list of fields
+ * @since 2.4.0
+ */
+GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom *room);
+
 /*@}*/
 
 /**************************************************************************/
@@ -294,6 +336,36 @@
 PurpleRoomlistField *purple_roomlist_field_new(PurpleRoomlistFieldType type,
                                            const gchar *label, const gchar *name,
                                            gboolean hidden);
+
+/**
+ * Get the type of a field.
+ *
+ * @param field  A PurpleRoomlistField, which must not be @c NULL.
+ *
+ * @return  The type of the field.
+ * @since 2.4.0
+ */
+PurpleRoomlistFieldType purple_roomlist_field_get_type(PurpleRoomlistField *field);
+
+/**
+ * Get the label of a field.
+ *
+ * @param field  A PurpleRoomlistField, which must not be @c NULL.
+ *
+ * @return  The label of the field.
+ * @since 2.4.0
+ */
+const char * purple_roomlist_field_get_label(PurpleRoomlistField *field);
+
+/**
+ * Check whether a roomlist-field is hidden.
+ * @param field  A PurpleRoomlistField, which must not be @c NULL.
+ *
+ * @return  @c TRUE if the field is hidden, @c FALSE otherwise.
+ * @since 2.4.0
+ */
+gboolean purple_roomlist_field_get_hidden(PurpleRoomlistField *field);
+
 /*@}*/
 
 /**************************************************************************/
--- a/libpurple/savedstatuses.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/savedstatuses.c	Wed Feb 06 03:35:04 2008 +0000
@@ -190,7 +190,7 @@
  * does the expiration.
  */
 static void
-remove_old_transient_statuses()
+remove_old_transient_statuses(void)
 {
 	GList *l, *next;
 	PurpleSavedStatus *saved_status, *current_status;
--- a/libpurple/server.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/server.c	Wed Feb 06 03:35:04 2008 +0000
@@ -44,12 +44,16 @@
 unsigned int
 serv_send_typing(PurpleConnection *gc, const char *name, PurpleTypingState state)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->send_typing)
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->send_typing)
 		return prpl_info->send_typing(gc, name, state);
 
 	return 0;
@@ -117,24 +121,28 @@
 int serv_send_im(PurpleConnection *gc, const char *name, const char *message,
 				 PurpleMessageFlags flags)
 {
-	PurpleConversation *conv;
-	PurpleAccount *account;
-	PurplePresence *presence;
-	PurplePluginProtocolInfo *prpl_info;
+	PurpleConversation *conv = NULL;
+	PurpleAccount *account = NULL;
+	PurplePresence *presence = NULL;
+	PurplePlugin *prpl = NULL;
+	PurplePluginProtocolInfo *prpl_info = NULL;
 	int val = -EINVAL;
-	const gchar *auto_reply_pref;
+	const gchar *auto_reply_pref = NULL;
 
 	g_return_val_if_fail(gc != NULL, val);
-	g_return_val_if_fail(gc->prpl != NULL, val);
+
+	prpl = purple_connection_get_prpl(gc);
 
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	g_return_val_if_fail(prpl != NULL, val);
+
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 	account  = purple_connection_get_account(gc);
 	presence = purple_account_get_presence(account);
 
-	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, gc->account);
+	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, account);
 
-	if (prpl_info && prpl_info->send_im)
+	if(prpl_info && prpl_info->send_im)
 		val = prpl_info->send_im(gc, name, message, flags);
 
 	/*
@@ -142,7 +150,7 @@
 	 * this only reset lar->sent if we're away AND idle?
 	 */
 	auto_reply_pref = purple_prefs_get_string("/purple/away/auto_reply");
-	if ((gc->flags & PURPLE_CONNECTION_AUTO_RESP) &&
+	if((gc->flags & PURPLE_CONNECTION_AUTO_RESP) &&
 			flags & PURPLE_MESSAGE_AUTO_RESP &&
 			!purple_presence_is_available(presence) &&
 			strcmp(auto_reply_pref, "never")) {
@@ -152,7 +160,7 @@
 		lar->sent = time(NULL);
 	}
 
-	if (conv && purple_conv_im_get_send_typed_timeout(PURPLE_CONV_IM(conv)))
+	if(conv && purple_conv_im_get_send_typed_timeout(PURPLE_CONV_IM(conv)))
 		purple_conv_im_stop_send_typed_timeout(PURPLE_CONV_IM(conv));
 
 	return val;
@@ -160,28 +168,36 @@
 
 void serv_get_info(PurpleConnection *gc, const char *name)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
+	
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
-	if (gc && prpl_info && prpl_info->get_info)
+	if(gc && prpl_info && prpl_info->get_info)
 		prpl_info->get_info(gc, name);
 }
 
 void serv_set_info(PurpleConnection *gc, const char *info)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
-	PurpleAccount *account;
+	PurpleAccount *account = NULL;;
 
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
+	
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
-	if (prpl_info && prpl_info->set_info) {
+	if(prpl_info && prpl_info->set_info) {
 
 		account = purple_connection_get_account(gc);
 
-		if (purple_signal_emit_return_1(purple_accounts_get_handle(),
+		if(purple_signal_emit_return_1(purple_accounts_get_handle(),
 									  "account-setting-info", account, info))
 			return;
 
@@ -197,30 +213,45 @@
  */
 void serv_alias_buddy(PurpleBuddy *b)
 {
+	PurpleAccount *account = NULL;
+	PurpleConnection *gc = NULL;
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (b != NULL && b->account->gc && b->account->gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(b->account->gc->prpl);
+	if(b)
+		account = purple_buddy_get_account(b);
+
+	if(account)
+		gc = purple_account_get_connection(account);
 
-	if (b && prpl_info && prpl_info->alias_buddy) {
-		prpl_info->alias_buddy(b->account->gc, b->name, b->alias);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
+
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(b && prpl_info && prpl_info->alias_buddy) {
+		prpl_info->alias_buddy(gc, b->name, b->alias);
 	}
 }
 
 void
 serv_got_alias(PurpleConnection *gc, const char *who, const char *alias)
 {
-	PurpleAccount *account = purple_connection_get_account(gc);
-	GSList *buddies = purple_find_buddies(account, who);
+	PurpleAccount *account;
+	GSList *buddies;
 	PurpleBuddy *b;
 	PurpleConversation *conv;
 
+	account = purple_connection_get_account(gc);
+	buddies = purple_find_buddies(account, who);
+
 	while (buddies != NULL)
 	{
 		b = buddies->data;
 		buddies = g_slist_delete_link(buddies, buddies);
 
-		if ((b->server_alias == NULL && alias == NULL) ||
+		if((b->server_alias == NULL && alias == NULL) ||
 		    (b->server_alias && alias && !strcmp(b->server_alias, alias)))
 		{
 			continue;
@@ -229,7 +260,7 @@
 		purple_blist_server_alias_buddy(b, alias);
 
 		conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, b->name, account);
-		if (conv != NULL && alias != NULL && strcmp(alias, who))
+		if(conv != NULL && alias != NULL && strcmp(alias, who))
 		{
 			char *tmp = g_strdup_printf(_("%s is now known as %s.\n"),
 										who, alias);
@@ -296,8 +327,8 @@
 	else
 		alias = who;
 
-	if (attn && attn->outgoing_description) {
-		description = g_strdup_printf(attn->outgoing_description, alias);
+	if (attn && purple_attention_type_get_outgoing_desc(attn)) {
+		description = g_strdup_printf(purple_attention_type_get_outgoing_desc(attn), alias);
 	} else {
 		description = g_strdup_printf(_("Requesting %s's attention..."), alias);
 	}
@@ -341,8 +372,8 @@
 	else
 		alias = who;
 
-	if (attn && attn->incoming_description) {
-		description = g_strdup_printf(attn->incoming_description, alias);
+	if (attn && purple_attention_type_get_incoming_desc(attn)) {
+		description = g_strdup_printf(purple_attention_type_get_incoming_desc(attn), alias);
 	} else {
 		description = g_strdup_printf(_("%s has requested your attention!"), alias);
 	}
@@ -367,72 +398,101 @@
  */
 void serv_move_buddy(PurpleBuddy *b, PurpleGroup *og, PurpleGroup *ng)
 {
+	PurpleAccount *account = NULL;
+	PurpleConnection *gc = NULL;
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
 	g_return_if_fail(b != NULL);
 	g_return_if_fail(og != NULL);
 	g_return_if_fail(ng != NULL);
 
-	if (b->account->gc != NULL && b->account->gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(b->account->gc->prpl);
+	account = purple_buddy_get_account(b);
+	gc = purple_account_get_connection(account);
+
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (b->account->gc && og && ng) {
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(gc && og && ng) {
 		if (prpl_info && prpl_info->group_buddy) {
-			prpl_info->group_buddy(b->account->gc, b->name, og->name, ng->name);
+			prpl_info->group_buddy(gc, b->name, og->name, ng->name);
 		}
 	}
 }
 
-void serv_add_permit(PurpleConnection *g, const char *name)
+void serv_add_permit(PurpleConnection *gc, const char *name)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (g != NULL && g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->add_permit)
-		prpl_info->add_permit(g, name);
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->add_permit)
+		prpl_info->add_permit(gc, name);
 }
 
-void serv_add_deny(PurpleConnection *g, const char *name)
+void serv_add_deny(PurpleConnection *gc, const char *name)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (g != NULL && g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->add_deny)
-		prpl_info->add_deny(g, name);
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->add_deny)
+		prpl_info->add_deny(gc, name);
 }
 
-void serv_rem_permit(PurpleConnection *g, const char *name)
+void serv_rem_permit(PurpleConnection *gc, const char *name)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (g != NULL && g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->rem_permit)
-		prpl_info->rem_permit(g, name);
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->rem_permit)
+		prpl_info->rem_permit(gc, name);
 }
 
-void serv_rem_deny(PurpleConnection *g, const char *name)
+void serv_rem_deny(PurpleConnection *gc, const char *name)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (g != NULL && g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->rem_deny)
-		prpl_info->rem_deny(g, name);
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->rem_deny)
+		prpl_info->rem_deny(gc, name);
 }
 
-void serv_set_permit_deny(PurpleConnection *g)
+void serv_set_permit_deny(PurpleConnection *gc)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (g != NULL && g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
+
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 	/*
 	 * this is called when either you import a buddy list, and make lots
@@ -440,52 +500,64 @@
 	 * in the prefs. In either case you should probably be resetting and
 	 * resending the permit/deny info when you get this.
 	 */
-	if (prpl_info && prpl_info->set_permit_deny)
-		prpl_info->set_permit_deny(g);
+	if(prpl_info && prpl_info->set_permit_deny)
+		prpl_info->set_permit_deny(gc);
 }
 
-void serv_join_chat(PurpleConnection *g, GHashTable *data)
+void serv_join_chat(PurpleConnection *gc, GHashTable *data)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (g != NULL && g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->join_chat)
-		prpl_info->join_chat(g, data);
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->join_chat)
+		prpl_info->join_chat(gc, data);
 }
 
 
-void serv_reject_chat(PurpleConnection *g, GHashTable *data)
+void serv_reject_chat(PurpleConnection *gc, GHashTable *data)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (g != NULL && g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->reject_chat)
-		prpl_info->reject_chat(g, data);
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->reject_chat)
+		prpl_info->reject_chat(gc, data);
 }
 
-void serv_chat_invite(PurpleConnection *g, int id, const char *message, const char *name)
+void serv_chat_invite(PurpleConnection *gc, int id, const char *message, const char *name)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleConversation *conv;
 	char *buffy = message && *message ? g_strdup(message) : NULL;
 
-	conv = purple_find_chat(g, id);
+	conv = purple_find_chat(gc, id);
 
-	if (conv == NULL)
+	if(conv == NULL)
 		return;
 
-	if (g != NULL && g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
+
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 	purple_signal_emit(purple_conversations_get_handle(), "chat-inviting-user",
 					 conv, name, &buffy);
 
 	if (prpl_info && prpl_info->chat_invite)
-		prpl_info->chat_invite(g, id, buffy, name);
+		prpl_info->chat_invite(gc, id, buffy, name);
 
 	purple_signal_emit(purple_conversations_get_handle(), "chat-invited-user",
 					 conv, name, buffy);
@@ -499,37 +571,47 @@
  * to leave a chat without destroying the conversation.
  */
 
-void serv_chat_leave(PurpleConnection *g, int id)
+void serv_chat_leave(PurpleConnection *gc, int id)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->chat_leave)
-		prpl_info->chat_leave(g, id);
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->chat_leave)
+		prpl_info->chat_leave(gc, id);
 }
 
-void serv_chat_whisper(PurpleConnection *g, int id, const char *who, const char *message)
+void serv_chat_whisper(PurpleConnection *gc, int id, const char *who, const char *message)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (g != NULL && g->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->chat_whisper)
-		prpl_info->chat_whisper(g, id, who, message);
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->chat_whisper)
+		prpl_info->chat_whisper(gc, id, who, message);
 }
 
 int serv_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags)
 {
 	int val = -EINVAL;
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	prpl = purple_connection_get_prpl(gc);
 
-	if (prpl_info && prpl_info->chat_send)
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if(prpl_info && prpl_info->chat_send)
 		val = prpl_info->chat_send(gc, id, message, flags);
 
 	return val;
@@ -552,7 +634,7 @@
 
 	account  = purple_connection_get_account(gc);
 
-	if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->set_permit_deny == NULL) {
+	if (PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc))->set_permit_deny == NULL) {
 		/* protocol does not support privacy, handle it ourselves */
 		if (!purple_privacy_check(account, who))
 			return;
@@ -772,7 +854,7 @@
 	int plugin_return;
 
 	account = purple_connection_get_account(gc);
-	if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->set_permit_deny == NULL) {
+	if (PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc))->set_permit_deny == NULL) {
 		/* protocol does not support privacy, handle it ourselves */
 		if (!purple_privacy_check(account, who))
 			return;
@@ -920,10 +1002,14 @@
 
 void serv_send_file(PurpleConnection *gc, const char *who, const char *file)
 {
+	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
 
-	if (gc != NULL && gc->prpl != NULL)
-		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+	if(gc)
+		prpl = purple_connection_get_prpl(gc);
+
+	if(prpl)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 	if (prpl_info && prpl_info->send_file) {
 		if (!prpl_info->can_receive_file || prpl_info->can_receive_file(gc, who)) {
--- a/libpurple/signals.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/signals.h	Wed Feb 06 03:35:04 2008 +0000
@@ -44,11 +44,24 @@
 /**************************************************************************/
 /*@{*/
 
-/**
- * Signal Connect Priorities
+/** The priority of a signal connected using purple_signal_connect().
+ *
+ *  @see purple_signal_connect_priority()
  */
 #define PURPLE_SIGNAL_PRIORITY_DEFAULT     0
+/** The largest signal priority; signals with this priority will be called
+ *  <em>last</em>.  (This is highest as in numerical value, not as in order of
+ *  importance.)
+ *
+ *  @see purple_signal_connect_priority().
+ */
 #define PURPLE_SIGNAL_PRIORITY_HIGHEST  9999
+/** The smallest signal priority; signals with this priority will be called
+ *  <em>first</em>.  (This is lowest as in numerical value, not as in order of
+ *  importance.)
+ *
+ *  @see purple_signal_connect_priority().
+ */
 #define PURPLE_SIGNAL_PRIORITY_LOWEST  -9999
 
 /**
@@ -109,19 +122,21 @@
  * @param handle   The handle of the receiver.
  * @param func     The callback function.
  * @param data     The data to pass to the callback function.
- * @param priority The priority with which the handler should be called. Signal handlers are called
- *                 in order from PURPLE_SIGNAL_PRIORITY_LOWEST to PURPLE_SIGNAL_PRIORITY_HIGHEST.
+ * @param priority The priority with which the handler should be called. Signal
+ *                 handlers are called in ascending numerical order of @a
+ *                 priority from #PURPLE_SIGNAL_PRIORITY_LOWEST to
+ *                 #PURPLE_SIGNAL_PRIORITY_HIGHEST.
  *
  * @return The signal handler ID.
  *
  * @see purple_signal_disconnect()
  */
 gulong purple_signal_connect_priority(void *instance, const char *signal,
-				   void *handle, PurpleCallback func, void *data, int priority);
+	void *handle, PurpleCallback func, void *data, int priority);
 
 /**
  * Connects a signal handler to a signal for a particular object.
- * (priority defaults to 0)
+ * (Its priority defaults to 0, aka #PURPLE_SIGNAL_PRIORITY_DEFAULT.)
  * 
  * Take care not to register a handler function twice. Purple will
  * not correct any mistakes for you in this area.
@@ -137,7 +152,7 @@
  * @see purple_signal_disconnect()
  */
 gulong purple_signal_connect(void *instance, const char *signal,
-						   void *handle, PurpleCallback func, void *data);
+	void *handle, PurpleCallback func, void *data);
 
 /**
  * Connects a signal handler to a signal for a particular object.
@@ -153,18 +168,22 @@
  * @param handle   The handle of the receiver.
  * @param func     The callback function.
  * @param data     The data to pass to the callback function.
- * @param priority The order in which the signal should be added to the list
+ * @param priority The priority with which the handler should be called. Signal
+ *                 handlers are called in ascending numerical order of @a
+ *                 priority from #PURPLE_SIGNAL_PRIORITY_LOWEST to
+ *                 #PURPLE_SIGNAL_PRIORITY_HIGHEST.
  *
  * @return The signal handler ID.
  *
  * @see purple_signal_disconnect()
  */
 gulong purple_signal_connect_priority_vargs(void *instance, const char *signal,
-					void *handle, PurpleCallback func, void *data, int priority);
+	void *handle, PurpleCallback func, void *data, int priority);
 
 /**
  * Connects a signal handler to a signal for a particular object.
- * (priority defaults to 0)
+ * (Its priority defaults to 0, aka #PURPLE_SIGNAL_PRIORITY_DEFAULT.)
+ *
  * The signal handler will take a va_args of arguments, instead of
  * individual arguments.
  *
@@ -182,7 +201,7 @@
  * @see purple_signal_disconnect()
  */
 gulong purple_signal_connect_vargs(void *instance, const char *signal,
-								 void *handle, PurpleCallback func, void *data);
+	void *handle, PurpleCallback func, void *data);
 
 /**
  * Disconnects a signal handler from a signal on an object.
--- a/libpurple/status.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/status.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1310,7 +1310,8 @@
 	else if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_ACCOUNT)
 	{
 		PurpleAccount *account;
-		PurpleConnection *gc;
+		PurpleConnection *gc = NULL;
+		PurplePlugin *prpl = NULL;
 		PurplePluginProtocolInfo *prpl_info = NULL;
 
 		account = purple_presence_get_account(presence);
@@ -1339,9 +1340,11 @@
 
 		gc = purple_account_get_connection(account);
 
-		if (gc != NULL && PURPLE_CONNECTION_IS_CONNECTED(gc) &&
-				gc->prpl != NULL)
-			prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+		if(gc)
+			prpl = purple_connection_get_prpl(gc);
+
+		if(PURPLE_CONNECTION_IS_CONNECTED(gc) && prpl != NULL)
+			prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
 		if (prpl_info && prpl_info->set_idle)
 			prpl_info->set_idle(gc, (idle ? (current_time - idle_time) : 0));
--- a/libpurple/stringref.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/stringref.c	Wed Feb 06 03:35:04 2008 +0000
@@ -31,6 +31,7 @@
 #include <stdarg.h>
 
 #include "debug.h"
+#include "eventloop.h"
 #include "stringref.h"
 
 /**
@@ -87,7 +88,7 @@
 	newref->ref = 0x80000000;
 
 	if (gclist == NULL)
-		g_idle_add(gs_idle_cb, NULL);
+		purple_timeout_add(0, gs_idle_cb, NULL);
 	gclist = g_list_prepend(gclist, newref);
 
 	return newref;
--- a/libpurple/stun.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/stun.c	Wed Feb 06 03:35:04 2008 +0000
@@ -104,7 +104,7 @@
 	g_free(sc);
 }
 
-static void do_callbacks() {
+static void do_callbacks(void) {
 	while(callbacks) {
 		StunCallback cb = callbacks->data;
 		if(cb)
--- a/libpurple/tests/test_util.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/tests/test_util.c	Wed Feb 06 03:35:04 2008 +0000
@@ -71,6 +71,14 @@
 START_TEST(test_util_email_is_valid)
 {
 	fail_unless(purple_email_is_valid("purple-devel@lists.sf.net"));
+	fail_if(purple_email_is_valid("purple-devel@@lists.sf.net"));
+	fail_if(purple_email_is_valid("purple@devel@lists.sf.net"));
+	fail_if(purple_email_is_valid("purple-devel@list..sf.net"));
+	fail_if(purple_email_is_valid("purple-devel"));
+	fail_if(purple_email_is_valid("purple-devel@"));
+	fail_if(purple_email_is_valid("@lists.sf.net"));
+	fail_if(purple_email_is_valid(""));
+	fail_if(purple_email_is_valid("totally bogus"));
 }
 END_TEST
 
--- a/libpurple/upnp.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/upnp.c	Wed Feb 06 03:35:04 2008 +0000
@@ -777,7 +777,7 @@
 
 /* TODO: This could be exported */
 static const gchar *
-purple_upnp_get_internal_ip()
+purple_upnp_get_internal_ip(void)
 {
 	if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERED
 			&& control_info.internalip
--- a/libpurple/util.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/util.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1445,7 +1445,6 @@
 				ALLOW_TAG("pre");
 				ALLOW_TAG("q");
 				ALLOW_TAG("span");
-				ALLOW_TAG("strong");
 				ALLOW_TAG("ul");
 
 
@@ -1465,9 +1464,14 @@
 						plain = g_string_append_c(plain, '\n');
 					continue;
 				}
-				if(!g_ascii_strncasecmp(c, "<b>", 3) || !g_ascii_strncasecmp(c, "<bold>", strlen("<bold>"))) {
+				if(!g_ascii_strncasecmp(c, "<b>", 3) || !g_ascii_strncasecmp(c, "<bold>", strlen("<bold>")) || !g_ascii_strncasecmp(c, "<strong>", strlen("<strong>"))) {
 					struct purple_parse_tag *pt = g_new0(struct purple_parse_tag, 1);
-					pt->src_tag = *(c+2) == '>' ? "b" : "bold";
+					if (*(c+2) == '>')
+						pt->src_tag = "b";
+					else if (*(c+2) == 'o')
+						pt->src_tag = "bold";
+					else
+						pt->src_tag = "strong";
 					pt->dest_tag = "span";
 					tags = g_list_prepend(tags, pt);
 					c = strchr(c, '>') + 1;
@@ -4628,3 +4632,67 @@
 #endif /* HAVE_SIGNAL_H */
 #endif /* !_WIN32 */
 }
+
+static void
+set_status_with_attrs(PurpleStatus *status, ...)
+{
+	va_list args;
+	va_start(args, status);
+	purple_status_set_active_with_attrs(status, TRUE, args);
+	va_end(args);
+}
+
+void purple_util_set_current_song(const char *title, const char *artist, const char *album)
+{
+	GList *list = purple_accounts_get_all();
+	for (; list; list = list->next) {
+		PurplePresence *presence;
+		PurpleStatus *tune;
+		PurpleAccount *account = list->data;
+		if (!purple_account_get_enabled(account, purple_core_get_ui()))
+			continue;
+
+		presence = purple_account_get_presence(account);
+		tune = purple_presence_get_status(presence, "tune");
+		if (!tune)
+			continue;
+		if (title) {
+			set_status_with_attrs(tune,
+					PURPLE_TUNE_TITLE, title,
+					PURPLE_TUNE_ARTIST, artist,
+					PURPLE_TUNE_ALBUM, album,
+					NULL);
+		} else {
+			purple_status_set_active(tune, FALSE);
+		}
+	}
+}
+
+char * purple_util_format_song_info(const char *title, const char *artist, const char *album, gpointer unused)
+{
+	GString *string;
+	char *esc;
+
+	if (!title || !*title)
+		return NULL;
+
+	esc = g_markup_escape_text(title, -1);
+	string = g_string_new("");
+	g_string_append_printf(string, "%s", esc);
+	g_free(esc);
+
+	if (artist && *artist) {
+		esc = g_markup_escape_text(artist, -1);
+		g_string_append_printf(string, _(" - %s"), esc);
+		g_free(esc);
+	}
+
+	if (album && *album) {
+		esc = g_markup_escape_text(album, -1);
+		g_string_append_printf(string, _(" (%s)"), esc);
+		g_free(esc);
+	}
+
+	return g_string_free(string, FALSE);
+}
+
--- a/libpurple/util.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/util.h	Wed Feb 06 03:35:04 2008 +0000
@@ -85,6 +85,31 @@
  */
 void purple_menu_action_free(PurpleMenuAction *act);
 
+/**
+ * Set the appropriate presence values for the currently playing song.
+ *
+ * @param title     The title of the song, @c NULL to unset the value.
+ * @param artist    The artist of the song, can be @c NULL.
+ * @param album     The album of the song, can be @c NULL.
+ * @since 2.4.0
+ */
+void purple_util_set_current_song(const char *title, const char *artist,
+		const char *album);
+
+/**
+ * Format song information.
+ *
+ * @param title     The title of the song, @c NULL to unset the value.
+ * @param artist    The artist of the song, can be @c NULL.
+ * @param album     The album of the song, can be @c NULL.
+ * @param unused    Currently unused, must be @c NULL.
+ *
+ * @return   The formatted string. The caller must #g_free the returned string.
+ * @since 2.4.0
+ */
+char * purple_util_format_song_info(const char *title, const char *artist,
+		const char *album, gpointer unused);
+
 /**************************************************************************/
 /** @name Utility Subsystem                                               */
 /**************************************************************************/
--- a/libpurple/whiteboard.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/whiteboard.c	Wed Feb 06 03:35:04 2008 +0000
@@ -59,7 +59,8 @@
 	wb->state   = state;
 	wb->who     = g_strdup(who);
 
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl);
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(
+				purple_account_get_connection(account)));
 	purple_whiteboard_set_prpl_ops(wb, prpl_info->whiteboard_prpl_ops);
 
 	/* Start up protocol specifics */
--- a/libpurple/xmlnode.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/libpurple/xmlnode.c	Wed Feb 06 03:35:04 2008 +0000
@@ -552,6 +552,9 @@
 		g_strdup_printf("<?xml version='1.0' encoding='UTF-8' ?>" NEWLINE_S NEWLINE_S "%s", xml);
 	g_free(xml);
 
+	if (len)
+		*len += sizeof("<?xml version='1.0' encoding='UTF-8' ?>" NEWLINE_S NEWLINE_S) - 1;
+
 	return xml_with_declaration;
 }
 
--- a/pidgin/gtkaccount.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkaccount.c	Wed Feb 06 03:35:04 2008 +0000
@@ -158,25 +158,7 @@
 add_pref_box(AccountPrefsDialog *dialog, GtkWidget *parent,
 			 const char *text, GtkWidget *widget)
 {
-	GtkWidget *hbox;
-	GtkWidget *label;
-
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(parent), hbox, FALSE, FALSE, 0);
-	gtk_widget_show(hbox);
-
-	label = gtk_label_new_with_mnemonic(text);
-	gtk_size_group_add_widget(dialog->sg, label);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), widget);
-	gtk_widget_show(label);
-
-	gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, PIDGIN_HIG_BORDER);
-	gtk_widget_show(widget);
-	pidgin_set_accessible_label (widget, label);
-
-	return hbox;
+	return pidgin_add_widget_to_vbox(GTK_BOX(parent), text, dialog->sg, widget, TRUE, NULL);
 }
 
 static void
@@ -259,7 +241,7 @@
 
 	gtk_widget_grab_focus(dialog->protocol_menu);
 
-	if (!dialog->prpl_info || !dialog->prpl_info->register_user || 
+	if (!dialog->prpl_info || !dialog->prpl_info->register_user ||
 	    g_object_get_data(G_OBJECT(item), "fake")) {
 		gtk_widget_hide(dialog->register_button);
 	} else {
@@ -1759,16 +1741,14 @@
 	}
 }
 
-static gint
+static gboolean
 accedit_win_destroy_cb(GtkWidget *w, GdkEvent *event, AccountsWindow *dialog)
 {
-	/* Since this is called as the window is closing, we don't need
-	 * pidgin_accounts_window_hide() to also dispose of the window */
 	dialog->window = NULL;
 
 	pidgin_accounts_window_hide();
 
-	return 0;
+	return FALSE;
 }
 
 static gboolean
@@ -1853,7 +1833,8 @@
 							  purple_account_get_username(account));
 
 		purple_request_close_with_handle(account);
-		purple_request_action(account, NULL, buf, NULL, 0,
+		purple_request_action(account, NULL, buf, NULL,
+							PURPLE_DEFAULT_ACTION_NONE,
 							account, NULL, NULL,
 							account, 2,
 							_("Delete"), delete_account_cb,
@@ -2102,24 +2083,24 @@
 	GtkTreeViewColumn *column;
 	GtkTreeIter iter;
 	PurpleAccount *account;
-	const gchar *title;
 
 	dialog = (AccountsWindow *)user_data;
 
+	if (event->window != gtk_tree_view_get_bin_window(treeview))
+	    return FALSE;
+
 	/* Figure out which node was clicked */
 	if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(dialog->treeview), event->x, event->y, &path, &column, NULL, NULL))
 		return FALSE;
-	title = gtk_tree_view_column_get_title(column);
-	/* The -1 is required because the first two columns of the list
-	 * store are displayed as only one column in the tree view. */
-	column = gtk_tree_view_get_column(treeview, COLUMN_ENABLED-1);
+	if (column == gtk_tree_view_get_column(treeview, 0))
+		return FALSE;
+
 	gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path);
 	gtk_tree_path_free(path);
 	gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, COLUMN_DATA, &account, -1);
 
 	if ((account != NULL) && (event->button == 1) &&
-		(event->type == GDK_2BUTTON_PRESS) &&
-		(strcmp(gtk_tree_view_column_get_title(column), title)))
+		(event->type == GDK_2BUTTON_PRESS))
 	{
 		pidgin_account_dialog_show(PIDGIN_MODIFY_ACCOUNT_DIALOG, account);
 		return TRUE;
@@ -2197,6 +2178,7 @@
 	treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model));
 	dialog->treeview = treeview;
 	gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
+	g_object_unref(G_OBJECT(dialog->model));
 
 	sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
 	gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
@@ -2498,6 +2480,7 @@
 						  _("Authorize"), authorize_and_add_cb,
 						  _("Deny"), deny_no_add_cb,
 						  NULL);
+		g_object_set_data(G_OBJECT(alert), "auth_and_add", aa);
 	} else {
 		alert = pidgin_make_mini_dialog(gc, PIDGIN_STOCK_DIALOG_QUESTION,
 						  _("Authorize buddy?"), buffer, user_data,
@@ -2509,13 +2492,20 @@
 
 	g_free(buffer);
 
-	return NULL;
+	return alert;
 }
 
 static void
 pidgin_accounts_request_close(void *ui_handle)
 {
-
+	/* This is super ugly, but without API changes, this is how it works */
+	struct auth_and_add *aa = g_object_get_data(G_OBJECT(ui_handle), "auth_and_add");
+	if (aa != NULL) {
+		g_free(aa->username);
+		g_free(aa->alias);
+		g_free(aa);
+	}
+	gtk_widget_destroy(GTK_WIDGET(ui_handle));
 }
 
 static PurpleAccountUiOps ui_ops =
--- a/pidgin/gtkblist.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkblist.c	Wed Feb 06 03:35:04 2008 +0000
@@ -177,7 +177,7 @@
 } PidginBlistNode;
 
 static char dim_grey_string[8] = "";
-static char *dim_grey()
+static char *dim_grey(void)
 {
 	if (!gtkblist)
 		return "dim grey";
@@ -708,12 +708,12 @@
 	pidgin_blist_update(purple_get_blist(), node);
 }
 
-static void gtk_blist_show_systemlog_cb()
+static void gtk_blist_show_systemlog_cb(void)
 {
 	pidgin_syslog_show();
 }
 
-static void gtk_blist_show_onlinehelp_cb()
+static void gtk_blist_show_onlinehelp_cb(void)
 {
 	purple_notify_uri(NULL, PURPLE_WEBSITE "documentation");
 }
@@ -843,20 +843,10 @@
 
 	for (tmp = list; tmp; tmp = tmp->next)
 	{
-		GtkWidget *label;
-		GtkWidget *rowbox;
 		GtkWidget *input;
 
 		pce = tmp->data;
 
-		rowbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
-		gtk_box_pack_start(GTK_BOX(data->entries_box), rowbox, FALSE, FALSE, 0);
-
-		label = gtk_label_new_with_mnemonic(pce->label);
-		gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-		gtk_size_group_add_widget(data->sg, label);
-		gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0);
-
 		if (pce->is_int)
 		{
 			GtkObject *adjust;
@@ -864,7 +854,7 @@
 										1, 10, 10);
 			input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0);
 			gtk_widget_set_size_request(input, 50, -1);
-			gtk_box_pack_end(GTK_BOX(rowbox), input, FALSE, FALSE, 0);
+			pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL);
 		}
 		else
 		{
@@ -880,7 +870,7 @@
 				if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*')
 					gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR);
 			}
-			gtk_box_pack_end(GTK_BOX(rowbox), input, TRUE, TRUE, 0);
+			pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL);
 			g_signal_connect(G_OBJECT(input), "changed",
 							 G_CALLBACK(joinchat_set_sensitive_if_input_cb), data);
 		}
@@ -891,8 +881,6 @@
 			gtk_widget_grab_focus(input);
 			focus = FALSE;
 		}
-		gtk_label_set_mnemonic_widget(GTK_LABEL(label), input);
-		pidgin_set_accessible_label(input, label);
 		g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier);
 		g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int));
 		g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required));
@@ -949,7 +937,6 @@
 pidgin_blist_joinchat_show(void)
 {
 	GtkWidget *hbox, *vbox;
-	GtkWidget *rowbox;
 	GtkWidget *label;
 	PidginBuddyList *gtkblist;
 	GtkWidget *img = NULL;
@@ -988,23 +975,13 @@
 	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
 	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
 
-	rowbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
-	gtk_box_pack_start(GTK_BOX(vbox), rowbox, TRUE, TRUE, 0);
-
 	data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 
-	label = gtk_label_new_with_mnemonic(_("_Account:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(data->sg, label);
-
 	data->account_menu = pidgin_account_option_menu_new(NULL, FALSE,
 			G_CALLBACK(joinchat_select_account_cb),
 			chat_account_filter_func, data);
-	gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label),
-								  GTK_WIDGET(data->account_menu));
-	pidgin_set_accessible_label (data->account_menu, label);
+
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL);
 
 	data->entries_box = gtk_vbox_new(FALSE, 5);
 	gtk_container_add(GTK_CONTAINER(vbox), data->entries_box);
@@ -1117,7 +1094,7 @@
 	}
 }
 
-static void pidgin_blist_add_chat_cb()
+static void pidgin_blist_add_chat_cb(void)
 {
 	GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview));
 	GtkTreeIter iter;
@@ -1137,7 +1114,7 @@
 	}
 }
 
-static void pidgin_blist_add_buddy_cb()
+static void pidgin_blist_add_buddy_cb(void)
 {
 	GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview));
 	GtkTreeIter iter;
@@ -2576,6 +2553,35 @@
 	int height;
 };
 
+static PangoLayout * create_pango_layout(const char *markup, int *width, int *height)
+{
+	PangoLayout *layout;
+	int w, h;
+
+	layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL);
+	pango_layout_set_markup(layout, markup, -1);
+	pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
+	pango_layout_set_width(layout, 300000);
+
+	pango_layout_get_size (layout, &w, &h);
+	if (width)
+		*width = PANGO_PIXELS(w);
+	if (height)
+		*height = PANGO_PIXELS(h);
+	return layout;
+}
+
+static struct tooltip_data * create_tip_for_account(PurpleAccount *account)
+{
+	struct tooltip_data *td = g_new0(struct tooltip_data, 1);
+	td->status_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
+		/* Yes, status_icon, not prpl_icon */
+	if (purple_account_is_disconnected(account))
+		gdk_pixbuf_saturate_and_pixelate(td->status_icon, td->status_icon, 0.0, FALSE);
+	td->layout = create_pango_layout(purple_account_get_username(account), &td->width, &td->height);
+	return td;
+}
+
 static struct tooltip_data * create_tip_for_node(PurpleBlistNode *node, gboolean full)
 {
 	struct tooltip_data *td = g_new0(struct tooltip_data, 1);
@@ -2594,8 +2600,9 @@
 		td->prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
 	}
 	tooltip_text = pidgin_get_tooltip_text(node, full);
-	td->layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL);
-	td->name_layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL);
+	if (tooltip_text && *tooltip_text) {
+		td->layout = create_pango_layout(tooltip_text, &td->width, &td->height);
+	}
 
 	if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
 		tmp = g_markup_escape_text(purple_buddy_get_name((PurpleBuddy*)node), -1);
@@ -2612,21 +2619,9 @@
 	node_name = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", tmp);
 	g_free(tmp);
 
-	pango_layout_set_markup(td->layout, tooltip_text, -1);
-	pango_layout_set_wrap(td->layout, PANGO_WRAP_WORD);
-	pango_layout_set_width(td->layout, 300000);
-
-	pango_layout_get_size (td->layout, &td->width, &td->height);
-	td->width = PANGO_PIXELS(td->width);
-	td->height = PANGO_PIXELS(td->height);
-
-	pango_layout_set_markup(td->name_layout, node_name, -1);
-	pango_layout_set_wrap(td->name_layout, PANGO_WRAP_WORD);
-	pango_layout_set_width(td->name_layout, 300000);
-
-	pango_layout_get_size (td->name_layout, &td->name_width, &td->name_height);
-	td->name_width = PANGO_PIXELS(td->name_width) + SMALL_SPACE + PRPL_SIZE;
-	td->name_height = MAX(PANGO_PIXELS(td->name_height), PRPL_SIZE + SMALL_SPACE);
+	td->name_layout = create_pango_layout(node_name, &td->name_width, &td->name_height);
+	td->name_width += SMALL_SPACE + PRPL_SIZE;
+	td->name_height = MAX(td->name_height, PRPL_SIZE + SMALL_SPACE);
 #if 0  /* PRPL Icon as avatar */
 	if(!td->avatar && full) {
 		td->avatar = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_LARGE);
@@ -2654,13 +2649,12 @@
 	GList *l;
 	int prpl_col = 0;
 	GtkTextDirection dir = gtk_widget_get_direction(widget);
+	int status_size = 0;
 
 	if(gtkblist->tooltipdata == NULL)
 		return FALSE;
 
 	style = gtkblist->tipwindow->style;
-	gtk_paint_flat_box(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,
-			NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1);
 
 	max_text_width = 0;
 	max_avatar_width = 0;
@@ -2672,13 +2666,15 @@
 		max_text_width = MAX(max_text_width,
 				MAX(td->width, td->name_width));
 		max_avatar_width = MAX(max_avatar_width, td->avatar_width);
-	}
-
-	max_width = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + max_text_width + SMALL_SPACE + max_avatar_width + TOOLTIP_BORDER;
+		if (td->status_icon)
+			status_size = STATUS_SIZE;
+	}
+
+	max_width = TOOLTIP_BORDER + status_size + SMALL_SPACE + max_text_width + SMALL_SPACE + max_avatar_width + TOOLTIP_BORDER;
 	if (dir == GTK_TEXT_DIR_RTL)
 		prpl_col = TOOLTIP_BORDER + max_avatar_width + SMALL_SPACE;
 	else
-		prpl_col = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + max_text_width - PRPL_SIZE;
+		prpl_col = TOOLTIP_BORDER + status_size + SMALL_SPACE + max_text_width - PRPL_SIZE;
 
 	current_height = 12;
 	for(l = gtkblist->tooltipdata; l; l = l->next)
@@ -2702,11 +2698,12 @@
 		if (td->status_icon) {
 			if (dir == GTK_TEXT_DIR_RTL)
 				gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon,
-				                0, 0, max_width - TOOLTIP_BORDER - STATUS_SIZE, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
+				                0, 0, max_width - TOOLTIP_BORDER - status_size, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
 			else
 				gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon,
 				                0, 0, TOOLTIP_BORDER, current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0);
 		}
+
 		if(td->avatar) {
 			if (dir == GTK_TEXT_DIR_RTL)
 				gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL,
@@ -2717,7 +2714,7 @@
 						current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0);
 		}
 
-		if (!td->avatar_is_prpl_icon)
+		if (!td->avatar_is_prpl_icon && td->prpl_icon)
 			gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->prpl_icon,
 					0, 0,
 					prpl_col,
@@ -2734,26 +2731,31 @@
 					max_width - (td->avatar_width + TOOLTIP_BORDER),
 					current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
 #endif
-		if (dir == GTK_TEXT_DIR_RTL) {
-			gtk_paint_layout(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE,
-					NULL, gtkblist->tipwindow, "tooltip",
-					max_width  -(TOOLTIP_BORDER + STATUS_SIZE +SMALL_SPACE) - PANGO_PIXELS(300000),
-					current_height, td->name_layout);
-		} else {
-			gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE,
-					NULL, gtkblist->tipwindow, "tooltip",
-					TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE, current_height, td->name_layout);
+		if (td->name_layout) {
+			if (dir == GTK_TEXT_DIR_RTL) {
+				gtk_paint_layout(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE,
+						NULL, gtkblist->tipwindow, "tooltip",
+						max_width  -(TOOLTIP_BORDER + status_size + SMALL_SPACE) - PANGO_PIXELS(300000),
+						current_height, td->name_layout);
+			} else {
+				gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE,
+						NULL, gtkblist->tipwindow, "tooltip",
+						TOOLTIP_BORDER + status_size + SMALL_SPACE, current_height, td->name_layout);
+			}
 		}
-		if (dir != GTK_TEXT_DIR_RTL) {
-			gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE,
-					NULL, gtkblist->tipwindow, "tooltip",
-					TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE, current_height + td->name_height, td->layout);
-		} else {
-			gtk_paint_layout(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE,
-					NULL, gtkblist->tipwindow, "tooltip",
-					max_width - (TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE) - PANGO_PIXELS(300000),
-					current_height + td->name_height,
-					td->layout);
+
+		if (td->layout) {
+			if (dir != GTK_TEXT_DIR_RTL) {
+				gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE,
+						NULL, gtkblist->tipwindow, "tooltip",
+						TOOLTIP_BORDER + status_size + SMALL_SPACE, current_height + td->name_height, td->layout);
+			} else {
+				gtk_paint_layout(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE,
+						NULL, gtkblist->tipwindow, "tooltip",
+						max_width - (TOOLTIP_BORDER + status_size + SMALL_SPACE) - PANGO_PIXELS(300000),
+						current_height + td->name_height,
+						td->layout);
+			}
 		}
 
 		current_height += MAX(td->name_height + td->height, td->avatar_height) + TOOLTIP_BORDER;
@@ -2762,7 +2764,7 @@
 }
 
 static void
-pidgin_blist_destroy_tooltip_data()
+pidgin_blist_destroy_tooltip_data(void)
 {
 	while(gtkblist->tooltipdata) {
 		struct tooltip_data *td = gtkblist->tooltipdata->data;
@@ -2773,8 +2775,10 @@
 			g_object_unref(td->status_icon);
 		if(td->prpl_icon)
 			g_object_unref(td->prpl_icon);
-		g_object_unref(td->layout);
-		g_object_unref(td->name_layout);
+		if (td->layout)
+			g_object_unref(td->layout);
+		if (td->name_layout)
+			g_object_unref(td->name_layout);
 		g_free(td);
 		gtkblist->tooltipdata = g_list_delete_link(gtkblist->tooltipdata, gtkblist->tooltipdata);
 	}
@@ -2791,22 +2795,38 @@
 {
 	PurpleBlistNode *node = data;
 	int width, height;
+	GList *list;
+	int max_text_width = 0;
+	int max_avatar_width = 0;
+	int status_size = 0;
+
+	if (gtkblist->tooltipdata) {
+		gtkblist->tipwindow = NULL;
+		pidgin_blist_destroy_tooltip_data();
+	}
 
 	gtkblist->tipwindow = widget;
-	if(PURPLE_BLIST_NODE_IS_CHAT(node) ||
-	   PURPLE_BLIST_NODE_IS_BUDDY(node) ||
-	   PURPLE_BLIST_NODE_IS_GROUP(node)) {
+	if (PURPLE_BLIST_NODE_IS_CHAT(node) ||
+	   PURPLE_BLIST_NODE_IS_BUDDY(node)) {
 		struct tooltip_data *td = create_tip_for_node(node, TRUE);
 		gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td);
-		width = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE +
-			MAX(td->width, td->name_width) + SMALL_SPACE + td->avatar_width + TOOLTIP_BORDER;
-		height = TOOLTIP_BORDER + MAX(td->height + td->name_height, MAX(STATUS_SIZE, td->avatar_height))
-			+ TOOLTIP_BORDER;
-	} else if(PURPLE_BLIST_NODE_IS_CONTACT(node)) {
+	} else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
+		PurpleGroup *group = (PurpleGroup*)node;
+		GSList *accounts;
+		struct tooltip_data *td = create_tip_for_node(node, TRUE);
+		gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td);
+
+		/* Accounts with buddies in group */
+		accounts = purple_group_get_accounts(group);
+		for (; accounts != NULL;
+		     accounts = g_slist_delete_link(accounts, accounts)) {
+			PurpleAccount *account = accounts->data;
+			td = create_tip_for_account(account);
+			gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td);
+		}
+	} else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
 		PurpleBlistNode *child;
 		PurpleBuddy *b = purple_contact_get_priority_buddy((PurpleContact *)node);
-		int max_text_width = 0;
-		int max_avatar_width = 0;
 		width = height = 0;
 
 		for(child = node->child; child; child = child->next)
@@ -2818,18 +2838,25 @@
 				} else {
 					gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td);
 				}
-				max_text_width = MAX(max_text_width, MAX(td->width, td->name_width));
-				max_avatar_width = MAX(max_avatar_width, td->avatar_width);
-				height += MAX(TOOLTIP_BORDER + MAX(STATUS_SIZE,td->avatar_height),
-						TOOLTIP_BORDER + td->height + td->name_height);
 			}
 		}
-		height += TOOLTIP_BORDER;
-		width = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + max_text_width + SMALL_SPACE + max_avatar_width + TOOLTIP_BORDER;
 	} else {
 		return FALSE;
 	}
 
+	height = width = 0;
+	for (list = gtkblist->tooltipdata; list; list = list->next) {
+		struct tooltip_data *td = list->data;
+		max_text_width = MAX(max_text_width, MAX(td->width, td->name_width));
+		max_avatar_width = MAX(max_avatar_width, td->avatar_width);
+		height += MAX(TOOLTIP_BORDER + MAX(STATUS_SIZE, td->avatar_height),
+				TOOLTIP_BORDER + td->height + td->name_height);
+		if (td->status_icon)
+			status_size = MAX(status_size, STATUS_SIZE);
+	}
+	height += TOOLTIP_BORDER;
+	width = TOOLTIP_BORDER + status_size + SMALL_SPACE + max_text_width + SMALL_SPACE + max_avatar_width + TOOLTIP_BORDER;
+
 	if (w)
 		*w = width;
 	if (h)
@@ -3096,7 +3123,7 @@
 		if (g_list_length(purple_connections_get_all()) > 1)
 		{
 			tmp = g_markup_escape_text(chat->account->username, -1);
-			g_string_append_printf(str, _("\n<b>Account:</b> %s"), tmp);
+			g_string_append_printf(str, _("<b>Account:</b> %s"), tmp);
 			g_free(tmp);
 		}
 
@@ -3289,7 +3316,6 @@
 
 		purple_notify_user_info_destroy(user_info);
 	} else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
-		GSList *accounts;
 		PurpleGroup *group = (PurpleGroup*)node;
 		PurpleNotifyUserInfo *user_info;
 
@@ -3309,14 +3335,6 @@
 		                                 tmp);
 		g_free(tmp);
 
-		/* Accounts with buddies in group */
-		accounts = purple_group_get_accounts(group);
-		for (; accounts != NULL;
-		     accounts = g_slist_delete_link(accounts, accounts)) {
-			PurpleAccount *account = accounts->data;
-			purple_notify_user_info_add_pair(user_info, _("Account"), purple_account_get_username(account));
-		}
-
 		tmp = purple_notify_user_info_get_text_with_newline(user_info, "\n");
 		g_string_append(str, tmp);
 		g_free(tmp);
@@ -3746,7 +3764,7 @@
 	return text;
 }
 
-static void pidgin_blist_restore_position()
+static void pidgin_blist_restore_position(void)
 {
 	int blist_x, blist_y, blist_width, blist_height;
 
@@ -3893,7 +3911,7 @@
 }
 
 static void
-unseen_conv_menu()
+unseen_conv_menu(void)
 {
 	static GtkWidget *menu = NULL;
 	GList *convs = NULL;
@@ -4125,12 +4143,11 @@
 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);
+	gtkblist->priv = g_new0(PidginBuddyListPrivate, 1);
 
 	blist->ui_data = gtkblist;
 }
@@ -4179,7 +4196,8 @@
 	pidgin_blist_sort_method_set(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/blist/sort_type"));
 }
 
-static void _prefs_change_redo_list()
+static void _prefs_change_redo_list(const char *name, PurplePrefType type,
+                                    gconstpointer val, gpointer data)
 {
 	GtkTreeSelection *sel;
 	GtkTreeIter iter;
@@ -4849,6 +4867,9 @@
 #endif
 
 	gtk_tooltips_force_window (tooltips);
+#if GTK_CHECK_VERSION(2, 12, 0)
+	gtk_widget_set_name (tooltips->tip_window, "gtk-tooltips");
+#endif
 	gtk_widget_ensure_style (tooltips->tip_window);
 	style = gtk_widget_get_style (tooltips->tip_window);
 
@@ -5033,8 +5054,9 @@
 	gtk_label_set_line_wrap(GTK_LABEL(gtkblist->headline_label), TRUE);
 	gtk_box_pack_start(GTK_BOX(gtkblist->headline_hbox), gtkblist->headline_image, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(gtkblist->headline_hbox), gtkblist->headline_label, TRUE, TRUE, 0);
-	g_signal_connect(gtkblist->headline_hbox,
-			 "style-set",
+	g_signal_connect(gtkblist->headline_label,   /* connecting on headline_hbox doesn't work, because
+	                                                the signal is not emitted when theme is changed */
+			"style-set",
 			 G_CALLBACK(headline_style_set),
 			 NULL);
 	g_signal_connect (gtkblist->headline_hbox,
@@ -6046,6 +6068,7 @@
 	gtkblist->timeout = 0;
 	gtkblist->drag_timeout = 0;
 	gtkblist->window = gtkblist->vbox = gtkblist->treeview = NULL;
+	g_object_unref(G_OBJECT(gtkblist->treemodel));
 	gtkblist->treemodel = NULL;
 	g_object_unref(G_OBJECT(gtkblist->ift));
 	g_object_unref(G_OBJECT(gtkblist->empty_avatar));
@@ -6471,20 +6494,10 @@
 
 	for (tmp = list; tmp; tmp = tmp->next)
 	{
-		GtkWidget *label;
-		GtkWidget *rowbox;
 		GtkWidget *input;
 
 		pce = tmp->data;
 
-		rowbox = gtk_hbox_new(FALSE, 5);
-		gtk_box_pack_start(GTK_BOX(data->entries_box), rowbox, FALSE, FALSE, 0);
-
-		label = gtk_label_new_with_mnemonic(pce->label);
-		gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-		gtk_size_group_add_widget(data->sg, label);
-		gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0);
-
 		if (pce->is_int)
 		{
 			GtkObject *adjust;
@@ -6492,7 +6505,7 @@
 										1, 10, 10);
 			input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0);
 			gtk_widget_set_size_request(input, 50, -1);
-			gtk_box_pack_end(GTK_BOX(rowbox), input, FALSE, FALSE, 0);
+			pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL);
 		}
 		else
 		{
@@ -6508,7 +6521,7 @@
 				if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*')
 					gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR);
 			}
-			gtk_box_pack_end(GTK_BOX(rowbox), input, TRUE, TRUE, 0);
+			pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL);
 			g_signal_connect(G_OBJECT(input), "changed",
 							 G_CALLBACK(addchat_set_sensitive_if_input_cb), data);
 		}
@@ -6519,8 +6532,6 @@
 			gtk_widget_grab_focus(input);
 			focus = FALSE;
 		}
-		gtk_label_set_mnemonic_widget(GTK_LABEL(label), input);
-		pidgin_set_accessible_label(input, label);
 		g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier);
 		g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int));
 		g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required));
@@ -6563,7 +6574,6 @@
 	GList *l;
 	PurpleConnection *gc;
 	GtkWidget *label;
-	GtkWidget *rowbox;
 	GtkWidget *hbox;
 	GtkWidget *vbox;
 	GtkWidget *img;
@@ -6639,20 +6649,10 @@
 	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
 	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
 
-	rowbox = gtk_hbox_new(FALSE, 5);
-	gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0);
-
-	label = gtk_label_new_with_mnemonic(_("_Account:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_size_group_add_widget(data->sg, label);
-	gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0);
-
 	data->account_menu = pidgin_account_option_menu_new(account, FALSE,
 			G_CALLBACK(addchat_select_account_cb),
 			chat_account_filter_func, data);
-	gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->account_menu);
-	pidgin_set_accessible_label (data->account_menu, label);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL);
 
 	data->entries_box = gtk_vbox_new(FALSE, 5);
 	gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0);
@@ -6660,36 +6660,17 @@
 
 	rebuild_addchat_entries(data);
 
-	rowbox = gtk_hbox_new(FALSE, 5);
-	gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0);
-
-	label = gtk_label_new_with_mnemonic(_("A_lias:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_size_group_add_widget(data->sg, label);
-	gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0);
-
 	data->alias_entry = gtk_entry_new();
 	if (alias != NULL)
 		gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias);
-	gtk_box_pack_end(GTK_BOX(rowbox), data->alias_entry, TRUE, TRUE, 0);
 	gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->alias_entry);
-	pidgin_set_accessible_label (data->alias_entry, label);
+
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_lias:"), data->sg, data->alias_entry, TRUE, NULL);
 	if (name != NULL)
 		gtk_widget_grab_focus(data->alias_entry);
 
-	rowbox = gtk_hbox_new(FALSE, 5);
-	gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0);
-
-	label = gtk_label_new_with_mnemonic(_("_Group:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_size_group_add_widget(data->sg, label);
-	gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0);
-
 	data->group_combo = pidgin_text_combo_box_entry_new(group ? group->name : NULL, groups_tree());
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_BIN(data->group_combo)->child);
-	pidgin_set_accessible_label (data->group_combo, label);
-	gtk_box_pack_end(GTK_BOX(rowbox), data->group_combo, TRUE, TRUE, 0);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Group:"), data->sg, data->group_combo, TRUE, NULL);
 	
 	data->autojoin = gtk_check_button_new_with_mnemonic(_("Auto_join when account becomes online."));
 	data->persistent = gtk_check_button_new_with_mnemonic(_("_Hide chat when the window is closed."));
@@ -6963,7 +6944,8 @@
 	pidgin_blist_update_sort_methods();
 }
 
-void pidgin_blist_sort_method_unreg(const char *id){
+void pidgin_blist_sort_method_unreg(const char *id)
+{
 	GList *l = pidgin_blist_sort_methods;
 
 	while(l) {
@@ -6975,6 +6957,7 @@
 			g_free(method);
 			break;
 		}
+		l = l->next;
 	}
 	pidgin_blist_update_sort_methods();
 }
--- a/pidgin/gtkcertmgr.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkcertmgr.c	Wed Feb 06 03:35:04 2008 +0000
@@ -84,10 +84,10 @@
 	GtkTreeView *listview = tpm_dat->listview;
 	PurpleCertificatePool *tls_peers;
 	GList *idlist, *l;
-	
+
 	GtkListStore *store = GTK_LIST_STORE(
 		gtk_tree_view_get_model(GTK_TREE_VIEW(listview)));
-	
+
 	/* First, delete everything in the list */
 	gtk_list_store_clear(store);
 
@@ -199,7 +199,7 @@
 				     NULL, NULL, NULL, /* No account/who/conv*/
 				     crt    /* Pass cert instance to callback*/
 				     );
-		
+
 		g_free(default_hostname);
 	} else {
 		/* Errors! Oh no! */
@@ -235,7 +235,7 @@
 	PurpleCertificate *crt = (PurpleCertificate *) data;
 
 	g_assert(filename);
-	
+
 	if (!purple_certificate_export(filename, crt)) {
 		/* Errors! Oh no! */
 		/* TODO: Perhaps find a way to be specific about what just
@@ -260,7 +260,7 @@
 	/* Pressing cancel just frees the duplicated certificate */
 	purple_certificate_destroy(crt);
 }
-	
+
 static void
 tls_peers_mgmt_export_cb(GtkWidget *button, gpointer data)
 {
@@ -293,7 +293,6 @@
 	}
 	g_free(id);
 
-	
 	/* TODO: inform user that it will be a PEM? */
 	purple_request_file(tpm_dat,
 			    _("PEM X.509 Certificate Export"),
@@ -327,10 +326,10 @@
 	/* Now retrieve the certificate */
 	crt = purple_certificate_pool_retrieve(tpm_dat->tls_peers, id);
 	g_return_if_fail(crt);
-	
+
 	/* Fire the notification */
 	purple_certificate_display_x509(crt);
-	
+
 	g_free(id);
 	purple_certificate_destroy(crt);
 }
@@ -350,7 +349,7 @@
 
 	g_free(id);
 }
-	
+
 static void
 tls_peers_mgmt_delete_cb(GtkWidget *button, gpointer data)
 {
@@ -370,17 +369,17 @@
 		/* Prompt to confirm deletion */
 		primary = g_strdup_printf(
 			_("Really delete certificate for %s?"), id );
-		
+
 		purple_request_yes_no(tpm_dat, _("Confirm certificate delete"),
 				      primary, NULL, /* Can this be NULL? */
-				      2, /* NO is default action */
+				      0, /* "yes" is the default action */
 				      NULL, NULL, NULL,
 				      id, /* id ownership passed to callback */
 				      tls_peers_mgmt_delete_confirm_cb,
 				      tls_peers_mgmt_delete_confirm_cb );
-		
+
 		g_free(primary);
-				      
+
 	} else {
 		purple_debug_warning("gtkcertmgr/tls_peers_mgmt",
 				     "Delete clicked with no selection?\n");
@@ -393,6 +392,7 @@
 {
 	GtkWidget *bbox;
 	GtkListStore *store;
+	GtkWidget *sw;
 
 	/* This block of variables will end up in tpm_dat */
 	GtkTreeView *listview;
@@ -406,10 +406,12 @@
 
 	/* Create a struct to store context information about this window */
 	tpm_dat = g_new0(tls_peers_mgmt_data, 1);
-	
+
 	tpm_dat->mgmt_widget = mgmt_widget =
 		gtk_hbox_new(FALSE, /* Non-homogeneous */
-			     PIDGIN_HIG_BORDER);
+			     PIDGIN_HIG_BOX_SPACE);
+	gtk_container_set_border_width(GTK_CONTAINER(mgmt_widget),
+		PIDGIN_HIG_BOX_SPACE);
 	gtk_widget_show(mgmt_widget);
 
 	/* Ensure that everything gets cleaned up when the dialog box
@@ -417,12 +419,23 @@
 	g_signal_connect(G_OBJECT(mgmt_widget), "destroy",
 			 G_CALLBACK(tls_peers_mgmt_destroy), NULL);
 
+	/* Scrolled window */
+	sw = gtk_scrolled_window_new(NULL,NULL);
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
+			GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
+	gtk_box_pack_start(GTK_BOX(mgmt_widget), GTK_WIDGET(sw),
+			TRUE, TRUE, /* Take up lots of space */
+			0);
+	gtk_widget_show(GTK_WIDGET(sw));
+
 	/* List view */
 	store = gtk_list_store_new(TPM_N_COLUMNS, G_TYPE_STRING);
-	
+
 	tpm_dat->listview = listview =
 		GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)));
-	
+	g_object_unref(G_OBJECT(store));
+
 	{
 		GtkCellRenderer *renderer;
 		GtkTreeViewColumn *column;
@@ -430,7 +443,7 @@
 		/* Set up the display columns */
 		renderer = gtk_cell_renderer_text_new();
 		column = gtk_tree_view_column_new_with_attributes(
-			"Hostname",
+			_("Hostname"),
 			renderer,
 			"text", TPM_HOSTNAME_COLUMN,
 			NULL);
@@ -439,11 +452,11 @@
 		gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store),
 				TPM_HOSTNAME_COLUMN, GTK_SORT_ASCENDING);
 	}
-	
+
 	/* Get the treeview selector into the struct */
 	tpm_dat->listselect = select =
 		gtk_tree_view_get_selection(GTK_TREE_VIEW(listview));
-	
+
 	/* Force the selection mode */
 	gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
 
@@ -451,20 +464,18 @@
 	   something is selected */
 	g_signal_connect(G_OBJECT(select), "changed",
 			 G_CALLBACK(tls_peers_mgmt_select_chg_cb), NULL);
-	
-	gtk_box_pack_start(GTK_BOX(mgmt_widget), GTK_WIDGET(listview),
-			   TRUE, TRUE, /* Take up lots of space */
-			   0); /* TODO: this padding is wrong */
+
+	gtk_container_add(GTK_CONTAINER(sw), GTK_WIDGET(listview));
 	gtk_widget_show(GTK_WIDGET(listview));
 
 	/* Fill the list for the first time */
 	tls_peers_mgmt_repopulate_list();
-	
+
 	/* Right-hand side controls box */
 	bbox = gtk_vbutton_box_new();
 	gtk_box_pack_end(GTK_BOX(mgmt_widget), bbox,
 			 FALSE, FALSE, /* Do not take up space */
-			 0); /* TODO: this padding is probably wrong */
+			 0);
 	gtk_box_set_spacing(GTK_BOX(bbox), PIDGIN_HIG_BOX_SPACE);
 	gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_START);
 	gtk_widget_show(bbox);
@@ -512,7 +523,7 @@
 
 	/* Bind us to the tls_peers pool */
 	tpm_dat->tls_peers = purple_certificate_find_pool("x509", "tls_peers");
-	
+
 	/**** libpurple signals ****/
 	/* Respond to certificate add/remove by just reloading everything */
 	purple_signal_connect(tpm_dat->tls_peers, "certificate-stored",
@@ -521,7 +532,7 @@
 	purple_signal_connect(tpm_dat->tls_peers, "certificate-deleted",
 			      tpm_dat, PURPLE_CALLBACK(tls_peers_mgmt_mod_cb),
 			      NULL);
-	
+
 	return mgmt_widget;
 }
 
@@ -570,7 +581,7 @@
 		      poollist = poollist->next ) {
 			PurpleCertificatePool *pool = poollist->data;
 			GList *l;
-			
+
 			purple_debug_info("gtkcertmgr",
 					  "Pool %s found for scheme %s -"
 					  "Enumerating certificates:\n",
@@ -587,7 +598,7 @@
 		} /* poollist */
 	}
 
-	
+
 	/* If the manager is already open, bring it to the front */
 	if (certmgr_dialog != NULL) {
 		gtk_window_present(GTK_WINDOW(certmgr_dialog->window));
@@ -606,7 +617,7 @@
 	g_signal_connect(G_OBJECT(win), "delete_event",
 			 G_CALLBACK(certmgr_close_cb), dlg);
 
-	
+
 	/* TODO: Retrieve the user-set window size and use it */
 	gtk_window_set_default_size(GTK_WINDOW(win), 400, 400);
 
--- a/pidgin/gtkconn.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkconn.c	Wed Feb 06 03:35:04 2008 +0000
@@ -162,11 +162,6 @@
 		if (info != NULL)
 			g_hash_table_remove(auto_reconns, account);
 
-		/*
-		 * TODO: Do we really want to disable the account when it's
-		 * disconnected by wants_to_die?  This happens when you sign
-		 * on from somewhere else, or when you enter an invalid password.
-		 */
 		purple_account_set_enabled(account, PIDGIN_UI, FALSE);
 	}
 
@@ -182,7 +177,7 @@
 	}
 }
 
-static void pidgin_connection_network_connected ()
+static void pidgin_connection_network_connected (void)
 {
 	GList *list, *l;
 	PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist();
@@ -201,7 +196,7 @@
 	g_list_free(list);
 }
 
-static void pidgin_connection_network_disconnected ()
+static void pidgin_connection_network_disconnected (void)
 {
 	GList *list, *l;
 	PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist();
--- a/pidgin/gtkconv.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkconv.c	Wed Feb 06 03:35:04 2008 +0000
@@ -67,6 +67,7 @@
 #include "gtkthemes.h"
 #include "gtkutils.h"
 #include "pidginstock.h"
+#include "pidgintooltip.h"
 
 #include "gtknickcolors.h"
 
@@ -164,12 +165,11 @@
 static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win);
 static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv);
 static gboolean infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *conv);
-static gboolean pidgin_userlist_motion_cb (GtkWidget *w, GdkEventMotion *event, PidginConversation *gtkconv);
-static gboolean pidgin_conv_leave_cb (GtkWidget *w, GdkEventCrossing *e, PidginConversation *gtkconv);
 static void hide_conv(PidginConversation *gtkconv, gboolean closetimer);
 
 static void pidgin_conv_set_position_size(PidginWindow *win, int x, int y,
 		int width, int height);
+static gboolean pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y);
 
 static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) {
 	static GdkColor col;
@@ -442,6 +442,13 @@
 
 		cmdline = cmd + strlen(prefix);
 
+		if (strcmp(cmdline, "xyzzy") == 0) {
+			purple_conversation_write(conv, "", "Nothing happens",
+					PURPLE_MESSAGE_NO_LOG, time(NULL));
+			g_free(cmd);
+			return TRUE;
+		}
+
 		gtk_text_iter_forward_chars(&start, g_utf8_strlen(prefix, -1));
 		gtk_text_buffer_get_end_iter(GTK_IMHTML(gtkconv->entry)->text_buffer, &end);
 		markup = gtk_imhtml_get_markup_range(GTK_IMHTML(gtkconv->entry), &start, &end);
@@ -1351,6 +1358,7 @@
 	PidginWindow *win = data;
 	PurpleConversation *conv;
 	gboolean logging;
+	PurpleBlistNode *node;
 
 	conv = pidgin_conv_window_get_active_conversation(win);
 
@@ -1361,6 +1369,8 @@
 
 	if (logging == purple_conversation_is_logging(conv))
 		return;
+	
+	node = get_conversation_blist_node(conv);
 
 	if (logging)
 	{
@@ -1384,6 +1394,27 @@
 		/* Disable the logging second, so that the above message can be logged. */
 		purple_conversation_set_logging(conv, FALSE);
 	}
+
+	/* Save the setting IFF it's different than the pref. */
+	switch (conv->type)
+	{
+		case PURPLE_CONV_TYPE_IM:
+			if (logging == purple_prefs_get_bool("/purple/logging/log_ims"))
+				purple_blist_node_remove_setting(node, "enable-logging");
+			else
+				purple_blist_node_set_bool(node, "enable-logging", logging);
+			break;
+
+		case PURPLE_CONV_TYPE_CHAT:
+			if (logging == purple_prefs_get_bool("/purple/logging/log_chats"))
+				purple_blist_node_remove_setting(node, "enable-logging");
+			else
+				purple_blist_node_set_bool(node, "enable-logging", logging);
+			break;
+
+		default:
+			break;
+	}
 }
 
 static void
@@ -2421,7 +2452,6 @@
 {
 	PidginConversation *gtkconv;
 	PidginWindow *win;
-	PurpleBuddy *b;
 	GList *l;
 	GdkPixbuf *status = NULL;
 	GdkPixbuf *infopane_status = NULL;
@@ -2434,13 +2464,18 @@
 	if (conv != gtkconv->active_conv)
 		return;
 
-
 	status = pidgin_conv_get_tab_icon(conv, TRUE);
 	infopane_status = pidgin_conv_get_tab_icon(conv, FALSE);
 
-	b = purple_find_buddy(conv->account, conv->name);
-	if (b)
-		emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b);
+	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
+		PurpleBuddy *b = purple_find_buddy(conv->account, conv->name);
+		if (b)
+			emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b);
+	} else {
+		PurpleChat *c = purple_blist_find_chat(conv->account, conv->name);
+		if (c)
+			emblem = pidgin_blist_get_emblem((PurpleBlistNode*)c);
+	}
 
 	g_return_if_fail(status != NULL);
 
@@ -3338,6 +3373,7 @@
 	}
 }
 
+#if 0
 static gboolean
 typing_animation(gpointer data) {
 	PidginConversation *gtkconv = data;
@@ -3376,6 +3412,7 @@
 	gtk_widget_show(gtkwin->menu.typing_icon);
 	return TRUE;
 }
+#endif
 
 static void
 update_typing_message(PidginConversation *gtkconv, const char *message)
@@ -3392,9 +3429,14 @@
 		gtk_text_buffer_delete_mark(buffer, stmark);
 		gtk_text_buffer_delete_mark(buffer, enmark);
 		gtk_text_buffer_delete(buffer, &start, &end);
-	} else if (message && *message == '\n' && !*(message + 1))
+	} else if (message && *message == '\n' && message[1] == ' ' && message[2] == '\0')
 		message = NULL;
 
+#ifdef RESERVE_LINE
+	if (!message)
+		message = "\n ";   /* The blank space is required to avoid a GTK+/Pango bug */
+#endif
+
 	if (message) {
 		GtkTextIter iter;
 		gtk_text_buffer_get_end_iter(buffer, &iter);
@@ -3411,8 +3453,6 @@
 	PidginWindow *gtkwin;
 	PurpleConvIm *im = NULL;
 	PurpleConversation *conv = gtkconv->active_conv;
-	char *stock_id;
-	const char *tooltip;
 	char *message = NULL;
 
 	gtkwin = gtkconv->win;
@@ -3420,55 +3460,24 @@
 	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)
 		im = PURPLE_CONV_IM(conv);
 
-	if (gtkwin->menu.typing_icon) {
-		gtk_widget_hide(gtkwin->menu.typing_icon);
-	}
-
 	if (im == NULL)
 		return;
 
 	if (purple_conv_im_get_typing_state(im) == PURPLE_NOT_TYPING) {
-		if (gtkconv->u.im->typing_timer != 0) {
-			g_source_remove(gtkconv->u.im->typing_timer);
-			gtkconv->u.im->typing_timer = 0;
-		}
-		update_typing_message(gtkconv, "\n");
+#ifdef RESERVE_LINE
+		update_typing_message(gtkconv, NULL);
+#else
+		update_typing_message(gtkconv, "\n ");
+#endif
 		return;
 	}
 
 	if (purple_conv_im_get_typing_state(im) == PURPLE_TYPING) {
-		if (gtkconv->u.im->typing_timer == 0) {
-			gtkconv->u.im->typing_timer = g_timeout_add(250, typing_animation, gtkconv);
-		}
-		stock_id = PIDGIN_STOCK_ANIMATION_TYPING1;
-		tooltip = _("User is typing...");
 		message = g_strdup_printf(_("\n%s is typing..."), purple_conversation_get_title(conv));
 	} else {
-		stock_id = PIDGIN_STOCK_ANIMATION_TYPING5;
-		tooltip = _("User has typed something and stopped");
-		message = g_strdup_printf(_("\n%s has typed something and stopped"), purple_conversation_get_title(conv));
-		if (gtkconv->u.im->typing_timer != 0) {
-			g_source_remove(gtkconv->u.im->typing_timer);
-			gtkconv->u.im->typing_timer = 0;
-		}
-	}
-
-	if (gtkwin->menu.typing_icon == NULL)
-	{
-		gtkwin->menu.typing_icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
-		pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray),
-								  gtkwin->menu.typing_icon,
-								  tooltip);
-	}
-	else
-	{
-		gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), stock_id, GTK_ICON_SIZE_MENU);
-		pidgin_menu_tray_set_tooltip(PIDGIN_MENU_TRAY(gtkwin->menu.tray),
-									   gtkwin->menu.typing_icon,
-									   tooltip);
-	}
-
-	gtk_widget_show(gtkwin->menu.typing_icon);
+		message = g_strdup_printf(_("\n%s has stopped typing"), purple_conversation_get_title(conv));
+	}
+
 	update_typing_message(gtkconv, message);
 	g_free(message);
 }
@@ -4434,6 +4443,36 @@
 	}
 }
 
+static gboolean
+pidgin_conv_userlist_create_tooltip(GtkWidget *tipwindow, GtkTreePath *path,
+		gpointer userdata, int *w, int *h)
+{
+	PidginConversation *gtkconv = userdata;
+	GtkTreeIter iter;
+	GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkconv->u.chat->list));
+	PurpleConversation *conv = gtkconv->active_conv;
+	PurpleBlistNode *node;
+	PurplePluginProtocolInfo *prpl_info;
+	PurpleAccount *account = purple_conversation_get_account(conv);
+	char *who = NULL;
+
+	if (account->gc == NULL)
+		return FALSE;
+
+	if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path))
+		return FALSE;
+
+	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1);
+
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl);
+	node = (PurpleBlistNode*)(purple_find_buddy(conv->account, who));
+	if (node && prpl_info && (prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME))
+		pidgin_blist_draw_tooltip(node, gtkconv->infopane);
+
+	g_free(who);
+	return FALSE;
+}
+
 static void
 setup_chat_userlist(PidginConversation *gtkconv, GtkWidget *hpaned)
 {
@@ -4488,14 +4527,13 @@
 
 	g_signal_connect(G_OBJECT(list), "button_press_event",
 					 G_CALLBACK(right_click_chat_cb), gtkconv);
-	g_signal_connect(G_OBJECT(list), "motion-notify-event",
-					 G_CALLBACK(pidgin_userlist_motion_cb), gtkconv);
-	g_signal_connect(G_OBJECT(list), "leave-notify-event",
-					 G_CALLBACK(pidgin_conv_leave_cb), gtkconv);
 	g_signal_connect(G_OBJECT(list), "popup-menu",
 			 G_CALLBACK(gtkconv_chat_popup_menu_cb), gtkconv);
 	g_signal_connect(G_OBJECT(lbox), "size-allocate", G_CALLBACK(lbox_size_allocate_cb), gtkconv);
 
+	pidgin_tooltip_setup_for_treeview(list, gtkconv,
+			pidgin_conv_userlist_create_tooltip, NULL);
+
 	rend = gtk_cell_renderer_text_new();
 	g_object_set(rend,
 				 "foreground-set", TRUE,
@@ -4531,32 +4569,12 @@
 	gtk_container_add(GTK_CONTAINER(sw), list);
 }
 
-/* Stuff used to display tooltips on the infopane */
-static struct {
-	int timeout;
-	PidginConversation *gtkconv;   /* This is the Pidgin conversation that
-	                                  triggered the tooltip */
-	int userlistx;
-	int userlisty;
-} tooltip;
-
-static void
-reset_tooltip()
-{
-	if (tooltip.timeout != 0) {
-		g_source_remove(tooltip.timeout);
-		tooltip.timeout = 0;
-	}
-	tooltip.gtkconv = NULL;
-}
-
 static gboolean
-pidgin_conv_tooltip_timeout(PidginConversation *gtkconv)
+pidgin_conv_create_tooltip(GtkWidget *tipwindow, gpointer userdata, int *w, int *h)
 {
 	PurpleBlistNode *node = NULL;
 	PurpleConversation *conv;
-
-	g_return_val_if_fail (tooltip.gtkconv == gtkconv, FALSE);
+	PidginConversation *gtkconv = userdata;
 
 	conv = gtkconv->active_conv;
 	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
@@ -4579,103 +4597,6 @@
 	return FALSE;
 }
 
-static gboolean
-pidgin_conv_leave_cb (GtkWidget *w, GdkEventCrossing *e, PidginConversation *gtkconv)
-{
-	pidgin_blist_tooltip_destroy();
-	reset_tooltip();
-	return FALSE;
-}
-
-static gboolean 
-pidgin_conv_motion_cb (GtkWidget *infopane, GdkEventMotion *event, PidginConversation *gtkconv)
-{
-	int delay = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/tooltip_delay");
-
-	pidgin_blist_tooltip_destroy();
-	if (delay == 0)
-		return FALSE;
-
-	if (tooltip.timeout != 0)
-		g_source_remove(tooltip.timeout);
-
-	tooltip.timeout = g_timeout_add(delay, (GSourceFunc)pidgin_conv_tooltip_timeout, gtkconv);
-	tooltip.gtkconv = gtkconv;
-	return FALSE;
-}
-
-static gboolean
-pidgin_userlist_tooltip_timeout(PidginConversation *gtkconv)
-{
-	PurplePluginProtocolInfo *prpl_info;
-	PurpleConversation *conv = gtkconv->active_conv;
-	PidginChatPane *gtkchat;
-	PurpleBlistNode *node = NULL;
-	PurpleAccount *account;
-	GtkTreePath *path;
-	GtkTreeIter iter;
-	GtkTreeModel *model;
-	GtkTreeViewColumn *column;
-	gchar *who;
-	int x, y;
-
-	gtkchat = gtkconv->u.chat;
-	account = purple_conversation_get_account(conv);
-
-	if (account->gc == NULL)
-		return FALSE;
-
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl);
-
-	model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list));
-
-	if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(gtkchat->list),
-								  tooltip.userlistx, tooltip.userlisty, &path, &column, &x, &y))
-		return FALSE;
-
-	gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path);
-	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1);
-
-	node = (PurpleBlistNode*)(purple_find_buddy(conv->account, who));
-	if (node && prpl_info && (prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME))
-		pidgin_blist_draw_tooltip(node, gtkconv->infopane);
-
-	g_free(who);
-	gtk_tree_path_free(path);
-
-
-	return FALSE;
-}
-
-static gboolean
-pidgin_userlist_motion_cb (GtkWidget *w, GdkEventMotion *event, PidginConversation *gtkconv)
-{
-	PurpleConversation *conv;
-	PurpleAccount *account;
-	int delay = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/tooltip_delay");
-	
-	pidgin_blist_tooltip_destroy();
-	if (delay == 0)
-		return FALSE;
-
-	if (tooltip.timeout != 0)
-		g_source_remove(tooltip.timeout);
-	tooltip.timeout = 0;
-
-	conv = gtkconv->active_conv;
-	account = purple_conversation_get_account(conv);
-
-	if (account->gc == NULL)
-		return FALSE;
-
-	tooltip.timeout = g_timeout_add(delay, (GSourceFunc)pidgin_userlist_tooltip_timeout, gtkconv);
-	tooltip.gtkconv = gtkconv;
-	tooltip.userlistx = event->x;
-	tooltip.userlisty = event->y;
-
-	return FALSE;
-}
- 
 static GtkWidget *
 setup_common_pane(PidginConversation *gtkconv)
 {
@@ -4705,10 +4626,8 @@
 	g_signal_connect(G_OBJECT(event_box), "button-press-event",
 	                 G_CALLBACK(infopane_press_cb), gtkconv);
 
-	g_signal_connect(G_OBJECT(event_box), "motion-notify-event", 
-			G_CALLBACK(pidgin_conv_motion_cb), gtkconv);
-	g_signal_connect(G_OBJECT(event_box), "leave-notify-event", 
-			G_CALLBACK(pidgin_conv_leave_cb), gtkconv);
+	pidgin_tooltip_setup_for_widget(event_box, gtkconv,
+		pidgin_conv_create_tooltip, NULL);
 
 	gtkconv->infopane = gtk_cell_view_new();
 	gtkconv->infopane_model = gtk_list_store_new(CONV_NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF);
@@ -4998,6 +4917,7 @@
 	GtkWidget *pane = NULL;
 	GtkWidget *tab_cont;
 	PurpleBlistNode *convnode;
+	PurpleValue *value;
 
 	if (conv_type == PURPLE_CONV_TYPE_IM && (gtkconv = pidgin_conv_find_gtkconv(conv))) {
 		conv->ui_data = gtkconv;
@@ -5070,7 +4990,7 @@
 	gtk_text_buffer_create_tag(GTK_IMHTML(gtkconv->imhtml)->text_buffer, "TYPING-NOTIFICATION",
 			"foreground", "#888888",
 			"justification", GTK_JUSTIFY_LEFT,  /* XXX: RTL'ify */
-			"weight", PANGO_WEIGHT_BOLD,
+			"weight", PANGO_WEIGHT_LIGHT,
 			"scale", PANGO_SCALE_SMALL,
 			NULL);
 
@@ -5085,6 +5005,13 @@
 	if (convnode == NULL || !purple_blist_node_get_bool(convnode, "gtk-mute-sound"))
 		gtkconv->make_sound = TRUE;
 
+	if (convnode != NULL &&
+	    (value = g_hash_table_lookup(convnode->settings, "enable-logging")) &&
+	    purple_value_get_type(value) == PURPLE_TYPE_BOOLEAN)
+	{
+		purple_conversation_set_logging(conv, purple_value_get_boolean(value));
+	}
+
 	if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar"))
 		gtk_widget_show(gtkconv->toolbar);
 	else
@@ -5214,9 +5141,6 @@
 		g_source_remove(gtkconv->attach.timer);
 	}
 
-	if (tooltip.gtkconv == gtkconv)
-		reset_tooltip();
-
 	g_free(gtkconv);
 }
 
@@ -6652,7 +6576,7 @@
 			pango_attr_list_unref(list);
 		} else
 			gtk_label_set_attributes(GTK_LABEL(gtkconv->tab_label), NULL);
-
+		
 		if (pidgin_conv_window_is_active_conversation(conv))
 			update_typing_icon(gtkconv);
 
@@ -6925,10 +6849,8 @@
                               GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
 	g_signal_connect(G_OBJECT(event), "button-press-event",
 					 G_CALLBACK(icon_menu), gtkconv);
-	g_signal_connect(G_OBJECT(event), "motion-notify-event",
-			G_CALLBACK(pidgin_conv_motion_cb), gtkconv);
-	g_signal_connect(G_OBJECT(event), "leave-notify-event",
-			G_CALLBACK(pidgin_conv_leave_cb), gtkconv);
+
+	pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL);
 	gtk_widget_show(event);
 
 	gtkconv->u.im->icon = gtk_image_new_from_pixbuf(scale);
@@ -6964,6 +6886,18 @@
 		gray_stuff_out(PIDGIN_CONVERSATION(conv));
 }
 
+static gboolean
+pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y)
+{
+	gint pane_x, pane_y, x_rel;
+	PidginConversation *gtkconv;
+
+	gdk_window_get_origin(win->notebook->window, &pane_x, &pane_y);
+	x_rel = x - pane_x;
+	gtkconv = pidgin_conv_window_get_active_gtkconv(win);
+	return (x_rel > gtkconv->infopane->allocation.x + gtkconv->infopane->allocation.width / 2);
+}
+
 int
 pidgin_conv_get_tab_at_xy(PidginWindow *win, int x, int y, gboolean *to_right)
 {
@@ -6999,7 +6933,7 @@
 		tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), page);
 
 		/* Make sure the tab is not hidden beyond an arrow */
-		if (!GTK_WIDGET_DRAWABLE(tab))
+		if (!GTK_WIDGET_DRAWABLE(tab) && gtk_notebook_get_show_tabs(notebook))
 			continue;
 
 		if (horiz) {
@@ -8258,7 +8192,6 @@
 		GtkWidget *tab;
 		gint page_num;
 		gboolean horiz_tabs = FALSE;
-		PidginConversation *gtkconv;
 		gboolean to_right = FALSE;
 
 		/* Get the window that the cursor is over. */
@@ -8272,20 +8205,27 @@
 
 		dest_notebook = GTK_NOTEBOOK(dest_win->notebook);
 
-		page_num = pidgin_conv_get_tab_at_xy(dest_win,
-		                                      e->x_root, e->y_root, &to_right);
-		to_right = to_right && (win != dest_win);
+		if (gtk_notebook_get_show_tabs(dest_notebook)) {
+			page_num = pidgin_conv_get_tab_at_xy(dest_win,
+			                                      e->x_root, e->y_root, &to_right);
+			to_right = to_right && (win != dest_win);
+			tab = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num)->tabby;
+		} else {
+			page_num = 0;
+			to_right = pidgin_conv_xy_to_right_infopane(dest_win, e->x_root, e->y_root);
+			tab = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num)->infopane;
+		}
 
 		if (gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_TOP ||
 				gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_BOTTOM) {
 			horiz_tabs = TRUE;
 		}
 
-		gtkconv = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num);
-		tab = gtkconv->tabby;
-		if (gtk_notebook_get_show_tabs(dest_notebook) == FALSE) {
-				dnd_hints_show_relative(HINT_ARROW_DOWN, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_TOP);
-				dnd_hints_show_relative(HINT_ARROW_UP, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_BOTTOM);
+		if (gtk_notebook_get_show_tabs(dest_notebook) == FALSE && win == dest_win)
+		{
+			/* dragging a tab from a single-tabbed window over its own window */
+			dnd_hints_hide_all();
+			return TRUE;
 		} else if (horiz_tabs) {
 			if (((gpointer)win == (gpointer)dest_win && win->drag_tab < page_num) || to_right) {
 				dnd_hints_show_relative(HINT_ARROW_DOWN, tab, HINT_POSITION_RIGHT, HINT_POSITION_TOP);
@@ -8482,6 +8422,7 @@
 notebook_release_cb(GtkWidget *widget, GdkEventButton *e, PidginWindow *win)
 {
 	PidginWindow *dest_win;
+	GtkNotebook *dest_notebook;
 	PurpleConversation *conv;
 	PidginConversation *gtkconv;
 	gint dest_page_num = 0;
@@ -8557,9 +8498,16 @@
 	                 "conversation-dragging", win, dest_win);
 
 	/* Get the destination page number. */
-	if (!new_window)
-		dest_page_num = pidgin_conv_get_tab_at_xy(dest_win,
-		                                           e->x_root, e->y_root, &to_right);
+	if (!new_window) {
+		dest_notebook = GTK_NOTEBOOK(dest_win->notebook);
+		if (gtk_notebook_get_show_tabs(dest_notebook)) {
+			dest_page_num = pidgin_conv_get_tab_at_xy(dest_win,
+			                                           e->x_root, e->y_root, &to_right);
+		} else {
+			dest_page_num = 0;
+			to_right = pidgin_conv_xy_to_right_infopane(dest_win, e->x_root, e->y_root);
+		}
+	}
 
 	gtkconv = pidgin_conv_window_get_gtkconv_at_index(win, win->drag_tab);
 
@@ -8798,7 +8746,7 @@
 	PurpleConversation *conv = gtkconv->active_conv;
 	const char *text = NULL;
 
-	if (!GTK_WIDGET_VISIBLE(gtkconv->tab_label)) {
+	if (!GTK_WIDGET_VISIBLE(gtkconv->infopane)) {
 		/* There's already an entry for alias. Let's not create another one. */
 		return FALSE;
 	}
--- a/pidgin/gtkdebug.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkdebug.c	Wed Feb 06 03:35:04 2008 +0000
@@ -686,13 +686,11 @@
 	width  = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/debug/width");
 	height = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/debug/height");
 
-	PIDGIN_DIALOG(win->window);
+	win->window = pidgin_create_dialog(_("Debug Window"), 0, "debug", TRUE);
 	purple_debug_info("gtkdebug", "Setting dimensions to %d, %d\n",
 					width, height);
 
 	gtk_window_set_default_size(GTK_WINDOW(win->window), width, height);
-	gtk_window_set_role(GTK_WINDOW(win->window), "debug");
-	gtk_window_set_title(GTK_WINDOW(win->window), _("Debug Window"));
 
 	g_signal_connect(G_OBJECT(win->window), "delete_event",
 	                 G_CALLBACK(debug_window_destroy), NULL);
@@ -700,7 +698,7 @@
 	                 G_CALLBACK(configure_cb), win);
 
 	handle = pidgin_debug_get_handle();
-	
+
 #ifdef HAVE_REGEX_H
 	/* the list store for all the messages */
 	win->store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
@@ -716,8 +714,7 @@
 #endif /* HAVE_REGEX_H */
 
 	/* Setup the vbox */
-	vbox = gtk_vbox_new(FALSE, 0);
-	gtk_container_add(GTK_CONTAINER(win->window), vbox);
+	vbox = pidgin_dialog_get_vbox(GTK_DIALOG(win->window));
 
 	if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/debug/toolbar")) {
 		/* Setup our top button bar thingie. */
--- a/pidgin/gtkdialogs.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkdialogs.c	Wed Feb 06 03:35:04 2008 +0000
@@ -288,7 +288,7 @@
 	}
 }
 
-static void destroy_about()
+static void destroy_about(void)
 {
 	if (about != NULL)
 		gtk_widget_destroy(about);
@@ -337,12 +337,10 @@
 
 void pidgin_dialogs_about()
 {
-	GtkWidget *hbox;
 	GtkWidget *vbox;
 	GtkWidget *logo;
 	GtkWidget *frame;
 	GtkWidget *text;
-	GtkWidget *bbox;
 	GtkWidget *button;
 	GtkTextIter iter;
 	GString *str;
@@ -357,20 +355,12 @@
 		return;
 	}
 
-	PIDGIN_DIALOG(about);
 	tmp = g_strdup_printf(_("About %s"), PIDGIN_NAME);
-	gtk_window_set_title(GTK_WINDOW(about), tmp);
+	about = pidgin_create_dialog(tmp, PIDGIN_HIG_BORDER, "about", TRUE);
 	g_free(tmp);
-	gtk_window_set_role(GTK_WINDOW(about), "about");
-	gtk_window_set_resizable(GTK_WINDOW(about), TRUE);
 	gtk_window_set_default_size(GTK_WINDOW(about), 340, 450);
 
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
-	gtk_container_set_border_width(GTK_CONTAINER(hbox), PIDGIN_HIG_BORDER);
-	gtk_container_add(GTK_CONTAINER(about), hbox);
-
-	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
-	gtk_container_add(GTK_CONTAINER(hbox), vbox);
+	vbox = pidgin_dialog_get_vbox_with_properties(GTK_DIALOG(about), FALSE, PIDGIN_HIG_BORDER);
 
 	/* Generate a logo with a version number */
 	logo = gtk_window_new(GTK_WINDOW_TOPLEVEL);
@@ -709,15 +699,9 @@
 	gtk_text_buffer_place_cursor(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), &iter);
 
 	/* Close Button */
-	bbox = gtk_hbutton_box_new();
-	gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
-	gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+	button = pidgin_dialog_add_button(GTK_DIALOG(about), GTK_STOCK_CLOSE,
+	                G_CALLBACK(destroy_about), about);
 
-	button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
-	gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
-
-	g_signal_connect_swapped(G_OBJECT(button), "clicked",
-							 G_CALLBACK(destroy_about), G_OBJECT(about));
 	g_signal_connect(G_OBJECT(about), "destroy",
 					 G_CALLBACK(destroy_about), G_OBJECT(about));
 
--- a/pidgin/gtkdialogs.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkdialogs.h	Wed Feb 06 03:35:04 2008 +0000
@@ -54,11 +54,10 @@
 
 /* Everything after this should probably be moved elsewhere */
 
-/**
- * Our UI's identifier.
- */
+#ifndef PIDGIN_DISABLE_DEPRECATED
 #define PIDGIN_DIALOG(x)	x = gtk_window_new(GTK_WINDOW_TOPLEVEL); \
 			gtk_window_set_type_hint(GTK_WINDOW(x), GDK_WINDOW_TYPE_HINT_DIALOG)
+#endif
 #define PIDGIN_WINDOW_ICONIFIED(x) (gdk_window_get_state(GTK_WIDGET(x)->window) & GDK_WINDOW_STATE_ICONIFIED)
 
 #endif /* _PIDGINDIALOGS_H_ */
--- a/pidgin/gtkdocklet-x11.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkdocklet-x11.c	Wed Feb 06 03:35:04 2008 +0000
@@ -48,7 +48,7 @@
 static void docklet_x11_create(gboolean);
 
 static gboolean
-docklet_x11_recreate_cb()
+docklet_x11_recreate_cb(gpointer data)
 {
 	docklet_x11_create(TRUE);
 
@@ -147,7 +147,7 @@
 }
 
 static void
-docklet_x11_blank_icon()
+docklet_x11_blank_icon(void)
 {
 	if (!blank_icon) {
 		GtkIconSize size = GTK_ICON_SIZE_LARGE_TOOLBAR;
@@ -205,7 +205,7 @@
 #endif
 
 static void
-docklet_x11_destroy()
+docklet_x11_destroy(void)
 {
 	g_return_if_fail(docklet != NULL);
 
@@ -230,7 +230,7 @@
 }
 
 static gboolean
-docklet_x11_embed_timeout_cb()
+docklet_x11_embed_timeout_cb(gpointer data)
 {
 	/* The docklet was not embedded within the timeout.
 	 * Remove it as a visibility manager, but leave the plugin
@@ -301,7 +301,7 @@
 }
 
 static void
-docklet_x11_create_ui_op()
+docklet_x11_create_ui_op(void)
 {
 	docklet_x11_create(FALSE);
 }
--- a/pidgin/gtkdocklet.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkdocklet.c	Wed Feb 06 03:35:04 2008 +0000
@@ -62,7 +62,7 @@
  * docklet status and utility functions
  **************************************************************************/
 static gboolean
-docklet_blink_icon()
+docklet_blink_icon(gpointer data)
 {
 	static gboolean blinked = FALSE;
 	gboolean ret = FALSE; /* by default, don't keep blinking */
@@ -108,7 +108,7 @@
 }
 
 static gboolean
-docklet_update_status()
+docklet_update_status(void)
 {
 	GList *convs, *l;
 	int count;
@@ -219,7 +219,7 @@
 }
 
 static gboolean
-online_account_supports_chat()
+online_account_supports_chat(void)
 {
 	GList *c = NULL;
 	c = purple_connections_get_all();
@@ -523,7 +523,7 @@
 }
 
 static GtkWidget *
-docklet_status_submenu()
+docklet_status_submenu(void)
 {
 	GtkWidget *submenu, *menuitem;
 	GList *popular_statuses, *cur;
@@ -667,7 +667,8 @@
 }
 
 static void
-docklet_menu() {
+docklet_menu(void)
+{
 	static GtkWidget *menu = NULL;
 	GtkWidget *menuitem;
 
--- a/pidgin/gtkft.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkft.c	Wed Feb 06 03:35:04 2008 +0000
@@ -156,15 +156,15 @@
 	}
 
 	if (time_remaining != NULL) {
-		if (purple_xfer_get_size(xfer) == 0) {
-			*time_remaining = g_strdup(_("Unknown"));
-		}
-		else if (purple_xfer_is_completed(xfer)) {
+		if (purple_xfer_is_completed(xfer)) {
 			*time_remaining = g_strdup(_("Finished"));
 		}
 		else if (purple_xfer_is_canceled(xfer)) {
 			*time_remaining = g_strdup(_("Canceled"));
 		}
+		else if (purple_xfer_get_size(xfer) == 0 || (kb_sent > 0 && kbps == 0)) {
+			*time_remaining = g_strdup(_("Unknown"));
+		}
 		else if (kb_sent <= 0) {
 			*time_remaining = g_strdup(_("Waiting for transfer to begin"));
 		}
--- a/pidgin/gtkidle.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkidle.c	Wed Feb 06 03:35:04 2008 +0000
@@ -69,7 +69,7 @@
  */
 #if defined(USE_SCREENSAVER) || defined(HAVE_IOKIT)
 static time_t
-pidgin_get_time_idle()
+pidgin_get_time_idle(void)
 {
 # ifdef HAVE_IOKIT
 	/* Query the IOKit API */
--- a/pidgin/gtkimhtml.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkimhtml.c	Wed Feb 06 03:35:04 2008 +0000
@@ -289,7 +289,7 @@
 #endif
 
 static GtkSmileyTree*
-gtk_smiley_tree_new ()
+gtk_smiley_tree_new (void)
 {
 	return g_new0 (GtkSmileyTree, 1);
 }
@@ -1455,6 +1455,9 @@
 	gtk_text_buffer_create_tag(imhtml->text_buffer, "SUP", "rise", 5000, NULL);
 	gtk_text_buffer_create_tag(imhtml->text_buffer, "PRE", "family", "Monospace", NULL);
 	gtk_text_buffer_create_tag(imhtml->text_buffer, "search", "background", "#22ff00", "weight", "bold", NULL);
+#if GTK_CHECK_VERSION(2,10,10)
+	gtk_text_buffer_create_tag(imhtml->text_buffer, "comment", "invisible", FALSE, NULL);
+#endif
 
 	/* When hovering over a link, we show the hand cursor--elsewhere we show the plain ol' pointer cursor */
 	imhtml->hand_cursor = gdk_cursor_new (GDK_HAND2);
@@ -2981,10 +2984,15 @@
 
 					gtk_text_buffer_insert(imhtml->text_buffer, iter, ws, wpos);
 
+#if GTK_CHECK_VERSION(2,10,10)
+					wpos = g_snprintf (ws, len, "%s", tag);
+					gtk_text_buffer_insert_with_tags_by_name(imhtml->text_buffer, iter, ws, wpos, "comment", NULL);
+#else
 					if (imhtml->show_comments && !(options & GTK_IMHTML_NO_COMMENTS)) {
 						wpos = g_snprintf (ws, len, "%s", tag);
 						gtk_text_buffer_insert(imhtml->text_buffer, iter, ws, wpos);
 					}
+#endif
 					ws[0] = '\0'; wpos = 0;
 
 					/* NEW_BIT (NEW_COMMENT_BIT); */
@@ -3130,6 +3138,12 @@
 void       gtk_imhtml_show_comments    (GtkIMHtml        *imhtml,
 					gboolean          show)
 {
+#if GTK_CHECK_VERSION(2,10,10)
+	GtkTextTag *tag;
+	tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(imhtml->text_buffer), "comment");
+	if (tag)
+		g_object_set(G_OBJECT(tag), "invisible", !show, NULL);
+#endif
 	imhtml->show_comments = show;
 }
 
@@ -4277,33 +4291,6 @@
 	g_object_unref(object);
 }
 
-static void populate_popup_cb(GtkTextView *textview, GtkMenu *menu, gpointer nul)
-{
-	GtkWidget *mi, *img;
-	
-	mi = gtk_menu_item_new();
-	gtk_widget_show(mi);
-	gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi);
-
-	img = gtk_image_new_from_stock(GTK_STOCK_BOLD, GTK_ICON_SIZE_MENU);
-	mi = gtk_image_menu_item_new_with_mnemonic(_("_Font"));
-	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
-	gtk_widget_show(mi);
-	gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi);
-
-	img = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_INSERT, GTK_ICON_SIZE_MENU);
-	mi = gtk_image_menu_item_new_with_mnemonic(_("_Insert"));
-	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
-	gtk_widget_show(mi);
-	gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi);
-
-	img = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SMILEY, GTK_ICON_SIZE_MENU);
-	mi = gtk_image_menu_item_new_with_mnemonic(_("S_mile!"));
-	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
-	gtk_widget_show(mi);
-	gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi);
-}
-
 static void imhtml_toggle_bold(GtkIMHtml *imhtml)
 {
 	GtkTextIter start, end;
--- a/pidgin/gtkimhtmltoolbar.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkimhtmltoolbar.c	Wed Feb 06 03:35:04 2008 +0000
@@ -709,10 +709,8 @@
 		smileys = smileys->next;
 	}
 
-	PIDGIN_DIALOG(dialog);
+	dialog = pidgin_create_dialog(_("Smile!"), 0, "smiley_dialog", FALSE);
 
-	gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-	gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog");
 	gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
 
 	if (unique_smileys != NULL) {
@@ -769,18 +767,15 @@
 	}
 
 	g_signal_connect(G_OBJECT(dialog), "key-press-event", (GCallback)smiley_dialog_input_cb, toolbar);
-	gtk_container_add(GTK_CONTAINER(dialog), smiley_table);
+	gtk_container_add(GTK_CONTAINER(pidgin_dialog_get_vbox(GTK_DIALOG(dialog))), smiley_table);
 
 	gtk_widget_show(smiley_table);
 
-	gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
-
 	/* connect signals */
 	g_signal_connect(G_OBJECT(dialog), "delete_event",
 					 G_CALLBACK(close_smiley_dialog), toolbar);
 
 	/* show everything */
-	gtk_window_set_title(GTK_WINDOW(dialog), _("Smile!"));
 	gtk_widget_show_all(dialog);
 	gtk_window_set_transient_for(GTK_WINDOW(dialog),
 			GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(toolbar))));
@@ -1317,6 +1312,7 @@
 
 	gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, FALSE, 0);
 	g_object_set_data(G_OBJECT(hbox), "lean-view", box);
+	gtk_widget_show(box);
 
 	purple_prefs_connect_callback(toolbar, PIDGIN_PREFS_ROOT "/conversations/toolbar/wide",
 			imhtmltoolbar_view_pref_changed, toolbar);
--- a/pidgin/gtklog.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtklog.c	Wed Feb 06 03:35:04 2008 +0000
@@ -139,7 +139,7 @@
 	{
 		/* Searching for the same term acts as "Find Next" */
 		gtk_imhtml_search_find(GTK_IMHTML(lv->imhtml), lv->search);
-		return;	
+		return;
 	}
 
 	pidgin_set_cursor(lv->window, GDK_WATCH);
@@ -242,8 +242,8 @@
 {
 	if (!purple_log_delete((PurpleLog *)data[2]))
 	{
-		purple_notify_error(NULL, NULL, "Log Deletion Failed",
-		                  "Check permissions and try again.");
+		purple_notify_error(NULL, NULL, _("Log Deletion Failed"),
+		                  _("Check permissions and try again."));
 	}
 	else
 	{
@@ -321,7 +321,7 @@
 	data2[0] = lv->treestore;
 	data2[1] = data[3]; /* iter */
 	data2[2] = log;
-	purple_request_action(lv, NULL, "Delete Log?", tmp, 0, 
+	purple_request_action(lv, NULL, _("Delete Log?"), tmp, 0,
 						NULL, NULL, NULL,
 						data2, 2,
 						_("Delete"), delete_log_cb,
@@ -332,7 +332,7 @@
 static void log_show_popup_menu(GtkWidget *treeview, GdkEventButton *event, gpointer *data)
 {
 	GtkWidget *menu = gtk_menu_new();
-	GtkWidget *menuitem = gtk_menu_item_new_with_label("Delete Log...");
+	GtkWidget *menuitem = gtk_menu_item_new_with_label(_("Delete Log..."));
 
 	if (!purple_log_is_deletable((PurpleLog *)data[1]))
 		gtk_widget_set_sensitive(menuitem, FALSE);
@@ -556,8 +556,13 @@
 				if (!purple_prefs_get_bool("/purple/logging/log_chats"))
 					log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled.");
 			}
+			g_free(ht->screenname);
+			g_free(ht);
 		}
 
+		if(icon != NULL)
+			gtk_widget_destroy(icon);
+
 		purple_notify_info(NULL, title, _("No logs were found"), log_preferences);
 		return NULL;
 	}
@@ -614,6 +619,7 @@
 	gtk_paned_add1(GTK_PANED(pane), sw);
 	lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
 	lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore));
+	g_object_unref(G_OBJECT(lv->treestore));
 	rend = gtk_cell_renderer_text_new();
 	col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL);
 	gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col);
@@ -730,18 +736,19 @@
 }
 
 void pidgin_log_show_contact(PurpleContact *contact) {
-	struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1);
+	struct log_viewer_hash_t *ht;
 	PurpleBlistNode *child;
 	PidginLogViewer *lv = NULL;
 	GList *logs = NULL;
 	GdkPixbuf *pixbuf;
-	GtkWidget *image = gtk_image_new();
+	GtkWidget *image;
 	const char *name = NULL;
 	char *title;
 	int total_log_size = 0;
 
 	g_return_if_fail(contact != NULL);
 
+	ht = g_new0(struct log_viewer_hash_t, 1);
 	ht->type = PURPLE_LOG_IM;
 	ht->contact = contact;
 
@@ -763,9 +770,16 @@
 	}
 	logs = g_list_sort(logs, purple_log_compare);
 
+	image = gtk_image_new();
 	pixbuf = gtk_widget_render_icon(image, PIDGIN_STOCK_STATUS_PERSON,
 					gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow");
-	gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
+	if (pixbuf) {
+		gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
+		g_object_unref(pixbuf);
+	} else {
+		gtk_widget_destroy(image);
+		image = NULL;
+	}
 
 	if (contact->alias != NULL)
 		name = contact->alias;
--- a/pidgin/gtkmain.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkmain.c	Wed Feb 06 03:35:04 2008 +0000
@@ -174,7 +174,7 @@
  * be wise to move this code into gtksound.c.
  */
 static void
-clean_pid()
+clean_pid(void)
 {
 	int status;
 	pid_t pid;
@@ -241,7 +241,7 @@
 #endif
 
 static int
-ui_main()
+ui_main(void)
 {
 #ifndef _WIN32
 	GList *icons = NULL;
@@ -359,7 +359,7 @@
 	gtk_main_quit();
 }
 
-static GHashTable *pidgin_ui_get_info()
+static GHashTable *pidgin_ui_get_info(void)
 {
 	if(NULL == ui_info) {
 		ui_info = g_hash_table_new(g_str_hash, g_str_equal);
@@ -508,6 +508,7 @@
 		{"session",  required_argument, NULL, 's'},
 		{"version",  no_argument,       NULL, 'v'},
 		{"display",  required_argument, NULL, 'D'},
+		{"sync",     no_argument,       NULL, 'S'},
 		{0, 0, 0, 0}
 	};
 
@@ -517,7 +518,7 @@
 	debug_enabled = FALSE;
 #endif
 
-	/* This is the first Glib function call. Make sure to initialize GThread bfeore then */
+	/* Initialize GThread before calling any Glib or GTK+ functions. */
 	g_thread_init(NULL);
 
 #ifdef ENABLE_NLS
@@ -654,6 +655,7 @@
 			opt_si = FALSE;
 			break;
 		case 'D':   /* --display */
+		case 'S':   /* --sync */
 			/* handled by gtk_init_check below */
 			break;
 		case '?':	/* show terse help */
--- a/pidgin/gtknotify.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtknotify.c	Wed Feb 06 03:35:04 2008 +0000
@@ -332,7 +332,7 @@
 }
 
 static GtkWidget *
-pidgin_get_mail_dialog()
+pidgin_get_mail_dialog(void)
 {
 	if (mail_dialog == NULL) {
 		GtkWidget *dialog = NULL;
@@ -379,6 +379,7 @@
 		mail_dialog->treemodel = gtk_tree_store_new(COLUMNS_PIDGIN_MAIL,
 						GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
 		mail_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(mail_dialog->treemodel));
+		g_object_unref(G_OBJECT(mail_dialog->treemodel));
 		gtk_tree_view_set_search_column(GTK_TREE_VIEW(mail_dialog->treeview), PIDGIN_MAIL_TEXT);
 		gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(mail_dialog->treeview),
 			             pidgin_tree_view_search_equal_func, NULL, NULL);
@@ -604,7 +605,7 @@
 }
 
 static GtkIMHtmlOptions
-notify_imhtml_options()
+notify_imhtml_options(void)
 {
 	GtkIMHtmlOptions options = 0;
 
@@ -818,6 +819,7 @@
 
 	/* Setup the treeview */
 	treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
+	g_object_unref(G_OBJECT(model));
 	gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
 	gtk_widget_set_size_request(treeview, 500, 400);
 	gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
@@ -1056,7 +1058,12 @@
 	/* if they are running gnome, use the gnome web browser */
 	if (purple_running_gnome() == TRUE)
 	{
-		command = g_strdup_printf("gnome-open %s", escaped);
+		char *tmp = g_find_program_in_path("xdg-open");
+		if (tmp == NULL)
+			command = g_strdup_printf("gnome-open %s", escaped);
+		else
+			command = g_strdup_printf("xdg-open %s", escaped);
+		g_free(tmp);
 	}
 	else if (purple_running_osx() == TRUE)
 	{
@@ -1072,6 +1079,10 @@
 		else
 			command = g_strdup_printf("%s %s", web_browser, escaped);
 	}
+	else if (!strcmp(web_browser, "xdg-open"))
+	{
+		command = g_strdup_printf("xdg-open %s", escaped);
+	}
 	else if (!strcmp(web_browser, "gnome-open"))
 	{
 		command = g_strdup_printf("gnome-open %s", escaped);
--- a/pidgin/gtkplugin.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkplugin.c	Wed Feb 06 03:35:04 2008 +0000
@@ -31,6 +31,7 @@
 #include "debug.h"
 #include "prefs.h"
 #include "request.h"
+#include "pidgintooltip.h"
 
 #include <string.h>
 
@@ -531,6 +532,58 @@
 	plugin_dialog_response_cb(dialog, PIDGIN_RESPONSE_CONFIGURE, sel);
 }
 
+static gboolean
+pidgin_plugins_paint_tooltip(GtkWidget *tipwindow, gpointer data)
+{
+	PangoLayout *layout = g_object_get_data(G_OBJECT(tipwindow), "tooltip-plugin");
+	gtk_paint_layout(tipwindow->style, tipwindow->window, GTK_STATE_NORMAL, FALSE,
+			NULL, tipwindow, "tooltip",
+			6, 6, layout);
+	return TRUE;
+}
+
+static gboolean
+pidgin_plugins_create_tooltip(GtkWidget *tipwindow, GtkTreePath *path,
+		gpointer data, int *w, int *h)
+{
+	GtkTreeIter iter;
+	GtkTreeView *treeview = GTK_TREE_VIEW(data);
+	PurplePlugin *plugin = NULL;
+	GtkTreeModel *model = gtk_tree_view_get_model(treeview);
+	PangoLayout *layout;
+	int width, height;
+	char *markup, *name, *desc, *author;
+
+	if (!gtk_tree_model_get_iter(model, &iter, path))
+		return FALSE;
+
+	gtk_tree_model_get(model, &iter, 2, &plugin, -1);
+
+	markup = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>\n<b>Description:</b> %s\n<b>Author:</b> %s",
+			name = g_markup_escape_text(purple_plugin_get_name(plugin), -1),
+			desc = g_markup_escape_text(purple_plugin_get_description(plugin), -1),
+			author = g_markup_escape_text(purple_plugin_get_author(plugin), -1));
+
+	layout = gtk_widget_create_pango_layout(tipwindow, NULL);
+	pango_layout_set_markup(layout, markup, -1);
+	pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
+	pango_layout_set_width(layout, 600000);
+	pango_layout_get_size(layout, &width, &height);
+	g_object_set_data_full(G_OBJECT(tipwindow), "tooltip-plugin", layout, g_object_unref);
+
+	if (w)
+		*w = PANGO_PIXELS(width) + 12;
+	if (h)
+		*h = PANGO_PIXELS(height) + 12;
+
+	g_free(markup);
+	g_free(name);
+	g_free(desc);
+	g_free(author);
+
+	return TRUE;
+}
+
 void pidgin_plugin_dialog_show()
 {
 	GtkWidget *sw;
@@ -613,6 +666,10 @@
 	gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(event_view),
 				pidgin_tree_view_search_equal_func, NULL, NULL);
 
+	pidgin_tooltip_setup_for_treeview(event_view, event_view,
+			pidgin_plugins_create_tooltip,
+			pidgin_plugins_paint_tooltip);
+
 	expander = gtk_expander_new(_("<b>Plugin Details</b>"));
 	gtk_expander_set_use_markup(GTK_EXPANDER(expander), TRUE);
 	plugin_details = gtk_label_new(NULL);
--- a/pidgin/gtkpluginpref.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkpluginpref.c	Wed Feb 06 03:35:04 2008 +0000
@@ -93,22 +93,6 @@
 		case PURPLE_PLUGIN_PREF_NONE:
 		default:
 			if (format == PURPLE_STRING_FORMAT_TYPE_NONE)
-				box = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-			else
-				box = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-
-			gtk_widget_show(box);
-			gtk_box_pack_start(GTK_BOX(parent), box, FALSE, FALSE, 0);
-
-			gtk_label = gtk_label_new_with_mnemonic(pref_label);
-			gtk_misc_set_alignment(GTK_MISC(gtk_label), 0, 0.5);
-			gtk_widget_show(gtk_label);
-			gtk_box_pack_start(GTK_BOX(box), gtk_label, FALSE, FALSE, 0);
-
-			if(sg)
-				gtk_size_group_add_widget(sg, gtk_label);
-
-			if (format == PURPLE_STRING_FORMAT_TYPE_NONE)
 			{				
 				entry = gtk_entry_new();
 				gtk_entry_set_text(GTK_ENTRY(entry), purple_prefs_get_string(pref_name));
@@ -123,9 +107,7 @@
 				g_signal_connect(G_OBJECT(entry), "changed",
 								 G_CALLBACK(entry_cb),
 								 (gpointer)pref_name);
-				gtk_label_set_mnemonic_widget(GTK_LABEL(gtk_label), entry);
-				gtk_widget_show(entry);
-				gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 0);
+				pidgin_add_widget_to_vbox(GTK_BOX(parent), pref_label, sg, entry, TRUE, NULL);
 			}
 			else
 			{
@@ -135,6 +117,19 @@
 				GtkWidget *toolbar;
 				GtkWidget *frame;
 
+				box = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
+
+				gtk_widget_show(box);
+				gtk_box_pack_start(GTK_BOX(parent), box, FALSE, FALSE, 0);
+
+				gtk_label = gtk_label_new_with_mnemonic(pref_label);
+				gtk_misc_set_alignment(GTK_MISC(gtk_label), 0, 0.5);
+				gtk_widget_show(gtk_label);
+				gtk_box_pack_start(GTK_BOX(box), gtk_label, FALSE, FALSE, 0);
+
+				if(sg)
+					gtk_size_group_add_widget(sg, gtk_label);
+
 				hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
 				gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
 				gtk_widget_show(hbox);
--- a/pidgin/gtkpounce.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkpounce.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1237,6 +1237,7 @@
 
 	/* Create the treeview */
 	treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model));
+	g_object_unref(G_OBJECT(dialog->model));
 	dialog->treeview = treeview;
 	gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
 
--- a/pidgin/gtkprefs.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkprefs.c	Wed Feb 06 03:35:04 2008 +0000
@@ -89,23 +89,12 @@
 pidgin_prefs_labeled_spin_button(GtkWidget *box, const gchar *title,
 		const char *key, int min, int max, GtkSizeGroup *sg)
 {
-	GtkWidget *hbox;
-	GtkWidget *label;
 	GtkWidget *spin;
 	GtkObject *adjust;
 	int val;
 
 	val = purple_prefs_get_int(key);
 
-	hbox = gtk_hbox_new(FALSE, 5);
-	gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 5);
-	gtk_widget_show(hbox);
-
-	label = gtk_label_new_with_mnemonic(title);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-	gtk_widget_show(label);
-
 	adjust = gtk_adjustment_new(val, min, max, 1, 1, 1);
 	spin = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0);
 	g_object_set_data(G_OBJECT(spin), "val", (char *)key);
@@ -113,21 +102,11 @@
 		gtk_widget_set_size_request(spin, 50, -1);
 	else
 		gtk_widget_set_size_request(spin, 60, -1);
-	gtk_box_pack_start(GTK_BOX(hbox), spin, FALSE, FALSE, 0);
 	g_signal_connect(G_OBJECT(adjust), "value-changed",
 					 G_CALLBACK(update_spin_value), GTK_WIDGET(spin));
 	gtk_widget_show(spin);
 
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin);
-
-	if (sg) {
-		gtk_size_group_add_widget(sg, label);
-		gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-	}
-
-	pidgin_set_accessible_label (spin, label);
-
-	return hbox;
+	return pidgin_add_widget_to_vbox(GTK_BOX(box), title, sg, spin, FALSE, NULL);
 }
 
 static void
@@ -141,37 +120,18 @@
 pidgin_prefs_labeled_entry(GtkWidget *page, const gchar *title,
 							 const char *key, GtkSizeGroup *sg)
 {
-	GtkWidget *hbox, *label, *entry;
+	GtkWidget *entry;
 	const gchar *value;
 
 	value = purple_prefs_get_string(key);
 
-	hbox = gtk_hbox_new(FALSE, 5);
-	gtk_box_pack_start(GTK_BOX(page), hbox, FALSE, FALSE, 0);
-	gtk_widget_show(hbox);
-
-	label = gtk_label_new_with_mnemonic(title);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-	gtk_widget_show(label);
-
 	entry = gtk_entry_new();
 	gtk_entry_set_text(GTK_ENTRY(entry), value);
-	gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
 	g_signal_connect(G_OBJECT(entry), "changed",
 					 G_CALLBACK(entry_set), (char*)key);
 	gtk_widget_show(entry);
 
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry);
-
-	if(sg) {
-		gtk_size_group_add_widget(sg, label);
-		gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-	}
-
-	pidgin_set_accessible_label(entry, label);
-
-	return hbox;
+	return pidgin_add_widget_to_vbox(GTK_BOX(page), title, sg, entry, TRUE, NULL);
 }
 
 static void
@@ -205,7 +165,6 @@
 {
 	GtkWidget  *dropdown, *opt, *menu;
 	GtkWidget  *label = NULL;
-	GtkWidget  *hbox;
 	gchar      *text;
 	const char *stored_str = NULL;
 	int         stored_int = 0;
@@ -215,19 +174,6 @@
 
 	g_return_val_if_fail(menuitems != NULL, NULL);
 
-	if (title != NULL) {
-		hbox = gtk_hbox_new(FALSE, 5);
-		/*gtk_container_add (GTK_CONTAINER (box), hbox);*/
-		gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
-		gtk_widget_show(hbox);
-
-		label = gtk_label_new_with_mnemonic(title);
-		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-		gtk_widget_show(label);
-	} else {
-		hbox = box;
-	}
-
 #if 0 /* GTK_CHECK_VERSION(2,4,0) */
 	if(type == PURPLE_PREF_INT)
 		model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
@@ -239,11 +185,6 @@
 	menu = gtk_menu_new();
 #endif
 
-	if (label != NULL) {
-		gtk_label_set_mnemonic_widget(GTK_LABEL(label), dropdown);
-		pidgin_set_accessible_relations (dropdown, label);
-	}
-
 	if (type == PURPLE_PREF_INT)
 		stored_int = purple_prefs_get_int(key);
 	else if (type == PURPLE_PREF_STRING)
@@ -293,8 +234,8 @@
 	}
 
 	gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu);
-	gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0);
-	gtk_widget_show(dropdown);
+
+	pidgin_add_widget_to_vbox(GTK_BOX(box), title, NULL, dropdown, FALSE, &label);
 
 	return label;
 }
@@ -412,7 +353,7 @@
 	gtk_tree_path_free(path);
 }
 
-static GtkTreeRowReference *theme_refresh_theme_list()
+static GtkTreeRowReference *theme_refresh_theme_list(void)
 {
 	GdkPixbuf *pixbuf;
 	GSList *themes;
@@ -537,12 +478,20 @@
 {
 	FILE *f;
 	gchar *path;
+	size_t wc;
 
 	if ((error_message != NULL) || (len == 0))
 		return;
 
 	f = purple_mkstemp(&path, TRUE);
-	fwrite(themedata, len, 1, f);
+	wc = fwrite(themedata, len, 1, f);
+	if (wc != 1) {
+		purple_debug_warning("theme_got_url", "Unable to write theme data.\n");
+		fclose(f);
+		g_unlink(path);
+		g_free(path);
+		return;
+	}
 	fclose(f);
 
 	theme_install_theme(path, user_data);
@@ -676,7 +625,7 @@
 }
 
 static GtkWidget *
-theme_page()
+theme_page(void)
 {
 	GtkWidget *add_button, *remove_button;
 	GtkWidget *hbox_buttons;
@@ -877,7 +826,7 @@
 }
 
 static GtkWidget *
-interface_page()
+interface_page(void)
 {
 	GtkWidget *ret;
 	GtkWidget *vbox;
@@ -970,7 +919,7 @@
 #endif
 
 static GtkWidget *
-conv_page()
+conv_page(void)
 {
 	GtkWidget *ret;
 	GtkWidget *vbox;
@@ -983,7 +932,6 @@
 
 #if GTK_CHECK_VERSION(2,4,0)
 	GtkWidget *hbox;
-	GtkWidget *label;
 	GtkWidget *font_button;
 	const char *font_name;
 #endif
@@ -1026,19 +974,15 @@
 		fontpref = pidgin_prefs_checkbox(_("Use document font from _theme"), PIDGIN_PREFS_ROOT "/conversations/use_theme_font", vbox);
 	else
 		fontpref = pidgin_prefs_checkbox(_("Use font from _theme"), PIDGIN_PREFS_ROOT "/conversations/use_theme_font", vbox);
-	hbox = gtk_hbox_new(FALSE, 3);
-	label = gtk_label_new_with_mnemonic(_("Conversation _font:"));
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+
 	font_name = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/custom_font");
 	font_button = gtk_font_button_new_with_font(font_name ? font_name : NULL);
 	gtk_font_button_set_show_style(GTK_FONT_BUTTON(font_button), TRUE);
-	gtk_box_pack_start(GTK_BOX(hbox), font_button, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Conversation _font:"), NULL, font_button, FALSE, NULL);
 	if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/use_theme_font"))
 		gtk_widget_set_sensitive(hbox, FALSE);
 	g_signal_connect(G_OBJECT(fontpref), "clicked", G_CALLBACK(pidgin_toggle_sensitive), hbox);
 	g_signal_connect(G_OBJECT(font_button), "font-set", G_CALLBACK(pidgin_custom_font_set), NULL);
-	gtk_widget_show_all(hbox);
 #endif
 
 	vbox = pidgin_make_frame(ret, _("Default Formatting"));
@@ -1137,7 +1081,7 @@
 }
 
 static GtkWidget *
-network_page()
+network_page(void)
 {
 	GtkWidget *ret;
 	GtkWidget *vbox, *hbox, *entry;
@@ -1411,7 +1355,7 @@
 	return FALSE;
 }
 
-static GList *get_available_browsers()
+static GList *get_available_browsers(void)
 {
 	struct browser {
 		char *name;
@@ -1425,6 +1369,7 @@
 		{N_("Netscape"), "netscape"},
 		{N_("Mozilla"), "mozilla"},
 		{N_("Konqueror"), "kfmclient"},
+		{N_("Desktop Default"), "xdg-open"},
 		{N_("GNOME Default"), "gnome-open"},
 		{N_("Galeon"), "galeon"},
 		{N_("Firefox"), "firefox"},
@@ -1447,6 +1392,14 @@
 			browsers = g_list_prepend(browsers, (gpointer)_(possible_browsers[i].name));
 			if(browser_setting && !strcmp(possible_browsers[i].command, browser_setting))
 				browser_setting = NULL;
+			/* If xdg-open is valid, prefer it over gnome-open and skip forward */
+			if(!strcmp(possible_browsers[i].command, "xdg-open")) {
+				if (browser_setting && !strcmp("gnome-open", browser_setting)) {
+					purple_prefs_set_string(PIDGIN_PREFS_ROOT "/browsers/browser", possible_browsers[i].command);
+					browser_setting = NULL;
+				}
+				i++;
+			}
 		}
 	}
 
@@ -1477,7 +1430,7 @@
 }
 
 static GtkWidget *
-browser_page()
+browser_page(void)
 {
 	GtkWidget *ret;
 	GtkWidget *vbox;
@@ -1520,28 +1473,16 @@
 									browser_changed1_cb, hbox);
 	}
 
-	hbox = gtk_hbox_new(FALSE, 5);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-	label = gtk_label_new_with_mnemonic(_("_Manual:\n(%s for URL)"));
-	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
-	gtk_size_group_add_widget(sg, label);
-
 	entry = gtk_entry_new();
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry);
-
-	if (strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/browser"), "custom"))
-		gtk_widget_set_sensitive(hbox, FALSE);
-	purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/browsers/browser",
-								browser_changed2_cb, hbox);
-
-	gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
-
 	gtk_entry_set_text(GTK_ENTRY(entry),
 					   purple_prefs_get_path(PIDGIN_PREFS_ROOT "/browsers/command"));
 	g_signal_connect(G_OBJECT(entry), "focus-out-event",
 					 G_CALLBACK(manual_browser_set), NULL);
-	pidgin_set_accessible_label (entry, label);
+	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Manual:\n(%s for URL)"), sg, entry, TRUE, NULL);
+	if (strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/browser"), "custom"))
+		gtk_widget_set_sensitive(hbox, FALSE);
+	purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/browsers/browser",
+			browser_changed2_cb, hbox);
 
 	gtk_widget_show_all(ret);
 	g_object_unref(sg);
@@ -1550,7 +1491,7 @@
 #endif /*_WIN32*/
 
 static GtkWidget *
-logging_page()
+logging_page(void)
 {
 	GtkWidget *ret;
 	GtkWidget *vbox;
@@ -1778,7 +1719,7 @@
 }
 
 static GtkWidget *
-sound_page()
+sound_page(void)
 {
 	GtkWidget *ret;
 	GtkWidget *vbox, *sw, *button;
@@ -1794,9 +1735,6 @@
 	int j;
 	const char *file;
 	char *pref;
-#if !defined _WIN32 || defined USE_GSTREAMER
-	GtkWidget *label;
-#endif
 #ifndef _WIN32
 	GtkWidget *dd;
 	GtkWidget *entry;
@@ -1824,33 +1762,20 @@
 	gtk_size_group_add_widget(sg, dd);
 	gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5);
 
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-	label = gtk_label_new_with_mnemonic(_("Sound c_ommand:\n(%s for filename)"));
-	gtk_size_group_add_widget(sg, label);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
 	entry = gtk_entry_new();
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry);
-
 	gtk_editable_set_editable(GTK_EDITABLE(entry), TRUE);
 	cmd = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/sound/command");
 	if(cmd)
 		gtk_entry_set_text(GTK_ENTRY(entry), cmd);
-
-	gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
 	g_signal_connect(G_OBJECT(entry), "changed",
 					 G_CALLBACK(sound_cmd_yeah), NULL);
 
+	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Sound c_ommand:\n(%s for filename)"), sg, entry, TRUE, NULL);
 	purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/sound/method",
 								sound_changed1_cb, hbox);
 	gtk_widget_set_sensitive(hbox,
 			!strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/method"),
 					"custom"));
-
-	pidgin_set_accessible_label (entry, label);
 #endif /* _WIN32 */
 
 	vbox = pidgin_make_frame (ret, _("Sound Options"));
@@ -1864,13 +1789,6 @@
 				NULL);
 
 #ifdef USE_GSTREAMER
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-	label = gtk_label_new_with_mnemonic(_("Volume:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
 	sw = gtk_hscale_new_with_range(0.0, 100.0, 5.0);
 	gtk_range_set_increments(GTK_RANGE(sw), 5.0, 25.0);
 	gtk_range_set_value(GTK_RANGE(sw), purple_prefs_get_int(PIDGIN_PREFS_ROOT "/sound/volume"));
@@ -1880,7 +1798,7 @@
 	g_signal_connect (G_OBJECT (sw), "value-changed",
 			  G_CALLBACK (prefs_sound_volume_changed),
 			  NULL);
-	gtk_box_pack_start(GTK_BOX(hbox), sw, TRUE, TRUE, 0);
+	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Volume:"), NULL, sw, TRUE, NULL);
 
 	purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/sound/method",
 								sound_changed3_cb, hbox);
@@ -2005,11 +1923,10 @@
 }
 
 static GtkWidget *
-away_page()
+away_page(void)
 {
 	GtkWidget *ret;
 	GtkWidget *vbox;
-	GtkWidget *hbox;
 	GtkWidget *dd;
 	GtkWidget *label;
 	GtkWidget *button;
@@ -2060,22 +1977,13 @@
 	g_signal_connect(G_OBJECT(button), "clicked",
 					 G_CALLBACK(pidgin_toggle_sensitive), select);
 
-	hbox = gtk_hbox_new(FALSE, 0);
-	gtk_container_add(GTK_CONTAINER(vbox), hbox);
-
-	label = gtk_label_new_with_mnemonic(_("Change _status to:"));
-	gtk_size_group_add_widget(sg, label);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+	/* TODO: Show something useful if we don't have any saved statuses. */
+	menu = pidgin_status_menu(purple_savedstatus_get_idleaway(), G_CALLBACK(set_idle_away));
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Change _status to:"), sg, menu, TRUE, &label);
+	g_signal_connect(G_OBJECT(button), "clicked",
+			 G_CALLBACK(pidgin_toggle_sensitive), menu);
 	g_signal_connect(G_OBJECT(button), "clicked",
 					 G_CALLBACK(pidgin_toggle_sensitive), label);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
-	/* TODO: Show something useful if we don't have any saved statuses. */
-	menu = pidgin_status_menu(purple_savedstatus_get_idleaway(), G_CALLBACK(set_idle_away));
-	gtk_box_pack_start(GTK_BOX(hbox), menu, FALSE, FALSE, 0);
-	g_signal_connect(G_OBJECT(button), "clicked",
-			 G_CALLBACK(pidgin_toggle_sensitive), menu);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), menu);
 
 	if (!purple_prefs_get_bool("/purple/away/away_when_idle")) {
 		gtk_widget_set_sensitive(GTK_WIDGET(menu), FALSE);
@@ -2089,22 +1997,13 @@
 	button = pidgin_prefs_checkbox(_("Use status from last _exit at startup"),
 		"/purple/savedstatus/startup_current_status", vbox);
 
-	hbox = gtk_hbox_new(FALSE, 0);
-	gtk_container_add(GTK_CONTAINER(vbox), hbox);
-
-	label = gtk_label_new_with_mnemonic(_("Status to a_pply at startup:"));
-	gtk_size_group_add_widget(sg, label);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+	/* TODO: Show something useful if we don't have any saved statuses. */
+	menu = pidgin_status_menu(purple_savedstatus_get_startup(), G_CALLBACK(set_startupstatus));
+	g_signal_connect(G_OBJECT(button), "clicked",
+			 G_CALLBACK(pidgin_toggle_sensitive), menu);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Status to a_pply at startup:"), sg, menu, TRUE, &label);
 	g_signal_connect(G_OBJECT(button), "clicked",
 					 G_CALLBACK(pidgin_toggle_sensitive), label);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
-	/* TODO: Show something useful if we don't have any saved statuses. */
-	menu = pidgin_status_menu(purple_savedstatus_get_startup(), G_CALLBACK(set_startupstatus));
-	gtk_box_pack_start(GTK_BOX(hbox), menu, FALSE, FALSE, 0);
-	g_signal_connect(G_OBJECT(button), "clicked",
-			 G_CALLBACK(pidgin_toggle_sensitive), menu);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), menu);
 
 	if (purple_prefs_get_bool("/purple/savedstatus/startup_current_status")) {
 		gtk_widget_set_sensitive(GTK_WIDGET(menu), FALSE);
@@ -2130,7 +2029,7 @@
 #endif
 }
 
-static void prefs_notebook_init() {
+static void prefs_notebook_init(void) {
 	prefs_notebook_add_page(_("Interface"), interface_page(), notebook_page++);
 	prefs_notebook_add_page(_("Conversations"), conv_page(), notebook_page++);
 	prefs_notebook_add_page(_("Smiley Themes"), theme_page(), notebook_page++);
--- a/pidgin/gtkprivacy.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkprivacy.c	Wed Feb 06 03:35:04 2008 +0000
@@ -44,7 +44,7 @@
 
 	GtkWidget *add_button;
 	GtkWidget *remove_button;
-	GtkWidget *clear_button;
+	GtkWidget *removeall_button;
 	GtkWidget *close_button;
 
 	GtkWidget *button_box;
@@ -117,23 +117,6 @@
 	}
 }
 
-static const char *
-find_permit_block_by_name(GSList *list, const char *name)
-{
-	const char *temp_name;
-	GSList *l;
-
-	for (l = list; l != NULL; l = l->next) {
-		temp_name = (const char *)l->data;
-
-		/* Should this use purple_normalize()? */
-		if (!purple_utf8_strcasecmp(name, temp_name))
-			return temp_name;
-	}
-
-	return NULL;
-}
-
 static void
 user_selected_cb(GtkTreeSelection *sel, PidginPrivacyDialog *dialog)
 {
@@ -317,19 +300,16 @@
 	else
 		return;
 
-	if (dialog->in_allow_list) {
-		if (find_permit_block_by_name(dialog->account->permit, name))
-			purple_privacy_permit_remove(dialog->account, name, FALSE);
-	}
-	else {
-		if (find_permit_block_by_name(dialog->account->deny, name))
-			purple_privacy_deny_remove(dialog->account, name, FALSE);
-	}
+	if (dialog->in_allow_list)
+		purple_privacy_permit_remove(dialog->account, name, FALSE);
+	else
+		purple_privacy_deny_remove(dialog->account, name, FALSE);
+
 	g_free(name);
 }
 
 static void
-clear_cb(GtkWidget *button, PidginPrivacyDialog *dialog)
+removeall_cb(GtkWidget *button, PidginPrivacyDialog *dialog)
 {
 	GSList *l;
 	if (dialog->in_allow_list)
@@ -359,7 +339,6 @@
 privacy_dialog_new(void)
 {
 	PidginPrivacyDialog *dialog;
-	GtkWidget *hbox;
 	GtkWidget *vbox;
 	GtkWidget *button;
 	GtkWidget *dropdown;
@@ -386,22 +365,10 @@
 	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
 	gtk_widget_show(label);
 
-	/* Hbox for the accounts drop-down and label. */
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-	gtk_widget_show(hbox);
-
-	/* "Set privacy for:" label */
-	label = gtk_label_new(_("Set privacy for:"));
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-	gtk_widget_show(label);
-
 	/* Accounts drop-down */
 	dropdown = pidgin_account_option_menu_new(NULL, FALSE,
 												G_CALLBACK(select_account_cb), NULL, dialog);
-	gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0);
-	gtk_widget_show(dropdown);
-	pidgin_set_accessible_label (dropdown, label);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Set privacy for:"), NULL, dropdown, TRUE, NULL);
 	dialog->account = pidgin_account_option_menu_get_selected(dropdown);
 
 	/* Add the drop-down list with the allow/block types. */
@@ -433,7 +400,7 @@
 	dialog->block_widget = build_block_list(dialog);
 	gtk_box_pack_start(GTK_BOX(vbox), dialog->block_widget, TRUE, TRUE, 0);
 
-	/* Add the button box for Add, Remove, Clear */
+	/* Add the button box for Add, Remove, Remove All */
 	dialog->button_box = pidgin_dialog_get_action_area(GTK_DIALOG(dialog->win));
 
 	/* Add button */
@@ -443,11 +410,12 @@
 	/* Remove button */
 	button = pidgin_dialog_add_button(GTK_DIALOG(dialog->win), GTK_STOCK_REMOVE, G_CALLBACK(remove_cb), dialog);
 	dialog->remove_button = button;
+	/* TODO: This button should be sensitive/invisitive more cleverly */
 	gtk_widget_set_sensitive(button, FALSE);
 
-	/* Clear button */
-	button = pidgin_dialog_add_button(GTK_DIALOG(dialog->win), GTK_STOCK_CLEAR, G_CALLBACK(clear_cb), dialog);
-	dialog->clear_button = button;
+	/* Remove All button */
+	button = pidgin_dialog_add_button(GTK_DIALOG(dialog->win), _("Remove Al_l"), G_CALLBACK(removeall_cb), dialog);
+	dialog->removeall_button = button;
 
 	/* Close button */
 	button = pidgin_dialog_add_button(GTK_DIALOG(dialog->win), GTK_STOCK_CLOSE, G_CALLBACK(close_cb), dialog);
@@ -487,6 +455,8 @@
 	if (privacy_dialog == NULL)
 		return;
 
+	g_object_unref(G_OBJECT(privacy_dialog->allow_store));
+	g_object_unref(G_OBJECT(privacy_dialog->block_store));
 	g_free(privacy_dialog);
 	privacy_dialog = NULL;
 }
--- a/pidgin/gtkrequest.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkrequest.c	Wed Feb 06 03:35:04 2008 +0000
@@ -663,7 +663,11 @@
 		gtk_widget_grab_focus(img);
 		gtk_widget_grab_default(img);
 	} else
-		gtk_dialog_set_default_response(GTK_DIALOG(dialog), default_action);
+		/*
+		 * Need to invert the default_action number because the
+		 * buttons are added to the dialog in reverse order.
+		 */
+		gtk_dialog_set_default_response(GTK_DIALOG(dialog), action_count - 1 - default_action);
 
 	/* Show everything. */
 	pidgin_auto_parent_window(dialog);
@@ -1007,6 +1011,7 @@
 
 	/* Create the tree view */
 	treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+	g_object_unref(G_OBJECT(store));
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
 
 	sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
--- a/pidgin/gtkroomlist.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkroomlist.c	Wed Feb 06 03:35:04 2008 +0000
@@ -356,8 +356,6 @@
 	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;
 
@@ -523,9 +521,7 @@
 	GtkWidget *window;
 	GtkWidget *vbox;
 	GtkWidget *vbox2;
-	GtkWidget *account_hbox;
 	GtkWidget *bbox;
-	GtkWidget *label;
 
 	dialog = g_new0(PidginRoomlistDialog, 1);
 	dialog->account = account;
@@ -544,25 +540,11 @@
 	gtk_widget_show(vbox2);
 
 	/* accounts dropdown list */
-	account_hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(vbox2), account_hbox, FALSE, FALSE, 0);
-	gtk_widget_show(account_hbox);
-
-	label = gtk_label_new(NULL);
-	gtk_box_pack_start(GTK_BOX(account_hbox), label, FALSE, FALSE, 0);
-	gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Account:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_widget_show(label);
-
 	dialog->account_widget = pidgin_account_option_menu_new(dialog->account, FALSE,
 	                         G_CALLBACK(dialog_select_account_cb), account_filter_func, dialog);
-
 	if (!dialog->account) /* this is normally null, and we normally don't care what the first selected item is */
 		dialog->account = pidgin_account_option_menu_get_selected(dialog->account_widget);
-
-	gtk_box_pack_start(GTK_BOX(account_hbox), dialog->account_widget, TRUE, TRUE, 0);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(dialog->account_widget));
-	gtk_widget_show(dialog->account_widget);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox2), _("_Account:"), NULL, dialog->account_widget, TRUE, NULL);
 
 	/* scrolled window */
 	dialog->sw = gtk_scrolled_window_new(NULL, NULL);
--- a/pidgin/gtksavedstatuses.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtksavedstatuses.c	Wed Feb 06 03:35:04 2008 +0000
@@ -669,6 +669,7 @@
 	purple_request_close_with_handle(status_window);
 	purple_notify_close_with_handle(status_window);
 	purple_signals_disconnect_by_handle(status_window);
+	g_object_unref(G_OBJECT(status_window->model));
 	g_free(status_window);
 	status_window = NULL;
 }
@@ -723,6 +724,7 @@
 
 	status_editor_remove_dialog(dialog);
 	g_free(dialog->original_title);
+	g_object_unref(G_OBJECT(dialog->model));
 	g_free(dialog);
 
 	return FALSE;
@@ -1092,7 +1094,6 @@
 	GtkWidget *entry;
 	GtkWidget *frame;
 	GtkWidget *hbox;
-	GtkWidget *label;
 	GtkWidget *sw;
 	GtkWidget *text;
 	GtkWidget *toolbar;
@@ -1141,52 +1142,29 @@
 	sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 
 	/* Title */
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-	label = gtk_label_new_with_mnemonic(_("_Title:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(sg, label);
-
 	entry = gtk_entry_new();
 	dialog->title = GTK_ENTRY(entry);
 	if ((saved_status != NULL)
 			&& !purple_savedstatus_is_transient(saved_status)
 			&& (purple_savedstatus_get_title(saved_status) != NULL))
 		gtk_entry_set_text(GTK_ENTRY(entry), purple_savedstatus_get_title(saved_status));
-	gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
 	g_signal_connect(G_OBJECT(entry), "changed",
 					 G_CALLBACK(editor_title_changed_cb), dialog);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Title:"), sg, entry, TRUE, NULL);
 
 	/* Status type */
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-	label = gtk_label_new_with_mnemonic(_("_Status:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(sg, label);
-
 	if (saved_status != NULL)
 		dropdown = create_status_type_menu(purple_savedstatus_get_type(saved_status));
 	else
 		dropdown = create_status_type_menu(PURPLE_STATUS_AWAY);
 	dialog->type = GTK_OPTION_MENU(dropdown);
-	gtk_box_pack_start(GTK_BOX(hbox), dropdown, TRUE, TRUE, 0);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Status:"), sg, dropdown, TRUE, NULL);
 
 	/* Status message */
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
-
-	label = gtk_label_new_with_mnemonic(_("_Message:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(sg, label);
-
 	frame = pidgin_create_imhtml(TRUE, &text, &toolbar, NULL);
 	dialog->message = GTK_IMHTML(text);
-	gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
+	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Message:"), sg, frame, TRUE, NULL);
+	gtk_container_child_set(GTK_CONTAINER(vbox), hbox, "expand", TRUE, "fill", TRUE, NULL);
 	focus_chain = g_list_prepend(focus_chain, dialog->message);
 	gtk_container_set_focus_chain(GTK_CONTAINER(hbox), focus_chain);
 	g_list_free(focus_chain);
--- a/pidgin/gtksession.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtksession.c	Wed Feb 06 03:35:04 2008 +0000
@@ -124,7 +124,7 @@
 	purple_debug(PURPLE_DEBUG_INFO, NULL, "done.\n");
 }
 
-static void ice_init() {
+static void ice_init(void) {
 	IceIOErrorHandler default_handler;
 
 	ice_installed_io_error_handler = IceSetIOErrorHandler(NULL);
--- a/pidgin/gtkstatusbox.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkstatusbox.c	Wed Feb 06 03:35:04 2008 +0000
@@ -119,7 +119,10 @@
 	DATA_COLUMN,
 
 	/**
- 	 * This column stores the GdkPixbuf for the status emblem. Currently only 'saved' is stored
+ 	 * This column stores the GdkPixbuf for the status emblem. Currently only 'saved' is stored.
+	 * In the GtkTreeModel for the dropdown, this is the stock-id (gchararray), and for the
+	 * GtkTreeModel for the cell_view (for the account-specific statusbox), this is the prpl-icon
+	 * (GdkPixbuf) of the account.
  	 */
 	EMBLEM_COLUMN,
 
@@ -317,12 +320,20 @@
 {
 	FILE *f;
 	gchar *path;
+	size_t wc;
 
 	if ((error_message != NULL) || (len == 0))
 		return;
 
 	f = purple_mkstemp(&path, TRUE);
-	fwrite(themedata, len, 1, f);
+	wc = fwrite(themedata, len, 1, f);
+	if (wc != 1) {
+		purple_debug_warning("theme_got_url", "Unable to write theme data.\n");
+		fclose(f);
+		g_unlink(path);
+		g_free(path);
+		return;
+	}
 	fclose(f);
 
 	icon_choose_cb(path, user_data);
@@ -500,20 +511,28 @@
 pidgin_status_box_finalize(GObject *obj)
 {
 	PidginStatusBox *statusbox = PIDGIN_STATUS_BOX(obj);
+	int i;
 
 	purple_signals_disconnect_by_handle(statusbox);
 	purple_prefs_disconnect_by_handle(statusbox);
 
-	gdk_cursor_unref(statusbox->hand_cursor);
-	gdk_cursor_unref(statusbox->arrow_cursor);
+	destroy_icon_box(statusbox);
+
+	if (statusbox->active_row)
+		gtk_tree_row_reference_free(statusbox->active_row);
 
-	purple_imgstore_unref(statusbox->buddy_icon_img);
-	g_object_unref(G_OBJECT(statusbox->buddy_icon));
-	g_object_unref(G_OBJECT(statusbox->buddy_icon_hover));
+	for (i = 0; i < G_N_ELEMENTS(statusbox->connecting_pixbufs); i++) {
+		if (statusbox->connecting_pixbufs[i] != NULL)
+			gdk_pixbuf_unref(statusbox->connecting_pixbufs[i]);
+	}
 
-	if (statusbox->buddy_icon_sel)
-		gtk_widget_destroy(statusbox->buddy_icon_sel);
+	for (i = 0; i < G_N_ELEMENTS(statusbox->typing_pixbufs); i++) {
+		if (statusbox->typing_pixbufs[i] != NULL)
+			gdk_pixbuf_unref(statusbox->typing_pixbufs[i]);
+	}
 
+	g_object_unref(G_OBJECT(statusbox->store));
+	g_object_unref(G_OBJECT(statusbox->dropdown_store));
 	G_OBJECT_CLASS(parent_class)->finalize(obj);
 }
 
@@ -606,7 +625,7 @@
 	char aa_color[8];
 	PurpleSavedStatus *saved_status;
 	char *primary, *secondary, *text;
-	GdkPixbuf *pixbuf;
+	GdkPixbuf *pixbuf, *emblem = NULL;
 	GtkTreePath *path;
 	gboolean account_status = FALSE;
 	PurpleAccount *acct = (status_box->token_status_account) ? status_box->token_status_account : status_box->account;
@@ -703,6 +722,7 @@
 		text = g_strdup_printf("%s - <span size=\"smaller\" color=\"%s\">%s</span>",
 				       purple_account_get_username(status_box->account),
 				       aa_color, secondary ? secondary : primary);
+		emblem = pidgin_create_prpl_icon(status_box->account, PIDGIN_PRPL_ICON_SMALL);
 	} else if (secondary != NULL) {
 		text = g_strdup_printf("%s<span size=\"smaller\" color=\"%s\"> - %s</span>",
 				       primary, aa_color, secondary);
@@ -719,10 +739,14 @@
 	gtk_list_store_set(status_box->store, &(status_box->iter),
 			   ICON_COLUMN, pixbuf,
 			   TEXT_COLUMN, text,
+			   EMBLEM_COLUMN, emblem,
+			   EMBLEM_VISIBLE_COLUMN, (emblem != NULL),
 			   -1);
 	if ((status_box->typing == 0) && (!status_box->connecting))
 		g_object_unref(pixbuf);
 	g_free(text);
+	if (emblem)
+		g_object_unref(emblem);
 
 	/* Make sure to activate the only row in the tree view */
 	path = gtk_tree_path_new_from_string("0");
@@ -941,7 +965,7 @@
 
 /* This returns NULL if the active accounts don't have identical
  * statuses and a token account if they do */
-static PurpleAccount* check_active_accounts_for_identical_statuses()
+static PurpleAccount* check_active_accounts_for_identical_statuses(void)
 {
 	PurpleAccount *acct = NULL, *acct2;
 	GList *tmp, *tmp2, *active_accts = purple_accounts_get_all_active();
@@ -1156,18 +1180,15 @@
 cache_pixbufs(PidginStatusBox *status_box)
 {
 	GtkIconSize icon_size;
+	int i;
 
 	g_object_set(G_OBJECT(status_box->icon_rend), "xpad", 3, NULL);
 	icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL);
 
-	if (status_box->connecting_pixbufs[0] != NULL)
-		gdk_pixbuf_unref(status_box->connecting_pixbufs[0]);
-	if (status_box->connecting_pixbufs[1] != NULL)
-		gdk_pixbuf_unref(status_box->connecting_pixbufs[1]);
-	if (status_box->connecting_pixbufs[2] != NULL)
-		gdk_pixbuf_unref(status_box->connecting_pixbufs[2]);
-	if (status_box->connecting_pixbufs[3] != NULL)
-		gdk_pixbuf_unref(status_box->connecting_pixbufs[3]);
+	for (i = 0; i < G_N_ELEMENTS(status_box->connecting_pixbufs); i++) {
+		if (status_box->connecting_pixbufs[i] != NULL)
+			gdk_pixbuf_unref(status_box->connecting_pixbufs[i]);
+	}
 
 	status_box->connecting_index = 0;
 	status_box->connecting_pixbufs[0] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_ANIMATION_CONNECT0,
@@ -1189,14 +1210,10 @@
 	status_box->connecting_pixbufs[8] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_ANIMATION_CONNECT8,
 								     icon_size, "PidginStatusBox");
 
-	if (status_box->typing_pixbufs[0] != NULL)
-		gdk_pixbuf_unref(status_box->typing_pixbufs[0]);
-	if (status_box->typing_pixbufs[1] != NULL)
-		gdk_pixbuf_unref(status_box->typing_pixbufs[1]);
-	if (status_box->typing_pixbufs[2] != NULL)
-		gdk_pixbuf_unref(status_box->typing_pixbufs[2]);
-	if (status_box->typing_pixbufs[3] != NULL)
-		gdk_pixbuf_unref(status_box->typing_pixbufs[3]);
+	for (i = 0; i < G_N_ELEMENTS(status_box->typing_pixbufs); i++) {
+		if (status_box->typing_pixbufs[i] != NULL)
+			gdk_pixbuf_unref(status_box->typing_pixbufs[i]);
+	}
 
 	status_box->typing_index = 0;
 	status_box->typing_pixbufs[0] =  gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_ANIMATION_TYPING0,
@@ -1690,7 +1707,7 @@
 	status_box->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
 
 	status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, 
-					       G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN);
+					       G_TYPE_STRING, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN);
 	status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, 
 							G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN);
 
@@ -1775,10 +1792,13 @@
 
 	status_box->icon_rend = gtk_cell_renderer_pixbuf_new();
 	status_box->text_rend = gtk_cell_renderer_text_new();
+	emblem_rend = gtk_cell_renderer_pixbuf_new();
 	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE);
 	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE);
+	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), emblem_rend, FALSE);
 	gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL);
 	gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL);
+	gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), emblem_rend, "pixbuf", EMBLEM_COLUMN, "visible", EMBLEM_VISIBLE_COLUMN, NULL);
 #if GTK_CHECK_VERSION(2, 6, 0)
 	g_object_set(status_box->text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
 #endif
--- a/pidgin/gtkthemes.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkthemes.c	Wed Feb 06 03:35:04 2008 +0000
@@ -168,7 +168,7 @@
 }
 
 static void
-pidgin_smiley_themes_remove_non_existing()
+pidgin_smiley_themes_remove_non_existing(void)
 {
 	static struct smiley_theme *theme = NULL;
 	GSList *iter = NULL;
--- a/pidgin/gtkutils.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkutils.c	Wed Feb 06 03:35:04 2008 +0000
@@ -1595,7 +1595,7 @@
 			else if (!(im || ft))
 				purple_request_yes_no(NULL, NULL, _("You have dragged an image"),
 							_("Would you like to set it as the buddy icon for this user?"),
-							0,
+							PURPLE_DEFAULT_ACTION_NONE,
 							account, who, NULL,
 							data, (GCallback)dnd_set_icon_ok_cb, (GCallback)dnd_set_icon_cancel_cb);
 			else
@@ -1701,23 +1701,23 @@
 	GdkPixbuf *pixbuf = NULL;
 
 	if (prim == PURPLE_STATUS_UNAVAILABLE)
-        	pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_BUSY,
-                                                 icon_size, "GtkWidget");
-        else if (prim == PURPLE_STATUS_AWAY)
-                pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_AWAY,
-                                                 icon_size, "GtkWidget");
-        else if (prim == PURPLE_STATUS_EXTENDED_AWAY)
-                pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_XA,
-                                                 icon_size, "GtkWidget");
-        else if (prim == PURPLE_STATUS_INVISIBLE)
-                pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_INVISIBLE,
-                                                 icon_size, "GtkWidget");
-        else if (prim == PURPLE_STATUS_OFFLINE)
-                pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_OFFLINE,
-                                                 icon_size, "GtkWidget");
-        else
-                pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_AVAILABLE,
-                                                 icon_size, "GtkWidget");
+		pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_BUSY,
+				icon_size, "GtkWidget");
+	else if (prim == PURPLE_STATUS_AWAY)
+		pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_AWAY,
+				icon_size, "GtkWidget");
+	else if (prim == PURPLE_STATUS_EXTENDED_AWAY)
+		pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_XA,
+				icon_size, "GtkWidget");
+	else if (prim == PURPLE_STATUS_INVISIBLE)
+		pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_INVISIBLE,
+				icon_size, "GtkWidget");
+	else if (prim == PURPLE_STATUS_OFFLINE)
+		pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_OFFLINE,
+				icon_size, "GtkWidget");
+	else
+		pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_AVAILABLE,
+				icon_size, "GtkWidget");
 	return pixbuf;
 
 }
@@ -2947,7 +2947,7 @@
 GSList *minidialogs = NULL;
 
 static void *
-pidgin_utils_get_handle()
+pidgin_utils_get_handle(void)
 {
 	static int handle;
 
@@ -3321,6 +3321,40 @@
 	gtk_entry_set_text(GTK_ENTRY(GTK_BIN((widget))->child), (text));
 }
 
+GtkWidget *
+pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label)
+{
+	GtkWidget *hbox;
+	GtkWidget *label = NULL;
+
+	if (widget_label) {
+		hbox = gtk_hbox_new(FALSE, 5);
+		gtk_widget_show(hbox);
+		gtk_box_pack_start(vbox, hbox, FALSE, FALSE, 0);
+
+		label = gtk_label_new_with_mnemonic(widget_label);
+		gtk_widget_show(label);
+		if (sg) {
+			gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+			gtk_size_group_add_widget(sg, label);
+		}
+		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	} else {
+		hbox = GTK_WIDGET(vbox);
+	}
+
+	gtk_widget_show(widget);
+	gtk_box_pack_start(GTK_BOX(hbox), widget, expand, TRUE, 0);
+	if (label) {
+		gtk_label_set_mnemonic_widget(GTK_LABEL(label), widget);
+		pidgin_set_accessible_label (widget, label);
+	}
+
+	if (p_label)
+		(*p_label) = label;
+	return hbox;
+}
+
 gboolean pidgin_auto_parent_window(GtkWidget *widget)
 {
 #if 0
--- a/pidgin/gtkutils.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/gtkutils.h	Wed Feb 06 03:35:04 2008 +0000
@@ -374,16 +374,20 @@
 gboolean pidgin_screenname_autocomplete_default_filter(const PidginBuddyCompletionEntry *completion_entry, gpointer all_accounts);
 
 /**
+ * Add autocompletion of screenames to an entry.
+ *
  * @deprecated
- * Add autocompletion of screenames to an entry.
- * The usage of this function is deprecated. For new code, use the equivalent:
- * pidgin_setup_screenname_autocomplete_with_filter(entry, optmenu, pidgin_screenname_autocomplete_default_filter, GINT_TO_POINTER(all))
+ *   For new code, use the equivalent:
+ *   #pidgin_setup_screenname_autocomplete_with_filter(@a entry, @a optmenu,
+ *   #pidgin_screenname_autocomplete_default_filter, <tt>GINT_TO_POINTER(@a
+ *   all)</tt>)
  *
  * @param entry     The GtkEntry on which to setup autocomplete.
- * @param optmenu   A menu for accounts, returned by pidgin_account_option_menu_new().
- *                  If @a optmenu is not @c NULL, it'll be updated when a screenname is chosen
- *                  from the autocomplete list.
- * @param all       Whether to include screennames from disconnected accounts. 
+ * @param optmenu   A menu for accounts, returned by
+ *                  pidgin_account_option_menu_new().  If @a optmenu is not @c
+ *                  NULL, it'll be updated when a screenname is chosen from the
+ *                  autocomplete list.
+ * @param all       Whether to include screennames from disconnected accounts.
  */
 void pidgin_setup_screenname_autocomplete(GtkWidget *entry, GtkWidget *optmenu, gboolean all);
 
@@ -506,7 +510,7 @@
 
 /**
  * A valid GtkMenuPositionFunc.  This is used to determine where 
- * to draw context menu's when the menu is activated with the 
+ * to draw context menus when the menu is activated with the 
  * keyboard (shift+F10).  If the menu is activated with the mouse, 
  * then you should just use GTK's built-in position function, 
  * because it does a better job of positioning the menu.
@@ -790,5 +794,20 @@
  */
 gboolean pidgin_auto_parent_window(GtkWidget *window);
 
+/**
+ * Add a labelled widget to a GtkVBox
+ *
+ * @param vbox         The GtkVBox to add the widget to.
+ * @param widget_label The label to give the widget, can be @c NULL.
+ * @param sg           The GtkSizeGroup to add the label to, can be @c NULL.
+ * @param widget       The GtkWidget to add.
+ * @param expand       Whether to expand the widget horizontally.
+ * @param p_label      Place to store a pointer to the GtkLabel, or @c NULL if you don't care.
+ *
+ * @return  A GtkHBox already added to the GtkVBox containing the GtkLabel and the GtkWidget.
+ * @since 2.4.0
+ */
+GtkWidget *pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label);
+
 #endif /* _PIDGINUTILS_H_ */
 
--- a/pidgin/pidgintooltip.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/pidgintooltip.c	Wed Feb 06 03:35:04 2008 +0000
@@ -43,15 +43,22 @@
 {
 	GtkWidget *widget;
 	gpointer userdata;
-	PidginTooltipCreateForTree create_tooltip;
 	PidginTooltipPaint paint_tooltip;
-	GtkTreePath *path;
+	union {
+		struct {
+			PidginTooltipCreateForTree create_tooltip;
+			GtkTreePath *path;
+		} treeview;
+		struct {
+			PidginTooltipCreate create_tooltip;
+		} widget;
+	} common;
 } PidginTooltipData;
 
 static void
 destroy_tooltip_data(PidginTooltipData *data)
 {
-	gtk_tree_path_free(data->path);
+	gtk_tree_path_free(data->common.treeview.path);
 	g_free(data);
 }
 
@@ -70,13 +77,16 @@
 static gboolean
 pidgin_tooltip_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
 {
-	if (pidgin_tooltip.paint_tooltip)
+	if (pidgin_tooltip.paint_tooltip) {
+		gtk_paint_flat_box(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+				NULL, widget, "tooltip", 0, 0, -1, -1);
 		pidgin_tooltip.paint_tooltip(widget, data);
+	}
 	return FALSE;
 }
 
 static GtkWidget*
-setup_tooltip_window()
+setup_tooltip_window(void)
 {
 	const char *name;
 	GtkWidget *tipwindow;
@@ -184,14 +194,35 @@
 static void
 reset_data_treepath(PidginTooltipData *data)
 {
-	gtk_tree_path_free(data->path);
-	data->path = NULL;
+	gtk_tree_path_free(data->common.treeview.path);
+	data->common.treeview.path = NULL;
 }
 
 static void
 pidgin_tooltip_draw(PidginTooltipData *data)
 {
 	GtkWidget *tipwindow;
+	int w, h;
+
+	pidgin_tooltip_destroy();
+
+	pidgin_tooltip.widget = gtk_widget_get_toplevel(data->widget);
+	pidgin_tooltip.tipwindow = tipwindow = setup_tooltip_window();
+	pidgin_tooltip.paint_tooltip = data->paint_tooltip;
+
+	if (!data->common.widget.create_tooltip(tipwindow, data->userdata, &w, &h)) {
+		if (tipwindow == pidgin_tooltip.tipwindow)
+			pidgin_tooltip_destroy();
+		return;
+	}
+
+	setup_tooltip_window_position(data->userdata, w, h);
+}
+
+static void
+pidgin_tooltip_draw_tree(PidginTooltipData *data)
+{
+	GtkWidget *tipwindow;
 	GtkTreePath *path = NULL;
 	int w, h;
 
@@ -203,13 +234,13 @@
 		return;
 	}
 
-	if (data->path) {
-		if (gtk_tree_path_compare(data->path, path) == 0) {
+	if (data->common.treeview.path) {
+		if (gtk_tree_path_compare(data->common.treeview.path, path) == 0) {
 			gtk_tree_path_free(path);
 			return;
 		}
-		gtk_tree_path_free(data->path);
-		data->path = NULL;
+		gtk_tree_path_free(data->common.treeview.path);
+		data->common.treeview.path = NULL;
 	}
 
 	pidgin_tooltip_destroy();
@@ -218,24 +249,29 @@
 	pidgin_tooltip.tipwindow = tipwindow = setup_tooltip_window();
 	pidgin_tooltip.paint_tooltip = data->paint_tooltip;
 
-	if (!data->create_tooltip(tipwindow, path, data->userdata, &w, &h)) {
-		pidgin_tooltip_destroy();
+	if (!data->common.treeview.create_tooltip(tipwindow, path, data->userdata, &w, &h)) {
+		if (tipwindow == pidgin_tooltip.tipwindow)
+			pidgin_tooltip_destroy();
 		gtk_tree_path_free(path);
 		return;
 	}
 
 	setup_tooltip_window_position(data->userdata, w, h);
 
-	data->path = path;
-	g_signal_connect_swapped(G_OBJECT(tipwindow), "destroy",
+	data->common.treeview.path = path;
+	g_signal_connect_swapped(G_OBJECT(pidgin_tooltip.tipwindow), "destroy",
 			G_CALLBACK(reset_data_treepath), data);
 }
 
 static gboolean
 pidgin_tooltip_timeout(gpointer data)
 {
+	PidginTooltipData *tdata = data;
 	pidgin_tooltip.timeout = 0;
-	pidgin_tooltip_draw(data);
+	if (GTK_IS_TREE_VIEW(tdata->widget))
+		pidgin_tooltip_draw_tree(data);
+	else
+		pidgin_tooltip_draw(data);
 	return FALSE;
 }
 
@@ -276,7 +312,7 @@
 }
 
 static gboolean
-row_leave_cb(GtkWidget *tv, GdkEvent *event, gpointer userdata)
+widget_leave_cb(GtkWidget *tv, GdkEvent *event, gpointer userdata)
 {
 	pidgin_tooltip_destroy();
 	return FALSE;
@@ -288,12 +324,40 @@
 	PidginTooltipData *tdata = g_new0(PidginTooltipData, 1);
 	tdata->widget = tree;
 	tdata->userdata = userdata;
-	tdata->create_tooltip = create_tooltip;
+	tdata->common.treeview.create_tooltip = create_tooltip;
 	tdata->paint_tooltip = paint_tooltip;
 
 	g_signal_connect(G_OBJECT(tree), "motion-notify-event", G_CALLBACK(row_motion_cb), tdata);
-	g_signal_connect(G_OBJECT(tree), "leave-notify-event", G_CALLBACK(row_leave_cb), NULL);
+	g_signal_connect(G_OBJECT(tree), "leave-notify-event", G_CALLBACK(widget_leave_cb), NULL);
 	g_signal_connect_swapped(G_OBJECT(tree), "destroy", G_CALLBACK(destroy_tooltip_data), tdata);
 	return TRUE;
 }
 
+static gboolean
+widget_motion_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+	int delay = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/tooltip_delay");
+
+	pidgin_tooltip_destroy();
+	if (delay == 0)
+		return FALSE;
+
+	pidgin_tooltip.timeout = g_timeout_add(delay, (GSourceFunc)pidgin_tooltip_timeout, data);
+	return FALSE;
+}
+
+gboolean pidgin_tooltip_setup_for_widget(GtkWidget *widget, gpointer userdata,
+		PidginTooltipCreate create_tooltip, PidginTooltipPaint paint_tooltip)
+{
+	PidginTooltipData *wdata = g_new0(PidginTooltipData, 1);
+	wdata->widget = widget;
+	wdata->userdata = userdata;
+	wdata->common.widget.create_tooltip = create_tooltip;
+	wdata->paint_tooltip = paint_tooltip;
+
+	g_signal_connect(G_OBJECT(widget), "motion-notify-event", G_CALLBACK(widget_motion_cb), wdata);
+	g_signal_connect(G_OBJECT(widget), "leave-notify-event", G_CALLBACK(widget_leave_cb), NULL);
+	g_signal_connect_swapped(G_OBJECT(widget), "destroy", G_CALLBACK(g_free), wdata);
+	return TRUE;
+}
+
--- a/pidgin/pidgintooltip.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/pidgintooltip.h	Wed Feb 06 03:35:04 2008 +0000
@@ -77,6 +77,20 @@
 		PidginTooltipCreateForTree create_cb, PidginTooltipPaint paint_cb);
 
 /**
+ * Setup tooltip drawing functions for any widget.
+ *
+ * @param widget       The widget
+ * @param userdata     The userdata to send to the callback functions
+ * @param create_cb    Callback function to create the tooltip for the widget
+ * @param paint_cb     Callback function to paint the tooltip
+ *
+ * @return   @c TRUE if the tooltip callbacks were setup correctly.
+ * @since 2.4.0
+ */
+gboolean pidgin_tooltip_setup_for_widget(GtkWidget *widget, gpointer userdata,
+		PidginTooltipCreate create_cb, PidginTooltipPaint paint_cb);
+
+/**
  * Destroy the tooltip.
  * @since 2.4.0
  */
@@ -94,4 +108,5 @@
  */
 void pidgin_tooltip_show(GtkWidget *widget, gpointer userdata,
 		PidginTooltipCreate create_cb, PidginTooltipPaint paint_cb);
+
 #endif
--- a/pidgin/plugins/cap/cap.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/plugins/cap/cap.c	Wed Feb 06 03:35:04 2008 +0000
@@ -434,26 +434,6 @@
 	stats->last_seen = time(NULL);
 }
 
-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;
-	purple_debug_info("cap", "got extended blist menu\n");
-	purple_debug_info("cap", "is buddy: %d\n", PURPLE_BLIST_NODE_IS_BUDDY(node));
-	purple_debug_info("cap", "is contact: %d\n", PURPLE_BLIST_NODE_IS_CONTACT(node));
-	purple_debug_info("cap", "is group: %d\n", PURPLE_BLIST_NODE_IS_GROUP(node));
-	/* Probably only concerned with buddy/contact types. Contacts = meta-buddies (grouped msn/jabber/etc.) */
-	g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
-	buddy = (PurpleBuddy *)node;
-	menu_action = purple_menu_action_new(_("Display Statistics"),
-			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) {
 	if(node->type == PURPLE_BLIST_BUDDY_NODE) {
@@ -662,15 +642,6 @@
 	/* result = dbi_conn_queryf(_conn, "insert into cap_message values(\'%s\', \'%s\', %d, now());", sender, receiver, count); */
 }
 
-/* Callbacks */
-void display_statistics_action_cb(PurpleBlistNode *node, gpointer data) {
-	PurpleBuddy *buddy;
-
-	g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
-	buddy = (PurpleBuddy *)node;
-	purple_debug_info("cap", "Statistics for %s requested.\n", buddy->name);
-}
-
 /* Purple plugin specific code */
 
 static gboolean plugin_load(PurplePlugin *plugin) {
@@ -714,9 +685,6 @@
 	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", plugin,
 			PURPLE_CALLBACK(buddy_signed_off), NULL);
 
-	/*purple_signal_connect(purple_blist_get_handle(), "blist-node-extended-menu", plugin,
-			PURPLE_CALLBACK(blist_node_extended_menu), NULL);*/
-
 	purple_signal_connect(pidgin_blist_get_handle(), "drawing-tooltip", plugin,
 			PURPLE_CALLBACK(drawing_tooltip), NULL);
 
@@ -726,9 +694,6 @@
 	purple_signal_connect(purple_connections_get_handle(), "signed-off", plugin,
 			PURPLE_CALLBACK(signed_off), NULL);
 
-	purple_signal_connect(purple_blist_get_handle(), "buddy-idle-changed", plugin,
-			PURPLE_CALLBACK(buddy_idle), NULL);
-
 	_signals_connected = TRUE;
 }
 
@@ -765,9 +730,6 @@
 	purple_signal_disconnect(purple_blist_get_handle(), "buddy-signed-off", plugin,
 			PURPLE_CALLBACK(buddy_signed_off));
 
-	/*purple_signal_disconnect(purple_blist_get_handle(), "blist-node-extended-menu", plugin,
-			PURPLE_CALLBACK(blist_node_extended_menu));*/
-
 	purple_signal_disconnect(pidgin_blist_get_handle(), "drawing-tooltip", plugin,
 			PURPLE_CALLBACK(drawing_tooltip));
 
@@ -777,9 +739,6 @@
 	purple_signal_disconnect(purple_connections_get_handle(), "signed-off", plugin,
 			PURPLE_CALLBACK(signed_off));
 
-	purple_signal_disconnect(purple_blist_get_handle(), "buddy-idle-changed", plugin,
-			PURPLE_CALLBACK(buddy_idle));
-
 	_signals_connected = FALSE;
 }
 
--- a/pidgin/plugins/cap/cap.h	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/plugins/cap/cap.h	Wed Feb 06 03:35:04 2008 +0000
@@ -98,7 +98,6 @@
 static void buddy_signed_on(PurpleBuddy *buddy);
 /* buddy-signed-off */
 static void buddy_signed_off(PurpleBuddy *buddy);
-static void buddy_idle(PurpleBuddy *buddy, gboolean old_idle, gboolean idle);
 /* drawing-tooltip */
 static void drawing_tooltip(PurpleBlistNode *node, GString *text, gboolean full);
 /* signed-on */
@@ -107,21 +106,20 @@
 static void signed_off(PurpleConnection *gc);
 static void reset_all_last_message_times(gpointer key, gpointer value, gpointer user_data);
 static PurpleStatus * get_status_for(PurpleBuddy *buddy);
-static void create_tables();
-static gboolean create_database_connection();
-static void destroy_database_connection();
+static void create_tables(void);
+static gboolean create_database_connection(void);
+static void destroy_database_connection(void);
 static guint word_count(const gchar *string);
 static void insert_status_change(CapStatistics *statistics);
 static void insert_status_change_from_purple_status(CapStatistics *statistics, PurpleStatus *status);
 static void insert_word_count(const char *sender, const char *receiver, guint count);
-void display_statistics_action_cb(PurpleBlistNode *node, gpointer data);
 static gboolean plugin_load(PurplePlugin *plugin);
 static void add_plugin_functionality(PurplePlugin *plugin);
 static void cancel_conversation_timeouts(gpointer key, gpointer value, gpointer user_data);
 static void remove_plugin_functionality(PurplePlugin *plugin);
 static void write_stats_on_unload(gpointer key, gpointer value, gpointer user_data);
 static gboolean plugin_unload(PurplePlugin *plugin);
-static CapPrefsUI * create_cap_prefs_ui();
+static CapPrefsUI * create_cap_prefs_ui(void);
 static void cap_prefs_ui_destroy_cb(GtkObject *object, gpointer user_data);
 static void numeric_spinner_prefs_cb(GtkSpinButton *spinbutton, gpointer user_data);
 static GtkWidget * get_config_frame(PurplePlugin *plugin);
--- a/pidgin/plugins/convcolors.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/plugins/convcolors.c	Wed Feb 06 03:35:04 2008 +0000
@@ -77,7 +77,7 @@
 	FONT_UNDERLINE	= 1 << 2
 };
 
-struct
+static struct
 {
 	PurpleMessageFlags flag;
 	char *prefix;
@@ -129,6 +129,11 @@
 
 	if (purple_prefs_get_bool(PREF_IGNORE))
 	{
+		/* This seems to be necessary, especially for received messages. */
+		t = *displaying;
+		*displaying = purple_strreplace(t, "\n", "<br>");
+		g_free(t);
+
 		t = *displaying;
 		*displaying = purple_markup_strip_html(t);
 		g_free(t);
--- a/pidgin/plugins/markerline.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/plugins/markerline.c	Wed Feb 06 03:35:04 2008 +0000
@@ -190,13 +190,13 @@
 }
 
 static void
-detach_from_all_windows()
+detach_from_all_windows(void)
 {
 	g_list_foreach(pidgin_conv_windows_get_list(), (GFunc)detach_from_pidgin_window, NULL);
 }
 
 static void
-attach_to_all_windows()
+attach_to_all_windows(void)
 {
 	g_list_foreach(pidgin_conv_windows_get_list(), (GFunc)attach_to_pidgin_window, NULL);
 }
--- a/pidgin/plugins/pidginrc.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/plugins/pidginrc.c	Wed Feb 06 03:35:04 2008 +0000
@@ -95,7 +95,7 @@
 */
 
 static GString *
-make_gtkrc_string()
+make_gtkrc_string(void)
 {
 	gint i;
 	gchar *prefbase = NULL;
@@ -185,7 +185,7 @@
 }
 
 static void
-purplerc_make_changes()
+purplerc_make_changes(void)
 {
 	GString *str = make_gtkrc_string();
 #if GTK_CHECK_VERSION(2,4,0)
--- a/pidgin/plugins/spellchk.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/plugins/spellchk.c	Wed Feb 06 03:35:04 2008 +0000
@@ -695,7 +695,7 @@
 	return 1;
 }
 
-static void load_conf()
+static void load_conf(void)
 {
 	/* Corrections to change "...", "(c)", "(r)", and "(tm)" to their
 	 * Unicode character equivalents were not added here even though
@@ -1912,7 +1912,7 @@
 	save_list();
 }
 
-static void list_add_new()
+static void list_add_new(void)
 {
 	GtkTreeIter iter;
 	const char *word = gtk_entry_get_text(GTK_ENTRY(bad_entry));
@@ -2015,7 +2015,7 @@
 	gtk_tree_row_reference_free(row_reference);
 }
 
-static void list_delete()
+static void list_delete(void)
 {
 	GtkTreeSelection *sel;
 	GSList *list = NULL;
@@ -2161,14 +2161,13 @@
 get_config_frame(PurplePlugin *plugin)
 {
 	GtkWidget *ret, *vbox, *win;
-	GtkWidget *hbox, *label;
+	GtkWidget *hbox;
 	GtkWidget *button;
 	GtkSizeGroup *sg;
 	GtkSizeGroup *sg2;
 	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
 	GtkWidget *vbox2;
-	GtkWidget *hbox2;
 	GtkWidget *vbox3;
 
 	ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
@@ -2275,37 +2274,15 @@
 	sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 	sg2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 
-	hbox2 = gtk_hbox_new(FALSE, 2);
-	gtk_box_pack_start(GTK_BOX(vbox2), hbox2, FALSE, FALSE, 0);
-	gtk_widget_show(hbox2);
-
-	label = gtk_label_new_with_mnemonic(_("You _type:"));
-	gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(sg, label);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
-
 	bad_entry = gtk_entry_new();
 	/* Set a minimum size. Since they're in a size group, the other entry will match up. */
 	gtk_widget_set_size_request(bad_entry, 350, -1);
-	gtk_box_pack_start(GTK_BOX(hbox2), bad_entry, TRUE, TRUE, 0);
 	gtk_size_group_add_widget(sg2, bad_entry);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), bad_entry);
-	gtk_widget_show(bad_entry);
-
-	hbox2 = gtk_hbox_new(FALSE, 2);
-	gtk_box_pack_start(GTK_BOX(vbox2), hbox2, FALSE, FALSE, 0);
-	gtk_widget_show(hbox2);
-
-	label = gtk_label_new_with_mnemonic(_("You _send:"));
-	gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(sg, label);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox2), _("You _type:"), sg, bad_entry, FALSE, NULL);
 
 	good_entry = gtk_entry_new();
-	gtk_box_pack_start(GTK_BOX(hbox2), good_entry, TRUE, TRUE, 0);
 	gtk_size_group_add_widget(sg2, good_entry);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), good_entry);
-	gtk_widget_show(good_entry);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox2), _("You _send:"), sg, good_entry, FALSE, NULL);
 
 	/* Created here so it can be passed to whole_words_button_toggled. */
 	case_toggle = gtk_check_button_new_with_mnemonic(_("_Exact case match (uncheck for automatic case handling)"));
--- a/pidgin/plugins/ticker/ticker.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/plugins/ticker/ticker.c	Wed Feb 06 03:35:04 2008 +0000
@@ -65,7 +65,7 @@
 	return TRUE; /* don't actually destroy the window */
 }
 
-static void buddy_ticker_create_window() {
+static void buddy_ticker_create_window(void) {
 	if(tickerwindow) {
 		gtk_widget_show(tickerwindow);
 		return;
@@ -215,7 +215,7 @@
 	buddy_ticker_update_contact(c);
 }
 
-static void buddy_ticker_show()
+static void buddy_ticker_show(void)
 {
 	PurpleBuddyList *list = purple_get_blist();
 	PurpleBlistNode *gnode, *cnode, *bnode;
--- a/pidgin/plugins/xmppconsole.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/plugins/xmppconsole.c	Wed Feb 06 03:35:04 2008 +0000
@@ -727,7 +727,7 @@
 }
 
 static void 
-create_console() 
+create_console(PurplePluginAction *action) 
 {
 	GtkWidget *vbox = gtk_vbox_new(FALSE, 6);
 	GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL);
--- a/pidgin/win32/nsis/pidgin-installer.nsi	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/win32/nsis/pidgin-installer.nsi	Wed Feb 06 03:35:04 2008 +0000
@@ -700,7 +700,6 @@
     Delete "$INSTDIR\ca-certs\GTE_CyberTrust_Global_Root.pem"
     Delete "$INSTDIR\ca-certs\Microsoft_Secure_Server_Authority.pem"
     Delete "$INSTDIR\ca-certs\StartCom_Free_SSL_CA.pem"
-    Delete "$INSTDIR\ca-certs\Verisign_Class3_Extended_Validation_CA.pem"
     Delete "$INSTDIR\ca-certs\Verisign_Class3_Primary_CA.pem"
     Delete "$INSTDIR\ca-certs\Verisign_RSA_Secure_Server_CA.pem"
     RMDir "$INSTDIR\ca-certs"
@@ -1168,7 +1167,10 @@
     MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION $(PIDGIN_IS_RUNNING) /SD IDCANCEL IDRETRY retry_runcheck
     Abort
 
-  done:
+  ; Close the Handle (If we don't do this, the uninstaller called from within will fail)
+  ; This is not optimal because there is a (small) window of time when a new process could start
+  System::Call 'kernel32::CloseHandle(i $R1) i .R1'
+
   Pop $R1
   Pop $R0
 FunctionEnd
@@ -1264,7 +1266,7 @@
 
   ClearErrors
   ${GetOptions} "$R0" "/DS=" $R1
-  IfErrors +7
+  IfErrors +8
   SectionGetFlags ${SecDesktopShortcut} $R2
   StrCmp "1" $R1 0 +2
   IntOp $R2 $R2 | ${SF_SELECTED}
@@ -1275,7 +1277,7 @@
 
   ClearErrors
   ${GetOptions} "$R0" "/SMS=" $R1
-  IfErrors +7
+  IfErrors +8
   SectionGetFlags ${SecStartMenuShortcut} $R2
   StrCmp "1" $R1 0 +2
   IntOp $R2 $R2 | ${SF_SELECTED}
--- a/pidgin/win32/winpidgin.c	Sun Jan 13 00:29:56 2008 +0000
+++ b/pidgin/win32/winpidgin.c	Wed Feb 06 03:35:04 2008 +0000
@@ -450,23 +450,25 @@
 
 	if ((h = CreateMutex(NULL, FALSE, "pidgin_is_running"))) {
 		DWORD err = GetLastError();
-		if (err == ERROR_ALREADY_EXISTS && fail_if_running) {
-			HWND msg_win;
+		if (err == ERROR_ALREADY_EXISTS) {
+			if (fail_if_running) {
+				HWND msg_win;
 
-			printf("An instance of Pidgin is already running.\n");
+				printf("An instance of Pidgin is already running.\n");
 
-			if((msg_win = FindWindowEx(HWND_MESSAGE, NULL, TEXT("WinpidginMsgWinCls"), NULL)))
-				if(SendMessage(msg_win, PIDGIN_WM_FOCUS_REQUEST, (WPARAM) NULL, (LPARAM) NULL))
-					return FALSE;
+				if((msg_win = FindWindowEx(HWND_MESSAGE, NULL, TEXT("WinpidginMsgWinCls"), NULL)))
+					if(SendMessage(msg_win, PIDGIN_WM_FOCUS_REQUEST, (WPARAM) NULL, (LPARAM) NULL))
+						return FALSE;
 
-			/* If we get here, the focus request wasn't successful */
+				/* If we get here, the focus request wasn't successful */
 
-			MessageBox(NULL,
-				"An instance of Pidgin is already running",
-				NULL, MB_OK | MB_TOPMOST);
+				MessageBox(NULL,
+					"An instance of Pidgin is already running",
+					NULL, MB_OK | MB_TOPMOST);
 
-			return FALSE;
-		} else
+				return FALSE;
+			}
+		} else if (err != ERROR_SUCCESS)
 			printf("Error (%u) accessing \"pidgin_is_running\" mutex.\n", (UINT) err);
 	}
 	return TRUE;
--- a/po/POTFILES.in	Sun Jan 13 00:29:56 2008 +0000
+++ b/po/POTFILES.in	Wed Feb 06 03:35:04 2008 +0000
@@ -7,11 +7,13 @@
 finch/gntconv.c
 finch/gntdebug.c
 finch/gntft.c
+finch/gntlog.c
 finch/gntnotify.c
 finch/gntplugin.c
 finch/gntpounce.c
 finch/gntprefs.c
 finch/gntrequest.c
+finch/gntroomlist.c
 finch/gntsound.c
 finch/gntstatus.c
 finch/gntui.c
@@ -32,6 +34,7 @@
 finch/plugins/gntclipboard.c
 finch/plugins/gntgf.c
 finch/plugins/gnthistory.c
+finch/plugins/grouping.c
 finch/plugins/lastlog.c
 libpurple/account.c
 libpurple/blist.c
@@ -71,6 +74,7 @@
 libpurple/protocols/bonjour/bonjour.c
 libpurple/protocols/bonjour/bonjour.h
 libpurple/protocols/bonjour/jabber.c
+libpurple/protocols/bonjour/mdns_win32.c
 libpurple/protocols/gg/gg.c
 libpurple/protocols/irc/cmds.c
 libpurple/protocols/irc/dcc_send.c
@@ -212,6 +216,7 @@
 pidgin/pidgin.h
 pidgin/pidgincombobox.c
 pidgin/pidginstock.c
+pidgin/pidgintooltip.c
 pidgin/pixmaps/emotes/default/24/default.theme.in
 pidgin/pixmaps/emotes/none/none.theme.in
 pidgin/plugins/cap/cap.c
--- a/po/check_po.pl	Sun Jan 13 00:29:56 2008 +0000
+++ b/po/check_po.pl	Wed Feb 06 03:35:04 2008 +0000
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl -w
 #
 # check_po.pl  -  check po file translations for likely errors
 #
--- a/po/de.po	Sun Jan 13 00:29:56 2008 +0000
+++ b/po/de.po	Wed Feb 06 03:35:04 2008 +0000
@@ -11,8 +11,8 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-12-19 10:17+0100\n"
-"PO-Revision-Date: 2007-12-19 10:17+0100\n"
+"POT-Creation-Date: 2008-01-23 10:20+0100\n"
+"PO-Revision-Date: 2008-01-23 10:19+0100\n"
 "Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n"
 "Language-Team: Deutsch <de@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -155,6 +155,29 @@
 msgid "Deny"
 msgstr "Ablehnen"
 
+#, c-format
+msgid ""
+"Online: %d\n"
+"Total: %d"
+msgstr ""
+"Online: %d\n"
+"Gesamt: %d"
+
+#, c-format
+msgid "Account: %s (%s)"
+msgstr "Konto: %s (%s)"
+
+#, c-format
+msgid ""
+"\n"
+"Last Seen: %s ago"
+msgstr ""
+"\n"
+"Zuletzt gesehen: vor %s"
+
+msgid "Default"
+msgstr "Standard"
+
 msgid "You must provide a screename for the buddy."
 msgstr "Sie müssen einen Benutzernamen für den Buddy angeben."
 
@@ -303,26 +326,6 @@
 msgid "On Mobile"
 msgstr "Am Handy"
 
-#, c-format
-msgid ""
-"Online: %d\n"
-"Total: %d"
-msgstr ""
-"Online: %d\n"
-"Gesamt: %d"
-
-#, c-format
-msgid "Account: %s (%s)"
-msgstr "Konto: %s (%s)"
-
-#, c-format
-msgid ""
-"\n"
-"Last Seen: %s ago"
-msgstr ""
-"\n"
-"Zuletzt gesehen: vor %s"
-
 msgid "New..."
 msgstr "Neu..."
 
@@ -389,6 +392,15 @@
 msgid "By Log Size"
 msgstr "Nach Größe der Logs"
 
+msgid "Buddy"
+msgstr "Buddy"
+
+msgid "Chat"
+msgstr "Chat"
+
+msgid "Grouping"
+msgstr "Gruppierung"
+
 msgid "Certificate Import"
 msgstr "Zertifikat-Import"
 
@@ -1022,6 +1034,16 @@
 msgid "Choose Location..."
 msgstr "Wählen Sie einen Ort..."
 
+msgid "Hit 'Enter' to find more rooms of this category."
+msgstr "Drücken Sie 'Enter', um mehr Räume dieser Kategorie zu finden."
+
+msgid "Get"
+msgstr "Holen"
+
+#. Create the window.
+msgid "Room List"
+msgstr "Raumliste"
+
 msgid "Buddy logs in"
 msgstr "Buddy meldet sich an"
 
@@ -1311,6 +1333,27 @@
 "Wenn eine neue Unterhaltung eröffnet wird, fügt dieses Plugin die letzte "
 "Unterhaltung in die aktuelle Unterhaltung ein."
 
+msgid "Online"
+msgstr "Online"
+
+msgid "Offline"
+msgstr "Offline"
+
+msgid "Online Buddies"
+msgstr "Online-Buddys"
+
+msgid "Offline Buddies"
+msgstr "Offline-Buddys"
+
+msgid "Online/Offline"
+msgstr "Online/Offline"
+
+msgid "No Grouping"
+msgstr "Keine Gruppierung"
+
+msgid "Provides alternate buddylist grouping options."
+msgstr "Bietet alternative Einstellungen für die Kontaktlisten-Gruppierung."
+
 msgid "Lastlog"
 msgstr "Verlauf"
 
@@ -1436,19 +1479,6 @@
 msgstr "Ze_rtifikat ansehen..."
 
 #. 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
-#, 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 ""
-"Das Zertifikat, welches von „%s“ präsentiert wurde, behauptet stattdessen "
-"von „%s“ zu kommen.  Das kann bedeuten, dass Sie tatsächlich nicht mit dem "
-"Dienst verbunden sind, mit dem Sie glauben verbunden zu sein."
-
-#. Prompt the user to authenticate the certificate
 #. vrq will be completed by user_auth
 #, c-format
 msgid ""
@@ -1498,6 +1528,19 @@
 msgid "Invalid certificate authority signature"
 msgstr "Unbekannte Zertifizierungsstellensignatur"
 
+#. 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
+#, 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 ""
+"Das Zertifikat, welches von „%s“ präsentiert wurde, behauptet stattdessen "
+"von „%s“ zu kommen.  Das kann bedeuten, dass Sie tatsächlich nicht mit dem "
+"Dienst verbunden sind, mit dem Sie glauben verbunden zu sein."
+
 #. Make messages
 #, c-format
 msgid ""
@@ -2678,6 +2721,9 @@
 msgid "Could not listen on socket"
 msgstr "Kann nicht an der Socket hören"
 
+msgid "Error communicating with local mDNSResponder."
+msgstr "Fehler bei der Kommunikation mit lokalem mDNSResponder."
+
 msgid "Invalid proxy settings"
 msgstr "Falsche Proxy-Einstellungen"
 
@@ -2809,9 +2855,6 @@
 msgid "Add to chat..."
 msgstr "Zum Chat hinzufügen..."
 
-msgid "Offline"
-msgstr "Offline"
-
 msgid "Available"
 msgstr "Verfügbar"
 
@@ -3285,6 +3328,10 @@
 msgid "nickserv: Send a command to nickserv"
 msgstr "nickserv: Sendet ein Kommando zum Nickserv"
 
+msgid "notice &lt;target&lt;:  Send a notice to a user or channel."
+msgstr ""
+"notice &lt;Ziel&gt;:  Sende eine Notiz an einen Benutzer oder an einen Kanal."
+
 msgid ""
 "op &lt;nick1&gt; [nick2] ...:  Grant channel operator status to someone. You "
 "must be a channel operator to do this."
@@ -3971,8 +4018,8 @@
 msgid "Mood"
 msgstr "Stimmung"
 
-msgid "Current media"
-msgstr "Aktuelles Medium"
+msgid "Now Listening"
+msgstr "Hört gerade"
 
 msgid "Mood Text"
 msgstr "Stimmungstext"
@@ -4223,6 +4270,8 @@
 msgid "Unable to buzz, because the user %s does not support it."
 msgstr "Kann nicht anklopfen, da der Benutzer %s dies nicht unterstützt."
 
+#. Yahoo only supports one attention command: the 'buzz'.
+#. This is index number YAHOO_BUZZ.
 msgid "Buzz"
 msgstr "Anklopfen"
 
@@ -5957,9 +6006,6 @@
 msgid "AIM Direct IM"
 msgstr "AIM direkte Nachricht"
 
-msgid "Chat"
-msgstr "Chat"
-
 msgid "Get File"
 msgstr "Datei abrufen"
 
@@ -6029,9 +6075,6 @@
 msgid "Invisible"
 msgstr "Unsichtbar"
 
-msgid "Online"
-msgstr "Online"
-
 msgid "IP Address"
 msgstr "IP-Adresse"
 
@@ -9137,6 +9180,10 @@
 msgid "Unable to establish file descriptor."
 msgstr "Konnte Dateibeschreibung nicht erstellen."
 
+#, c-format
+msgid "%s is trying to send you a group of %d files.\n"
+msgstr "%s versucht, Ihnen eine Gruppe von %d Dateien zu senden.\n"
+
 msgid "Write Error"
 msgstr "Schreibfehler"
 
@@ -9632,6 +9679,14 @@
 msgid "Unable to connect to %s: %s"
 msgstr "Verbindung zu %s nicht möglich: %s"
 
+#, c-format
+msgid " - %s"
+msgstr " - %s"
+
+#, c-format
+msgid " (%s)"
+msgstr " (%s)"
+
 #. 10053
 #, c-format
 msgid "Connection interrupted by other software on your computer."
@@ -9640,7 +9695,7 @@
 "unterbrochen."
 
 #. 10054
-#, fuzzy, c-format
+#, c-format
 msgid "Remote host closed connection."
 msgstr "Der entfernte Host hat die Verbindung beendet."
 
@@ -9908,6 +9963,12 @@
 "Sie sind im Moment nicht mit einem Konto angemeldet, welches benutzt werden "
 "kann, um diesen Buddy hinzuzufügen."
 
+#. I don't believe this can happen currently, I think
+#. * everything that calls this function checks for one of the
+#. * above node types first.
+msgid "Unknown node type"
+msgstr "Unbekannter Knotentyp"
+
 #. Buddies menu
 msgid "/_Buddies"
 msgstr "/_Buddys"
@@ -10009,12 +10070,8 @@
 msgstr "/Hilfe/Ü_ber"
 
 #, c-format
-msgid ""
-"\n"
-"<b>Account:</b> %s"
-msgstr ""
-"\n"
-"<b>Konto:</b> %s"
+msgid "<b>Account:</b> %s"
+msgstr "<b>Konto:</b> %s"
 
 #, c-format
 msgid ""
@@ -10045,6 +10102,9 @@
 msgid "Rockin'"
 msgstr "Abgefahren"
 
+msgid "Total Buddies"
+msgstr "Buddy-Anzahl"
+
 #, c-format
 msgid "Idle %dd %dh %02dm"
 msgstr "Untätig %dd %dh %02dm"
@@ -10460,16 +10520,13 @@
 msgid "User is typing..."
 msgstr "Benutzer tippt gerade..."
 
-msgid "User has typed something and stopped"
-msgstr "Benutzer hat etwas getippt und wartet nun"
-
 #, c-format
 msgid ""
 "\n"
-"%s has typed something and stopped"
+"%s has stopped typing"
 msgstr ""
 "\n"
-"%s hat etwas getippt und wartet nun"
+"%s hat aufgehört zu tippen"
 
 #. Build the Send To menu
 msgid "S_end To"
@@ -11108,31 +11165,33 @@
 msgstr ""
 "Farbe zum Darstellen von Hyperlinks, wenn sich die Maus darüber befindet."
 
-#, fuzzy
 msgid "Sent Message Name Color"
-msgstr "Gesendete Nachrichten"
+msgstr "Farbe des Absendernamens für gesendete Nachrichten"
 
 msgid "Color to draw the name of a message you sent."
 msgstr ""
-
-#, fuzzy
+"Farbe, mit der der Name in einer gesendeten Nachricht dargestellt wird."
+
 msgid "Received Message Name Color"
-msgstr "Empfangene Nachrichten"
+msgstr "Farbe des Absendernamens für empfangene Nachrichten"
 
 msgid "Color to draw the name of a message you received."
 msgstr ""
+"Farbe, mit der der Name in einer empfangenen Nachricht dargestellt wird."
 
 msgid "\"Attention\" Name Color"
-msgstr ""
+msgstr "Farbe des Absendernamens für \"Achtung\"-Nachrichten"
 
 msgid "Color to draw the name of a message you received containing your name."
 msgstr ""
+"Farbe, mit der der Name in einer Nachricht dargestellt wird, die Ihren Namen "
+"enthält."
 
 msgid "Action Message Name Color"
-msgstr ""
+msgstr "Farbe des Absendernamens für Aktions-Nachrichten"
 
 msgid "Color to draw the name of an action message."
-msgstr ""
+msgstr "Farbe, mit der der Name in einer Aktions-Nachricht dargestellt wird."
 
 msgid "_Copy E-Mail Address"
 msgstr "Kopiere _E-Mail-Adresse"
@@ -11187,15 +11246,6 @@
 msgid "_Save Image..."
 msgstr "Bild _speichern..."
 
-msgid "_Font"
-msgstr "_Schrift"
-
-msgid "_Insert"
-msgstr "_Einfügen"
-
-msgid "S_mile!"
-msgstr "_Lächeln!"
-
 msgid "Select Font"
 msgstr "Schriftart wählen"
 
@@ -11224,6 +11274,9 @@
 msgid "Insert Link"
 msgstr "Link einfügen"
 
+msgid "_Insert"
+msgstr "_Einfügen"
+
 #, c-format
 msgid "Failed to store image: %s\n"
 msgstr "Speichern des Bildes fehlgeschlagen: %s\n"
@@ -11231,12 +11284,14 @@
 msgid "Insert Image"
 msgstr "Bild einfügen"
 
+msgid "Smile!"
+msgstr "Lächeln!"
+
 msgid "This theme has no available smileys."
 msgstr "Dieses Thema verfügt über keine Smileys."
 
-#. show everything
-msgid "Smile!"
-msgstr "Lächeln!"
+msgid "_Font"
+msgstr "_Schrift"
 
 msgid "Group Items"
 msgstr "Elemente gruppieren"
@@ -11657,9 +11712,6 @@
 msgid "Pounce Target"
 msgstr "Alarm-Ziel"
 
-msgid "Default"
-msgstr "Standard"
-
 msgid "Smiley theme failed to unpack."
 msgstr "Smiley-Thema konnte nicht entpackt werden."
 
@@ -12029,7 +12081,6 @@
 msgid "Changes to privacy settings take effect immediately."
 msgstr "Einstellungen bzgl. der Privatsphäre werden sofort wirksam."
 
-#. "Set privacy for:" label
 msgid "Set privacy for:"
 msgstr "Setze Privatsphäre für:"
 
@@ -12093,10 +12144,6 @@
 msgid "Select Folder..."
 msgstr "Ordner auswählen..."
 
-#. Create the window.
-msgid "Room List"
-msgstr "Raumliste"
-
 #. list button
 msgid "_Get List"
 msgstr "_Liste abrufen"
@@ -12275,6 +12322,9 @@
 msgid "_Open Mail"
 msgstr "Mail ö_ffnen"
 
+msgid "Pidgin Tooltip"
+msgstr "Pidgin-Tooltip"
+
 msgid "Pidgin smileys"
 msgstr "Pidgin-Smileys"
 
@@ -12287,9 +12337,6 @@
 msgid "none"
 msgstr "keine"
 
-msgid "Display Statistics"
-msgstr "Statistik anzeigen"
-
 msgid "Response Probability:"
 msgstr "Antwortwahrscheinlichkeit:"
 
@@ -12850,9 +12897,8 @@
 msgid "Hyperlink Color"
 msgstr "Hyperlink-Farbe"
 
-#, fuzzy
 msgid "Highlighted Message Name Color"
-msgstr "Hervorgehobene Nachrichten"
+msgstr "Farbe des Absendernamens für hervorgehobene Nachrichten"
 
 msgid "GtkTreeView Horizontal Separation"
 msgstr "GtkTreeview horizontaler Abstand"
@@ -12861,7 +12907,7 @@
 msgstr "Unterhaltungseintrag"
 
 msgid "Request Dialog"
-msgstr "Dialog anfordern"
+msgstr "Anfrage-Dialog"
 
 msgid "Notify Dialog"
 msgstr "Benachrichtigungsdialog"
--- a/po/en_GB.po	Sun Jan 13 00:29:56 2008 +0000
+++ b/po/en_GB.po	Wed Feb 06 03:35:04 2008 +0000
@@ -3315,7 +3315,7 @@
 
 #: ../libpurple/plugins/psychic.c:72
 msgid "You feel a disturbance in the force..."
-msgstr "You have a disturbance in the force..."
+msgstr "You feel a disturbance in the force..."
 
 #: ../libpurple/plugins/psychic.c:91
 msgid "Only enable for users on the buddy list"
--- a/po/nb.po	Sun Jan 13 00:29:56 2008 +0000
+++ b/po/nb.po	Wed Feb 06 03:35:04 2008 +0000
@@ -1,10 +1,12 @@
-# translation of nb.po to Norsk bokmål
-# Gaim Norwegian translation
+# translation of nb.po to Norsk
+# Pidgin Norwegian Bokmål translation
 # Copyright (C) 2003, Petter Johan Olsen <petter.olsen@cc.uit.no>
 # Copyright (C) 2005, Kyrre Ness Sjøbæk  <kyrre@solution-forge.net>
+# Copyright (C), Hallvard Glad <hallvard.glad@gmail.com>
 #
-# This file is distributed under the same license as the Gaim package.
+# This file is distributed under the same license as the Pidgin package.
 #
+# Hallvard Glad <hallvard.glad@gmail.com>, 2007.
 # Contributors:
 #  Petter Johan Olsen   initial translation for 0.62
 #  Eivind Tagseth (eivindt@multinet.no) corrections, updates
@@ -13,30 +15,32 @@
 #  Kyrre Ness Sjobak, updates for 1.x
 #  Kyrre Ness Sjobak, updates for 1.3
 #  Hallvard Glad, updates for 2.0BETA6
+#  Hallvard Glad, updates for 2.2.3
 msgid ""
 msgstr ""
 "Project-Id-Version: nb\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-09-28 15:32-0500\n"
-"PO-Revision-Date: 2005-06-08 15:51+0200\n"
+"POT-Creation-Date: 2007-09-26 09:23-0400\n"
+"PO-Revision-Date: 2007-12-30 14:04+0100\n"
 "Last-Translator: Hallvard Glad <hallvard.glad@gmail.com>\n"
-"Language-Team: Norsk bokmål <no@li.org>\n"
+"Language-Team: Norsk <nb@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: KBabel 1.3.1\n"
-
-#: ../finch/finch.c:64 ../finch/finch.c:301 ../finch/finch.c:330
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../finch/finch.c:64
+#: ../finch/finch.c:301
+#: ../finch/finch.c:330
 #: ../finch/finch.c:418
-#, fuzzy
 msgid "Finch"
-msgstr "Fransk"
+msgstr "Finch"
 
 #: ../finch/finch.c:206
-#, fuzzy, c-format
+#, c-format
 msgid "%s. Try `%s -h' for more information.\n"
-msgstr "Gaim %s. Prøv '%s -h' for mer informasjon.\n"
+msgstr "%s. Prøv '%s -h' for mer informasjon.\n"
 
 #: ../finch/finch.c:208
 #, c-format
@@ -50,43 +54,58 @@
 "  -n, --nologin       don't automatically login\n"
 "  -v, --version       display the current version and exit\n"
 msgstr ""
-
-#: ../finch/finch.c:328 ../pidgin/gtkmain.c:711
-#, c-format
-msgid ""
-"%s encountered errors migrating your settings from %s to %s. Please "
-"investigate and complete the migration by hand. Please report this error at "
+"%s\n"
+"Bruk: %s [Valg]...\n"
+"\n"
+"  -c, --config=DIR    bruk DIR for konfigurasjonsfiler\n"
+"  -d, --debug         skriv debugging beskjeder til stdout\n"
+"  -h, --help          vis denne hjelpen og avslutt\n"
+"  -n, --nologin       ikke logg automatisk inn\n"
+"  -v, --version       vis den nåværende versjon og avslutt\n"
+
+#: ../finch/finch.c:328
+#: ../pidgin/gtkmain.c:718
+#, c-format
+msgid "%s encountered errors migrating your settings from %s to %s. Please investigate and complete the migration by hand. Please report this error at http://developer.pidgin.im"
+msgstr ""
+"%s det inntraff en feil i migreringen av ditt oppsett fra %s til %s. Vennligst undersøk og gjør ferdig migreringen for hånd. Vennligst raporter denne feilen på "
 "http://developer.pidgin.im"
-msgstr ""
-
-#: ../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/plugins/gntclipboard.c:115 ../finch/plugins/gntclipboard.c:121
+
+#: ../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/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/qq/group_join.c:328
-#: ../libpurple/protocols/qq/im.c:576 ../libpurple/protocols/silc/ops.c:57
+#: ../libpurple/protocols/qq/im.c:576
+#: ../libpurple/protocols/silc/ops.c:57
 #: ../libpurple/protocols/silc/ops.c:1456
 #: ../libpurple/protocols/silc10/ops.c:1451
 msgid "Error"
 msgstr "Feil"
 
 #: ../finch/gntaccount.c:124
-#, fuzzy
 msgid "Account was not added"
-msgstr "Kontoen har blitt deaktivert"
+msgstr "Kontoen ble ikke lagt til"
 
 #: ../finch/gntaccount.c:125
 msgid "Screenname of an account must be non-empty."
-msgstr ""
+msgstr "Skjermnavnet for en konto kan ikke være tomt."
 
 #: ../finch/gntaccount.c:437
 msgid "New mail notifications"
-msgstr "Varsling om ny e-post"
+msgstr "Varsling om nye e-poster"
 
 #: ../finch/gntaccount.c:447
 msgid "Remember password"
@@ -94,30 +113,31 @@
 
 #: ../finch/gntaccount.c:485
 msgid "There's no protocol plugins installed."
-msgstr ""
+msgstr "Det er ingen protokolltillegg installert."
 
 #: ../finch/gntaccount.c:486
 msgid "(You probably forgot to 'make install'.)"
-msgstr ""
-
-#: ../finch/gntaccount.c:496 ../finch/gntconn.c:136
-#: ../pidgin/gtkaccount.c:1473 ../pidgin/gtkblist.c:4040
+msgstr "(Du har sikkert glemt 'make install'.)"
+
+#: ../finch/gntaccount.c:496
+#: ../finch/gntconn.c:137
+#: ../pidgin/gtkaccount.c:1473
+#: ../pidgin/gtkblist.c:4322
 msgid "Modify Account"
 msgstr "Endre konto"
 
 #
 #: ../finch/gntaccount.c:496
-#, fuzzy
 msgid "New Account"
-msgstr "Konto"
-
-#: ../finch/gntaccount.c:521 ../pidgin/gtkft.c:696
+msgstr "Ny konto"
+
+#: ../finch/gntaccount.c:521
+#: ../pidgin/gtkft.c:696
 msgid "Protocol:"
 msgstr "Protokoll:"
 
 #: ../finch/gntaccount.c:529
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:290
-#, fuzzy
 msgid "Screen name:"
 msgstr "Skjermnavn:"
 
@@ -131,21 +151,37 @@
 
 #. Cancel button
 #. Cancel
-#: ../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
+#: ../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:2224
+#: ../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
 #: ../libpurple/protocols/jabber/buddy.c:728
-#: ../libpurple/protocols/jabber/buddy.c:2413
-#: ../libpurple/protocols/jabber/buddy.c:2449
+#: ../libpurple/protocols/jabber/buddy.c:2416
+#: ../libpurple/protocols/jabber/buddy.c:2452
 #: ../libpurple/protocols/jabber/chat.c:786
 #: ../libpurple/protocols/jabber/jabber.c:1008
 #: ../libpurple/protocols/jabber/jabber.c:1017
@@ -154,10 +190,12 @@
 #: ../libpurple/protocols/jabber/usermood.c:184
 #: ../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/msn/msn.c:290
+#: ../libpurple/protocols/msn/msn.c:307
+#: ../libpurple/protocols/msn/msn.c:324
+#: ../libpurple/protocols/msn/msn.c:341
+#: ../libpurple/protocols/msn/msn.c:362
+#: ../libpurple/protocols/oscar/oscar.c:6092
 #: ../libpurple/protocols/oscar/peer.c:1046
 #: ../libpurple/protocols/qq/buddy_info.c:484
 #: ../libpurple/protocols/qq/buddy_opt.c:214
@@ -192,176 +230,231 @@
 #: ../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
+#: ../libpurple/protocols/yahoo/yahoo.c:1031
+#: ../libpurple/protocols/yahoo/yahoo.c:3497
+#: ../libpurple/protocols/yahoo/yahoo.c:3508
+#: ../pidgin/gtkaccount.c:1908
+#: ../pidgin/gtkaccount.c:2495
+#: ../pidgin/gtkblist.c:6267
+#: ../pidgin/gtkcertmgr.c:197
+#: ../pidgin/gtkdialogs.c:769
+#: ../pidgin/gtkdialogs.c:908
+#: ../pidgin/gtkdialogs.c:1000
+#: ../pidgin/gtkdialogs.c:1020
+#: ../pidgin/gtkdialogs.c:1044
+#: ../pidgin/gtkdialogs.c:1066
+#: ../pidgin/gtkdialogs.c:1114
+#: ../pidgin/gtkdialogs.c:1155
+#: ../pidgin/gtkdialogs.c:1211
+#: ../pidgin/gtkdialogs.c:1250
+#: ../pidgin/gtkdialogs.c:1277
+#: ../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
 msgid "Cancel"
-msgstr "_Avbryt"
+msgstr "Avbryt"
 
 #. Save button
 #. Save
-#: ../finch/gntaccount.c:579 ../finch/gntcertmgr.c:311
-#: ../finch/gntplugin.c:379 ../finch/gntpounce.c:465 ../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
+#: ../finch/gntaccount.c:579
+#: ../finch/gntcertmgr.c:311
+#: ../finch/gntplugin.c:379
+#: ../finch/gntpounce.c:465
+#: ../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
 msgid "Save"
 msgstr "Lagre"
 
-#: ../finch/gntaccount.c:632 ../pidgin/gtkaccount.c:1900
-#: ../pidgin/gtksavedstatuses.c:333 ../pidgin/gtkstatusbox.c:1568
+#: ../finch/gntaccount.c:632
+#: ../pidgin/gtkaccount.c:1900
+#: ../pidgin/gtksavedstatuses.c:333
+#: ../pidgin/gtkstatusbox.c:1568
 #, c-format
 msgid "Are you sure you want to delete %s?"
 msgstr "Er du sikker på at du vil slette %s?"
 
-#
 #: ../finch/gntaccount.c:635
-#, fuzzy
 msgid "Delete Account"
-msgstr "Konto"
+msgstr "Slett konto"
 
 #. Delete button
-#: ../finch/gntaccount.c:637 ../finch/gntaccount.c:707
-#: ../finch/gntcertmgr.c:319 ../finch/gntpounce.c:666 ../finch/gntpounce.c:729
-#: ../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
+#: ../finch/gntaccount.c:637
+#: ../finch/gntaccount.c:707
+#: ../finch/gntcertmgr.c:319
+#: ../finch/gntpounce.c:666
+#: ../finch/gntpounce.c:729
+#: ../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
 msgid "Delete"
 msgstr "Slett"
 
-#: ../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:2325
+#: ../pidgin/gtkdocklet.c:522
 msgid "Accounts"
 msgstr "Kontoer"
 
 #: ../finch/gntaccount.c:675
-#, fuzzy
 msgid "You can enable/disable accounts from the following list."
-msgstr "Du venter på godkjenning fra disse kontaktene"
+msgstr "Du kan aktivere/deaktivere kontoer fra følgende liste."
 
 #. 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/gntaccount.c:698
+#: ../finch/gntaccount.c:888
+#: ../finch/gntblist.c:343
+#: ../finch/gntblist.c:421
+#: ../finch/gntblist.c:456
+#: ../finch/gntblist.c:2305
+#: ../finch/gntcertmgr.c:306
+#: ../finch/gntnotify.c:383
+#: ../finch/gntpounce.c:713
+#: ../finch/gntstatus.c:199
+#: ../libpurple/protocols/gg/gg.c:883
+#: ../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
+#: ../libpurple/protocols/silc10/chat.c:599
+#: ../pidgin/gtkaccount.c:2494
+#: ../pidgin/gtkblist.c:6266
+#: ../pidgin/gtkconv.c:1712
 #: ../pidgin/gtkrequest.c:275
 msgid "Add"
 msgstr "Legg til"
 
 #. Modify button
-#: ../finch/gntaccount.c:703 ../finch/gntpounce.c:721
-#, fuzzy
+#: ../finch/gntaccount.c:703
+#: ../finch/gntpounce.c:721
 msgid "Modify"
-msgstr "_Endre"
-
-#: ../finch/gntaccount.c:811 ../pidgin/gtkaccount.c:2441
-#, fuzzy, c-format
+msgstr "Endre"
+
+#: ../finch/gntaccount.c:811
+#: ../pidgin/gtkaccount.c:2441
+#, c-format
 msgid "%s%s%s%s has made %s his or her buddy%s%s"
-msgstr "%s%s%s%s har lagt %s til i sin kontaktliste%s%s%s"
-
-#: ../finch/gntaccount.c:884 ../pidgin/gtkaccount.c:2493
+msgstr "%s%s%s%s har lagt til %s i sin kontaktliste%s%s"
+
+#: ../finch/gntaccount.c:884
+#: ../pidgin/gtkaccount.c:2493
 msgid "Add buddy to your list?"
 msgstr "Legg til kontakten i listen din?"
 
-#: ../finch/gntaccount.c:944 ../pidgin/gtkaccount.c:2551
-#, fuzzy, c-format
+#: ../finch/gntaccount.c:944
+#: ../pidgin/gtkaccount.c:2551
+#, c-format
 msgid "%s%s%s%s wants to add %s to his or her buddy list%s%s"
-msgstr "Brukeren %s ønsker å legge til %s i kontaktlisten sin."
-
-#: ../finch/gntaccount.c:969 ../finch/gntaccount.c:972
-#: ../finch/gntaccount.c:999 ../pidgin/gtkaccount.c:2574
+msgstr "%s%s%s%s ønsker å legge til %s i sin kontaktliste%s%s"
+
+#: ../finch/gntaccount.c:969
+#: ../finch/gntaccount.c:972
+#: ../finch/gntaccount.c:999
+#: ../pidgin/gtkaccount.c:2574
 #: ../pidgin/gtkaccount.c:2580
-#, fuzzy
 msgid "Authorize buddy?"
-msgstr "Godkjenn"
-
-#: ../finch/gntaccount.c:976 ../finch/gntaccount.c:1003
-#: ../pidgin/gtkaccount.c:2575 ../pidgin/gtkaccount.c:2581
+msgstr "Godkjenn kontakt?"
+
+#: ../finch/gntaccount.c:976
+#: ../finch/gntaccount.c:1003
+#: ../pidgin/gtkaccount.c:2575
+#: ../pidgin/gtkaccount.c:2581
 msgid "Authorize"
 msgstr "Godkjenn"
 
-#: ../finch/gntaccount.c:977 ../finch/gntaccount.c:1004
-#: ../pidgin/gtkaccount.c:2576 ../pidgin/gtkaccount.c:2582
+#: ../finch/gntaccount.c:977
+#: ../finch/gntaccount.c:1004
+#: ../pidgin/gtkaccount.c:2576
+#: ../pidgin/gtkaccount.c:2582
 msgid "Deny"
 msgstr "Nekt"
 
 #: ../finch/gntblist.c:289
 msgid "You must provide a screename for the buddy."
-msgstr ""
+msgstr "Du må oppgi et skjermnavn for kontakten."
 
 #: ../finch/gntblist.c:291
 msgid "You must provide a group."
-msgstr ""
+msgstr "Du må oppgi en gruppe."
 
 #: ../finch/gntblist.c:293
-#, fuzzy
 msgid "You must select an account."
-msgstr "Du må angi et kallenavn"
+msgstr "Du må velge en konto."
 
 #: ../finch/gntblist.c:295
 msgid "The selected account is not online."
-msgstr ""
+msgstr "Den valgte konto er ikke pålogget."
 
 #: ../finch/gntblist.c:300
-#, fuzzy
 msgid "Error adding buddy"
-msgstr ""
-"Klarte ikke lese %s:\n"
-"%s\n"
-
-#: ../finch/gntblist.c:325 ../libpurple/protocols/oscar/oscar.c:2888
-#: ../pidgin/gtkaccount.c:1981 ../pidgin/gtksavedstatuses.c:980
+msgstr "Feil ved å legge til kontakt"
+
+#: ../finch/gntblist.c:325
+#: ../libpurple/protocols/oscar/oscar.c:2884
+#: ../pidgin/gtkaccount.c:1981
+#: ../pidgin/gtksavedstatuses.c:980
 msgid "Screen Name"
 msgstr "Skjermnavn"
 
-#: ../finch/gntblist.c:328 ../finch/gntblist.c:410 ../finch/gntblist.c:1250
-#: ../libpurple/protocols/msn/msn.c:1395
+#: ../finch/gntblist.c:328
+#: ../finch/gntblist.c:410
+#: ../finch/gntblist.c:1250
+#: ../libpurple/protocols/msn/msn.c:1507
 #: ../libpurple/protocols/silc/chat.c:606
 #: ../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
+#: ../libpurple/protocols/zephyr/zephyr.c:1207
+#: ../pidgin/gtkdialogs.c:1019
+#: ../pidgin/gtkdialogs.c:1043
+#: ../pidgin/gtkdialogs.c:1065
 #: ../pidgin/gtkrequest.c:278
 msgid "Alias"
 msgstr "Alias"
 
-#: ../finch/gntblist.c:331 ../finch/gntblist.c:413
-#, fuzzy
+#: ../finch/gntblist.c:331
+#: ../finch/gntblist.c:413
 msgid "Group"
-msgstr "Gruppe:"
-
-#
-#: ../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
+msgstr "Gruppe"
+
+#: ../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:3206
+#: ../pidgin/gtknotify.c:503
+#: ../pidgin/gtkpounce.c:1268
+#: ../pidgin/plugins/gevolution/gevolution.c:445
 msgid "Account"
 msgstr "Konto"
 
-#: ../finch/gntblist.c:341 ../finch/gntblist.c:852
+#: ../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
@@ -370,199 +463,210 @@
 #: ../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/yahoo/yahoo.c:3342
+#: ../pidgin/gtkblist.c:5772
 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:445
 msgid "Add Buddy"
 msgstr "Legg til kontakt"
 
 #: ../finch/gntblist.c:341
-#, fuzzy
 msgid "Please enter buddy information."
-msgstr "Navnet på kontakten du vil varsle."
-
-#: ../finch/gntblist.c:370 ../libpurple/blist.c:1209
+msgstr "Vennligst skriv inn kontakteninformasjon."
+
+#: ../finch/gntblist.c:370
+#: ../libpurple/blist.c:1210
 msgid "Chats"
 msgstr "Samtaler"
 
 #. Extract their Name and put it in
-#: ../finch/gntblist.c:407 ../libpurple/protocols/jabber/jabber.c:924
+#: ../finch/gntblist.c:407
+#: ../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:1694
+#: ../libpurple/protocols/msn/msn.c:1759
+#: ../libpurple/protocols/msn/msn.c:1786
+#: ../libpurple/protocols/qq/buddy_info.c:44
+#: ../pidgin/gtkplugin.c:582
 #: ../pidgin/gtkroomlist.c:618
 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:132
 #: ../pidgin/plugins/gevolution/assoc-buddy.c:123
 msgid "Name"
 msgstr "Navn"
 
-#: ../finch/gntblist.c:416 ../finch/gntblist.c:819
-#, fuzzy
+#: ../finch/gntblist.c:416
+#: ../finch/gntblist.c:819
 msgid "Auto-join"
 msgstr "Automatisk pålogging"
 
-#: ../finch/gntblist.c:419 ../finch/gntblist.c:854 ../pidgin/gtkblist.c:5859
+#: ../finch/gntblist.c:419
+#: ../finch/gntblist.c:854
+#: ../pidgin/gtkblist.c:6154
 msgid "Add Chat"
 msgstr "Legg til samtale"
 
 #: ../finch/gntblist.c:420
 msgid "You can edit more information from the context menu later."
-msgstr ""
-
-#: ../finch/gntblist.c:433 ../finch/gntblist.c:446
-#, fuzzy
+msgstr "Du kan forandre mer informasjon fra kontekstmenyen senere."
+
+#: ../finch/gntblist.c:433
+#: ../finch/gntblist.c:446
 msgid "Error adding group"
-msgstr ""
-"Klarte ikke lese %s:\n"
-"%s\n"
+msgstr "Feil ved å legge til gruppe"
 
 #: ../finch/gntblist.c:434
-#, fuzzy
 msgid "You must give a name for the group to add."
-msgstr "Vennligst skriv inn navnet på gruppen som skal legges til."
+msgstr "Du må angi et navn til gruppen som skal legges til."
 
 #: ../finch/gntblist.c:447
-#, fuzzy
 msgid "A group with the name already exists."
-msgstr "En mappe med dette navnet eksisterer allerede"
-
-#: ../finch/gntblist.c:454 ../finch/gntblist.c:856
+msgstr "En gruppe med dette navnet eksisterer allerede."
+
+#: ../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:5484
+#: ../pidgin/gtkblist.c:6263
 msgid "Add Group"
 msgstr "Legg til gruppe"
 
 #: ../finch/gntblist.c:454
-#, fuzzy
 msgid "Enter the name of the group"
-msgstr "Vennligst skriv inn navnet på gruppen som skal legges til."
+msgstr "Vennligst skriv inn navnet på gruppen"
 
 #: ../finch/gntblist.c:802
-#, fuzzy
 msgid "Edit Chat"
-msgstr "Legg til samtale"
+msgstr "Rediger samtale"
 
 #: ../finch/gntblist.c:802
 msgid "Please Update the necessary fields."
-msgstr ""
-
-#: ../finch/gntblist.c:803 ../finch/gntstatus.c:205
-#, fuzzy
+msgstr "Vennligst oppdater de nødvendige feltene."
+
+#: ../finch/gntblist.c:803
+#: ../finch/gntstatus.c:205
 msgid "Edit"
 msgstr "Rediger"
 
 #: ../finch/gntblist.c:828
-#, fuzzy
 msgid "Edit Settings"
-msgstr "Skjulte Innstillinger"
-
-#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:931
+msgstr "Rediger innstillinger"
+
+#: ../finch/gntblist.c:864
+#: ../pidgin/gtkutils.c:931
 msgid "Information"
 msgstr "Informasjon"
 
-#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:931
-#, fuzzy
+#: ../finch/gntblist.c:864
+#: ../pidgin/gtkutils.c:931
 msgid "Retrieving..."
-msgstr "Kobler til..."
-
-#: ../finch/gntblist.c:904 ../finch/gntconv.c:507
+msgstr "Mottar..."
+
+#: ../finch/gntblist.c:904
+#: ../finch/gntconv.c:534
 #: ../libpurple/protocols/silc/chat.c:899
 #: ../libpurple/protocols/silc10/chat.c:883
 msgid "Get Info"
 msgstr "Hent informasjon"
 
 #: ../finch/gntblist.c:908
-#, fuzzy
 msgid "Add Buddy Pounce"
-msgstr "Legg til kompisvarsling"
+msgstr "Legg til kontaktvarsling"
 
 #. if (q_bud && is_online(q_bud->status)) {
-#: ../finch/gntblist.c:915 ../finch/gntconv.c:519
+#: ../finch/gntblist.c:915
+#: ../finch/gntconv.c:546
 #: ../libpurple/protocols/jabber/si.c:874
-#: ../libpurple/protocols/oscar/oscar.c:654 ../libpurple/protocols/qq/qq.c:587
-#: ../pidgin/gtkconv.c:1607
+#: ../libpurple/protocols/oscar/oscar.c:654
+#: ../libpurple/protocols/qq/qq.c:587
+#: ../pidgin/gtkconv.c:1660
 msgid "Send File"
 msgstr "Send fil"
 
 #: ../finch/gntblist.c:919
-#, fuzzy
 msgid "View Log"
-msgstr "Vis _logg"
+msgstr "Vis logg"
 
 #: ../finch/gntblist.c:1000
-#, fuzzy, c-format
+#, c-format
 msgid "Please enter the new name for %s"
-msgstr "Vennligst skriv inn nytt navn for gruppen."
-
-#: ../finch/gntblist.c:1002 ../finch/gntblist.c:1250
-#, fuzzy
-msgid "Rename"
-msgstr "End_re navn"
+msgstr "Vennligst skriv inn det nye navnet for %s"
 
 #: ../finch/gntblist.c:1002
-#, fuzzy
+#: ../finch/gntblist.c:1250
+msgid "Rename"
+msgstr "Endre navn"
+
+#: ../finch/gntblist.c:1002
 msgid "Set Alias"
-msgstr "Alias"
+msgstr "Angi alias"
 
 #: ../finch/gntblist.c:1003
 msgid "Enter empty string to reset the name."
-msgstr ""
+msgstr "Skriv tom streng for å resette navnet."
 
 #: ../finch/gntblist.c:1079
 msgid "Removing this contact will also remove all the buddies in the contact"
-msgstr ""
+msgstr "Fjerning av denne kontakten vil også fjerne alle kompisene i denne kontakten"
 
 #: ../finch/gntblist.c:1087
 msgid "Removing this group will also remove all the buddies in the group"
-msgstr ""
+msgstr "Fjerning av denne gruppen vil også fjerne alle kompisene i denne gruppa"
 
 #: ../finch/gntblist.c:1092
-#, fuzzy, c-format
+#, c-format
 msgid "Are you sure you want to remove %s?"
 msgstr "Er du sikker på at du vil slette %s?"
 
 #. XXX: anything to do with the returned ui-handle?
 #: ../finch/gntblist.c:1095
-#, fuzzy
 msgid "Confirm Remove"
-msgstr "Bekrefte konto"
-
-#: ../finch/gntblist.c:1100 ../finch/gntblist.c:1252 ../finch/gntft.c:227
-#: ../pidgin/gtkconv.c:1656 ../pidgin/gtkrequest.c:276
+msgstr "Bekreft fjerning"
+
+#: ../finch/gntblist.c:1100
+#: ../finch/gntblist.c:1252
+#: ../finch/gntft.c:227
+#: ../pidgin/gtkconv.c:1709
+#: ../pidgin/gtkrequest.c:276
 #: ../pidgin/gtkstatusbox.c:264
 msgid "Remove"
 msgstr "Fjern"
 
 #. 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:2355
+#: ../finch/gntprefs.c:258
+#: ../finch/gntui.c:83
+#: ../pidgin/gtkblist.c:2886
+#: ../pidgin/gtkblist.c:4566
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:326
 msgid "Buddy List"
 msgstr "Kontaktliste"
 
 #: ../finch/gntblist.c:1257
 msgid "Place tagged"
-msgstr ""
+msgstr "Stedet er merket"
 
 #: ../finch/gntblist.c:1262
 msgid "Toggle Tag"
-msgstr ""
+msgstr "Bla i merkelapp"
 
 #. General
-#: ../finch/gntblist.c:1298 ../libpurple/protocols/gg/gg.c:637
-#: ../libpurple/protocols/gg/gg.c:1050 ../libpurple/protocols/gg/gg.c:1123
+#: ../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
 #: ../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:2399
 #: ../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/msn/msn.c:1515
+#: ../libpurple/protocols/msn/msn.c:1697
 #: ../libpurple/protocols/qq/buddy_info.c:43
 #: ../libpurple/protocols/silc/buddy.c:1535
 #: ../libpurple/protocols/silc/ops.c:1002
@@ -572,28 +676,31 @@
 #: ../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:3230
 msgid "Nickname"
 msgstr "Kallenavn"
 
 #. Idle stuff
-#: ../finch/gntblist.c:1320 ../finch/gntprefs.c:261
+#: ../finch/gntblist.c:1320
+#: ../finch/gntprefs.c:261
 #: ../libpurple/protocols/bonjour/bonjour.c:340
 #: ../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/state.c:32
+#: ../libpurple/protocols/novell/novell.c:2830
+#: ../libpurple/protocols/oscar/oscar.c:2908
+#: ../libpurple/protocols/yahoo/yahoo.c:3096
+#: ../libpurple/protocols/yahoo/yahoo_profile.c:710
+#: ../pidgin/gtkblist.c:3258
+#: ../pidgin/gtkblist.c:3664
+#: ../pidgin/gtkprefs.c:1927
 msgid "Idle"
 msgstr "Inaktiv"
 
 #: ../finch/gntblist.c:1334
-#, fuzzy
 msgid "On Mobile"
-msgstr "Send til mobil"
+msgstr "På mobil"
 
 #: ../finch/gntblist.c:1415
 #, c-format
@@ -601,72 +708,86 @@
 "Online: %d\n"
 "Total: %d"
 msgstr ""
+"Pålogget: %d\n"
+"Totalt: %d"
 
 #: ../finch/gntblist.c:1424
-#, fuzzy, c-format
+#, c-format
 msgid "Account: %s (%s)"
-msgstr "%s på %s (%s)"
+msgstr "Konto: %s (%s)"
 
 #: ../finch/gntblist.c:1436
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "\n"
 "Last Seen: %s ago"
 msgstr ""
 "\n"
-"<b>%s:</b> %s"
-
-#: ../finch/gntblist.c:1702 ../pidgin/gtkdocklet.c:470
+"Sist sett: %s siden"
+
+#: ../finch/gntblist.c:1704
+#: ../pidgin/gtkdocklet.c:470
 #: ../pidgin/gtkstatusbox.c:1072
 msgid "New..."
 msgstr "Ny..."
 
-#: ../finch/gntblist.c:1709 ../pidgin/gtkdocklet.c:471
+#: ../finch/gntblist.c:1711
+#: ../pidgin/gtkdocklet.c:471
 #: ../pidgin/gtkstatusbox.c:1073
-#, fuzzy
 msgid "Saved..."
-msgstr "Lagre fil..."
-
-#: ../finch/gntblist.c:2087 ../finch/gntplugin.c:255 ../finch/gntui.c:88
-#: ../pidgin/gtkdocklet.c:523 ../pidgin/gtkplugin.c:531
+msgstr "Lagret..."
+
+#: ../finch/gntblist.c:2089
+#: ../finch/gntplugin.c:255
+#: ../finch/gntui.c:88
+#: ../pidgin/gtkdocklet.c:523
+#: ../pidgin/gtkplugin.c:531
 msgid "Plugins"
 msgstr "Tillegg"
 
-#: ../finch/gntblist.c:2203 ../pidgin/gtkdialogs.c:754
-#: ../pidgin/gtkdialogs.c:893 ../pidgin/gtkdialogs.c:974
-#, fuzzy
+#: ../finch/gntblist.c:2205
+#: ../pidgin/gtkdialogs.c:750
+#: ../pidgin/gtkdialogs.c:889
+#: ../pidgin/gtkdialogs.c:970
 msgid "_Name"
-msgstr "Navn"
-
-#: ../finch/gntblist.c:2208 ../pidgin/gtkdialogs.c:759
-#: ../pidgin/gtkdialogs.c:898 ../pidgin/gtkdialogs.c:979
+msgstr "_Navn"
+
+#: ../finch/gntblist.c:2210
+#: ../pidgin/gtkdialogs.c:755
+#: ../pidgin/gtkdialogs.c:894
+#: ../pidgin/gtkdialogs.c:975
 msgid "_Account"
-msgstr "Konto:"
-
-#: ../finch/gntblist.c:2216 ../pidgin/gtkdialogs.c:767
+msgstr "_Konto"
+
+#: ../finch/gntblist.c:2218
+#: ../pidgin/gtkdialogs.c:763
 msgid "New Instant Message"
 msgstr "Ny direktemelding"
 
-#: ../finch/gntblist.c:2218 ../pidgin/gtkdialogs.c:769
-#, fuzzy
-msgid ""
-"Please enter the screen name or alias of the person you would like to IM."
-msgstr ""
-"Vennligst skriv inn skjermnavnet på den personen du vil sende direktemelding "
-"til."
+#: ../finch/gntblist.c:2220
+#: ../pidgin/gtkdialogs.c:765
+msgid "Please enter the screen name or alias of the person you would like to IM."
+msgstr "Vennligst skriv inn skjermnavnet eller aliaset på den personen du vil sende direktemelding til."
 
 #. 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
+#: ../finch/gntblist.c:2223
+#: ../finch/gntcertmgr.c:90
+#: ../finch/gntconn.c:136
+#: ../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
 #: ../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:289
+#: ../libpurple/protocols/msn/msn.c:306
+#: ../libpurple/protocols/msn/msn.c:323
+#: ../libpurple/protocols/msn/msn.c:340
+#: ../libpurple/protocols/oscar/oscar.c:6091
 #: ../libpurple/protocols/silc/buddy.c:454
 #: ../libpurple/protocols/silc/buddy.c:1190
 #: ../libpurple/protocols/silc/chat.c:447
@@ -683,107 +804,127 @@
 #: ../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
+#: ../libpurple/protocols/yahoo/yahoo.c:1030
+#: ../libpurple/protocols/yahoo/yahoo.c:3496
+#: ../libpurple/protocols/yahoo/yahoo.c:3507
+#: ../pidgin/gtkblist.c:4321
+#: ../pidgin/gtkcertmgr.c:195
+#: ../pidgin/gtkdialogs.c:768
+#: ../pidgin/gtkdialogs.c:907
+#: ../pidgin/gtkdialogs.c:999
 #: ../pidgin/gtkrequest.c:270
 msgid "OK"
-msgstr "_OK"
+msgstr "OK"
 
 #. Create the "Options" frame.
-#: ../finch/gntblist.c:2241 ../finch/gntpounce.c:447 ../pidgin/gtkpounce.c:790
-#, fuzzy
+#: ../finch/gntblist.c:2261
+#: ../finch/gntpounce.c:447
+#: ../pidgin/gtkpounce.c:790
 msgid "Options"
-msgstr "/_Brukervalg"
-
-#: ../finch/gntblist.c:2247
-#, fuzzy
-msgid "Send IM..."
-msgstr "Lagre fil..."
-
-#: ../finch/gntblist.c:2251
-#, fuzzy
-msgid "Show empty groups"
-msgstr "Etter gruppe"
-
-#: ../finch/gntblist.c:2257
-#, fuzzy
-msgid "Show offline buddies"
-msgstr "/Kontakter/Vis _avloggede kontakter"
-
-#: ../finch/gntblist.c:2263
-#, fuzzy
-msgid "Sort by status"
-msgstr "Status"
+msgstr "Brukervalg"
 
 #: ../finch/gntblist.c:2267
-#, fuzzy
-msgid "Sort alphabetically"
-msgstr "Alfabetisk"
+msgid "Send IM..."
+msgstr "Send direktemelding..."
 
 #: ../finch/gntblist.c:2271
-#, fuzzy
-msgid "Sort by log size"
+msgid "Show"
+msgstr "Vis"
+
+#: ../finch/gntblist.c:2276
+msgid "Empty groups"
+msgstr "Tomme grupper"
+
+#: ../finch/gntblist.c:2282
+msgid "Offline buddies"
+msgstr "Avloggede kontakter"
+
+#: ../finch/gntblist.c:2288
+msgid "Sort"
+msgstr "Sorter"
+
+#: ../finch/gntblist.c:2293
+msgid "By Status"
+msgstr "Etter status"
+
+#: ../finch/gntblist.c:2297
+#: ../pidgin/gtkblist.c:4106
+msgid "Alphabetically"
+msgstr "Alfabetisk"
+
+#: ../finch/gntblist.c:2301
+msgid "By Log Size"
 msgstr "Etter loggstørrelse"
 
-#: ../finch/gntcertmgr.c:86 ../pidgin/gtkcertmgr.c:188
-#, fuzzy
+#: ../finch/gntcertmgr.c:86
+#: ../pidgin/gtkcertmgr.c:188
 msgid "Certificate Import"
-msgstr "Koble til"
-
-#: ../finch/gntcertmgr.c:87 ../pidgin/gtkcertmgr.c:189
+msgstr "Importering av sertifikat"
+
+#: ../finch/gntcertmgr.c:87
+#: ../pidgin/gtkcertmgr.c:189
 msgid "Specify a hostname"
-msgstr ""
-
-#: ../finch/gntcertmgr.c:88 ../pidgin/gtkcertmgr.c:190
+msgstr "Spesifiser et vertsnavn"
+
+#: ../finch/gntcertmgr.c:88
+#: ../pidgin/gtkcertmgr.c:190
 msgid "Type the host name this certificate is for."
-msgstr ""
-
-#: ../finch/gntcertmgr.c:97 ../pidgin/gtkcertmgr.c:210
+msgstr "Skriv inn vertsnavnet som dette sertifikatet er for."
+
+#: ../finch/gntcertmgr.c:97
+#: ../pidgin/gtkcertmgr.c:210
 #, c-format
 msgid ""
 "File %s could not be imported.\n"
 "Make sure that the file is readable and in PEM format.\n"
 msgstr ""
-
-#: ../finch/gntcertmgr.c:99 ../pidgin/gtkcertmgr.c:212
+"Filen %s kunne ikke bli importert.\n"
+"Pass på at filen er lesbar og i PEM-format.\n"
+
+#: ../finch/gntcertmgr.c:99
+#: ../pidgin/gtkcertmgr.c:212
 msgid "Certificate Import Error"
-msgstr ""
-
-#: ../finch/gntcertmgr.c:100 ../pidgin/gtkcertmgr.c:213
+msgstr "Import av sertifikat feilet"
+
+#: ../finch/gntcertmgr.c:100
+#: ../pidgin/gtkcertmgr.c:213
 msgid "X.509 certificate import failed"
-msgstr ""
-
-#: ../finch/gntcertmgr.c:110 ../pidgin/gtkcertmgr.c:224
-#, fuzzy
+msgstr "Import av X.509 sertifikat feilet"
+
+#: ../finch/gntcertmgr.c:110
+#: ../pidgin/gtkcertmgr.c:224
 msgid "Select a PEM certificate"
-msgstr "Velg fil"
-
-#: ../finch/gntcertmgr.c:127 ../pidgin/gtkcertmgr.c:245
+msgstr "Velg et PEM-sertifikat"
+
+#: ../finch/gntcertmgr.c:127
+#: ../pidgin/gtkcertmgr.c:245
 #, c-format
 msgid ""
 "Export to file %s failed.\n"
 "Check that you have write permission to the target path\n"
 msgstr ""
-
-#: ../finch/gntcertmgr.c:129 ../pidgin/gtkcertmgr.c:247
+"Eksport til fil %s feilet.\n"
+"Sjekk at du har skrive-rettigheter til målbanen\n"
+
+#: ../finch/gntcertmgr.c:129
+#: ../pidgin/gtkcertmgr.c:247
 msgid "Certificate Export Error"
-msgstr ""
-
-#: ../finch/gntcertmgr.c:130 ../pidgin/gtkcertmgr.c:248
+msgstr "Eksport av sertifikat feilet"
+
+#: ../finch/gntcertmgr.c:130
+#: ../pidgin/gtkcertmgr.c:248
 msgid "X.509 certificate export failed"
-msgstr ""
-
-#: ../finch/gntcertmgr.c:159 ../pidgin/gtkcertmgr.c:299
+msgstr "Eksport av x.509 sertifikat feilet"
+
+#: ../finch/gntcertmgr.c:159
+#: ../pidgin/gtkcertmgr.c:299
 msgid "PEM X.509 Certificate Export"
-msgstr ""
+msgstr "Eksport av PEM X.509 sertifikat"
 
 #: ../finch/gntcertmgr.c:188
 #, c-format
 msgid "Certificate for %s"
-msgstr ""
+msgstr "Sertifikat for %s"
 
 #: ../finch/gntcertmgr.c:195
 #, c-format
@@ -793,188 +934,205 @@
 "SHA1 fingerprint:\n"
 "%s"
 msgstr ""
+"Vanlig navn: %s\n"
+"\n"
+"SHA1 fingeravtrykk:\n"
+"%s"
 
 #: ../finch/gntcertmgr.c:198
 msgid "SSL Host Certificate"
-msgstr ""
-
-#: ../finch/gntcertmgr.c:233 ../pidgin/gtkcertmgr.c:372
+msgstr "SSL Vert Sertifikat"
+
+#: ../finch/gntcertmgr.c:233
+#: ../pidgin/gtkcertmgr.c:372
 #, c-format
 msgid "Really delete certificate for %s?"
-msgstr ""
-
-#: ../finch/gntcertmgr.c:236 ../pidgin/gtkcertmgr.c:374
+msgstr "Virkelig slett sertifikat for %s?"
+
+#: ../finch/gntcertmgr.c:236
+#: ../pidgin/gtkcertmgr.c:374
 msgid "Confirm certificate delete"
-msgstr ""
-
-#: ../finch/gntcertmgr.c:293 ../pidgin/gtkcertmgr.c:602
+msgstr "Bekreft sletting av sertifikat"
+
+#: ../finch/gntcertmgr.c:293
+#: ../pidgin/gtkcertmgr.c:602
 msgid "Certificate Manager"
-msgstr ""
+msgstr "Sertifikatshåndterer"
 
 #. Creating the user splits
-#: ../finch/gntcertmgr.c:298 ../libpurple/protocols/bonjour/bonjour.c:652
+#: ../finch/gntcertmgr.c:298
+#: ../libpurple/protocols/bonjour/bonjour.c:652
 #: ../libpurple/protocols/silc/silc.c:1007
 #: ../libpurple/protocols/silc10/silc.c:918
-#, fuzzy
 msgid "Hostname"
-msgstr "Etternavn:"
-
-#: ../finch/gntcertmgr.c:315 ../finch/gntnotify.c:383 ../pidgin/gtkconv.c:1635
+msgstr "Vertsnavn"
+
+#: ../finch/gntcertmgr.c:315
+#: ../finch/gntnotify.c:386
+#: ../pidgin/gtkconv.c:1688
 #: ../pidgin/gtkdebug.c:835
 msgid "Info"
 msgstr "Info"
 
 #. 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
+#: ../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:406
 #: ../libpurple/protocols/silc/util.c:382
-#: ../libpurple/protocols/silc10/util.c:377 ../pidgin/gtkaccount.c:2468
+#: ../libpurple/protocols/silc10/util.c:377
+#: ../pidgin/gtkaccount.c:2468
 #: ../pidgin/gtkrequest.c:273
 msgid "Close"
-msgstr "L_ukk"
-
-#: ../finch/gntconn.c:124
-#, fuzzy, c-format
+msgstr "Lukk"
+
+#: ../finch/gntconn.c:125
+#, c-format
 msgid "%s (%s)"
-msgstr "%s på %s (%s)"
-
-#: ../finch/gntconn.c:127
-#, fuzzy, c-format
-msgid "%s disconnected."
-msgstr "Frakoblet."
+msgstr "%s (%s)"
 
 #: ../finch/gntconn.c:128
-#, fuzzy, c-format
+#, c-format
+msgid "%s disconnected."
+msgstr "%s koblet fra."
+
+#: ../finch/gntconn.c:129
+#, c-format
 msgid ""
 "%s\n"
 "\n"
-"Finch will not attempt to reconnect the account until you correct the error "
-"and re-enable the account."
-msgstr ""
-"%s ble avkoblet pga. en feil. %s Kontoen har blitt avstengt. Korriger feilen "
-"og slå på kontoen for å tilkoble."
-
-#: ../finch/gntconn.c:137 ../pidgin/gtkblist.c:4041
-#, fuzzy
+"Finch will not attempt to reconnect the account until you correct the error and re-enable the account."
+msgstr ""
+"%s\n"
+"\n"
+"Finch vil ikke forsøke å koble kontoen til igjen før du har rettet på feilen og slått på kontoen igjen."
+
+#: ../finch/gntconn.c:138
+#: ../pidgin/gtkblist.c:4323
 msgid "Re-enable Account"
-msgstr "Registrere ny jabber-konto"
+msgstr "Reaktiver konto"
 
 #: ../finch/gntconv.c:139
 msgid "No such command."
-msgstr "Ingen slik kommando"
-
-#: ../finch/gntconv.c:143 ../pidgin/gtkconv.c:489
+msgstr "Ingen slik kommando."
+
+#: ../finch/gntconv.c:143
+#: ../pidgin/gtkconv.c:530
 msgid "Syntax Error:  You typed the wrong number of arguments to that command."
-msgstr "Syntaksfeil: Du skrev inn feil antall argumenter til den kommandoen"
-
-#: ../finch/gntconv.c:148 ../pidgin/gtkconv.c:495
+msgstr "Syntaksfeil:  Du skrev inn feil antall argumenter til den kommandoen."
+
+#: ../finch/gntconv.c:148
+#: ../pidgin/gtkconv.c:536
 msgid "Your command failed for an unknown reason."
 msgstr "Din kommando feilet av ukjent årsak."
 
-#: ../finch/gntconv.c:153 ../pidgin/gtkconv.c:502
-#, fuzzy
+#: ../finch/gntconv.c:153
+#: ../pidgin/gtkconv.c:543
 msgid "That command only works in chats, not IMs."
-msgstr "Den kommandoen virker bare i samtalegrupper, ikke i direktemeldinger"
-
-#: ../finch/gntconv.c:156 ../pidgin/gtkconv.c:505
-#, fuzzy
+msgstr "Den kommandoen virker bare i samtalegrupper, ikke i direktemeldinger."
+
+#: ../finch/gntconv.c:156
+#: ../pidgin/gtkconv.c:546
 msgid "That command only works in IMs, not chats."
-msgstr "Den kommandoen virker bare i direktemeldinger, ikke samtalegrupper"
-
-#: ../finch/gntconv.c:160 ../pidgin/gtkconv.c:510
+msgstr "Den kommandoen virker bare i direktemeldinger, ikke samtalegrupper."
+
+#: ../finch/gntconv.c:160
+#: ../pidgin/gtkconv.c:551
 msgid "That command doesn't work on this protocol."
-msgstr "Denne kommandoen virker ikke på denne protokollen"
+msgstr "Denne kommandoen virker ikke på denne protokollen."
 
 #: ../finch/gntconv.c:168
-#, fuzzy
 msgid "Message was not sent, because you are not signed on."
-msgstr "Meldingen kunne ikke bli sendt, brukeren er frakoblet:"
+msgstr "Meldingen kunne ikke bli sendt, fordi du ikke er koblet til."
 
 #: ../finch/gntconv.c:251
-#, fuzzy, c-format
+#, c-format
 msgid "%s (%s -- %s)"
-msgstr "%s på %s (%s)"
+msgstr "%s (%s -- %s)"
 
 #: ../finch/gntconv.c:274
 #, c-format
 msgid "%s [%s]"
-msgstr ""
-
-#: ../finch/gntconv.c:279 ../finch/gntconv.c:773
-#, fuzzy, c-format
+msgstr "%s [%s]"
+
+#: ../finch/gntconv.c:279
+#: ../finch/gntconv.c:801
+#, c-format
 msgid ""
 "\n"
 "%s is typing..."
-msgstr "Brukeren skriver en melding..."
+msgstr ""
+"\n"
+"%s skriver..."
 
 #: ../finch/gntconv.c:298
-#, fuzzy
 msgid "You have left this chat."
-msgstr "Du snakker i samtalen"
-
-#: ../finch/gntconv.c:387 ../pidgin/gtkconv.c:1362
+msgstr "Du har forlatt denne samtalen."
+
+#: ../finch/gntconv.c:414
+#: ../pidgin/gtkconv.c:1415
 msgid "Logging started. Future messages in this conversation will be logged."
-msgstr ""
-
-#: ../finch/gntconv.c:393 ../pidgin/gtkconv.c:1370
-msgid ""
-"Logging stopped. Future messages in this conversation will not be logged."
-msgstr ""
-"Logging stoppet. Framtidige beskjeder i denne samtalen vil ikke bli logget."
-
-#: ../finch/gntconv.c:442
-#, fuzzy
+msgstr "Innlogging startet. Fremtidige beskjeder i denne samtalen vil bli logget."
+
+#: ../finch/gntconv.c:420
+#: ../pidgin/gtkconv.c:1423
+msgid "Logging stopped. Future messages in this conversation will not be logged."
+msgstr "Logging stoppet. Framtidige beskjeder i denne samtalen vil ikke bli logget."
+
+#: ../finch/gntconv.c:469
 msgid "Send To"
-msgstr "Send som"
-
-#: ../finch/gntconv.c:486
-#, fuzzy
+msgstr "Send til"
+
+#: ../finch/gntconv.c:513
 msgid "Conversation"
-msgstr "Samtaler"
-
-#: ../finch/gntconv.c:492
+msgstr "Samtale"
+
+#: ../finch/gntconv.c:519
 msgid "Clear Scrollback"
-msgstr ""
-
-#: ../finch/gntconv.c:496 ../finch/gntprefs.c:191
-#, fuzzy
+msgstr "Rens Rullefelt"
+
+#: ../finch/gntconv.c:523
+#: ../finch/gntprefs.c:191
 msgid "Show Timestamps"
-msgstr "Tidsstempler"
-
-#: ../finch/gntconv.c:512
-#, fuzzy
+msgstr "Vis tidsstempler"
+
+#: ../finch/gntconv.c:539
 msgid "Add Buddy Pounce..."
-msgstr "Legg til kompisvarsling"
-
-#: ../finch/gntconv.c:527
-#, fuzzy
+msgstr "Legg til kontaktvarsling..."
+
+#: ../finch/gntconv.c:554
 msgid "Enable Logging"
-msgstr "/Brukervalg/Slå på logging"
-
-#: ../finch/gntconv.c:533
-#, fuzzy
+msgstr "Aktiver logging"
+
+#: ../finch/gntconv.c:560
 msgid "Enable Sounds"
-msgstr "/Brukervalg/Slå på lyder"
-
-#: ../finch/gntconv.c:739
+msgstr "Aktiver lyder"
+
+#: ../finch/gntconv.c:766
 msgid "<AUTO-REPLY> "
-msgstr ""
+msgstr "<AUTO-SVAR> "
 
 #. Print the list of users in the room
-#: ../finch/gntconv.c:861
+#: ../finch/gntconv.c:889
 msgid "List of users:\n"
-msgstr ""
-
-#: ../finch/gntconv.c:1023 ../pidgin/gtkconv.c:331
+msgstr "Liste av brukere:\n"
+
+#: ../finch/gntconv.c:1051
+#: ../pidgin/gtkconv.c:370
 msgid "Supported debug options are:  version"
 msgstr "Støttede avlusningsmuligheter er: version"
 
-#: ../finch/gntconv.c:1059 ../pidgin/gtkconv.c:381
+#: ../finch/gntconv.c:1087
+#: ../pidgin/gtkconv.c:422
 msgid "No such command (in this context)."
 msgstr "Ingen slik kommando (i denne sammenheng)."
 
-#: ../finch/gntconv.c:1062 ../pidgin/gtkconv.c:384
+#: ../finch/gntconv.c:1090
+#: ../pidgin/gtkconv.c:425
 msgid ""
 "Use \"/help &lt;command&gt;\" for help on a specific command.\n"
 "The following commands are available in this context:\n"
@@ -982,65 +1140,62 @@
 "Bruk \"/help &lt;command&gt;\" for hjelp på en spesifikk kommando.\n"
 "De følgende kommandoer er tilgjengelige i denne sammenhengen:\n"
 
-#: ../finch/gntconv.c:1120 ../pidgin/gtkconv.c:7560
-msgid ""
-"say &lt;message&gt;:  Send a message normally as if you weren't using a "
-"command."
-msgstr ""
-"say &lt;message&gt;: Send en beskjed normalt som om du ikke brukte en "
-"kommando."
-
-#: ../finch/gntconv.c:1123 ../pidgin/gtkconv.c:7563
+#: ../finch/gntconv.c:1148
+#: ../pidgin/gtkconv.c:7642
+msgid "say &lt;message&gt;:  Send a message normally as if you weren't using a command."
+msgstr "say &lt;message&gt;: Send en beskjed normalt som om du ikke brukte en kommando."
+
+#: ../finch/gntconv.c:1151
+#: ../pidgin/gtkconv.c:7645
 msgid "me &lt;action&gt;:  Send an IRC style action to a buddy or chat."
-msgstr ""
-"me &lt;action&gt;: Send en IRC stil handling til en kompis eller samtale."
-
-#: ../finch/gntconv.c:1126 ../pidgin/gtkconv.c:7566
-msgid ""
-"debug &lt;option&gt;:  Send various debug information to the current "
-"conversation."
-msgstr ""
-"debug &lt;option&gt;: Send diverse debug informasjon til den pågående "
-"samtalen."
-
-#: ../finch/gntconv.c:1129 ../pidgin/gtkconv.c:7569
-#, fuzzy
+msgstr "me &lt;action&gt;: Send en IRC stil handling til en kompis eller samtale."
+
+#: ../finch/gntconv.c:1154
+#: ../pidgin/gtkconv.c:7648
+msgid "debug &lt;option&gt;:  Send various debug information to the current conversation."
+msgstr "debug &lt;option&gt;: Send diverse debug informasjon til den pågående samtalen."
+
+#: ../finch/gntconv.c:1157
+#: ../pidgin/gtkconv.c:7651
 msgid "clear: Clears the conversation scrollback."
-msgstr "%s har lukket samtalevinduet."
-
-#: ../finch/gntconv.c:1132 ../pidgin/gtkconv.c:7575
+msgstr "clear: Renser samtale scrollback."
+
+#: ../finch/gntconv.c:1160
+#: ../pidgin/gtkconv.c:7657
 msgid "help &lt;command&gt;:  Help on a specific command."
-msgstr ""
-
-#: ../finch/gntconv.c:1135
+msgstr "hjelp &lt;kommando&gt;:  Hjelp til en spesifikk kommando."
+
+#: ../finch/gntconv.c:1163
 msgid "users:  Show the list of users in the chat."
-msgstr ""
-
-#: ../finch/gntconv.c:1140
+msgstr "brukere:  Vis listen av brukere i samtalen."
+
+#: ../finch/gntconv.c:1168
 msgid "plugins: Show the plugins window."
-msgstr ""
-
-#: ../finch/gntconv.c:1143
+msgstr "tillegg: Vis tillegg i vinduet."
+
+#: ../finch/gntconv.c:1171
 msgid "buddylist: Show the buddylist."
-msgstr ""
-
-#: ../finch/gntconv.c:1146
+msgstr "kompisliste: Vis kompislisten."
+
+#: ../finch/gntconv.c:1174
 msgid "accounts: Show the accounts window."
-msgstr ""
-
-#: ../finch/gntconv.c:1149
+msgstr "kontoer: Vis kontoene i vinduet."
+
+#: ../finch/gntconv.c:1177
 msgid "debugwin: Show the debug window."
-msgstr ""
-
-#: ../finch/gntconv.c:1152
+msgstr "debugwin: Vis debugs vindu."
+
+#: ../finch/gntconv.c:1180
 msgid "prefs: Show the preference window."
-msgstr ""
-
-#: ../finch/gntconv.c:1155
+msgstr "prefs: Vis preferanse vindu."
+
+#: ../finch/gntconv.c:1183
 msgid "statuses: Show the savedstatuses window."
-msgstr ""
-
-#: ../finch/gntdebug.c:235 ../finch/gntui.c:86 ../pidgin/gtkdebug.c:695
+msgstr "statuser: Vis lagrede statuser i vindu."
+
+#: ../finch/gntdebug.c:235
+#: ../finch/gntui.c:86
+#: ../pidgin/gtkdebug.c:695
 msgid "Debug Window"
 msgstr "Avlusningsvindu"
 
@@ -1048,197 +1203,220 @@
 #. * 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
-#, fuzzy
+#: ../finch/gntdebug.c:256
+#: ../pidgin/gtkdebug.c:754
 msgid "Clear"
-msgstr "L_ukk"
+msgstr "Clear"
 
 #: ../finch/gntdebug.c:262
-#, fuzzy
 msgid "Filter: "
-msgstr "Feilet."
-
-#: ../finch/gntdebug.c:266 ../pidgin/gtkdebug.c:763
+msgstr "Filter: "
+
+#: ../finch/gntdebug.c:266
+#: ../pidgin/gtkdebug.c:763
 msgid "Pause"
 msgstr "Pause"
 
-#: ../finch/gntft.c:118 ../pidgin/gtkft.c:229
-#, fuzzy, c-format
+#: ../finch/gntft.c:118
+#: ../pidgin/gtkft.c:229
+#, c-format
 msgid "File Transfers - %d%% of %d files"
-msgstr "Filoverføring til %s avbrutt.\n"
+msgstr "Filoverføringer - %d%% av %d filer"
 
 #. Create the window.
-#: ../finch/gntft.c:123 ../finch/gntft.c:196 ../finch/gntui.c:87
-#: ../pidgin/gtkft.c:234 ../pidgin/gtkft.c:762
+#: ../finch/gntft.c:123
+#: ../finch/gntft.c:196
+#: ../finch/gntui.c:87
+#: ../pidgin/gtkft.c:234
+#: ../pidgin/gtkft.c:762
 msgid "File Transfers"
 msgstr "Filoverføringer"
 
-#: ../finch/gntft.c:201 ../pidgin/gtkft.c:645
+#: ../finch/gntft.c:201
+#: ../pidgin/gtkft.c:645
 msgid "Progress"
 msgstr "Framdrift"
 
-#: ../finch/gntft.c:201 ../pidgin/gtkft.c:652
+#: ../finch/gntft.c:201
+#: ../pidgin/gtkft.c:652
 msgid "Filename"
 msgstr "Filnavn"
 
-#: ../finch/gntft.c:201 ../pidgin/gtkft.c:659
+#: ../finch/gntft.c:201
+#: ../pidgin/gtkft.c:659
 msgid "Size"
 msgstr "Størrelse"
 
 #: ../finch/gntft.c:201
-#, fuzzy
 msgid "Speed"
-msgstr "Hastighet:"
-
-#: ../finch/gntft.c:201 ../pidgin/gtkft.c:666
+msgstr "Hastighet"
+
+#: ../finch/gntft.c:201
+#: ../pidgin/gtkft.c:666
 msgid "Remaining"
 msgstr "Gjenstår"
 
 #. XXX: Use of ggp_str_to_uin() is an ugly hack!
-#: ../finch/gntft.c:201 ../finch/gntstatus.c:547 ../finch/gntstatus.c:576
+#: ../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:1039
+#: ../libpurple/protocols/gg/gg.c:1576
 #: ../libpurple/protocols/gg/gg.c:1584
 #: ../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/msn/msn.c:596
+#: ../libpurple/protocols/msn/msn.c:603
+#: ../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/oscar/oscar.c:2696
+#: ../libpurple/protocols/oscar/oscar.c:3776
 #: ../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/yahoo/yahoo.c:3247
+#: ../pidgin/gtkblist.c:3302
+#: ../pidgin/gtkblist.c:3316
+#: ../pidgin/gtkblist.c:3318
+#: ../pidgin/gtksavedstatuses.c:999
+#: ../pidgin/gtksavedstatuses.c:1144
 msgid "Status"
 msgstr "Status"
 
 #: ../finch/gntft.c:211
 msgid "Close this window when all transfers finish"
-msgstr ""
+msgstr "Lukk dette vinduet når alle overføringer er ferdige"
 
 #: ../finch/gntft.c:218
-#, fuzzy
 msgid "Clear finished transfers"
 msgstr "Fjern fullførte overføringer"
 
 #: ../finch/gntft.c:232
-#, fuzzy
 msgid "Stop"
-msgstr "Hiptop"
-
-#: ../finch/gntft.c:305 ../pidgin/gtkft.c:169 ../pidgin/gtkft.c:973
+msgstr "Stopp"
+
+#: ../finch/gntft.c:305
+#: ../pidgin/gtkft.c:169
+#: ../pidgin/gtkft.c:973
 msgid "Waiting for transfer to begin"
 msgstr "Venter på at overføringen skal starte"
 
-#: ../finch/gntft.c:372 ../pidgin/gtkft.c:166 ../pidgin/gtkft.c:1054
+#: ../finch/gntft.c:372
+#: ../pidgin/gtkft.c:166
+#: ../pidgin/gtkft.c:1054
 msgid "Canceled"
 msgstr "Avbrutt"
 
-#: ../finch/gntft.c:374 ../pidgin/gtkft.c:1056
+#: ../finch/gntft.c:374
+#: ../pidgin/gtkft.c:1056
 msgid "Failed"
-msgstr "Feilet."
-
-#: ../finch/gntft.c:420 ../pidgin/gtkft.c:134
-#, fuzzy, c-format
+msgstr "Feilet"
+
+#: ../finch/gntft.c:420
+#: ../pidgin/gtkft.c:134
+#, c-format
 msgid "%.2f KiB/s"
-msgstr "%.2f KB/s"
+msgstr "%.2f KiB/s"
 
 #: ../finch/gntft.c:431
 #, c-format
 msgid "The file was saved as %s."
-msgstr ""
-
-#
-#: ../finch/gntft.c:432 ../finch/gntft.c:433 ../pidgin/gtkft.c:163
+msgstr "Filen ble lagret som %s."
+
+#: ../finch/gntft.c:432
+#: ../finch/gntft.c:433
+#: ../pidgin/gtkft.c:163
 #: ../pidgin/gtkft.c:1116
 msgid "Finished"
-msgstr "Ferdig"
-
-#: ../finch/gntft.c:437 ../libpurple/protocols/msn/session.c:347
+msgstr "Fullført"
+
+#: ../finch/gntft.c:437
+#: ../libpurple/protocols/msn/session.c:386
 msgid "Transferring"
 msgstr "Overfører"
 
 #: ../finch/gntnotify.c:165
-#, fuzzy
 msgid "Emails"
-msgstr "E-post"
-
-#: ../finch/gntnotify.c:171 ../finch/gntnotify.c:225
+msgstr "E-poster"
+
+#: ../finch/gntnotify.c:171
+#: ../finch/gntnotify.c:225
 msgid "You have mail!"
-msgstr ""
-
-#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:513
-#, fuzzy
+msgstr "Du har e-post!"
+
+#: ../finch/gntnotify.c:174
+#: ../pidgin/gtknotify.c:510
 msgid "Sender"
-msgstr "Kjønn"
-
-#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:520
+msgstr "Avsender"
+
+#: ../finch/gntnotify.c:174
+#: ../pidgin/gtknotify.c:517
 msgid "Subject"
-msgstr ""
+msgstr "Tittel"
 
 #: ../finch/gntnotify.c:201
-#, fuzzy, c-format
+#, c-format
 msgid "%s (%s) has %d new message."
 msgid_plural "%s (%s) has %d new messages."
-msgstr[0] "%s har %d ny beskjed."
-msgstr[1] "%s har %d nye beskjeder."
-
-#: ../finch/gntnotify.c:225 ../pidgin/gtknotify.c:341
-#, fuzzy
+msgstr[0] "%s (%s) har %d ny beskjed."
+msgstr[1] "%s (%s) har %d nye beskjeder."
+
+#: ../finch/gntnotify.c:225
+#: ../pidgin/gtknotify.c:341
 msgid "New Mail"
-msgstr "E-post"
-
-#: ../finch/gntnotify.c:290 ../pidgin/gtknotify.c:940
+msgstr "Ny e-post"
+
+#: ../finch/gntnotify.c:290
+#: ../pidgin/gtknotify.c:940
 #, c-format
 msgid "Info for %s"
 msgstr "Info for %s"
 
-#: ../finch/gntnotify.c:291 ../libpurple/protocols/toc/toc.c:476
+#: ../finch/gntnotify.c:291
+#: ../libpurple/protocols/toc/toc.c:476
 #: ../pidgin/gtknotify.c:941
 msgid "Buddy Information"
 msgstr "Kontaktinformasjon"
 
-#: ../finch/gntnotify.c:377 ../libpurple/protocols/qq/group_join.c:367
-#, fuzzy
+#: ../finch/gntnotify.c:380
+#: ../libpurple/protocols/qq/group_join.c:367
 msgid "Continue"
-msgstr "Kobler til"
-
-#: ../finch/gntnotify.c:386 ../pidgin/gtkconv.c:1596
-msgid "IM"
-msgstr "Direktemelding"
+msgstr "Fortsett"
 
 #: ../finch/gntnotify.c:389
-#, fuzzy
+#: ../pidgin/gtkconv.c:1649
+msgid "IM"
+msgstr "Direktemelding"
+
+#: ../finch/gntnotify.c:392
 msgid "Join"
-msgstr "_Bli med i samtalegruppe"
-
-#: ../finch/gntnotify.c:392 ../libpurple/protocols/sametime/sametime.c:3473
-msgid "Invite"
-msgstr "Inviter"
+msgstr "Bli med"
 
 #: ../finch/gntnotify.c:395
-#, fuzzy
+#: ../libpurple/protocols/sametime/sametime.c:3473
+msgid "Invite"
+msgstr "Inviter"
+
+#: ../finch/gntnotify.c:398
 msgid "(none)"
 msgstr "(uten navn)"
 
-#: ../finch/gntplugin.c:75 ../finch/gntplugin.c:84
+#: ../finch/gntplugin.c:75
+#: ../finch/gntplugin.c:84
 msgid "ERROR"
-msgstr ""
+msgstr "FEIL"
 
 #: ../finch/gntplugin.c:75
-#, fuzzy
 msgid "loading plugin failed"
-msgstr "Ping mislyktes"
+msgstr "lasting av tillegg feilet"
 
 #: ../finch/gntplugin.c:84
 msgid "unloading plugin failed"
-msgstr ""
+msgstr "avlessing av tillegg feilet"
 
 #: ../finch/gntplugin.c:129
 #, c-format
@@ -1250,517 +1428,539 @@
 "Website: %s\n"
 "Filename: %s\n"
 msgstr ""
+"Navn: %s\n"
+"Versjon: %s\n"
+"Beskrivelse: %s\n"
+"Forfatter: %s\n"
+"Hjemmeside: %s\n"
+"Filnavn: %s\n"
 
 #: ../finch/gntplugin.c:187
 msgid "Plugin need to be loaded before you can configure it."
-msgstr ""
+msgstr "Last inn tillegget før du kan konfigurere det."
 
 #: ../finch/gntplugin.c:235
 msgid "No configuration options for this plugin."
-msgstr ""
+msgstr "Ingen konfigurasjons muligheter for dette tillegg."
 
 #: ../finch/gntplugin.c:260
-#, fuzzy
 msgid "You can (un)load plugins from the following list."
-msgstr "Du venter på godkjenning fra disse kontaktene"
+msgstr "Du kan laste/losse tillegg fra den følgende listen."
 
 #: ../finch/gntplugin.c:315
-#, fuzzy
 msgid "Configure Plugin"
-msgstr "Konfigurer rom"
+msgstr "Konfigurer tillegg"
 
 #. copy the preferences to tmp values...
 #. * I liked "take affect immediately" Oh well :-(
 #. (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:371
+#: ../finch/gntplugin.c:378
+#: ../finch/gntprefs.c:264
+#: ../finch/gntui.c:90
+#: ../pidgin/gtkdocklet.c:524
+#: ../pidgin/gtkprefs.c:2069
 msgid "Preferences"
 msgstr "Innstillinger"
 
-#: ../finch/gntpounce.c:183 ../pidgin/gtkpounce.c:256
+#: ../finch/gntpounce.c:183
+#: ../pidgin/gtkpounce.c:256
 msgid "Please enter a buddy to pounce."
 msgstr "Navnet på kontakten du vil varsle."
 
-#: ../finch/gntpounce.c:328 ../pidgin/gtkpounce.c:517
+#: ../finch/gntpounce.c:328
+#: ../pidgin/gtkpounce.c:517
 msgid "New Buddy Pounce"
-msgstr "Legg til kompisvarsling"
-
-#: ../finch/gntpounce.c:328 ../pidgin/gtkpounce.c:517
+msgstr "Legg til kontaktvarsling"
+
+#: ../finch/gntpounce.c:328
+#: ../pidgin/gtkpounce.c:517
 msgid "Edit Buddy Pounce"
-msgstr "Rediger kompisvarsling"
+msgstr "Rediger kontaktvarsling"
 
 #: ../finch/gntpounce.c:333
 msgid "Pounce Who"
-msgstr "Varsling for"
+msgstr "Varsle hvem"
 
 #. Account:
-#: ../finch/gntpounce.c:336 ../finch/gntstatus.c:456
+#: ../finch/gntpounce.c:336
+#: ../finch/gntstatus.c:456
 msgid "Account:"
 msgstr "Konto:"
 
 #: ../finch/gntpounce.c:358
-#, fuzzy
 msgid "Buddy name:"
 msgstr "Kontaktnavn:"
 
 #. Create the "Pounce When Buddy..." frame.
-#: ../finch/gntpounce.c:374 ../pidgin/gtkpounce.c:585
-#, fuzzy
+#: ../finch/gntpounce.c:374
+#: ../pidgin/gtkpounce.c:585
 msgid "Pounce When Buddy..."
-msgstr "Varsle når"
+msgstr "Varsle når kontakt..."
 
 #: ../finch/gntpounce.c:376
-#, fuzzy
 msgid "Signs on"
-msgstr "Pålo_gging"
+msgstr "Logger på"
 
 #: ../finch/gntpounce.c:377
-#, fuzzy
 msgid "Signs off"
-msgstr "Logg _av"
+msgstr "Logger av"
 
 #: ../finch/gntpounce.c:378
-#, fuzzy
 msgid "Goes away"
-msgstr "Når fraværende"
+msgstr "Forlater"
 
 #: ../finch/gntpounce.c:379
-#, fuzzy
 msgid "Returns from away"
-msgstr "_Returnere fra fravær"
+msgstr "Returnerer fra fravær"
 
 #: ../finch/gntpounce.c:380
-#, fuzzy
 msgid "Becomes idle"
-msgstr "%s har blitt inaktiv"
+msgstr "Blir inaktiv"
 
 #: ../finch/gntpounce.c:381
-#, fuzzy
 msgid "Is no longer idle"
-msgstr "%s er ikke lenger inaktiv"
+msgstr "Er ikke lenger inaktiv"
 
 #: ../finch/gntpounce.c:382
-#, fuzzy
 msgid "Starts typing"
-msgstr "Venn s_tarter å skrive"
+msgstr "Starter å skrive"
 
 #: ../finch/gntpounce.c:383
-#, fuzzy
 msgid "Pauses while typing"
-msgstr "Brukeren skriver en melding..."
+msgstr "Brukeren skriver en melding"
 
 #: ../finch/gntpounce.c:384
-#, fuzzy
 msgid "Stops typing"
-msgstr "Venn slutter å skrive til deg"
+msgstr "Stopper å skrive"
 
 #: ../finch/gntpounce.c:385
-#, fuzzy
 msgid "Sends a message"
-msgstr "Send _beskjed"
+msgstr "Sender en beskjed"
 
 #. Create the "Action" frame.
-#: ../finch/gntpounce.c:414 ../pidgin/gtkpounce.c:646
-#, fuzzy
+#: ../finch/gntpounce.c:414
+#: ../pidgin/gtkpounce.c:646
 msgid "Action"
-msgstr "Sted"
+msgstr "Handling"
 
 #: ../finch/gntpounce.c:416
-#, fuzzy
 msgid "Open an IM window"
-msgstr "Åpne vindu for direktem_elding"
+msgstr "Åpne vindu for direktemelding"
 
 #: ../finch/gntpounce.c:417
-#, fuzzy
 msgid "Pop up a notification"
-msgstr "Varslingsvindu spretter o_pp"
+msgstr "Varslingsvindu spretter opp"
 
 #: ../finch/gntpounce.c:418
-#, fuzzy
 msgid "Send a message"
-msgstr "Send _beskjed"
+msgstr "Send en beskjed"
 
 #: ../finch/gntpounce.c:419
-#, fuzzy
 msgid "Execute a command"
 msgstr "Kjør en kommando"
 
 #: ../finch/gntpounce.c:420
-#, fuzzy
 msgid "Play a sound"
 msgstr "Spill av en lyd"
 
 #: ../finch/gntpounce.c:448
 msgid "Pounce only when my status is not available"
-msgstr ""
-
-#: ../finch/gntpounce.c:450 ../pidgin/gtkpounce.c:1281
+msgstr "Pounce kun når min status er ikke tilgjengelig"
+
+#: ../finch/gntpounce.c:450
+#: ../pidgin/gtkpounce.c:1281
 msgid "Recurring"
-msgstr ""
+msgstr "Gjentar"
 
 #: ../finch/gntpounce.c:618
-#, fuzzy
 msgid "Cannot create pounce"
-msgstr "Kan ikke endre kallenavn"
+msgstr "Kan ikke opprette varsling"
 
 #: ../finch/gntpounce.c:619
 msgid "You do not have any accounts."
-msgstr ""
+msgstr "Du har ingen kontoer."
 
 #: ../finch/gntpounce.c:620
 msgid "You must create an account first before you can create a pounce."
-msgstr ""
-
-#: ../finch/gntpounce.c:662 ../pidgin/gtkpounce.c:1096
-#, fuzzy, c-format
+msgstr "Du må opprette en konto før du kan opprette en varsling."
+
+#: ../finch/gntpounce.c:662
+#: ../pidgin/gtkpounce.c:1096
+#, c-format
 msgid "Are you sure you want to delete the pounce on %s for %s?"
-msgstr "Er du sikker på at du vil slette %s?"
-
-#: ../finch/gntpounce.c:696 ../finch/gntui.c:84 ../pidgin/gtkpounce.c:1325
-#, fuzzy
+msgstr "Er du sikker på at du vil slette kontaktvarsling på %s for %s?"
+
+#: ../finch/gntpounce.c:696
+#: ../finch/gntui.c:84
+#: ../pidgin/gtkpounce.c:1325
 msgid "Buddy Pounces"
-msgstr "Legg til kompisvarsling"
-
-#: ../finch/gntpounce.c:810 ../pidgin/gtkpounce.c:1452
+msgstr "Kontaktvarsling"
+
+#: ../finch/gntpounce.c:810
+#: ../pidgin/gtkpounce.c:1452
 #, c-format
 msgid "%s has started typing to you (%s)"
 msgstr "%s har begynt å skrive til deg (%s)"
 
-#: ../finch/gntpounce.c:812 ../pidgin/gtkpounce.c:1454
-#, fuzzy, c-format
+#: ../finch/gntpounce.c:812
+#: ../pidgin/gtkpounce.c:1454
+#, c-format
 msgid "%s has paused while typing to you (%s)"
-msgstr "%s har begynt å skrive til deg (%s)"
-
-#: ../finch/gntpounce.c:814 ../pidgin/gtkpounce.c:1456
+msgstr "%s har pauset under skriving til deg (%s)"
+
+#: ../finch/gntpounce.c:814
+#: ../pidgin/gtkpounce.c:1456
 #, c-format
 msgid "%s has signed on (%s)"
 msgstr "%s har logget på (%s)"
 
-#: ../finch/gntpounce.c:816 ../pidgin/gtkpounce.c:1458
+#: ../finch/gntpounce.c:816
+#: ../pidgin/gtkpounce.c:1458
 #, c-format
 msgid "%s has returned from being idle (%s)"
 msgstr "%s har blitt aktiv igjen (%s)"
 
-#: ../finch/gntpounce.c:818 ../pidgin/gtkpounce.c:1460
+#: ../finch/gntpounce.c:818
+#: ../pidgin/gtkpounce.c:1460
 #, c-format
 msgid "%s has returned from being away (%s)"
 msgstr "%s har kommet tilbake (%s)"
 
-#: ../finch/gntpounce.c:820 ../pidgin/gtkpounce.c:1462
+#: ../finch/gntpounce.c:820
+#: ../pidgin/gtkpounce.c:1462
 #, c-format
 msgid "%s has stopped typing to you (%s)"
 msgstr "%s har sluttet å skrive til deg (%s)"
 
-#: ../finch/gntpounce.c:822 ../pidgin/gtkpounce.c:1464
+#: ../finch/gntpounce.c:822
+#: ../pidgin/gtkpounce.c:1464
 #, c-format
 msgid "%s has signed off (%s)"
 msgstr "%s har logget av (%s)"
 
-#: ../finch/gntpounce.c:824 ../pidgin/gtkpounce.c:1466
+#: ../finch/gntpounce.c:824
+#: ../pidgin/gtkpounce.c:1466
 #, c-format
 msgid "%s has become idle (%s)"
 msgstr "%s har blitt inaktiv (%s)"
 
-#: ../finch/gntpounce.c:826 ../pidgin/gtkpounce.c:1468
+#: ../finch/gntpounce.c:826
+#: ../pidgin/gtkpounce.c:1468
 #, c-format
 msgid "%s has gone away. (%s)"
 msgstr "%s er borte. (%s)"
 
-#: ../finch/gntpounce.c:828 ../pidgin/gtkpounce.c:1470
-#, fuzzy, c-format
+#: ../finch/gntpounce.c:828
+#: ../pidgin/gtkpounce.c:1470
+#, c-format
 msgid "%s has sent you a message. (%s)"
-msgstr "%s ønsker å sende deg %s (%s)"
-
-#: ../finch/gntpounce.c:829 ../pidgin/gtkpounce.c:1471
-#, c-format
+msgstr "%s har sendt deg en beskjed. (%s)"
+
+#: ../finch/gntpounce.c:829
+#: ../pidgin/gtkpounce.c:1471
 msgid "Unknown pounce event. Please report this!"
 msgstr "Ukjent varslingshendelse. Vennligst rapporter dette!"
 
 #: ../finch/gntprefs.c:92
 msgid "Based on keyboard use"
-msgstr ""
-
-#: ../finch/gntprefs.c:94 ../pidgin/gtkprefs.c:1930
-#, fuzzy
+msgstr "Basert på tastatur bruk"
+
+#: ../finch/gntprefs.c:94
+#: ../pidgin/gtkprefs.c:1932
 msgid "From last sent message"
-msgstr "CTRL-Enter sender beskjeden"
-
-#: ../finch/gntprefs.c:96 ../pidgin/gtkprefs.c:898 ../pidgin/gtkprefs.c:907
-#: ../pidgin/gtkprefs.c:1929 ../pidgin/gtkprefs.c:1943
+msgstr "Fra sist sendte beskjed"
+
+#: ../finch/gntprefs.c:96
+#: ../pidgin/gtkprefs.c:898
+#: ../pidgin/gtkprefs.c:907
+#: ../pidgin/gtkprefs.c:1931
+#: ../pidgin/gtkprefs.c:1945
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:333
 msgid "Never"
 msgstr "Aldri"
 
 #: ../finch/gntprefs.c:184
-#, fuzzy
 msgid "Show Idle Time"
-msgstr "Sett fraværstid for konto"
+msgstr "Vis inaktivtid"
 
 #: ../finch/gntprefs.c:185
-#, fuzzy
 msgid "Show Offline Buddies"
-msgstr "/Kontakter/Vis _avloggede kontakter"
+msgstr "Vis avloggede kontakter"
 
 #: ../finch/gntprefs.c:192
-#, fuzzy
 msgid "Notify buddies when you are typing"
 msgstr "Varsle kontakter når skriver til dem"
 
 #: ../finch/gntprefs.c:198
-#, fuzzy
 msgid "Log format"
-msgstr "Logg_format:"
+msgstr "Logg-format"
 
 #: ../finch/gntprefs.c:199
 msgid "Log IMs"
-msgstr ""
+msgstr "Logg lynmeldinger"
 
 #: ../finch/gntprefs.c:200
-#, fuzzy
 msgid "Log chats"
 msgstr "Logg alle samtaler"
 
 #: ../finch/gntprefs.c:201
-#, fuzzy
 msgid "Log status change events"
-msgstr "Logg alle status endinger til systemlogg"
+msgstr "Logg alle status endinger"
 
 #: ../finch/gntprefs.c:207
-#, fuzzy
 msgid "Report Idle time"
 msgstr "Vis inaktiv tid"
 
 #: ../finch/gntprefs.c:208
-#, fuzzy
 msgid "Change status when idle"
-msgstr "Sett som borte når inaktiv"
+msgstr "Forandre status når inaktiv"
 
 #: ../finch/gntprefs.c:209
-#, fuzzy
 msgid "Minutes before changing status"
-msgstr "Antall minutter før fraværsmarkert:"
+msgstr "Antall minutter før fraværsmarkert"
 
 #: ../finch/gntprefs.c:210
-#, fuzzy
 msgid "Change status to"
-msgstr "Endre adresse til:"
+msgstr "Endre status til"
 
 #. Conversations
-#: ../finch/gntprefs.c:259 ../pidgin/gtkprefs.c:993 ../pidgin/gtkprefs.c:2033
+#: ../finch/gntprefs.c:259
+#: ../pidgin/gtkprefs.c:993
+#: ../pidgin/gtkprefs.c:2035
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:340
 msgid "Conversations"
 msgstr "Samtaler"
 
-#: ../finch/gntprefs.c:260 ../pidgin/gtkprefs.c:1467 ../pidgin/gtkprefs.c:2044
+#: ../finch/gntprefs.c:260
+#: ../pidgin/gtkprefs.c:1469
+#: ../pidgin/gtkprefs.c:2046
 msgid "Logging"
 msgstr "Logging"
 
 #: ../finch/gntrequest.c:583
-#, fuzzy
 msgid "Not implemented yet."
-msgstr "Funksjonen er ikke implementert"
-
-#: ../finch/gntrequest.c:659 ../pidgin/gtkrequest.c:1555
+msgstr "Ikke implementert enda."
+
+#: ../finch/gntrequest.c:659
+#: ../pidgin/gtkrequest.c:1555
 #: ../pidgin/gtkrequest.c:1601
 msgid "Save File..."
 msgstr "Lagre fil..."
 
-#: ../finch/gntrequest.c:659 ../pidgin/gtkrequest.c:1556
+#: ../finch/gntrequest.c:659
+#: ../pidgin/gtkrequest.c:1556
 #: ../pidgin/gtkrequest.c:1602
 msgid "Open File..."
 msgstr "Åpne fil..."
 
-#: ../finch/gntsound.c:97 ../pidgin/gtksound.c:64
+#: ../finch/gntsound.c:97
+#: ../pidgin/gtksound.c:64
 msgid "Buddy logs in"
 msgstr "Kontakt logger inn"
 
-#: ../finch/gntsound.c:98 ../pidgin/gtksound.c:65
+#: ../finch/gntsound.c:98
+#: ../pidgin/gtksound.c:65
 msgid "Buddy logs out"
 msgstr "Kontakt logger ut"
 
-#: ../finch/gntsound.c:99 ../pidgin/gtksound.c:66
+#: ../finch/gntsound.c:99
+#: ../pidgin/gtksound.c:66
 msgid "Message received"
 msgstr "Beskjed mottatt"
 
-#: ../finch/gntsound.c:100 ../pidgin/gtksound.c:67
+#: ../finch/gntsound.c:100
+#: ../pidgin/gtksound.c:67
 msgid "Message received begins conversation"
 msgstr "Beskjed mottas og samtale starter"
 
-#: ../finch/gntsound.c:101 ../pidgin/gtksound.c:68
+#: ../finch/gntsound.c:101
+#: ../pidgin/gtksound.c:68
 msgid "Message sent"
 msgstr "Beskjed sendt"
 
-#: ../finch/gntsound.c:102 ../pidgin/gtksound.c:69
+#: ../finch/gntsound.c:102
+#: ../pidgin/gtksound.c:69
 msgid "Person enters chat"
 msgstr "Person blir med i samtalen"
 
-#: ../finch/gntsound.c:103 ../pidgin/gtksound.c:70
+#: ../finch/gntsound.c:103
+#: ../pidgin/gtksound.c:70
 msgid "Person leaves chat"
 msgstr "Person forlater samtalen"
 
-#: ../finch/gntsound.c:104 ../pidgin/gtksound.c:71
+#: ../finch/gntsound.c:104
+#: ../pidgin/gtksound.c:71
 msgid "You talk in chat"
 msgstr "Du snakker i samtalen"
 
-#: ../finch/gntsound.c:105 ../pidgin/gtksound.c:72
+#: ../finch/gntsound.c:105
+#: ../pidgin/gtksound.c:72
 msgid "Others talk in chat"
 msgstr "Andre snakker i samtalen"
 
-#: ../finch/gntsound.c:107 ../pidgin/gtksound.c:75
-#, fuzzy
+#: ../finch/gntsound.c:107
+#: ../pidgin/gtksound.c:75
 msgid "Someone says your screen name in chat"
-msgstr "Noen sier navnet ditt i en samtale"
-
-#: ../finch/gntsound.c:361 ../pidgin/gtksound.c:311
+msgstr "Noen roper skjermnavnet ditt i en samtale"
+
+#: ../finch/gntsound.c:361
+#: ../pidgin/gtksound.c:311
 msgid "GStreamer Failure"
-msgstr ""
-
-#: ../finch/gntsound.c:362 ../pidgin/gtksound.c:312
+msgstr "Feil i GStreamer"
+
+#: ../finch/gntsound.c:362
+#: ../pidgin/gtksound.c:312
 msgid "GStreamer failed to initialize."
-msgstr ""
-
-#: ../finch/gntsound.c:716 ../finch/gntsound.c:802 ../pidgin/gtkprefs.c:1587
-#: ../pidgin/gtkprefs.c:1676 ../pidgin/gtkprefs.c:1872
-#, fuzzy
+msgstr "Start av GStreamer feilet."
+
+#: ../finch/gntsound.c:716
+#: ../finch/gntsound.c:802
+#: ../pidgin/gtkprefs.c:1589
+#: ../pidgin/gtkprefs.c:1678
+#: ../pidgin/gtkprefs.c:1874
 msgid "(default)"
-msgstr "Gnome-standard"
+msgstr "(forvalgt)"
 
 #: ../finch/gntsound.c:729
-#, fuzzy
 msgid "Select Sound File ..."
-msgstr "Velg fil"
+msgstr "Velg lydfil ..."
 
 #: ../finch/gntsound.c:904
-#, fuzzy
 msgid "Sound Preferences"
-msgstr "Innstillinger"
+msgstr "Lydinnstillinger"
 
 #: ../finch/gntsound.c:915
-#, fuzzy
 msgid "Profiles"
-msgstr "Profil"
-
-#: ../finch/gntsound.c:954 ../pidgin/gtkprefs.c:1717
+msgstr "Profiler"
+
+#: ../finch/gntsound.c:954
+#: ../pidgin/gtkprefs.c:1719
 msgid "Automatic"
 msgstr "Automatisk"
 
 #: ../finch/gntsound.c:957
-#, fuzzy
 msgid "Console Beep"
 msgstr "Konsollpip"
 
-#: ../finch/gntsound.c:958 ../pidgin/gtkprefs.c:1721
+#: ../finch/gntsound.c:958
+#: ../pidgin/gtkprefs.c:1723
 msgid "Command"
 msgstr "Kommando"
 
 #: ../finch/gntsound.c:959
-#, fuzzy
 msgid "No Sound"
-msgstr "Lyder"
-
-#: ../finch/gntsound.c:961 ../pidgin/gtkprefs.c:1712
+msgstr "Ingen lyd"
+
+#: ../finch/gntsound.c:961
+#: ../pidgin/gtkprefs.c:1714
 msgid "Sound Method"
 msgstr "Lydtype"
 
 #: ../finch/gntsound.c:966
-#, fuzzy
 msgid "Method: "
-msgstr "_Metode:"
+msgstr "Metode: "
 
 #: ../finch/gntsound.c:973
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Sound Command\n"
 "(%s for filename)"
 msgstr ""
-"_Program for lydavspilling\n"
+"Lydkommando\n"
 "(%s for filnavn)"
 
 #. Sound options
-#: ../finch/gntsound.c:981 ../pidgin/gtkprefs.c:1756
+#: ../finch/gntsound.c:981
+#: ../pidgin/gtkprefs.c:1758
 msgid "Sound Options"
 msgstr "Lydinnstillinger"
 
-#
 #: ../finch/gntsound.c:982
-#, fuzzy
 msgid "Sounds when conversation has focus"
-msgstr "Lyder når samtalevinduet har _fokus"
-
-#: ../finch/gntsound.c:990 ../pidgin/gtkprefs.c:897 ../pidgin/gtkprefs.c:909
-#: ../pidgin/gtkprefs.c:1763 ../pidgin/plugins/timestamp_format.c:42
+msgstr "Lyder når samtalen har fokus"
+
+#: ../finch/gntsound.c:990
+#: ../pidgin/gtkprefs.c:897
+#: ../pidgin/gtkprefs.c:909
+#: ../pidgin/gtkprefs.c:1765
+#: ../pidgin/plugins/timestamp_format.c:42
 #: ../pidgin/plugins/timestamp_format.c:51
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:334
-#, fuzzy
 msgid "Always"
-msgstr "Borte"
-
-#: ../finch/gntsound.c:991 ../pidgin/gtkprefs.c:1761
-#, fuzzy
+msgstr "Alltid"
+
+#: ../finch/gntsound.c:991
+#: ../pidgin/gtkprefs.c:1763
 msgid "Only when available"
-msgstr "Ikke tilgjengelig"
-
-#: ../finch/gntsound.c:992 ../pidgin/gtkprefs.c:1762
-#, fuzzy
+msgstr "Bare hvis tilgjengelig"
+
+#: ../finch/gntsound.c:992
+#: ../pidgin/gtkprefs.c:1764
 msgid "Only when not available"
-msgstr "Snakkerom i %s er ikke tilgjengelig."
+msgstr "Bare hvis ikke tilgjengelig"
 
 #: ../finch/gntsound.c:999
 msgid "Volume(0-100):"
-msgstr ""
+msgstr "Volum(0-100):"
 
 #. Sound events
-#: ../finch/gntsound.c:1018 ../pidgin/gtkprefs.c:1798
+#: ../finch/gntsound.c:1018
+#: ../pidgin/gtkprefs.c:1800
 msgid "Sound Events"
 msgstr "Lydhendelser"
 
-#: ../finch/gntsound.c:1020 ../pidgin/gtkprefs.c:1857
+#: ../finch/gntsound.c:1020
+#: ../pidgin/gtkprefs.c:1859
 msgid "Event"
 msgstr "Hendelse"
 
 #: ../finch/gntsound.c:1020
-#, fuzzy
 msgid "File"
-msgstr "Feilet."
-
-#: ../finch/gntsound.c:1039 ../pidgin/gtkprefs.c:1876
+msgstr "Fil"
+
+#: ../finch/gntsound.c:1039
+#: ../pidgin/gtkprefs.c:1878
 msgid "Test"
 msgstr "Test"
 
-#: ../finch/gntsound.c:1042 ../pidgin/gtkprefs.c:1880
+#: ../finch/gntsound.c:1042
+#: ../pidgin/gtkprefs.c:1882
 msgid "Reset"
 msgstr "Nullstill"
 
-#: ../finch/gntsound.c:1045 ../pidgin/gtkprefs.c:1884
+#: ../finch/gntsound.c:1045
+#: ../pidgin/gtkprefs.c:1886
 msgid "Choose..."
 msgstr "Bla gjennom..."
 
 #: ../finch/gntstatus.c:138
-#, fuzzy, c-format
+#, c-format
 msgid "Are you sure you want to delete \"%s\""
-msgstr "Er du sikker på at du vil slette %s?"
+msgstr "Er du sikker på at du vil slette \"%s\""
 
 #: ../finch/gntstatus.c:141
-#, fuzzy
 msgid "Delete Status"
-msgstr "Påloggningsstatus"
-
-#: ../finch/gntstatus.c:176 ../pidgin/gtksavedstatuses.c:597
-#, fuzzy
+msgstr "Slett status"
+
+#: ../finch/gntstatus.c:176
+#: ../pidgin/gtksavedstatuses.c:597
 msgid "Saved Statuses"
-msgstr "Tjenerstatistikk"
-
-#: ../finch/gntstatus.c:183 ../finch/gntstatus.c:539
+msgstr "Lagrede statuser"
+
+#: ../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/novell/novell.c:1486
 #: ../pidgin/gtksavedstatuses.c:500
 msgid "Title"
 msgstr "Tittel"
 
-#: ../finch/gntstatus.c:183 ../pidgin/gtksavedstatuses.c:515
+#: ../finch/gntstatus.c:183
+#: ../pidgin/gtksavedstatuses.c:515
 msgid "Type"
 msgstr "Type"
 
@@ -1772,31 +1972,43 @@
 #. user_settable
 #. not independent
 #. Attributes - each status can have a message.
-#: ../finch/gntstatus.c:183 ../finch/gntstatus.c:564 ../finch/gntstatus.c:576
+#: ../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/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/msn/msn.c:634
+#: ../libpurple/protocols/msn/msn.c:641
+#: ../libpurple/protocols/msn/msn.c:648
+#: ../libpurple/protocols/msn/msn.c:655
+#: ../libpurple/protocols/msn/msn.c:661
+#: ../libpurple/protocols/msn/msn.c:667
 #: ../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/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:5552
+#: ../libpurple/protocols/oscar/oscar.c:5770
+#: ../libpurple/protocols/oscar/oscar.c:5784
+#: ../libpurple/protocols/oscar/oscar.c:5800
+#: ../libpurple/protocols/oscar/oscar.c:5807
+#: ../libpurple/protocols/oscar/oscar.c:5814
 #: ../libpurple/protocols/sametime/sametime.c:3286
 #: ../libpurple/protocols/sametime/sametime.c:3292
 #: ../libpurple/protocols/sametime/sametime.c:3298
@@ -1804,242 +2016,226 @@
 #: ../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/yahoo/yahoo.c:3750
+#: ../libpurple/protocols/yahoo/yahoo.c:3756
 #: ../libpurple/protocols/zephyr/zephyr.c:2337
-#: ../pidgin/gtksavedstatuses.c:526 ../pidgin/gtksavedstatuses.c:1010
+#: ../pidgin/gtksavedstatuses.c:526
+#: ../pidgin/gtksavedstatuses.c:1010
 msgid "Message"
-msgstr "Beskjed:"
+msgstr "Beskjed"
 
 #. Use
-#: ../finch/gntstatus.c:194 ../finch/gntstatus.c:593
-#, fuzzy
+#: ../finch/gntstatus.c:194
+#: ../finch/gntstatus.c:593
 msgid "Use"
 msgstr "Bruk"
 
 #: ../finch/gntstatus.c:301
-#, fuzzy
 msgid "Invalid title"
-msgstr "Ugyldig authzid"
+msgstr "Ugyldig tittel"
 
 #: ../finch/gntstatus.c:302
-#, fuzzy
 msgid "Please enter a non-empty title for the status."
-msgstr "Vennligst skriv inn nytt navn for gruppen."
+msgstr "Vennligst ikke angi et tom tittel til statusen."
 
 #: ../finch/gntstatus.c:310
-#, fuzzy
 msgid "Duplicate title"
-msgstr "Dupliserings Korrigering"
+msgstr "Dupliserings tittel"
 
 #: ../finch/gntstatus.c:311
-#, fuzzy
 msgid "Please enter a different title for the status."
-msgstr "Vennligst skriv inn nytt navn for gruppen."
+msgstr "Vennligst skriv inn en annen tittel til statusen."
 
 #: ../finch/gntstatus.c:452
-#, fuzzy
 msgid "Substatus"
-msgstr "Status"
-
-#: ../finch/gntstatus.c:464 ../pidgin/gtkft.c:699
+msgstr "Understatus"
+
+#: ../finch/gntstatus.c:464
+#: ../pidgin/gtkft.c:699
 msgid "Status:"
 msgstr "Status:"
 
 #: ../finch/gntstatus.c:479
-#, fuzzy
 msgid "Message:"
 msgstr "Beskjed:"
 
 #: ../finch/gntstatus.c:528
-#, fuzzy
 msgid "Edit Status"
-msgstr "Sivilstatus"
+msgstr "Endre status"
 
 #: ../finch/gntstatus.c:570
-#, fuzzy
 msgid "Use different status for following accounts"
-msgstr "Bruk en annen status for noen kontoer"
+msgstr "Bruk en annen status for følgende kontoer"
 
 #. Save & Use
 #: ../finch/gntstatus.c:604
-#, fuzzy
 msgid "Save & Use"
-msgstr "Lagre & bruk"
+msgstr "Lagre og bruk"
 
 #: ../finch/gntui.c:85
 msgid "Certificates"
-msgstr ""
-
-#: ../finch/gntui.c:89 ../pidgin/gtkprefs.c:2035
+msgstr "Sertifikater"
+
+#: ../finch/gntui.c:89
+#: ../pidgin/gtkprefs.c:2037
 msgid "Sounds"
 msgstr "Lyder"
 
 #: ../finch/gntui.c:91
-#, fuzzy
 msgid "Statuses"
-msgstr "Status"
-
-#: ../finch/plugins/gntclipboard.c:115 ../finch/plugins/gntclipboard.c:121
+msgstr "Statuser"
+
+#: ../finch/plugins/gntclipboard.c:115
+#: ../finch/plugins/gntclipboard.c:121
 #: ../finch/plugins/gntclipboard.c:128
-#, fuzzy
 msgid "Error loading the plugin."
-msgstr "Lar deg laste perl-tillegg."
+msgstr "Feil ved lasting av tillegget."
 
 #: ../finch/plugins/gntclipboard.c:116
-#, fuzzy
 msgid "Couldn't find X display"
-msgstr "Kan ikke sende fil"
+msgstr "Kunne ikke finne X display"
 
 #: ../finch/plugins/gntclipboard.c:122
-#, fuzzy
 msgid "Couldn't find window"
-msgstr "Kan ikke sende fil"
+msgstr "Kan ikke finne vindu"
 
 #: ../finch/plugins/gntclipboard.c:129
 msgid "This plugin cannot be loaded because it was not built with X11 support."
-msgstr ""
+msgstr "Dette tillegget kan ikke bli lastet fordi det ikke var bygd med X11 støtte."
 
 #: ../finch/plugins/gntclipboard.c:158
 msgid "GntClipboard"
-msgstr ""
+msgstr "GntClipboard"
 
 #: ../finch/plugins/gntclipboard.c:160
 msgid "Clipboard plugin"
-msgstr ""
+msgstr "Utklipstavle tillegg"
 
 #: ../finch/plugins/gntclipboard.c:161
-msgid ""
-"When the gnt clipboard contents change, the contents are made available to "
-"X, if possible."
-msgstr ""
+msgid "When the gnt clipboard contents change, the contents are made available to X, if possible."
+msgstr "Når innholdet i gnt clipboard forandres, vil innholdet bli gjort tilgjengelig for X, om mulig."
 
 #: ../finch/plugins/gntgf.c:231
-#, fuzzy, c-format
+#, c-format
 msgid "%s just signed on"
-msgstr "%s har logget på"
+msgstr "%s logget akkurat på"
 
 #: ../finch/plugins/gntgf.c:238
-#, fuzzy, c-format
+#, c-format
 msgid "%s just signed off"
-msgstr "%s logget av"
+msgstr "%s logget akkurat av"
 
 #: ../finch/plugins/gntgf.c:246
-#, fuzzy, c-format
+#, c-format
 msgid "%s sent you a message"
-msgstr "%s ønsker å sende deg en fil."
+msgstr "%s har sendt deg en beskjed"
 
 #: ../finch/plugins/gntgf.c:265
 #, c-format
 msgid "%s said your nick in %s"
-msgstr ""
+msgstr "%s sa navnet ditt i %s"
 
 #: ../finch/plugins/gntgf.c:267
-#, fuzzy, c-format
+#, c-format
 msgid "%s sent a message in %s"
-msgstr "Send _beskjed"
+msgstr "%s sendte en beskjed i %s"
 
 #: ../finch/plugins/gntgf.c:305
-#, fuzzy
 msgid "Buddy signs on/off"
-msgstr "Kontakt er avlogget:"
+msgstr "Kontakt logget på/av"
 
 #: ../finch/plugins/gntgf.c:306
 msgid "You receive an IM"
-msgstr ""
+msgstr "Du mottok en lynmelding"
 
 #: ../finch/plugins/gntgf.c:307
-#, fuzzy
 msgid "Someone speaks in a chat"
-msgstr "Noen sier navnet ditt i en samtale"
+msgstr "Noen snakker i en samtale"
 
 #: ../finch/plugins/gntgf.c:308
-#, fuzzy
 msgid "Someone says your name in a chat"
-msgstr "Noen sier navnet ditt i en samtale"
+msgstr "Noen sa navnet ditt i en samtale"
 
 #: ../finch/plugins/gntgf.c:336
 msgid "Notify with a toaster when"
-msgstr ""
+msgstr "Notify with a toaster when"
 
 #: ../finch/plugins/gntgf.c:351
 msgid "Beep too!"
-msgstr ""
+msgstr "Pip også!"
 
 #: ../finch/plugins/gntgf.c:357
 msgid "Set URGENT for the terminal window."
-msgstr ""
+msgstr "Sett HASTER for terminalvinduet."
 
 #: ../finch/plugins/gntgf.c:377
 msgid "GntGf"
-msgstr ""
-
-#: ../finch/plugins/gntgf.c:379 ../finch/plugins/gntgf.c:380
+msgstr "GntGf"
+
+#: ../finch/plugins/gntgf.c:379
+#: ../finch/plugins/gntgf.c:380
 msgid "Toaster plugin"
-msgstr ""
-
-#: ../finch/plugins/gnthistory.c:116 ../pidgin/plugins/history.c:120
-#, fuzzy, c-format
+msgstr "Toaster tillegg"
+
+#: ../finch/plugins/gnthistory.c:116
+#: ../pidgin/plugins/history.c:123
+#, c-format
 msgid "<b>Conversation with %s on %s:</b><br>"
-msgstr "Samtaler med %s"
-
-#: ../finch/plugins/gnthistory.c:138 ../pidgin/plugins/history.c:147
+msgstr "<b>Samtaler med %s på %s:</b><br>"
+
+#: ../finch/plugins/gnthistory.c:138
+#: ../pidgin/plugins/history.c:150
 msgid "History Plugin Requires Logging"
 msgstr "Historie Tillegg Krever Logging"
 
-#: ../finch/plugins/gnthistory.c:139 ../pidgin/plugins/history.c:148
+#: ../finch/plugins/gnthistory.c:139
+#: ../pidgin/plugins/history.c:151
 msgid ""
 "Logging can be enabled from Tools -> Preferences -> Logging.\n"
 "\n"
-"Enabling logs for instant messages and/or chats will activate history for "
-"the same conversation type(s)."
+"Enabling logs for instant messages and/or chats will activate history for the same conversation type(s)."
 msgstr ""
 "Logging kan slås på gjennom Verktøy -> Innstillinger -> Logging.\n"
 "\n"
-"Å slå på logging for lynmeldinger og/eller prat vil aktivere historie for "
-"den samme samtaletypen."
+"Å slå på logging for lynmeldinger og/eller prat vil aktivere historie for den samme samtaletypen."
 
 #: ../finch/plugins/gnthistory.c:179
-#, fuzzy
 msgid "GntHistory"
-msgstr "Historikk"
-
-#: ../finch/plugins/gnthistory.c:181 ../pidgin/plugins/history.c:190
+msgstr "GntHistorikk"
+
+#: ../finch/plugins/gnthistory.c:181
+#: ../pidgin/plugins/history.c:194
 msgid "Shows recently logged conversations in new conversations."
 msgstr "Viser tidligere loggede samtaler i nye samtaler."
 
-#: ../finch/plugins/gnthistory.c:182 ../pidgin/plugins/history.c:191
-msgid ""
-"When a new conversation is opened this plugin will insert the last "
-"conversation into the current conversation."
-msgstr ""
-"Når en ny samtale startes, vil dette tillegget sette inn den forrige "
-"samtalen i den pågående."
+#: ../finch/plugins/gnthistory.c:182
+#: ../pidgin/plugins/history.c:195
+msgid "When a new conversation is opened this plugin will insert the last conversation into the current conversation."
+msgstr "Når en ny samtale startes, vil dette tillegget sette inn den forrige samtalen i den pågående."
 
 #: ../finch/plugins/lastlog.c:69
 msgid "Lastlog"
-msgstr ""
-
-#. Translator Note: The "backlog" is the conversation buffer/history.
-#: ../finch/plugins/lastlog.c:100
+msgstr "Lastlog"
+
+#: ../finch/plugins/lastlog.c:99
 msgid "lastlog: Searches for a substring in the backlog."
-msgstr ""
-
-#: ../finch/plugins/lastlog.c:122
+msgstr "lastlog: Søker etter en understreng i backlog."
+
+#: ../finch/plugins/lastlog.c:121
 msgid "GntLastlog"
-msgstr ""
-
-#: ../finch/plugins/lastlog.c:124 ../finch/plugins/lastlog.c:125
+msgstr "GntLastlog"
+
+#: ../finch/plugins/lastlog.c:123
+#: ../finch/plugins/lastlog.c:124
 msgid "Lastlog plugin."
-msgstr ""
+msgstr "Lastlog tillegg."
 
 #: ../libpurple/account.c:791
-#, fuzzy
 msgid "accounts"
-msgstr "Kontoer"
-
-#: ../libpurple/account.c:958 ../libpurple/protocols/jabber/auth.c:195
-#, fuzzy
+msgstr "kontoer"
+
+#: ../libpurple/account.c:958
+#: ../libpurple/protocols/jabber/auth.c:195
 msgid "Password is required to sign on."
 msgstr "Passord kreves for å logge på."
 
@@ -2049,28 +2245,29 @@
 msgstr "Oppgi passord for %s (%s)"
 
 #: ../libpurple/account.c:999
-#, fuzzy
 msgid "Enter Password"
-msgstr "Oppgi  passord"
+msgstr "Oppgi passord"
 
 #
 #: ../libpurple/account.c:1004
-#, fuzzy
 msgid "Save password"
 msgstr "Lagre passord"
 
-#: ../libpurple/account.c:1039 ../libpurple/connection.c:105
+#: ../libpurple/account.c:1039
+#: ../libpurple/connection.c:105
 #: ../libpurple/connection.c:178
 #, c-format
 msgid "Missing protocol plugin for %s"
 msgstr "Mangler protokolltillegg for %s"
 
-#: ../libpurple/account.c:1041 ../libpurple/connection.c:108
-#: ../pidgin/gtkblist.c:4036
+#: ../libpurple/account.c:1041
+#: ../libpurple/connection.c:108
+#: ../pidgin/gtkblist.c:4318
 msgid "Connection Error"
 msgstr "Feil ved tilkobling"
 
-#: ../libpurple/account.c:1199 ../libpurple/protocols/gg/gg.c:707
+#: ../libpurple/account.c:1199
+#: ../libpurple/protocols/gg/gg.c:707
 #: ../libpurple/protocols/jabber/jabber.c:1687
 msgid "New passwords do not match."
 msgstr "De nye passordene stemmer ikke overens."
@@ -2079,17 +2276,14 @@
 msgid "Fill out all fields completely."
 msgstr "Fyll ut alle feltene fullstendig."
 
-#
 #: ../libpurple/account.c:1231
 msgid "Original password"
 msgstr "Opprinnelig passord"
 
-#
 #: ../libpurple/account.c:1238
 msgid "New password"
 msgstr "Nytt passord"
 
-#
 #: ../libpurple/account.c:1245
 msgid "New password (again)"
 msgstr "Nytt passord (igjen)"
@@ -2097,9 +2291,8 @@
 #: ../libpurple/account.c:1251
 #, c-format
 msgid "Change password for %s"
-msgstr "Endre passord for %s:"
-
-#
+msgstr "Endre passord for %s"
+
 #: ../libpurple/account.c:1259
 msgid "Please enter your current password and your new password."
 msgstr "Skriv inn ditt nåværende passord og ditt nye passord."
@@ -2109,41 +2302,46 @@
 msgid "Change user information for %s"
 msgstr "Endre brukerinformasjon for %s"
 
-#: ../libpurple/account.c:1293 ../libpurple/protocols/toc/toc.c:1670
+#: ../libpurple/account.c:1293
+#: ../libpurple/protocols/toc/toc.c:1670
 msgid "Set User Info"
 msgstr "Sett brukerinfo"
 
-#: ../libpurple/account.c:1764 ../libpurple/protocols/gg/gg.c:1017
+#: ../libpurple/account.c:1764
+#: ../libpurple/protocols/gg/gg.c:1017
 #: ../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/qq/qq.c:232 ../pidgin/gtkft.c:160
+#: ../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 "Ukjent"
 
-#: ../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:3242
+#: ../pidgin/gtkblist.c:5662
 #: ../pidgin/plugins/gevolution/gevo-util.c:67
 #: ../pidgin/plugins/gevolution/gevolution.c:96
 msgid "Buddies"
 msgstr "Kontakter"
 
 #: ../libpurple/blist.c:548
-#, fuzzy
 msgid "buddy list"
-msgstr "Kontaktliste"
+msgstr "kontaktliste"
 
 #: ../libpurple/certificate.c:545
 msgid "(DOES NOT MATCH)"
-msgstr ""
+msgstr "(MATCHER IKKE)"
 
 #. Make messages
 #: ../libpurple/certificate.c:549
 #, c-format
 msgid "%s has presented the following certificate for just-this-once use:"
-msgstr ""
+msgstr "%s har presentert følgende sertifikat for engangsbruk:"
 
 #: ../libpurple/certificate.c:550
 #, c-format
@@ -2151,52 +2349,54 @@
 "Common name: %s %s\n"
 "Fingerprint (SHA1): %s"
 msgstr ""
+"Vanlig navn: %s %s\n"
+"Fingeravtrykk (SHA1): %s"
 
 #. TODO: Find what the handle ought to be
 #: ../libpurple/certificate.c:555
 msgid "Single-use Certificate Verification"
-msgstr ""
+msgstr "Verifiserer engangsbuk sertifikat"
 
 #. Scheme name
 #. Pool name
 #: ../libpurple/certificate.c:872
 msgid "Certificate Authorities"
-msgstr ""
+msgstr "Serifikat Myndigheter"
 
 #. Scheme name
 #. Pool name
 #: ../libpurple/certificate.c:1040
 msgid "SSL Peers Cache"
-msgstr ""
+msgstr "SSL Peers Cache"
 
 #. Make messages
 #: ../libpurple/certificate.c:1171
-#, fuzzy, c-format
+#, c-format
 msgid "Accept certificate for %s?"
-msgstr "Aksepter samtaleinvitasjon?"
+msgstr "Aksepter sertifikat for %s?"
 
 #. TODO: Find what the handle ought to be
 #: ../libpurple/certificate.c:1177
 msgid "SSL Certificate Verification"
-msgstr ""
+msgstr "SSL Sertifikat Verifisering"
 
 #. Number of actions
 #: ../libpurple/certificate.c:1186
 msgid "Accept"
 msgstr "Godta"
 
-#: ../libpurple/certificate.c:1187 ../libpurple/protocols/qq/buddy_opt.c:214
+#: ../libpurple/certificate.c:1187
+#: ../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
 #: ../libpurple/protocols/qq/sys_msg.c:246
-#, fuzzy
 msgid "Reject"
-msgstr "Nullstill"
+msgstr "Avslå"
 
 #: ../libpurple/certificate.c:1188
 msgid "_View Certificate..."
-msgstr ""
+msgstr "_Se på sertfikat..."
 
 #. Prompt the user to authenticate the certificate
 #. TODO: Provide the user with more guidance about why he is
@@ -2204,66 +2404,56 @@
 #. vrq will be completed by user_auth
 #: ../libpurple/certificate.c:1288
 #, 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 ""
+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 "Serifikatet presentert av \"%s\" hevder av være fra \"%s\" istedet.  Dette kan bety at du ikke er tilkoblet til den tjenesten du tror du er."
 
 #. Prompt the user to authenticate the certificate
 #. vrq will be completed by user_auth
 #: ../libpurple/certificate.c:1313
 #, c-format
-msgid ""
-"The certificate presented by \"%s\" is self-signed. It cannot be "
-"automatically checked."
-msgstr ""
+msgid "The certificate presented by \"%s\" is self-signed. It cannot be automatically checked."
+msgstr "Sertifikatet presentert av \"%s\" er sjøl signert. Det kan ikke bli automatisk sjekket."
 
 #: ../libpurple/certificate.c:1331
 #, c-format
 msgid "The certificate chain presented for %s is not valid."
-msgstr ""
+msgstr "Sertifikat lenken presentert for %s gjelder ikke."
 
 #. 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
+#: ../libpurple/certificate.c:1339
+#: ../libpurple/certificate.c:1416
 msgid "SSL Certificate Error"
-msgstr ""
+msgstr "SSL Sertifikat Feil"
 
 #: ../libpurple/certificate.c:1340
-#, fuzzy
 msgid "Invalid certificate chain"
-msgstr "Ugyldig godkjennings mekanisme"
+msgstr "Ugyldig sertifikat lenke"
 
 #. vrq will be completed by user_auth
 #: ../libpurple/certificate.c:1360
-msgid ""
-"You have no database of root certificates, so this certificate cannot be "
-"validated."
-msgstr ""
+msgid "You have no database of root certificates, so this certificate cannot be validated."
+msgstr "Du har ingen database av root sertifikater, så dette sertifikatet kan ikke bli validisert."
 
 #. 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 ""
+msgid "The root certificate this one claims to be issued by is unknown to Pidgin."
+msgstr "Root sertifikatet som denne hevder å bli utstedt av er ukjent for Pidgin."
 
 #: ../libpurple/certificate.c:1408
 #, 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 ""
+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 "Sertifikat lenken presentert av %s har ikke en gyldig digital signatur fra Sertifikat Myndigheten der den hevder å ha en signatur."
 
 #: ../libpurple/certificate.c:1417
 msgid "Invalid certificate authority signature"
-msgstr ""
+msgstr "Ugyldig sertifikat myndighet signatur"
 
 #. Make messages
-#: ../libpurple/certificate.c:1881
+#: ../libpurple/certificate.c:1882
 #, c-format
 msgid ""
 "Common name: %s\n"
@@ -2273,56 +2463,60 @@
 "Activation date: %s\n"
 "Expiration date: %s\n"
 msgstr ""
+"Vanlig navn: %s\n"
+"\n"
+"Fingeravtrykk (SHA1): %s\n"
+"\n"
+"Aktiviserings dato: %s\n"
+"Går ut dato: %s\n"
 
 #. TODO: Find what the handle ought to be
-#: ../libpurple/certificate.c:1890
-#, fuzzy
+#: ../libpurple/certificate.c:1891
 msgid "Certificate Information"
-msgstr "Profilinformasjon"
-
-#
+msgstr "Sertifikatinformasjon"
+
 #: ../libpurple/connection.c:107
 msgid "Registration Error"
 msgstr "Registreringsfeil"
 
-#
 #: ../libpurple/connection.c:180
-#, fuzzy
 msgid "Unregistration Error"
-msgstr "Registreringsfeil"
+msgstr "Avregistreringsfeil"
 
 #: ../libpurple/connection.c:350
-#, fuzzy, c-format
+#, c-format
 msgid "+++ %s signed on"
-msgstr "%s har logget på"
+msgstr "+++ %s logget på"
 
 #: ../libpurple/connection.c:380
-#, fuzzy, c-format
+#, c-format
 msgid "+++ %s signed off"
-msgstr "%s logget av"
-
-#: ../libpurple/connection.c:497 ../libpurple/plugin.c:282
-#: ../libpurple/protocols/jabber/buddy.c:2337
+msgstr "+++ %s logget av"
+
+#: ../libpurple/connection.c:497
+#: ../libpurple/plugin.c:282
+#: ../libpurple/protocols/jabber/buddy.c:2340
 #: ../libpurple/protocols/msn/servconn.c:141
-#: ../libpurple/protocols/msn/session.c:322
+#: ../libpurple/protocols/msn/session.c:361
 msgid "Unknown error"
 msgstr "Ukjent feil"
 
 #: ../libpurple/conversation.c:170
-#, fuzzy
 msgid "Unable to send message: The message is too large."
-msgstr "Kunne ikke sende beskjed. Beskjeden er for stor."
-
-#: ../libpurple/conversation.c:173 ../libpurple/conversation.c:186
-#, fuzzy, c-format
+msgstr "Kunne ikke sende beskjed: Beskjeden er for stor."
+
+#: ../libpurple/conversation.c:173
+#: ../libpurple/conversation.c:186
+#, c-format
 msgid "Unable to send message to %s."
-msgstr "Kunne ikke sende beskjed til %s."
+msgstr "Klarte ikke å sende beskjed til %s."
 
 #: ../libpurple/conversation.c:174
 msgid "The message is too large."
-msgstr "Meldingen er for stor."
-
-#: ../libpurple/conversation.c:183 ../libpurple/protocols/bonjour/jabber.c:255
+msgstr "Beskjeden er for stor."
+
+#: ../libpurple/conversation.c:183
+#: ../libpurple/protocols/bonjour/jabber.c:255
 #: ../libpurple/protocols/bonjour/jabber.c:298
 msgid "Unable to send message."
 msgstr "Kunne ikke sende beskjed."
@@ -2332,9 +2526,8 @@
 msgstr "Send beskjed"
 
 #: ../libpurple/conversation.c:1214
-#, fuzzy
 msgid "_Send Message"
-msgstr "Send beskjed"
+msgstr "_Send beskjed"
 
 #: ../libpurple/conversation.c:1620
 #, c-format
@@ -2349,7 +2542,7 @@
 #: ../libpurple/conversation.c:1733
 #, c-format
 msgid "You are now known as %s"
-msgstr "Du heter nå %s."
+msgstr "Du heter nå %s"
 
 #: ../libpurple/conversation.c:1753
 #, c-format
@@ -2367,77 +2560,75 @@
 msgstr "%s forlot rommet (%s)."
 
 #: ../libpurple/dbus-server.c:584
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get connection: %s"
-msgstr "Klarte ikke velge cmodes for %s"
+msgstr "Feilet i å få tilkobling: %s"
 
 #: ../libpurple/dbus-server.c:596
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get name: %s"
-msgstr "Klarte ikke å lagre bilde: %s\n"
+msgstr "Feilet i å få navn: %s"
 
 #: ../libpurple/dbus-server.c:610
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get serv name: %s"
-msgstr "Klarte ikke å lagre bilde: %s\n"
+msgstr "Feilet i å få serv navn: %s"
 
 #: ../libpurple/dbus-server.h:85
 msgid "Purple's D-BUS server is not running for the reason listed below"
-msgstr ""
-
-#: ../libpurple/desktopitem.c:287 ../libpurple/desktopitem.c:878
-#, fuzzy
+msgstr "Purple's D-BUS server går ikke pga det som er nevnt nedenfor"
+
+#: ../libpurple/desktopitem.c:287
+#: ../libpurple/desktopitem.c:878
 msgid "No name"
-msgstr "Etternavn:"
+msgstr "Ingen navn"
 
 #: ../libpurple/dnsquery.c:511
-#, fuzzy
 msgid "Unable to create new resolver process\n"
-msgstr "Kunne ikke opprette socket"
+msgstr "Kunne ikke opprette socket\n"
 
 #: ../libpurple/dnsquery.c:516
-#, fuzzy
 msgid "Unable to send request to resolver process\n"
-msgstr "Kunne ikke sende beskjed til %s."
-
-#: ../libpurple/dnsquery.c:549 ../libpurple/dnsquery.c:697
-#, fuzzy, c-format
+msgstr "Kunne ikke sende beskjed til %s\n"
+
+#: ../libpurple/dnsquery.c:549
+#: ../libpurple/dnsquery.c:697
+#, c-format
 msgid ""
 "Error resolving %s:\n"
 "%s"
 msgstr ""
 "Klarte ikke lese %s:\n"
-"%s\n"
-
-#: ../libpurple/dnsquery.c:552 ../libpurple/dnsquery.c:711
+"%s"
+
+#: ../libpurple/dnsquery.c:552
+#: ../libpurple/dnsquery.c:711
 #: ../libpurple/dnsquery.c:831
-#, fuzzy, c-format
+#, c-format
 msgid "Error resolving %s: %d"
-msgstr ""
-"Klarte ikke lese %s:\n"
-"%s\n"
+msgstr "Klarte ikke lese %s: %d"
 
 #: ../libpurple/dnsquery.c:574
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Error reading from resolver process:\n"
 "%s"
-msgstr "Feil under lesing fra socket."
+msgstr ""
+"Feil under lesing fra socket:\n"
+"%s"
 
 #: ../libpurple/dnsquery.c:578
-#, fuzzy, c-format
 msgid "EOF while reading from resolver process"
-msgstr "Feil under lesing fra socket."
+msgstr "Feil under lesing fra socket"
 
 #: ../libpurple/dnsquery.c:761
-#, fuzzy, c-format
+#, c-format
 msgid "Thread creation failure: %s"
-msgstr "Autentiseringsfeil"
+msgstr "Autentiseringsfeil: %s"
 
 #: ../libpurple/dnsquery.c:762
-#, fuzzy
 msgid "Unknown reason"
-msgstr "Ukjent grunn."
+msgstr "Ukjent grunn"
 
 #: ../libpurple/ft.c:209
 #, c-format
@@ -2468,7 +2659,7 @@
 
 #: ../libpurple/ft.c:253
 msgid "Directory is not writable."
-msgstr ""
+msgstr "Katalogen er ikke skrivbar."
 
 #: ../libpurple/ft.c:268
 msgid "Cannot send a file of 0 bytes."
@@ -2481,9 +2672,7 @@
 #: ../libpurple/ft.c:287
 #, c-format
 msgid "%s is not a regular file. Cowardly refusing to overwrite it.\n"
-msgstr ""
-"%s er ikke en vanlig fil. Gaim nekter å overskrive den for å ikke risikere å "
-"ødelegge noe.\n"
+msgstr "%s er ikke en vanlig fil. Pidgin nekter å overskrive den for å ikke risikere å ødelegge noe.\n"
 
 #: ../libpurple/ft.c:347
 #, c-format
@@ -2493,7 +2682,7 @@
 #: ../libpurple/ft.c:354
 #, c-format
 msgid "%s wants to send you a file"
-msgstr "%s ønsker å sende deg en fil."
+msgstr "%s ønsker å sende deg en fil"
 
 #: ../libpurple/ft.c:397
 #, c-format
@@ -2512,9 +2701,9 @@
 "Port: %d"
 
 #: ../libpurple/ft.c:436
-#, fuzzy, c-format
+#, c-format
 msgid "%s is offering to send file %s"
-msgstr "Tilbyr å sende %s til %s"
+msgstr "%s tilbyr å sende filen %s"
 
 #: ../libpurple/ft.c:488
 #, c-format
@@ -2527,29 +2716,27 @@
 msgstr "Tilbyr å sende %s til %s"
 
 #: ../libpurple/ft.c:521
-#, fuzzy, c-format
+#, c-format
 msgid "Starting transfer of %s from %s"
-msgstr "Aksepter forespørselen for filoverføring fra %s?"
+msgstr "Starter overføring av %s fra %s"
 
 #: ../libpurple/ft.c:682
 #, c-format
 msgid "Transfer of file %s complete"
-msgstr "Overføring av filen %s er ferdig."
+msgstr "Overføring av filen %s er ferdig"
 
 #: ../libpurple/ft.c:685
-#, c-format
 msgid "File transfer complete"
 msgstr "Filoverføring ferdig"
 
 #: ../libpurple/ft.c:1103
 #, c-format
 msgid "You canceled the transfer of %s"
-msgstr "Du avbrøt overføringen av %s."
+msgstr "Du avbrøt overføringen av %s"
 
 #: ../libpurple/ft.c:1108
-#, c-format
 msgid "File transfer cancelled"
-msgstr "Filoverføring avbrutt."
+msgstr "Filoverføring avbrutt"
 
 #: ../libpurple/ft.c:1166
 #, c-format
@@ -2559,171 +2746,153 @@
 #: ../libpurple/ft.c:1171
 #, c-format
 msgid "%s canceled the file transfer"
-msgstr "%s avbrøt filoverføringen."
+msgstr "%s avbrøt filoverføringen"
 
 #: ../libpurple/ft.c:1228
-#, fuzzy, c-format
+#, c-format
 msgid "File transfer to %s failed."
-msgstr "Filoverføring til %s avbrutt.\n"
+msgstr "Filoverføring til %s feilet."
 
 #: ../libpurple/ft.c:1230
-#, fuzzy, c-format
+#, c-format
 msgid "File transfer from %s failed."
-msgstr "Filoverføring fra %s avbrutt.\n"
+msgstr "Filoverføring fra %s feilet."
 
 #: ../libpurple/gconf/purple.schemas.in.h:1
 msgid "Run the command in a terminal"
-msgstr ""
+msgstr "Kjør kommandoen i en terminal"
 
 #: ../libpurple/gconf/purple.schemas.in.h:2
 msgid "The command used to handle \"aim\" URLs, if enabled."
-msgstr ""
+msgstr "Kommando for å håndtere «aim»-URLer, hvis aktivert."
 
 #: ../libpurple/gconf/purple.schemas.in.h:3
 msgid "The command used to handle \"gg\" URLs, if enabled."
-msgstr ""
+msgstr "Kommando for å håndtere «gg»-URLer, hvis aktivert."
 
 #: ../libpurple/gconf/purple.schemas.in.h:4
 msgid "The command used to handle \"icq\" URLs, if enabled."
-msgstr ""
+msgstr "Kommando for å håndtere «icq»-URLer, hvis aktivert."
 
 #: ../libpurple/gconf/purple.schemas.in.h:5
 msgid "The command used to handle \"irc\" URLs, if enabled."
-msgstr ""
+msgstr "Kommando for å håndtere «irc»-URLer, hvis aktivert."
 
 #: ../libpurple/gconf/purple.schemas.in.h:6
 msgid "The command used to handle \"msnim\" URLs, if enabled."
-msgstr ""
+msgstr "Kommando for å håndtere «msnim»-URLer, hvis aktivert."
 
 #: ../libpurple/gconf/purple.schemas.in.h:7
 msgid "The command used to handle \"sip\" URLs, if enabled."
-msgstr ""
+msgstr "Kommando for å håndtere «sip»-URLer, hvis aktivert."
 
 #: ../libpurple/gconf/purple.schemas.in.h:8
 msgid "The command used to handle \"xmpp\" URLs, if enabled."
-msgstr ""
+msgstr "Kommando for å håndtere «xmpp»-URLer, hvis aktivert."
 
 #: ../libpurple/gconf/purple.schemas.in.h:9
 msgid "The command used to handle \"ymsgr\" URLs, if enabled."
-msgstr ""
+msgstr "Kommando for å håndtere «ymsgr»-URLer, hvis aktivert."
 
 #: ../libpurple/gconf/purple.schemas.in.h:10
 msgid "The handler for \"aim\" URLs"
-msgstr ""
+msgstr "Håndtereren for «aim»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:11
 msgid "The handler for \"gg\" URLs"
-msgstr ""
+msgstr "Håndtereren for «gg»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:12
 msgid "The handler for \"icq\" URLs"
-msgstr ""
+msgstr "Håndtereren for «icq»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:13
 msgid "The handler for \"irc\" URLs"
-msgstr ""
+msgstr "Håndtereren for «irc»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:14
 msgid "The handler for \"msnim\" URLs"
-msgstr ""
+msgstr "Håndtereren for «msnim»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:15
 msgid "The handler for \"sip\" URLs"
-msgstr ""
+msgstr "Håndtereren for «sip»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:16
 msgid "The handler for \"xmpp\" URLs"
-msgstr ""
+msgstr "Håndtereren for «xmpp»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:17
 msgid "The handler for \"ymsgr\" URLs"
-msgstr ""
+msgstr "Håndtereren for «ymsgr»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:18
-msgid ""
-"True if the command specified in the \"command\" key should handle \"aim\" "
-"URLs."
-msgstr ""
+msgid "True if the command specified in the \"command\" key should handle \"aim\" URLs."
+msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «aim»-URLer."
 
 #: ../libpurple/gconf/purple.schemas.in.h:19
-msgid ""
-"True if the command specified in the \"command\" key should handle \"gg\" "
-"URLs."
-msgstr ""
+msgid "True if the command specified in the \"command\" key should handle \"gg\" URLs."
+msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «gg»-URLer."
 
 #: ../libpurple/gconf/purple.schemas.in.h:20
-msgid ""
-"True if the command specified in the \"command\" key should handle \"icq\" "
-"URLs."
-msgstr ""
+msgid "True if the command specified in the \"command\" key should handle \"icq\" URLs."
+msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «icq»-URLer."
 
 #: ../libpurple/gconf/purple.schemas.in.h:21
-msgid ""
-"True if the command specified in the \"command\" key should handle \"irc\" "
-"URLs."
-msgstr ""
+msgid "True if the command specified in the \"command\" key should handle \"irc\" URLs."
+msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «irc»-URLer."
 
 #: ../libpurple/gconf/purple.schemas.in.h:22
-msgid ""
-"True if the command specified in the \"command\" key should handle \"msnim\" "
-"URLs."
-msgstr ""
+msgid "True if the command specified in the \"command\" key should handle \"msnim\" URLs."
+msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «msnim»-URLer."
 
 #: ../libpurple/gconf/purple.schemas.in.h:23
-msgid ""
-"True if the command specified in the \"command\" key should handle \"sip\" "
-"URLs."
-msgstr ""
+msgid "True if the command specified in the \"command\" key should handle \"sip\" URLs."
+msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «sip»-URLer."
 
 #: ../libpurple/gconf/purple.schemas.in.h:24
-msgid ""
-"True if the command specified in the \"command\" key should handle \"xmpp\" "
-"URLs."
-msgstr ""
+msgid "True if the command specified in the \"command\" key should handle \"xmpp\" URLs."
+msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «xmpp»-URLer."
 
 #: ../libpurple/gconf/purple.schemas.in.h:25
-msgid ""
-"True if the command specified in the \"command\" key should handle \"ymsgr\" "
-"URLs."
-msgstr ""
+msgid "True if the command specified in the \"command\" key should handle \"ymsgr\" URLs."
+msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «ymsgr»-URLer."
 
 #: ../libpurple/gconf/purple.schemas.in.h:26
-msgid ""
-"True if the command used to handle this type of URL should be run in a "
-"terminal."
-msgstr ""
+msgid "True if the command used to handle this type of URL should be run in a terminal."
+msgstr "Sann hvis kommandoen som skal håndtere denne type URLer skal kjøres i en terminal."
 
 #: ../libpurple/gconf/purple.schemas.in.h:27
 msgid "Whether the specified command should handle \"aim\" URLs"
-msgstr ""
+msgstr "Om den spesifike kommandoen skal håndtere «aim»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:28
 msgid "Whether the specified command should handle \"gg\" URLs"
-msgstr ""
+msgstr "Om den spesifike kommandoen skal håndtere «gg»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:29
 msgid "Whether the specified command should handle \"icq\" URLs"
-msgstr ""
+msgstr "Om den spesifike kommandoen skal håndtere «icq»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:30
 msgid "Whether the specified command should handle \"irc\" URLs"
-msgstr ""
+msgstr "Om den spesifike kommandoen skal håndtere «irc»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:31
 msgid "Whether the specified command should handle \"msnim\" URLs"
-msgstr ""
+msgstr "Om den spesifike kommandoen skal håndtere «msnim»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:32
 msgid "Whether the specified command should handle \"sip\" URLs"
-msgstr ""
+msgstr "Om den spesifike kommandoen skal håndtere «sip»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:33
 msgid "Whether the specified command should handle \"xmpp\" URLs"
-msgstr ""
+msgstr "Om den spesifike kommandoen skal håndtere «xmpp»-URLer"
 
 #: ../libpurple/gconf/purple.schemas.in.h:34
 msgid "Whether the specified command should handle \"ymsgr\" URLs"
-msgstr ""
+msgstr "Om den spesifike kommandoen skal håndtere «ymsgr»-URLer"
 
 #: ../libpurple/log.c:183
 msgid "<b><font color=\"red\">The logger has no read function</font></b>"
@@ -2739,7 +2908,7 @@
 
 #: ../libpurple/log.c:626
 msgid "Old flat format"
-msgstr ""
+msgstr "Gammelt flatt format"
 
 #: ../libpurple/log.c:839
 msgid "Logging of this conversation failed."
@@ -2751,27 +2920,21 @@
 
 #: ../libpurple/log.c:1366
 #, c-format
-msgid ""
-"<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-"
-"REPLY&gt;:</b></font> %s<br/>\n"
-msgstr ""
-"<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s &lt;"
-"STANDARDSVAR&gt;:</b></font> %s<br/>\n"
+msgid "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-REPLY&gt;:</b></font> %s<br/>\n"
+msgstr "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s &lt;STANDARDSVAR&gt;:</b></font> %s<br/>\n"
 
 #: ../libpurple/log.c:1368
 #, c-format
-msgid ""
-"<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-"
-"REPLY&gt;:</b></font> %s<br/>\n"
-msgstr ""
-"<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s &lt;"
-"STANDARDSVAR&gt;:</b></font> %s<br/>\n"
-
-#: ../libpurple/log.c:1426 ../libpurple/log.c:1559
+msgid "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-REPLY&gt;:</b></font> %s<br/>\n"
+msgstr "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s &lt;STANDARDSVAR&gt;:</b></font> %s<br/>\n"
+
+#: ../libpurple/log.c:1426
+#: ../libpurple/log.c:1559
 msgid "<font color=\"red\"><b>Unable to find log path!</b></font>"
 msgstr "<font color=\"red\"><b>Kunne ikke finne banen til loggen!</b></font>"
 
-#: ../libpurple/log.c:1438 ../libpurple/log.c:1568
+#: ../libpurple/log.c:1438
+#: ../libpurple/log.c:1568
 #, c-format
 msgid "<font color=\"red\"><b>Could not read file: %s</b></font>"
 msgstr "<font color=\"red\"><b>Kunne ikke lese fil: %s</b></font>"
@@ -2779,45 +2942,39 @@
 #: ../libpurple/log.c:1500
 #, c-format
 msgid "(%s) %s <AUTO-REPLY>: %s\n"
-msgstr ""
+msgstr "(%s) %s <AUTO-SVAR>: %s\n"
 
 #: ../libpurple/plugin.c:365
 #, c-format
 msgid "You are using %s, but this plugin requires %s."
-msgstr ""
+msgstr "Du bruker %s, men dette tillegget krever %s."
 
 #: ../libpurple/plugin.c:380
-#, c-format
 msgid "This plugin has not defined an ID."
-msgstr ""
+msgstr "Dette tillegget har ikke definert en ID."
 
 #: ../libpurple/plugin.c:448
 #, c-format
 msgid "Plugin magic mismatch %d (need %d)"
-msgstr ""
+msgstr "Tillegg magic mismatch %d (trenger %d)"
 
 #: ../libpurple/plugin.c:465
 #, c-format
 msgid "ABI version mismatch %d.%d.x (need %d.%d.x)"
-msgstr ""
+msgstr "ABI versjon mismatch %d.%d.x (trenger %d.%d.x)"
 
 #: ../libpurple/plugin.c:482
 msgid "Plugin does not implement all required functions"
-msgstr ""
+msgstr "Tillegget implenterer ikke alle funksjoner som kreves"
 
 #: ../libpurple/plugin.c:547
 #, c-format
-msgid ""
-"The required plugin %s was not found. Please install this plugin and try "
-"again."
-msgstr ""
-"Det nødvendige tillegget %s ble ikke funnet. Installer dette tillegget og "
-"prøv igjen."
+msgid "The required plugin %s was not found. Please install this plugin and try again."
+msgstr "Det nødvendige tillegget %s ble ikke funnet. Installer dette tillegget og prøv igjen."
 
 #: ../libpurple/plugin.c:552
-#, fuzzy
 msgid "Unable to load the plugin"
-msgstr "Gaim klarte ikke å laste tillegget."
+msgstr "Klarte ikke å laste tillegget"
 
 #: ../libpurple/plugin.c:574
 #, c-format
@@ -2825,84 +2982,81 @@
 msgstr "Det nødvendige tillegget %s kunne ikke lastes."
 
 #: ../libpurple/plugin.c:578
-#, fuzzy
 msgid "Unable to load your plugin."
-msgstr "Gaim klarte ikke å laste tillegget."
+msgstr "Kunne ikke laste tillegget ditt."
 
 #: ../libpurple/plugin.c:677
-#, fuzzy, c-format
+#, c-format
 msgid "The dependent plugin %s failed to unload."
 msgstr "Det nødvendige tillegget %s kunne ikke lastes."
 
 #: ../libpurple/plugin.c:681
-#, fuzzy
 msgid "There were errors unloading the plugin."
-msgstr "Lar deg laste perl-tillegg."
+msgstr "Det oppsto feil i lossing av tillegget."
 
 #: ../libpurple/plugins/autoaccept.c:23
-#, fuzzy
 msgid "Autoaccept"
-msgstr "Godta"
-
-#: ../libpurple/plugins/autoaccept.c:25 ../libpurple/plugins/autoaccept.c:26
-#, fuzzy
+msgstr "Autoaksepter"
+
+#: ../libpurple/plugins/autoaccept.c:25
+#: ../libpurple/plugins/autoaccept.c:26
 msgid "Auto-accept file transfer requests from selected users."
-msgstr "Aksepter forespørselen for filoverføring fra %s?"
+msgstr "Aksepter forespørselen for filoverføring fra valgte brukere."
 
 #: ../libpurple/plugins/autoaccept.c:80
-#, fuzzy, c-format
+#, c-format
 msgid "Autoaccepted file transfer of \"%s\" from \"%s\" completed."
-msgstr "Aksepter forespørselen for filoverføring fra %s?"
+msgstr "Autoakseptert filoverføring av \"%s\" fra \"%s\" ferdig."
 
 #: ../libpurple/plugins/autoaccept.c:82
 msgid "Autoaccept complete"
-msgstr ""
+msgstr "Autogodta ferdig"
 
 #: ../libpurple/plugins/autoaccept.c:160
-#, fuzzy, c-format
+#, c-format
 msgid "When a file-transfer request arrives from %s"
-msgstr "Aksepter forespørselen for filoverføring fra %s?"
+msgstr "Når en filoverføring forespørsel kommer fra %s"
 
 #: ../libpurple/plugins/autoaccept.c:162
-#, fuzzy
 msgid "Set Autoaccept Setting"
-msgstr "Skjulte Innstillinger"
+msgstr "Sett Autoaksepter Innstillinger"
 
 #: ../libpurple/plugins/autoaccept.c:164
 msgid "_Save"
-msgstr "Lagre"
-
-#: ../libpurple/plugins/autoaccept.c:165 ../libpurple/plugins/idle.c:170
-#: ../libpurple/plugins/idle.c:204 ../libpurple/plugins/idle.c:230
+msgstr "_Lagre"
+
+#: ../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:5941
-#: ../libpurple/protocols/oscar/oscar.c:6167
-#: ../libpurple/protocols/oscar/oscar.c:6237 ../libpurple/request.h:1388
+#: ../libpurple/protocols/oscar/oscar.c:2229
+#: ../libpurple/protocols/oscar/oscar.c:2278
+#: ../libpurple/protocols/oscar/oscar.c:5884
+#: ../libpurple/protocols/oscar/oscar.c:5939
+#: ../libpurple/protocols/oscar/oscar.c:6165
+#: ../libpurple/protocols/oscar/oscar.c:6235
+#: ../libpurple/request.h:1388
 #: ../libpurple/request.h:1398
+#: ../pidgin/gtkblist.c:527
 msgid "_Cancel"
 msgstr "_Avbryt"
 
 #: ../libpurple/plugins/autoaccept.c:168
 msgid "Ask"
-msgstr ""
+msgstr "Spør"
 
 #: ../libpurple/plugins/autoaccept.c:169
-#, fuzzy
 msgid "Auto Accept"
-msgstr "Godta"
+msgstr "Auto Godta"
 
 #: ../libpurple/plugins/autoaccept.c:170
-#, fuzzy
 msgid "Auto Reject"
-msgstr "Automatisk tilkobling ved brudd"
+msgstr "Auto Avslå"
 
 #: ../libpurple/plugins/autoaccept.c:185
-#, fuzzy
 msgid "Autoaccept File Transfers..."
-msgstr "Filoverføringer"
+msgstr "Autoaksepter Filoverføringer..."
 
 #. XXX: Is there a better way than this? There really should be.
 #: ../libpurple/plugins/autoaccept.c:215
@@ -2910,9 +3064,10 @@
 "Path to save the files in\n"
 "(Please provide the full path)"
 msgstr ""
+"Bane for å lagre filene i\n"
+"(Vennligst gi fullt banenavn)"
 
 #: ../libpurple/plugins/autoaccept.c:220
-#, fuzzy
 msgid "Automatically reject from users not in buddy list"
 msgstr "Tillat bare brukere fra kontaktlisten min"
 
@@ -2921,20 +3076,22 @@
 "Notify with a popup when an autoaccepted file transfer is complete\n"
 "(only when there's no conversation with the sender)"
 msgstr ""
-
-#: ../libpurple/plugins/buddynote.c:46 ../libpurple/protocols/msn/msn.c:1660
-#: ../libpurple/protocols/msn/msn.c:1690
-#, fuzzy
+"Gi beskjed med en sprettopp når en autogodta filoverføring er ferdig\n"
+"(kun når det ikke er en samtale med senderen)"
+
+#: ../libpurple/plugins/buddynote.c:46
+#: ../libpurple/protocols/msn/msn.c:1770
+#: ../libpurple/protocols/msn/msn.c:1800
 msgid "Notes"
-msgstr "Merknad"
+msgstr "Merknader"
 
 #: ../libpurple/plugins/buddynote.c:47
 msgid "Enter your notes below..."
-msgstr ""
+msgstr "Skriv inn merknadene dine under..."
 
 #: ../libpurple/plugins/buddynote.c:65
 msgid "Edit Notes..."
-msgstr ""
+msgstr "Rediger merknader..."
 
 #. *< major version
 #. *< minor version
@@ -2944,22 +3101,23 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/buddynote.c:90 ../pidgin/plugins/gtkbuddynote.c:74
-#, fuzzy
+#: ../libpurple/plugins/buddynote.c:90
+#: ../pidgin/plugins/gtkbuddynote.c:74
 msgid "Buddy Notes"
-msgstr "Kontakter"
+msgstr "Kontaktmerknader"
 
 #. *< name
 #. *< version
-#: ../libpurple/plugins/buddynote.c:92 ../pidgin/plugins/gtkbuddynote.c:76
+#: ../libpurple/plugins/buddynote.c:92
+#: ../pidgin/plugins/gtkbuddynote.c:76
 msgid "Store notes on particular buddies."
-msgstr ""
+msgstr "Lagre notater på en spesifikk kompis."
 
 #. *< summary
-#: ../libpurple/plugins/buddynote.c:93 ../pidgin/plugins/gtkbuddynote.c:77
-#, fuzzy
+#: ../libpurple/plugins/buddynote.c:93
+#: ../pidgin/plugins/gtkbuddynote.c:77
 msgid "Adds the option to store notes for buddies on your buddy list."
-msgstr "Legg til brukeren i kontaktlisten din"
+msgstr "Legger til muligheten for å lagre notater for kompiser i kompislisten din."
 
 #. *< type
 #. *< ui_requirement
@@ -2969,15 +3127,16 @@
 #. *< id
 #: ../libpurple/plugins/ciphertest.c:264
 msgid "Cipher Test"
-msgstr ""
+msgstr "Cipher Test"
 
 #. *< name
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/ciphertest.c:267 ../libpurple/plugins/ciphertest.c:269
+#: ../libpurple/plugins/ciphertest.c:267
+#: ../libpurple/plugins/ciphertest.c:269
 msgid "Tests the ciphers that ship with libpurple."
-msgstr ""
+msgstr "Test sifrene som sendes med libpurple."
 
 #. *< type
 #. *< ui_requirement
@@ -2987,7 +3146,7 @@
 #. *< id
 #: ../libpurple/plugins/dbus-example.c:155
 msgid "DBus Example"
-msgstr ""
+msgstr "DBus-eksempel"
 
 #. *< name
 #. *< version
@@ -2996,7 +3155,7 @@
 #: ../libpurple/plugins/dbus-example.c:158
 #: ../libpurple/plugins/dbus-example.c:160
 msgid "DBus Plugin Example"
-msgstr ""
+msgstr "DBus Tillegg Eksempel"
 
 #. *< type
 #. *< ui_requirement
@@ -3005,67 +3164,68 @@
 #. *< priority
 #. *< id
 #: ../libpurple/plugins/filectl.c:248
-#, fuzzy
 msgid "File Control"
-msgstr "Styre Gaim fra kontrollfil"
+msgstr "Filkontroll"
 
 #. *< name
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/filectl.c:251 ../libpurple/plugins/filectl.c:253
-#, fuzzy
+#: ../libpurple/plugins/filectl.c:251
+#: ../libpurple/plugins/filectl.c:253
 msgid "Allows control by entering commands in a file."
-msgstr "Lar deg kontrollere Gaim ved å skrive inn kommandoer i en fil."
-
-#: ../libpurple/plugins/idle.c:158 ../libpurple/plugins/idle.c:218
+msgstr "Lar deg kontrollere Pidgin ved å skrive inn kommandoer i en fil."
+
+#: ../libpurple/plugins/idle.c:158
+#: ../libpurple/plugins/idle.c:218
 msgid "Minutes"
 msgstr "Minutter"
 
 #. This is a cultural reference.  Dy'er Mak'er is a song by Led Zeppelin.
 #. If that doesn't translate well into your language, drop the 's before translating.
-#: ../libpurple/plugins/idle.c:165 ../libpurple/plugins/idle.c:199
-#: ../libpurple/plugins/idle.c:225 ../libpurple/plugins/idle.c:318
+#: ../libpurple/plugins/idle.c:165
+#: ../libpurple/plugins/idle.c:199
+#: ../libpurple/plugins/idle.c:225
+#: ../libpurple/plugins/idle.c:318
 msgid "I'dle Mak'er"
 msgstr "I'dle Mak'er"
 
-#: ../libpurple/plugins/idle.c:166 ../libpurple/plugins/idle.c:258
-#, fuzzy
+#: ../libpurple/plugins/idle.c:166
+#: ../libpurple/plugins/idle.c:258
 msgid "Set Account Idle Time"
 msgstr "Sett fraværstid for konto"
 
-#: ../libpurple/plugins/idle.c:169 ../libpurple/plugins/idle.c:229
+#: ../libpurple/plugins/idle.c:169
+#: ../libpurple/plugins/idle.c:229
 msgid "_Set"
 msgstr "_Sett"
 
 #: ../libpurple/plugins/idle.c:184
 msgid "None of your accounts are idle."
-msgstr ""
-
-#: ../libpurple/plugins/idle.c:200 ../libpurple/plugins/idle.c:262
-#, fuzzy
+msgstr "Ingen av kontoene dine er inaktive."
+
+#: ../libpurple/plugins/idle.c:200
+#: ../libpurple/plugins/idle.c:262
 msgid "Unset Account Idle Time"
 msgstr "Sett fraværstid for konto"
 
 #: ../libpurple/plugins/idle.c:203
-#, fuzzy
 msgid "_Unset"
-msgstr "Bruk"
-
-#: ../libpurple/plugins/idle.c:226 ../libpurple/plugins/idle.c:266
-#, fuzzy
+msgstr "_Frigi"
+
+#: ../libpurple/plugins/idle.c:226
+#: ../libpurple/plugins/idle.c:266
 msgid "Set Idle Time for All Accounts"
-msgstr "Frigi Borte-tid For Alle Idle Kontoer"
+msgstr "Sett Borte-tid For Alle Kontoer"
 
 #: ../libpurple/plugins/idle.c:271
-#, fuzzy
 msgid "Unset Idle Time for All Idled Accounts"
 msgstr "Frigi Borte-tid For Alle Idle Kontoer"
 
-#: ../libpurple/plugins/idle.c:320 ../libpurple/plugins/idle.c:321
-#, fuzzy
+#: ../libpurple/plugins/idle.c:320
+#: ../libpurple/plugins/idle.c:321
 msgid "Allows you to hand-configure how long you've been idle"
-msgstr "Lar deg manuelt sette hvor lenge du har vært borte."
+msgstr "Lar deg manuelt sette hvor lenge du har vært borte"
 
 #. *< type
 #. *< ui_requirement
@@ -3086,12 +3246,8 @@
 
 #. *  description
 #: ../libpurple/plugins/ipc-test-client.c:92
-msgid ""
-"Test plugin IPC support, as a client. This locates the server plugin and "
-"calls the commands registered."
-msgstr ""
-"Test IPC-støtte for tillegg (som klient). Dette finner tjenertillegget og "
-"kaller de registrerte kommandoene."
+msgid "Test plugin IPC support, as a client. This locates the server plugin and calls the commands registered."
+msgstr "Test IPC-støtte for tillegg (som klient). Dette finner tjenertillegget og kaller de registrerte kommandoene."
 
 #
 #. *< type
@@ -3114,21 +3270,19 @@
 #. *  description
 #: ../libpurple/plugins/ipc-test-server.c:79
 msgid "Test plugin IPC support, as a server. This registers the IPC commands."
-msgstr ""
-"Test IPC-støtte for tillegg (som tjener). Dette registrerer IPC-kommandoene."
+msgstr "Test IPC-støtte for tillegg (som tjener). Dette registrerer IPC-kommandoene."
 
 #: ../libpurple/plugins/joinpart.c:229
-#, fuzzy
 msgid "Join/Part Hiding Configuration"
-msgstr "Innstillinger for Evolution-integrasjon"
+msgstr "Konfigurasjon for Join/Part Skjuling"
 
 #: ../libpurple/plugins/joinpart.c:233
 msgid "Minimum Room Size"
-msgstr ""
+msgstr "Minimums Rom Størrelse"
 
 #: ../libpurple/plugins/joinpart.c:239
 msgid "User Inactivity Timeout (in minutes)"
-msgstr ""
+msgstr "Brukers Inaktivitets Timeout (i minutter)"
 
 #. *< type
 #. *< ui_requirement
@@ -3138,21 +3292,19 @@
 #. *< id
 #: ../libpurple/plugins/joinpart.c:270
 msgid "Join/Part Hiding"
-msgstr ""
+msgstr "Join/Part Skjuling"
 
 #. *< name
 #. *< version
 #. *  summary
 #: ../libpurple/plugins/joinpart.c:273
 msgid "Hides extraneous join/part messages."
-msgstr ""
+msgstr "Skjul fremmede join/part beskjeder."
 
 #. *  description
 #: ../libpurple/plugins/joinpart.c:275
-msgid ""
-"This plugin hides join/part messages in large rooms, except for those users "
-"actively taking part in a conversation."
-msgstr ""
+msgid "This plugin hides join/part messages in large rooms, except for those users actively taking part in a conversation."
+msgstr "Denne plugin skjuler join/part beskjeder i store rom, untatt for de brukerne som aktivt deltar i en samtale."
 
 #. This is used in the place of a timezone abbreviation if the
 #. * offset is way off.  The user should never really see it, but
@@ -3160,48 +3312,42 @@
 #. * not a real timezone.
 #: ../libpurple/plugins/log_reader.c:493
 msgid "(UTC)"
-msgstr ""
+msgstr "(UTC)"
 
 #: ../libpurple/plugins/log_reader.c:1577
-#, fuzzy
 msgid "User is offline."
-msgstr "Brukeren er avlogget"
+msgstr "Brukeren er avlogget."
 
 #: ../libpurple/plugins/log_reader.c:1583
-#, fuzzy
 msgid "Auto-response sent:"
-msgstr "Automatisk tilkobling ved brudd"
+msgstr "Auto-respons sendt:"
 
 #: ../libpurple/plugins/log_reader.c:1593
 #: ../libpurple/plugins/log_reader.c:1596
 #: ../libpurple/plugins/statenotify.c:80
-#, fuzzy, c-format
+#, c-format
 msgid "%s has signed off."
-msgstr "%s har logget av (%s)"
+msgstr "%s har logget av."
 
 #: ../libpurple/plugins/log_reader.c:1610
 msgid "One or more messages may have been undeliverable."
-msgstr ""
+msgstr "En eller flere beskjeder kunne ikke bli levert."
 
 #: ../libpurple/plugins/log_reader.c:1620
 msgid "You were disconnected from the server."
 msgstr "Du har blitt koblet fra tjeneren."
 
 #: ../libpurple/plugins/log_reader.c:1628
-msgid ""
-"You are currently disconnected. Messages will not be received unless you are "
-"logged in."
-msgstr ""
+msgid "You are currently disconnected. Messages will not be received unless you are logged in."
+msgstr "Du er for tiden avlogget. Beskjeder vil ikke bli mottatt uten at du er innlogget."
 
 #: ../libpurple/plugins/log_reader.c:1643
-#, fuzzy
 msgid "Message could not be sent because the maximum length was exceeded."
-msgstr "Meldingen kunne ikke bli sendt, brukeren er frakoblet:"
+msgstr "Meldingen kunne ikke bli sendt fordi max lengde ble overskredet."
 
 #: ../libpurple/plugins/log_reader.c:1648
-#, fuzzy
 msgid "Message could not be sent."
-msgstr "Din Yahoo!-beskjed ble ikke sendt."
+msgstr "Beskjeden kunne ikke bli sendt."
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
@@ -3209,25 +3355,23 @@
 #: ../libpurple/plugins/log_reader.c:2349
 #: ../libpurple/plugins/log_reader.c:2472
 msgid "Adium"
-msgstr ""
+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
-#, fuzzy
 msgid "Fire"
-msgstr "Firefox"
+msgstr "Fire"
 
 #. 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
-#, fuzzy
 msgid "Messenger Plus!"
-msgstr "Melding fra %s"
+msgstr "Messenger Plus!"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
@@ -3235,16 +3379,15 @@
 #: ../libpurple/plugins/log_reader.c:2388
 #: ../libpurple/plugins/log_reader.c:2486
 msgid "QIP"
-msgstr ""
+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
-#, fuzzy
 msgid "MSN Messenger"
-msgstr "Lynmeldingsklient"
+msgstr "MSN Messenger"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
@@ -3252,28 +3395,27 @@
 #: ../libpurple/plugins/log_reader.c:2412
 #: ../libpurple/plugins/log_reader.c:2494
 msgid "Trillian"
-msgstr ""
+msgstr "Trillian"
 
 #. Add general preferences.
 #: ../libpurple/plugins/log_reader.c:2454
-#, fuzzy
 msgid "General Log Reading Configuration"
-msgstr "Innstillinger for trayikon"
+msgstr "Generelle Instillinger for Logg Lesing"
 
 #: ../libpurple/plugins/log_reader.c:2458
 msgid "Fast size calculations"
-msgstr ""
+msgstr "Kjapp størrelse kalkulasjon"
 
 #: ../libpurple/plugins/log_reader.c:2462
+#, fuzzy
 msgid "Use name heuristics"
-msgstr ""
+msgstr "Bruk navn heuristics"
 
 #
 #. Add Log Directory preferences.
 #: ../libpurple/plugins/log_reader.c:2468
-#, fuzzy
 msgid "Log Directory"
-msgstr "_Søk etter:"
+msgstr "Logg Katalog"
 
 #. *< type
 #. *< ui_requirement
@@ -3282,7 +3424,6 @@
 #. *< priority
 #. *< id
 #: ../libpurple/plugins/log_reader.c:2523
-#, fuzzy
 msgid "Log Reader"
 msgstr "Log Viser"
 
@@ -3291,28 +3432,28 @@
 #. * summary
 #: ../libpurple/plugins/log_reader.c:2527
 msgid "Includes other IM clients' logs in the log viewer."
-msgstr ""
+msgstr "Inkluderer andre lynmeldingsklienters logger i logg-viseren."
 
 #. * description
 #: ../libpurple/plugins/log_reader.c:2531
 msgid ""
-"When viewing logs, this plugin will include logs from other IM clients. "
-"Currently, this includes Adium, MSN Messenger, and Trillian.\n"
-"\n"
-"WARNING: This plugin is still alpha code and may crash frequently.  Use it "
-"at your own risk!"
-msgstr ""
+"When viewing logs, this plugin will include logs from other IM clients. Currently, this includes Adium, MSN Messenger, and Trillian.\n"
+"\n"
+"WARNING: This plugin is still alpha code and may crash frequently.  Use it at your own risk!"
+msgstr ""
+"Når man ser på logger, vil dette tillegget inkludere logger fra andre lynmeldingsklienter. For tiden inkluderer dette Adium, MSN Messenger og Trillian.\n"
+"\n"
+"ADVARSEL: Dette tillegget er enda alpha kode og kan krasje ofte.  Bruk den på egen risiko!"
 
 #
 #: ../libpurple/plugins/mono/loader/mono.c:217
-#, fuzzy
 msgid "Mono Plugin Loader"
-msgstr "Tcl-tilleggslaster"
+msgstr "Mono tilleggslaster"
 
 #: ../libpurple/plugins/mono/loader/mono.c:219
 #: ../libpurple/plugins/mono/loader/mono.c:220
 msgid "Loads .NET plugins with Mono."
-msgstr ""
+msgstr "Laster .NET tillegg med Mono."
 
 #. *< magic
 #. *< major version
@@ -3324,85 +3465,81 @@
 #. *< priority
 #. *< id
 #: ../libpurple/plugins/newline.c:68
-#, fuzzy
 msgid "New Line"
-msgstr "Nytt vindu"
+msgstr "Ny linje"
 
 #. *< name
 #. *< version
 #: ../libpurple/plugins/newline.c:70
-#, fuzzy
 msgid "Prepends a newline to displayed message."
-msgstr "Kunne ikke sende beskjed."
+msgstr "Legger til en ny linje på vist beskjed."
 
 #. *< summary
 #: ../libpurple/plugins/newline.c:71
-msgid ""
-"Prepends a newline to messages so that the rest of the message appears below "
-"the screen name in the conversation window."
-msgstr ""
+msgid "Prepends a newline to messages so that the rest of the message appears below the screen name in the conversation window."
+msgstr "Setter inn en ny linje foran beskjeder sånn at resten av teksten kommer frem under skjermnavnet i samtalevinduet."
 
 #: ../libpurple/plugins/offlinemsg.c:23
 msgid "Offline Message Emulation"
-msgstr ""
-
-#: ../libpurple/plugins/offlinemsg.c:25 ../libpurple/plugins/offlinemsg.c:26
+msgstr "Emulering av avlogget-beskjed"
+
+#: ../libpurple/plugins/offlinemsg.c:25
+#: ../libpurple/plugins/offlinemsg.c:26
 msgid "Save messages sent to an offline user as pounce."
-msgstr ""
+msgstr "Lagre beskjeder sendt til en avlogget bruker som pounce."
 
 #: ../libpurple/plugins/offlinemsg.c:95
-msgid ""
-"The rest of the messages will be saved as pounce. You can edit/delete the "
-"pounce from the `Buddy Pounce' dialog."
-msgstr ""
+msgid "The rest of the messages will be saved as pounce. You can edit/delete the pounce from the `Buddy Pounce' dialog."
+msgstr "Resten av beskjeden vil bli lagret som pounce. Du kan forandre/slette varslingen fra Kompisvarslings dialogen."
 
 #: ../libpurple/plugins/offlinemsg.c:156
 #, c-format
-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 ""
+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\" er for tiden avlogget. Vil du lagre resten av beskjeden i en pounce og automatisk sende den når \"%s\" logger inn igjen?"
 
 #: ../libpurple/plugins/offlinemsg.c:160
-#, fuzzy
 msgid "Offline Message"
-msgstr "Avlogget"
+msgstr "Avlogget Beskjed"
 
 #: ../libpurple/plugins/offlinemsg.c:161
 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
-msgstr ""
+msgstr "Du kan forandre/slette varsling fra Kompisvarslings dialogen"
 
 #: ../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:622
+#: ../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:304
 #: ../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:304
+#: ../pidgin/gtkrequest.c:268
 msgid "Yes"
 msgstr "Ja"
 
 #: ../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:622
+#: ../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:305
 #: ../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:305
+#: ../pidgin/gtkrequest.c:269
 msgid "No"
 msgstr "Nei"
 
 #: ../libpurple/plugins/offlinemsg.c:193
 msgid "Save offline messages in pounce"
-msgstr ""
+msgstr "Lagre avloggede beskjder i pounce"
 
 #: ../libpurple/plugins/offlinemsg.c:197
 msgid "Do not ask. Always save in pounce."
-msgstr ""
+msgstr "Ikke spør. Alltid lagre i pounce."
 
 #. *< type
 #. *< ui_requirement
@@ -3417,46 +3554,42 @@
 #. *< name
 #. *< version
 #. *< summary
-#: ../libpurple/plugins/perl/perl.c:603 ../libpurple/plugins/perl/perl.c:604
+#: ../libpurple/plugins/perl/perl.c:603
+#: ../libpurple/plugins/perl/perl.c:604
 msgid "Provides support for loading perl plugins."
 msgstr "Lar deg laste perl-tillegg."
 
 #: ../libpurple/plugins/psychic.c:20
 msgid "Psychic Mode"
-msgstr ""
+msgstr "Synsk Modus"
 
 #: ../libpurple/plugins/psychic.c:21
 msgid "Psychic mode for incoming conversation"
-msgstr ""
+msgstr "Synsk modus for innkommende samtale"
 
 #: ../libpurple/plugins/psychic.c:22
-msgid ""
-"Causes conversation windows to appear as other users begin to message you.  "
-"This works for AIM, ICQ, XMPP, Sametime, and Yahoo!"
-msgstr ""
+msgid "Causes conversation windows to appear as other users begin to message you.  This works for AIM, ICQ, XMPP, Sametime, and Yahoo!"
+msgstr "Gjør at samtalevinduet dukker opp idet andre brukere begynner å sende beskjed til deg. Dette fungerer for AIM, ICQ, XMPP, Sametime og Yahoo!"
 
 #: ../libpurple/plugins/psychic.c:72
 msgid "You feel a disturbance in the force..."
-msgstr ""
+msgstr "You feel a disturbance in the force..."
 
 #: ../libpurple/plugins/psychic.c:91
-#, fuzzy
 msgid "Only enable for users on the buddy list"
 msgstr "Tillat bare brukere fra kontaktlisten min"
 
 #: ../libpurple/plugins/psychic.c:96
-#, fuzzy
 msgid "Disable when away"
-msgstr "%s forsvant"
+msgstr "Slå av når borte"
 
 #: ../libpurple/plugins/psychic.c:100
 msgid "Display notification message in conversations"
-msgstr ""
+msgstr "Vis påminnelse i samtaler"
 
 #: ../libpurple/plugins/psychic.c:105
-#, fuzzy
 msgid "Raise psychic conversations"
-msgstr "Samtalevinduer for direktemeldinger"
+msgstr "Fremhev synske samtaler"
 
 #. *< type
 #. *< ui_requirement
@@ -3486,21 +3619,22 @@
 #. *< id
 #: ../libpurple/plugins/simple.c:37
 msgid "Simple Plugin"
-msgstr "Simpelt tillegg"
+msgstr "Simpelt Tillegg"
 
 #. *< name
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/simple.c:40 ../libpurple/plugins/simple.c:42
+#: ../libpurple/plugins/simple.c:40
+#: ../libpurple/plugins/simple.c:42
 msgid "Tests to see that most things are working."
 msgstr "Test for å se at mesteparten fungerer."
 
 #. Scheme name
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:902
+#: ../libpurple/plugins/ssl/ssl-gnutls.c:903
 #: ../libpurple/plugins/ssl/ssl-nss.c:725
 msgid "X.509 Certificates"
-msgstr ""
+msgstr "X.509-sertifikater"
 
 #. *< type
 #. *< ui_requirement
@@ -3508,7 +3642,7 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:986
+#: ../libpurple/plugins/ssl/ssl-gnutls.c:987
 msgid "GNUTLS"
 msgstr "GNUTLS"
 
@@ -3516,8 +3650,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:989
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:991
+#: ../libpurple/plugins/ssl/ssl-gnutls.c:990
+#: ../libpurple/plugins/ssl/ssl-gnutls.c:992
 msgid "Provides SSL support through GNUTLS."
 msgstr "Tilbyr SSL-støtte gjennom GNUTLS."
 
@@ -3554,7 +3688,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/ssl/ssl.c:97 ../libpurple/plugins/ssl/ssl.c:99
+#: ../libpurple/plugins/ssl/ssl.c:97
+#: ../libpurple/plugins/ssl/ssl.c:99
 msgid "Provides a wrapper around SSL support libraries."
 msgstr "Tilbyr ett felles grensesnitt for SSL-biblioteker."
 
@@ -3571,17 +3706,17 @@
 #: ../libpurple/plugins/statenotify.c:62
 #, c-format
 msgid "%s has become idle."
-msgstr "%s har blitt inaktiv"
+msgstr "%s har blitt inaktiv."
 
 #: ../libpurple/plugins/statenotify.c:64
 #, c-format
 msgid "%s is no longer idle."
-msgstr "%s er ikke lenger inaktiv"
+msgstr "%s er ikke lenger inaktiv."
 
 #: ../libpurple/plugins/statenotify.c:73
-#, fuzzy, c-format
+#, c-format
 msgid "%s has signed on."
-msgstr "%s har logget på (%s)"
+msgstr "%s har logget på."
 
 #: ../libpurple/plugins/statenotify.c:91
 msgid "Notify When"
@@ -3589,16 +3724,15 @@
 
 #: ../libpurple/plugins/statenotify.c:94
 msgid "Buddy Goes _Away"
-msgstr "Kontakt forsvinner"
+msgstr "Kontakt _Forsvinner"
 
 #: ../libpurple/plugins/statenotify.c:97
 msgid "Buddy Goes _Idle"
-msgstr "Kontakt blir inaktiv:"
+msgstr "Kontakt blir _Inaktiv"
 
 #: ../libpurple/plugins/statenotify.c:100
-#, fuzzy
 msgid "Buddy _Signs On/Off"
-msgstr "Kontakt logger inn"
+msgstr "Kontakt _Logger Inn/Ut"
 
 #. *< type
 #. *< ui_requirement
@@ -3616,62 +3750,53 @@
 #. *  description
 #: ../libpurple/plugins/statenotify.c:151
 #: ../libpurple/plugins/statenotify.c:154
-msgid ""
-"Notifies in a conversation window when a buddy goes or returns from away or "
-"idle."
-msgstr ""
-"Varsler i et samtalevindu når en kontakt blir borte/inaktiv, eller "
-"returnerer."
+msgid "Notifies in a conversation window when a buddy goes or returns from away or idle."
+msgstr "Varsler i et samtalevindu når en kontakt blir borte/inaktiv, eller returnerer."
 
 #
-#: ../libpurple/plugins/tcl/tcl.c:421
+#: ../libpurple/plugins/tcl/tcl.c:423
 msgid "Tcl Plugin Loader"
 msgstr "Tcl-tilleggslaster"
 
 #
-#: ../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 "Lar deg laste Tcl-tillegg."
-
-#: ../libpurple/plugins/tcl/tcl.c:507
-msgid ""
-"Unable to detect ActiveTCL installation. If you wish to use TCL plugins, "
-"install ActiveTCL from http://www.activestate.com\n"
-msgstr ""
+msgstr "Lar deg laste Tcl-tillegg"
+
+#: ../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"
+msgstr "Kunne ikke finne en ActiveTCL installasjon. Om du ønsker å bruke TCL tillegg, installer ActiveTCL fra http://www.activestate.com\n"
 
 #. Send a message about the connection error
 #: ../libpurple/protocols/bonjour/bonjour.c:112
-#, fuzzy
 msgid "Unable to listen for incoming IM connections\n"
-msgstr "Kunne ikke lage ny tilkobling."
+msgstr "Kunne ikke lage ny tilkobling\n"
 
 #: ../libpurple/protocols/bonjour/bonjour.c:137
-msgid ""
-"Unable to establish connection with the local mDNS server.  Is it running?"
-msgstr ""
+msgid "Unable to establish connection with the local mDNS server.  Is it running?"
+msgstr "Kunne ikke etablere kontakt med den lokale mDNS serveren. Er den igang?"
 
 #. 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/jabber/jabber.c:942
-#, fuzzy
 msgid "First name"
-msgstr "Fornavn:"
+msgstr "Fornavn"
 
 #: ../libpurple/protocols/bonjour/bonjour.c:353
 #: ../libpurple/protocols/bonjour/bonjour.c:659
 #: ../libpurple/protocols/gg/gg.c:627
 #: ../libpurple/protocols/jabber/jabber.c:947
-#, fuzzy
 msgid "Last name"
-msgstr "Etternavn:"
+msgstr "Etternavn"
 
 #: ../libpurple/protocols/bonjour/bonjour.c:357
 #: ../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/silc10/ops.c:1075
@@ -3682,16 +3807,14 @@
 
 #: ../libpurple/protocols/bonjour/bonjour.c:360
 #: ../libpurple/protocols/bonjour/bonjour.c:665
-#, fuzzy
 msgid "AIM Account"
-msgstr "Legg til konto"
+msgstr "AIM-konto"
 
 #
 #: ../libpurple/protocols/bonjour/bonjour.c:363
 #: ../libpurple/protocols/bonjour/bonjour.c:668
-#, fuzzy
 msgid "XMPP Account"
-msgstr "Konto"
+msgstr "XMPP-konto"
 
 #. *< type
 #. *< ui_requirement
@@ -3705,9 +3828,8 @@
 #. *  description
 #: ../libpurple/protocols/bonjour/bonjour.c:467
 #: ../libpurple/protocols/bonjour/bonjour.c:469
-#, fuzzy
 msgid "Bonjour Protocol Plugin"
-msgstr "Yahoo-protokolltillegg"
+msgstr "Bonjour-protokolltillegg"
 
 #: ../libpurple/protocols/bonjour/bonjour.c:610
 #, fuzzy
@@ -3721,30 +3843,27 @@
 #: ../libpurple/protocols/silc/silc.c:1011
 #: ../libpurple/protocols/silc10/silc.c:681
 #: ../libpurple/protocols/silc10/silc.c:922
-#, fuzzy
 msgid "E-mail"
-msgstr "E-post:"
+msgstr "E-post"
 
 #: ../libpurple/protocols/bonjour/bonjour.h:33
 msgid "Bonjour"
-msgstr ""
+msgstr "Bonjour"
 
 #: ../libpurple/protocols/bonjour/jabber.c:380
-#, fuzzy, c-format
+#, c-format
 msgid "%s has closed the conversation."
-msgstr "%s har blitt invitert til denne samtalen."
+msgstr "%s har lukket samtalen."
 
 #: ../libpurple/protocols/bonjour/jabber.c:437
 #: ../libpurple/protocols/bonjour/jabber.c:660
 #: ../libpurple/protocols/bonjour/jabber.c:678
-#, fuzzy
 msgid "Unable to send the message, the conversation couldn't be started."
-msgstr "Kunne ikke sende beskjed. Beskjeden er for stor."
+msgstr "Kunne ikke sende beskjed, samtalen ble ikke startet."
 
 #: ../libpurple/protocols/bonjour/jabber.c:583
-#, fuzzy
 msgid "Cannot open socket"
-msgstr "Klartie ikke åpne socket"
+msgstr "Klarte ikke åpne socket"
 
 #: ../libpurple/protocols/bonjour/jabber.c:591
 #, fuzzy
@@ -3752,185 +3871,180 @@
 msgstr "Feil: kunne ikke koble til"
 
 #: ../libpurple/protocols/bonjour/jabber.c:615
-#, fuzzy
 msgid "Could not bind socket to port"
-msgstr "Kunne ikke opprette socket"
+msgstr "Kunne ikke knytte socket til port"
 
 #: ../libpurple/protocols/bonjour/jabber.c:623
-#, fuzzy
 msgid "Could not listen on socket"
-msgstr "Kunne ikke opprette socket"
-
-#: ../libpurple/protocols/gg/gg.c:76 ../libpurple/proxy.c:1829
+msgstr "Kunne ikke lytte på socket"
+
+#: ../libpurple/protocols/gg/gg.c:76
+#: ../libpurple/proxy.c:1829
 msgid "Invalid proxy settings"
 msgstr "Ugyldige proxyinnstilinger"
 
-#: ../libpurple/protocols/gg/gg.c:77 ../libpurple/proxy.c:1829
-msgid ""
-"Either the host name or port number specified for your given proxy type is "
-"invalid."
+#: ../libpurple/protocols/gg/gg.c:77
+#: ../libpurple/proxy.c:1829
+msgid "Either the host name or port number specified for your given proxy type is invalid."
 msgstr "Det spesifiserte maskinnavnet eller portnummeret for proxy er ugyldig."
 
-#: ../libpurple/protocols/gg/gg.c:115 ../libpurple/protocols/gg/gg.c:137
+#: ../libpurple/protocols/gg/gg.c:115
+#: ../libpurple/protocols/gg/gg.c:137
 #: ../libpurple/protocols/gg/gg.c:180
 #, fuzzy
 msgid "Token Error"
 msgstr "Ukjent feil"
 
-#: ../libpurple/protocols/gg/gg.c:116 ../libpurple/protocols/gg/gg.c:138
+#: ../libpurple/protocols/gg/gg.c:116
+#: ../libpurple/protocols/gg/gg.c:138
 #: ../libpurple/protocols/gg/gg.c:181
-#, fuzzy
 msgid "Unable to fetch the token.\n"
-msgstr "Klarte ikke hente ned romliste."
-
-#: ../libpurple/protocols/gg/gg.c:269 ../libpurple/protocols/gg/gg.c:288
-#, fuzzy
+msgstr "Klarte ikke hente ned romliste.\n"
+
+#: ../libpurple/protocols/gg/gg.c:269
+#: ../libpurple/protocols/gg/gg.c:288
 msgid "Save Buddylist..."
-msgstr "Sende kontaktliste"
+msgstr "Lagre kontaktliste..."
 
 #: ../libpurple/protocols/gg/gg.c:270
 msgid "Your buddylist is empty, nothing was written to the file."
 msgstr "Kompislisten din er tom, ingenting ble skrevet til filen."
 
-#: ../libpurple/protocols/gg/gg.c:276 ../libpurple/protocols/gg/gg.c:278
-#, fuzzy
+#: ../libpurple/protocols/gg/gg.c:276
+#: ../libpurple/protocols/gg/gg.c:278
 msgid "Couldn't open file"
-msgstr "Kan ikke sende fil"
+msgstr "Kunne ikke åpne filen"
 
 #: ../libpurple/protocols/gg/gg.c:289
-#, fuzzy
 msgid "Buddylist saved successfully!"
-msgstr "Passordet er endret"
-
-#: ../libpurple/protocols/gg/gg.c:307 ../libpurple/protocols/gg/gg.c:308
-#, fuzzy
+msgstr "Lagring av kompisliste var vellykket!"
+
+#: ../libpurple/protocols/gg/gg.c:307
+#: ../libpurple/protocols/gg/gg.c:308
 msgid "Couldn't load buddylist"
-msgstr "Kunne ikke eksportere kontaktliste"
+msgstr "Kunne ikke laste kontaktliste"
 
 #: ../libpurple/protocols/gg/gg.c:324
-#, fuzzy
 msgid "Load Buddylist..."
-msgstr "_Alias for kontakt..."
+msgstr "Last Kontaktliste..."
 
 #: ../libpurple/protocols/gg/gg.c:325
-#, fuzzy
 msgid "Buddylist loaded successfully!"
-msgstr "Passordet er endret"
+msgstr "Lasting av kontaktliste var vellykket!"
 
 #: ../libpurple/protocols/gg/gg.c:336
-#, fuzzy
 msgid "Save buddylist..."
-msgstr "Sende kontaktliste"
+msgstr "Lagre kontaktliste..."
 
 #: ../libpurple/protocols/gg/gg.c:384
 msgid "Fill in the registration fields."
 msgstr "Fyll inn registrerings feltene."
 
 #: ../libpurple/protocols/gg/gg.c:389
-#, fuzzy
 msgid "Passwords do not match."
-msgstr "De nye passordene stemmer ikke overens."
+msgstr "Passordene stemmer ikke overens."
 
 #: ../libpurple/protocols/gg/gg.c:398
-#, fuzzy
 msgid "Unable to register new account. Error occurred.\n"
-msgstr "Kunne ikke lage ny tilkobling."
+msgstr "Kunne ikke registere ny konto. En feil oppsto.\n"
 
 #: ../libpurple/protocols/gg/gg.c:411
 msgid "New Gadu-Gadu Account Registered"
 msgstr "Ny Gadu-Gadu konto registrert"
 
 #: ../libpurple/protocols/gg/gg.c:412
-#, fuzzy
 msgid "Registration completed successfully!"
 msgstr "Registreringen var vellykket!"
 
-#: ../libpurple/protocols/gg/gg.c:482 ../libpurple/protocols/gg/gg.c:775
+#: ../libpurple/protocols/gg/gg.c:482
+#: ../libpurple/protocols/gg/gg.c:775
 #: ../libpurple/protocols/jabber/jabber.c:913
 #: ../libpurple/protocols/jabber/jabber.c:916
 #: ../libpurple/protocols/jabber/jabber.c:1722
 msgid "Password"
 msgstr "Passord"
 
-#: ../libpurple/protocols/gg/gg.c:487 ../libpurple/protocols/gg/gg.c:780
-#, fuzzy
+#: ../libpurple/protocols/gg/gg.c:487
+#: ../libpurple/protocols/gg/gg.c:780
 msgid "Password (retype)"
-msgstr "Passord sendt"
-
-#: ../libpurple/protocols/gg/gg.c:492 ../libpurple/protocols/gg/gg.c:785
-#, fuzzy
+msgstr "Passord (skriv på nytt)"
+
+#: ../libpurple/protocols/gg/gg.c:492
+#: ../libpurple/protocols/gg/gg.c:785
 msgid "Enter current token"
-msgstr "%s er ikke pålogget."
-
-#: ../libpurple/protocols/gg/gg.c:498 ../libpurple/protocols/gg/gg.c:791
-#, fuzzy
+msgstr "Skriv inn gjeldende kjennemerke"
+
+#: ../libpurple/protocols/gg/gg.c:498
+#: ../libpurple/protocols/gg/gg.c:791
 msgid "Current token"
-msgstr "Pålogget på"
-
-#: ../libpurple/protocols/gg/gg.c:502 ../libpurple/protocols/gg/gg.c:503
-#, fuzzy
+msgstr "Gjeldende kjennemerke"
+
+#: ../libpurple/protocols/gg/gg.c:502
+#: ../libpurple/protocols/gg/gg.c:503
 msgid "Register New Gadu-Gadu Account"
-msgstr "Registrere ny jabber-konto"
+msgstr "Registrere Ny Gadu-Gadu Konto"
 
 #: ../libpurple/protocols/gg/gg.c:504
 msgid "Please, fill in the following fields"
-msgstr "Vennligst fyll ut de følgende felt."
-
-#: ../libpurple/protocols/gg/gg.c:642 ../libpurple/protocols/gg/gg.c:1054
+msgstr "Vennligst fyll ut de følgende felt"
+
+#: ../libpurple/protocols/gg/gg.c:642
+#: ../libpurple/protocols/gg/gg.c:1054
 #: ../libpurple/protocols/gg/gg.c:1126
 #: ../libpurple/protocols/jabber/jabber.c:957
-#: ../libpurple/protocols/oscar/oscar.c:3789
-#: ../libpurple/protocols/oscar/oscar.c:3802
+#: ../libpurple/protocols/oscar/oscar.c:3785
+#: ../libpurple/protocols/oscar/oscar.c:3798
 #: ../libpurple/protocols/qq/buddy_info.c:49
 msgid "City"
 msgstr "By"
 
 #: ../libpurple/protocols/gg/gg.c:647
 msgid "Year of birth"
-msgstr "Fødselsdato"
-
-#: ../libpurple/protocols/gg/gg.c:650 ../libpurple/protocols/msn/msn.c:1589
+msgstr "Fødselsår"
+
+#: ../libpurple/protocols/gg/gg.c:650
+#: ../libpurple/protocols/msn/msn.c:1699
 #: ../libpurple/protocols/myspace/user.c:115
-#: ../libpurple/protocols/oscar/oscar.c:3732
+#: ../libpurple/protocols/oscar/oscar.c:3728
 #: ../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
+#: ../libpurple/protocols/qq/qq.c:226
+#: ../libpurple/protocols/qq/qq.c:229
+#: ../libpurple/protocols/qq/qq.c:232
+#: ../libpurple/protocols/qq/qq.c:236
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1091
 msgid "Gender"
 msgstr "Kjønn"
 
 #: ../libpurple/protocols/gg/gg.c:651
 msgid "Male or female"
-msgstr ""
+msgstr "Hankjønn eller hunkjønn"
 
 #: ../libpurple/protocols/gg/gg.c:652
-#: ../libpurple/protocols/oscar/oscar.c:3732
+#: ../libpurple/protocols/oscar/oscar.c:3728
 #: ../libpurple/protocols/qq/buddy_info.c:83
 #: ../libpurple/protocols/qq/qq.c:226
 msgid "Male"
 msgstr "Hankjønn"
 
 #: ../libpurple/protocols/gg/gg.c:653
-#: ../libpurple/protocols/oscar/oscar.c:3732
+#: ../libpurple/protocols/oscar/oscar.c:3728
 #: ../libpurple/protocols/qq/buddy_info.c:84
 #: ../libpurple/protocols/qq/qq.c:229
 msgid "Female"
 msgstr "Hunkjønn"
 
 #: ../libpurple/protocols/gg/gg.c:657
-#, fuzzy
 msgid "Only online"
-msgstr "Pålogget"
-
-#: ../libpurple/protocols/gg/gg.c:661 ../libpurple/protocols/gg/gg.c:662
-#, fuzzy
+msgstr "Kun pålogget"
+
+#: ../libpurple/protocols/gg/gg.c:661
+#: ../libpurple/protocols/gg/gg.c:662
 msgid "Find buddies"
-msgstr "Dimme ned inaktive kontakter"
+msgstr "Finn kontakter"
 
 #: ../libpurple/protocols/gg/gg.c:663
-#, fuzzy
 msgid "Please, enter your search criteria below"
-msgstr "Skriv inn ditt nye passord"
+msgstr "Vennligst fyll inn dine søke kriterier under"
 
 #: ../libpurple/protocols/gg/gg.c:701
 msgid "Fill in the fields."
@@ -3941,236 +4055,227 @@
 msgstr "Ditt nåværende passord er forskjellig fra det du skrev."
 
 #: ../libpurple/protocols/gg/gg.c:727
-#, fuzzy
 msgid "Unable to change password. Error occurred.\n"
-msgstr "Kunne ikke bytte Gadu-Gadu-passord"
+msgstr "Kunne ikke bytte passord. En feil oppsto. \n"
 
 #: ../libpurple/protocols/gg/gg.c:736
-#, fuzzy
 msgid "Change password for the Gadu-Gadu account"
-msgstr "Endre passord for %s:"
+msgstr "Endre passord for Gadu-Gadu kontoen"
 
 #: ../libpurple/protocols/gg/gg.c:737
-#, fuzzy
 msgid "Password was changed successfully!"
-msgstr "Passordet er endret"
+msgstr "Endring av passord vellykket!"
 
 #: ../libpurple/protocols/gg/gg.c:770
-#, fuzzy
 msgid "Current password"
-msgstr "Feil passord."
+msgstr "Nåværende passord"
 
 #
 #: ../libpurple/protocols/gg/gg.c:795
-#, fuzzy
 msgid "Please, enter your current password and your new password for UIN: "
-msgstr "Skriv inn ditt nåværende passord og ditt nye passord."
-
-#: ../libpurple/protocols/gg/gg.c:799 ../libpurple/protocols/gg/gg.c:800
-#, fuzzy
+msgstr "Skriv inn ditt nåværende passord og ditt nye passord for UIN: "
+
+#: ../libpurple/protocols/gg/gg.c:799
+#: ../libpurple/protocols/gg/gg.c:800
 msgid "Change Gadu-Gadu Password"
-msgstr "Kunne ikke bytte Gadu-Gadu-passord"
+msgstr "Endre Gadu-Gadu-passord"
 
 #: ../libpurple/protocols/gg/gg.c:876
-#, fuzzy, c-format
+#, c-format
 msgid "Select a chat for buddy: %s"
-msgstr "Fjern samtalen fra kontaktlisten din"
-
-#: ../libpurple/protocols/gg/gg.c:879 ../libpurple/protocols/gg/gg.c:880
-#, fuzzy
+msgstr "Velg en samtale for kontakt: %s"
+
+#: ../libpurple/protocols/gg/gg.c:879
+#: ../libpurple/protocols/gg/gg.c:880
 msgid "Add to chat..."
-msgstr "Legg til samtalegruppe"
+msgstr "Legg til samtale..."
 
 #: ../libpurple/protocols/gg/gg.c:1008
-#: ../libpurple/protocols/jabber/buddy.c:2031
-#: ../libpurple/protocols/novell/novell.c:2828
+#: ../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/qq/qq.c:170 ../libpurple/protocols/qq/qq.c:177
+#: ../libpurple/protocols/oscar/oscar.c:5602
+#: ../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:3098
+#: ../libpurple/status.c:154
+#: ../pidgin/gtkblist.c:3302
+#: ../pidgin/gtkblist.c:3640
+#: ../pidgin/gtkdocklet.c:450
+#: ../pidgin/gtkstatusbox.c:1061
 msgid "Offline"
 msgstr "Avlogget"
 
 #: ../libpurple/protocols/gg/gg.c:1011
-#: ../libpurple/protocols/jabber/buddy.c:2033
-#: ../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/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: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:3100
+#: ../libpurple/status.c:155
+#: ../pidgin/gtkdocklet.c:438
+#: ../pidgin/gtkstatusbox.c:1057
 msgid "Available"
 msgstr "Tilgjengelig"
 
 #. 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:1014
+#: ../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/qq/qq.c:180 ../libpurple/protocols/qq/qq.c:284
+#: ../libpurple/protocols/oscar/oscar.c:4543
+#: ../libpurple/protocols/oscar/oscar.c:5630
+#: ../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/yahoo/yahoo.c:3652
+#: ../libpurple/protocols/yahoo/yahoo.c:3726
+#: ../libpurple/status.c:158
+#: ../pidgin/gtkdocklet.c:442
+#: ../pidgin/gtkprefs.c:1941
 #: ../pidgin/gtkstatusbox.c:1058
-#, c-format
 msgid "Away"
 msgstr "Borte"
 
-#: ../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:1043
+#: ../libpurple/protocols/gg/gg.c:1117
+#: ../libpurple/protocols/oscar/oscar.c:2695
+#: ../libpurple/protocols/oscar/oscar.c:3695
 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:1046
+#: ../libpurple/protocols/gg/gg.c:1120
+#: ../libpurple/protocols/jabber/buddy.c:2213
+#: ../libpurple/protocols/jabber/buddy.c:2389
+#: ../libpurple/protocols/oscar/oscar.c:3706
 #: ../libpurple/protocols/silc/ops.c:990
 #: ../libpurple/protocols/silc10/ops.c:1024
 msgid "First Name"
 msgstr "Fornavn"
 
-#: ../libpurple/protocols/gg/gg.c:1059 ../libpurple/protocols/gg/gg.c:1129
+#: ../libpurple/protocols/gg/gg.c:1059
+#: ../libpurple/protocols/gg/gg.c:1129
 msgid "Birth Year"
 msgstr "Fødselsår"
 
-#: ../libpurple/protocols/gg/gg.c:1111 ../libpurple/protocols/gg/gg.c:1180
-#: ../libpurple/protocols/oscar/oscar.c:3911
-#, fuzzy
+#: ../libpurple/protocols/gg/gg.c:1111
+#: ../libpurple/protocols/gg/gg.c:1180
+#: ../libpurple/protocols/oscar/oscar.c:3907
 msgid "Unable to display the search results."
-msgstr "Kunne ikke invitere bruker (%s)."
+msgstr "Kunne ikke vise søke-resultatene."
 
 #: ../libpurple/protocols/gg/gg.c:1171
 msgid "Gadu-Gadu Public Directory"
-msgstr ""
+msgstr "Gadu-Gadu Offentlig Mappe"
 
 #: ../libpurple/protocols/gg/gg.c:1172
-#, fuzzy
 msgid "Search results"
 msgstr "Søkeresultater"
 
 #: ../libpurple/protocols/gg/gg.c:1215
-#, fuzzy
 msgid "No matching users found"
-msgstr "Ingen logger ble funnet"
+msgstr "Ingen matchende brukere funnet"
 
 #: ../libpurple/protocols/gg/gg.c:1216
-#, fuzzy
 msgid "There are no users matching your search criteria."
-msgstr "Skriv inn ditt nye passord"
-
-#: ../libpurple/protocols/gg/gg.c:1310 ../libpurple/protocols/gg/gg.c:1463
+msgstr "Ingen brukere matchet dine søkekriterier."
+
+#: ../libpurple/protocols/gg/gg.c:1310
+#: ../libpurple/protocols/gg/gg.c:1463
 msgid "Unable to read socket"
 msgstr "Kunne ikke lese socket"
 
 #: ../libpurple/protocols/gg/gg.c:1395
-#, fuzzy
 msgid "Buddy list downloaded"
-msgstr "Kontakt er inaktiv:"
+msgstr "Kontaktliste nedlastet"
 
 #: ../libpurple/protocols/gg/gg.c:1396
-#, fuzzy
 msgid "Your buddy list was downloaded from the server."
-msgstr "Du har blitt koblet fra tjeneren."
+msgstr "Kontaktlisten din har blitt lastet ned fra serveren."
 
 #: ../libpurple/protocols/gg/gg.c:1403
-#, fuzzy
 msgid "Buddy list uploaded"
-msgstr "Kontaktvisning"
+msgstr "Kontaktliste lastet opp"
 
 #: ../libpurple/protocols/gg/gg.c:1404
-#, fuzzy
 msgid "Your buddy list was stored on the server."
-msgstr "Det er ingen kontaktliste på Gadu-Gadu-tjeneren."
-
-#: ../libpurple/protocols/gg/gg.c:1509 ../libpurple/protocols/gg/gg.c:1715
-#, fuzzy
+msgstr "Kontaktlisten ble lagret på serveren."
+
+#: ../libpurple/protocols/gg/gg.c:1509
+#: ../libpurple/protocols/gg/gg.c:1715
 msgid "Connection failed."
-msgstr "Tilkopling feilet"
-
-#: ../libpurple/protocols/gg/gg.c:1621 ../libpurple/protocols/msn/msn.c:559
+msgstr "Tilkobling feilet."
+
+#: ../libpurple/protocols/gg/gg.c:1621
+#: ../libpurple/protocols/msn/msn.c:621
 msgid "Blocked"
 msgstr "Blokkert"
 
 #: ../libpurple/protocols/gg/gg.c:1644
-#, fuzzy
 msgid "Add to chat"
 msgstr "Legg til samtale"
 
 #: ../libpurple/protocols/gg/gg.c:1653
-#, fuzzy
 msgid "Unblock"
-msgstr "Blokker"
+msgstr "Ikke Blokker"
 
 #: ../libpurple/protocols/gg/gg.c:1657
 msgid "Block"
 msgstr "Blokker"
 
 #: ../libpurple/protocols/gg/gg.c:1674
-#, fuzzy
 msgid "Chat _name:"
-msgstr "Etternavn:"
+msgstr "Samtale _navn:"
 
 #: ../libpurple/protocols/gg/gg.c:1914
-#, fuzzy
 msgid "Chat error"
-msgstr "Lesefeil"
+msgstr "Samtalefeil"
 
 #: ../libpurple/protocols/gg/gg.c:1915
-#, fuzzy
 msgid "This chat name is already in use"
-msgstr "Filen eksisterer allerede."
+msgstr "Dette samtalenavnet er allerede i bruk"
 
 #: ../libpurple/protocols/gg/gg.c:1998
-#, fuzzy
 msgid "Not connected to the server."
-msgstr "Du har blitt koblet fra tjeneren."
+msgstr "Ikke tilkoblet tjeneren."
 
 #: ../libpurple/protocols/gg/gg.c:2021
-#, fuzzy
 msgid "Find buddies..."
-msgstr "Dimme ned inaktive kontakter"
+msgstr "Finn kontakter..."
 
 #: ../libpurple/protocols/gg/gg.c:2027
-#, fuzzy
 msgid "Change password..."
-msgstr "Bytt passord..."
+msgstr "Endre passord..."
 
 #: ../libpurple/protocols/gg/gg.c:2033
-#, fuzzy
 msgid "Upload buddylist to Server"
-msgstr "Eksporter kontaktliste til tjener"
+msgstr "Eksporter kontaktliste til Server"
 
 #: ../libpurple/protocols/gg/gg.c:2037
-#, fuzzy
 msgid "Download buddylist from Server"
-msgstr "Slett kontaktliste fra tjener"
+msgstr "Last ned  kontaktliste fra Server"
 
 #: ../libpurple/protocols/gg/gg.c:2041
-#, fuzzy
 msgid "Delete buddylist from Server"
-msgstr "Slett kontaktliste fra tjener"
+msgstr "Slett kontaktliste fra Server"
 
 #: ../libpurple/protocols/gg/gg.c:2045
-#, fuzzy
 msgid "Save buddylist to file..."
-msgstr "Lagre kompisliste til fil"
+msgstr "Lagre kompisliste til fil..."
 
 #: ../libpurple/protocols/gg/gg.c:2049
-#, fuzzy
 msgid "Load buddylist from file..."
-msgstr "Importer kontaktliste fra tjener"
+msgstr "Last inn kontaktliste fra fil..."
 
 #. magic
 #. major_version
@@ -4190,12 +4295,11 @@
 #. summary
 #: ../libpurple/protocols/gg/gg.c:2154
 msgid "Polish popular IM"
-msgstr ""
+msgstr "Populær Polsk Lynmeldingsklient"
 
 #: ../libpurple/protocols/gg/gg.c:2208
-#, fuzzy
 msgid "Gadu-Gadu User"
-msgstr "Gadu-Gadu søkemotor"
+msgstr "Gadu-Gadu Bruker"
 
 #: ../libpurple/protocols/irc/cmds.c:43
 #: ../libpurple/protocols/silc/silc.c:1637
@@ -4224,15 +4328,13 @@
 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:269
 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:278
 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:287
-#, fuzzy
 msgid "File Transfer Failed"
-msgstr "Filoverføring avbrutt."
+msgstr "Filoverføring feilet"
 
 #: ../libpurple/protocols/irc/dcc_send.c:297
 #: ../libpurple/protocols/irc/dcc_send.c:338
-#, fuzzy
 msgid "Could not open a listening port."
-msgstr "Gaim kunne ikke åpne en inngående port"
+msgstr "Kunne ikke åpne port for lytting."
 
 #: ../libpurple/protocols/irc/irc.c:79
 msgid "Error displaying MOTD"
@@ -4251,9 +4353,11 @@
 msgid "MOTD for %s"
 msgstr "MOTD for %s"
 
-#: ../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/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:2354
 msgid "Server has disconnected"
 msgstr "Tjeneren har koplet fra"
 
@@ -4261,15 +4365,17 @@
 msgid "View MOTD"
 msgstr "Vis MOTD"
 
-#: ../libpurple/protocols/irc/irc.c:261 ../libpurple/protocols/silc/chat.c:33
+#: ../libpurple/protocols/irc/irc.c:261
+#: ../libpurple/protocols/silc/chat.c:33
 #: ../libpurple/protocols/silc10/chat.c:33
 msgid "_Channel:"
 msgstr "_Kanal:"
 
 #: ../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:524
 msgid "_Password:"
-msgstr "_Passord"
+msgstr "_Passord:"
 
 #: ../libpurple/protocols/irc/irc.c:298
 msgid "IRC nicks may not contain whitespace"
@@ -4279,15 +4385,16 @@
 #. 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/msn/session.c:384
+#: ../libpurple/protocols/myspace/myspace.c:302
+#: ../libpurple/protocols/novell/novell.c:2187
 #: ../libpurple/protocols/oscar/oscar.c:1287
 #: ../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/zephyr/zephyr.c:1621 ../pidgin/gtkstatusbox.c:662
+#: ../libpurple/protocols/simple/simple.c:1718
+#: ../libpurple/protocols/yahoo/yahoo.c:2938
+#: ../libpurple/protocols/zephyr/zephyr.c:1621
+#: ../pidgin/gtkstatusbox.c:662
 msgid "Connecting"
 msgstr "Kobler til"
 
@@ -4300,20 +4407,21 @@
 #. 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/myspace/myspace.c:318
 #: ../libpurple/protocols/simple/simple.c:464
-#: ../libpurple/protocols/simple/simple.c:1631
+#: ../libpurple/protocols/simple/simple.c:1633
 msgid "Couldn't create socket"
 msgstr "Kunne ikke opprette socket"
 
 #: ../libpurple/protocols/irc/irc.c:421
-#: ../libpurple/protocols/myspace/myspace.c:2469
+#: ../libpurple/protocols/myspace/myspace.c:2467
 #: ../libpurple/protocols/oscar/oscar.c:1283
 msgid "Couldn't connect to host"
 msgstr "Kunne ikke koble til"
 
-#: ../libpurple/protocols/irc/irc.c:609 ../libpurple/protocols/irc/irc.c:634
-#: ../libpurple/protocols/myspace/myspace.c:2352
+#: ../libpurple/protocols/irc/irc.c:609
+#: ../libpurple/protocols/irc/irc.c:634
+#: ../libpurple/protocols/myspace/myspace.c:2350
 msgid "Read error"
 msgstr "Lesefeil"
 
@@ -4332,7 +4440,7 @@
 #: ../libpurple/protocols/silc10/ops.c:1382
 #: ../libpurple/protocols/yahoo/yahoochat.c:1506
 msgid "Topic"
-msgstr "Tema:"
+msgstr "Tema"
 
 #. *< type
 #. *< ui_requirement
@@ -4349,26 +4457,28 @@
 #. *  summary
 #: ../libpurple/protocols/irc/irc.c:915
 msgid "The IRC Protocol Plugin that Sucks Less"
-msgstr "IRC-protokolltillegg"
+msgstr "IRC-protokolltillegget som Suger mindre"
 
 #. 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/irc/irc.c:940
+#: ../libpurple/protocols/irc/msgs.c:323
+#: ../libpurple/protocols/msn/msn.c:2297
+#: ../libpurple/protocols/oscar/oscar.c:6669
 #: ../libpurple/protocols/qq/qq.c:755
 #: ../libpurple/protocols/sametime/sametime.c:5727
 #: ../libpurple/protocols/silc/ops.c:1249
 #: ../libpurple/protocols/silc/ops.c:1341
 #: ../libpurple/protocols/silc10/ops.c:1244
 #: ../libpurple/protocols/silc10/ops.c:1347
-#: ../libpurple/protocols/simple/simple.c:1896
+#: ../libpurple/protocols/simple/simple.c:1898
 #: ../libpurple/protocols/toc/toc.c:2327
 msgid "Server"
-msgstr "Tjener"
+msgstr "Server"
 
 #. 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:2302
+#: ../libpurple/protocols/oscar/oscar.c:6672
 #: ../libpurple/protocols/qq/qq.c:758
 #: ../libpurple/protocols/sametime/sametime.c:5732
 #: ../libpurple/protocols/silc/silc.c:1918
@@ -4379,9 +4489,10 @@
 
 #: ../libpurple/protocols/irc/irc.c:946
 msgid "Encodings"
-msgstr "Tegnkodinger:"
-
-#: ../libpurple/protocols/irc/irc.c:949 ../libpurple/protocols/irc/msgs.c:316
+msgstr "Tegnkodinger"
+
+#: ../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
@@ -4399,7 +4510,8 @@
 msgid "Username"
 msgstr "Brukernavn"
 
-#: ../libpurple/protocols/irc/irc.c:952 ../libpurple/protocols/irc/msgs.c:317
+#: ../libpurple/protocols/irc/irc.c:952
+#: ../libpurple/protocols/irc/msgs.c:317
 #: ../libpurple/protocols/silc/silc.c:1009
 #: ../libpurple/protocols/silc10/silc.c:920
 msgid "Real name"
@@ -4410,9 +4522,8 @@
 #. prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 #.
 #: ../libpurple/protocols/irc/irc.c:960
-#, fuzzy
 msgid "Use SSL"
-msgstr "SSL"
+msgstr "Bruk SSL"
 
 #: ../libpurple/protocols/irc/msgs.c:187
 msgid "Bad mode"
@@ -4430,7 +4541,7 @@
 #: ../libpurple/protocols/irc/msgs.c:216
 #, c-format
 msgid "Cannot ban %s: banlist is full"
-msgstr "Kan ikke bannlyse %s: Bannlysninslista er full."
+msgstr "Kan ikke bannlyse %s: Bannlysninslista er full"
 
 #: ../libpurple/protocols/irc/msgs.c:301
 msgid " <i>(ircop)</i>"
@@ -4441,7 +4552,7 @@
 msgstr " <i>(registrert)</i>"
 
 #: ../libpurple/protocols/irc/msgs.c:303
-#: ../libpurple/protocols/oscar/oscar.c:3700
+#: ../libpurple/protocols/oscar/oscar.c:3696
 #: ../libpurple/protocols/silc/ops.c:1418
 #: ../libpurple/protocols/silc10/ops.c:1414
 msgid "Nick"
@@ -4454,37 +4565,35 @@
 msgstr "Pålogget på"
 
 #: ../libpurple/protocols/irc/msgs.c:334
-#, fuzzy
 msgid "Idle for"
-msgstr "Inaktiv"
+msgstr "Inaktiv for"
 
 #: ../libpurple/protocols/irc/msgs.c:337
 msgid "Online since"
 msgstr "Pålogget siden"
 
 #: ../libpurple/protocols/irc/msgs.c:341
-#, fuzzy
 msgid "<b>Defining adjective:</b>"
-msgstr "<br><b>Beskrivelse:</b> Strålende<br>"
+msgstr "<b>Definerer adjektiv:</b>"
 
 #: ../libpurple/protocols/irc/msgs.c:341
 msgid "Glorious"
-msgstr ""
+msgstr "Strålende"
 
 #: ../libpurple/protocols/irc/msgs.c:420
 #, c-format
 msgid "%s has changed the topic to: %s"
-msgstr "%s har endret kanaltema til: %s"
+msgstr "%s har endret temaet til: %s"
 
 #: ../libpurple/protocols/irc/msgs.c:422
-#, fuzzy, c-format
+#, c-format
 msgid "%s has cleared the topic."
-msgstr "%s har endret kanaltema til: %s"
+msgstr "%s har endret tema."
 
 #: ../libpurple/protocols/irc/msgs.c:430
 #, c-format
 msgid "The topic for %s is: %s"
-msgstr "Kanaltema for %s er %s"
+msgstr "Temaet for %s er: %s"
 
 #: ../libpurple/protocols/irc/msgs.c:448
 #, c-format
@@ -4496,9 +4605,8 @@
 msgstr "Ukjent beskjed"
 
 #: ../libpurple/protocols/irc/msgs.c:449
-#, fuzzy
 msgid "The IRC server received a message it did not understand."
-msgstr "Gaim har sendt en beskjed som IRC-tjeneren ikke forstod."
+msgstr "Pidgin har sendt en beskjed som IRC-tjeneren ikke forstod."
 
 #: ../libpurple/protocols/irc/msgs.c:470
 #, c-format
@@ -4507,9 +4615,8 @@
 
 #
 #: ../libpurple/protocols/irc/msgs.c:575
-#, fuzzy
 msgid "Time Response"
-msgstr "Tid"
+msgstr "Responstid"
 
 #: ../libpurple/protocols/irc/msgs.c:576
 msgid "The IRC server's local time is:"
@@ -4551,7 +4658,8 @@
 msgstr "Du har blitt sparket ut fra %s: %s"
 
 #. Remove user from channel
-#: ../libpurple/protocols/irc/msgs.c:800 ../libpurple/protocols/silc/ops.c:699
+#: ../libpurple/protocols/irc/msgs.c:800
+#: ../libpurple/protocols/silc/ops.c:699
 #: ../libpurple/protocols/silc10/ops.c:720
 #, c-format
 msgid "Kicked by %s (%s)"
@@ -4562,26 +4670,18 @@
 msgid "mode (%s %s) by %s"
 msgstr "mode (%s %s) av %s"
 
-#: ../libpurple/protocols/irc/msgs.c:908 ../libpurple/protocols/irc/msgs.c:909
+#: ../libpurple/protocols/irc/msgs.c:908
+#: ../libpurple/protocols/irc/msgs.c:909
 msgid "Invalid nickname"
 msgstr "Ugyldig brukernavn"
 
 #: ../libpurple/protocols/irc/msgs.c:910
-#, fuzzy
-msgid ""
-"Your selected nickname was rejected by the server.  It probably contains "
-"invalid characters."
-msgstr ""
-"Ditt valgte kontonavn ble avvist av tjeneren. Sannsynligvis inneholder det "
-"ugyldige tegn."
+msgid "Your selected nickname was rejected by the server.  It probably contains invalid characters."
+msgstr "Ditt valgte kontonavn ble avvist av tjeneren. Sannsynligvis inneholder det ugyldige tegn."
 
 #: ../libpurple/protocols/irc/msgs.c:915
-msgid ""
-"Your selected account name was rejected by the server.  It probably contains "
-"invalid characters."
-msgstr ""
-"Ditt valgte kontonavn ble avvist av tjeneren. Sannsynligvis inneholder det "
-"ugyldige tegn."
+msgid "Your selected account name was rejected by the server.  It probably contains invalid characters."
+msgstr "Ditt valgte kontonavn ble avvist av tjeneren. Sannsynligvis inneholder det ugyldige tegn."
 
 #: ../libpurple/protocols/irc/msgs.c:954
 msgid "Cannot change nick"
@@ -4606,9 +4706,9 @@
 msgstr "PING-svar -- lag: %lu sekunder"
 
 #: ../libpurple/protocols/irc/msgs.c:1110
-#, fuzzy, c-format
+#, c-format
 msgid "Cannot join %s: Registration is required."
-msgstr "Registrering kreves"
+msgstr "Kan ikke joine %s: Registrering kreves."
 
 #: ../libpurple/protocols/irc/msgs.c:1111
 #: ../libpurple/protocols/silc/ops.c:1093
@@ -4617,9 +4717,8 @@
 msgstr "Kan ikke bli med i kanal"
 
 #: ../libpurple/protocols/irc/msgs.c:1145
-#, fuzzy
 msgid "Nick or channel is temporarily unavailable."
-msgstr "Tjenesten er midlertidig utilgjengelig."
+msgstr "Nick eller kanal er midlertidig utilgjengelig."
 
 #: ../libpurple/protocols/irc/msgs.c:1157
 #, c-format
@@ -4631,157 +4730,93 @@
 msgstr "action &lt;action to perform&gt;:  Utfør noe."
 
 #: ../libpurple/protocols/irc/parse.c:123
-#, fuzzy
-msgid ""
-"away [message]:  Set an away message, or use no message to return from being "
-"away."
-msgstr ""
-"fraværende [melding]:  Sett en melding som skal vises når du er fraværende, "
-"eller ikke sett noen for å returnere."
+msgid "away [message]:  Set an away message, or use no message to return from being away."
+msgstr "fraværende [melding]:  Sett en melding som skal vises når du er fraværende, eller ikke sett noen for å returnere."
 
 #: ../libpurple/protocols/irc/parse.c:124
-#, fuzzy
 msgid "chanserv: Send a command to chanserv"
-msgstr "quote [...]:  Send en rå kommando til serveren."
+msgstr "chanserv:  Send en kommando til chanserv"
 
 #: ../libpurple/protocols/irc/parse.c:125
-msgid ""
-"deop &lt;nick1&gt; [nick2] ...:  Remove channel operator status from "
-"someone. You must be a channel operator to do this."
-msgstr ""
-"deop &lt;nick1&gt; [nick2] ...:  Fjern kanal OP status fra noen. Du må være "
-"kanal OP for å gjøre dette."
+msgid "deop &lt;nick1&gt; [nick2] ...:  Remove channel operator status from someone. You must be a channel operator to do this."
+msgstr "deop &lt;nick1&gt; [nick2] ...:  Fjern kanal OP status fra noen. Du må være kanal OP for å gjøre dette."
 
 #: ../libpurple/protocols/irc/parse.c:126
-msgid ""
-"devoice &lt;nick1&gt; [nick2] ...:  Remove channel voice status from "
-"someone, preventing them from speaking if the channel is moderated (+m). You "
-"must be a channel operator to do this."
-msgstr ""
-"devoice &lt;nick1&gt; [nick2] ...:  Fjern kanal voice status fra noen, "
-"hindre de fra å snakke om kanalen er moderert (+m). Du må være kanal OP for "
-"å gjøre dette."
+msgid "devoice &lt;nick1&gt; [nick2] ...:  Remove channel voice status from someone, preventing them from speaking if the channel is moderated (+m). You must be a channel operator to do this."
+msgstr "devoice &lt;nick1&gt; [nick2] ...:  Fjern kanal voice status fra noen, hindre de fra å snakke om kanalen er moderert (+m). Du må være kanal OP for å gjøre dette."
 
 #: ../libpurple/protocols/irc/parse.c:127
-msgid ""
-"invite &lt;nick&gt; [room]:  Invite someone to join you in the specified "
-"channel, or the current channel."
-msgstr ""
-"invite &lt;nick&gt; [room]:  Inviter noen til å joine deg i spsifisert kanel "
-"eller den nåværende kanalen."
+msgid "invite &lt;nick&gt; [room]:  Invite someone to join you in the specified channel, or the current channel."
+msgstr "invite &lt;nick&gt; [room]:  Inviter noen til å joine deg i spsifisert kanel eller den nåværende kanalen."
 
 #: ../libpurple/protocols/irc/parse.c:128
-msgid ""
-"j &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more "
-"channels, optionally providing a channel key for each if needed."
-msgstr ""
-"j &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Fyll inn en eller flere "
-"kanaler, alternativt gi en nøkkel for hver om nødvendig."
+msgid "j &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more channels, optionally providing a channel key for each if needed."
+msgstr "j &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Fyll inn en eller flere kanaler, alternativt gi en nøkkel for hver om nødvendig."
 
 #: ../libpurple/protocols/irc/parse.c:129
-msgid ""
-"join &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more "
-"channels, optionally providing a channel key for each if needed."
-msgstr ""
-"join &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Fyll inn en eller "
-"flere kanaler, alternativt gi en nøkkel for hver om nødvendig."
+msgid "join &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more channels, optionally providing a channel key for each if needed."
+msgstr "join &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Fyll inn en eller flere kanaler, alternativt gi en nøkkel for hver om nødvendig."
 
 #: ../libpurple/protocols/irc/parse.c:130
-msgid ""
-"kick &lt;nick&gt; [message]:  Remove someone from a channel. You must be a "
-"channel operator to do this."
-msgstr ""
-"kick &lt;nick&gt; [message]:  Fjern noen fra en kanal. Du må være kanal OP "
-"for å gjøre dette."
+msgid "kick &lt;nick&gt; [message]:  Remove someone from a channel. You must be a channel operator to do this."
+msgstr "kick &lt;nick&gt; [message]:  Fjern noen fra en kanal. Du må være kanal OP for å gjøre dette."
 
 #: ../libpurple/protocols/irc/parse.c:131
-msgid ""
-"list:  Display a list of chat rooms on the network. <i>Warning, some servers "
-"may disconnect you upon doing this.</i>"
-msgstr ""
-"list:  Vis en liste over samtalerom på et nettverk.<i>Advarsel, noen servere "
-"kan disconnecte om du gjør dette.<i>"
+msgid "list:  Display a list of chat rooms on the network. <i>Warning, some servers may disconnect you upon doing this.</i>"
+msgstr "list:  Vis en liste over samtalerom på et nettverk.<i>Advarsel, noen servere kan disconnecte om du gjør dette.</i>"
 
 #: ../libpurple/protocols/irc/parse.c:132
 msgid "me &lt;action to perform&gt;:  Perform an action."
 msgstr "me &lt;action to perform&gt;:  Utfør noe."
 
 #: ../libpurple/protocols/irc/parse.c:133
-#, fuzzy
 msgid "memoserv: Send a command to memoserv"
-msgstr "quote [...]:  Send en rå kommando til serveren."
+msgstr "memoserv:  Send en kommando til memoserv"
 
 #: ../libpurple/protocols/irc/parse.c:134
-msgid ""
-"mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nick|channel&gt;:  Set or unset a channel "
-"or user mode."
-msgstr ""
-"mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nick|channel&gt;:  Sett er fjern en kanal "
-"eller bruker modus."
+msgid "mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nick|channel&gt;:  Set or unset a channel or user mode."
+msgstr "mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nick|channel&gt;:  Sett er fjern en kanal eller bruker modus."
 
 #: ../libpurple/protocols/irc/parse.c:135
-msgid ""
-"msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as "
-"opposed to a channel)."
-msgstr ""
-"msg &lt;nick&gt; &lt;message&gt;:  Send en privat beskjed til en bruker."
+msgid "msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as opposed to a channel)."
+msgstr "msg &lt;nick&gt; &lt;message&gt;:  Send en privat beskjed til en bruker."
 
 #: ../libpurple/protocols/irc/parse.c:136
 msgid "names [channel]:  List the users currently in a channel."
 msgstr "names [channel]:  Vis brukere i denne kanalen."
 
 #: ../libpurple/protocols/irc/parse.c:137
-#: ../libpurple/protocols/jabber/jabber.c:2261
+#: ../libpurple/protocols/jabber/jabber.c:2299
 msgid "nick &lt;new nickname&gt;:  Change your nickname."
 msgstr "nick &lt;new nickname&gt;:  Skift nick."
 
 #: ../libpurple/protocols/irc/parse.c:138
-#, fuzzy
 msgid "nickserv: Send a command to nickserv"
-msgstr "quote [...]:  Send en rå kommando til serveren."
+msgstr "nickserv:  Send en kommando til nickserv"
 
 #: ../libpurple/protocols/irc/parse.c:139
-msgid ""
-"op &lt;nick1&gt; [nick2] ...:  Grant channel operator status to someone. You "
-"must be a channel operator to do this."
-msgstr ""
-"op &lt;nick1&gt; [nick2] ...:  Tillat OP status til noen. Du må være kanal "
-"OP for å gjøre dette."
+msgid "op &lt;nick1&gt; [nick2] ...:  Grant channel operator status to someone. You must be a channel operator to do this."
+msgstr "op &lt;nick1&gt; [nick2] ...:  Tillat OP status til noen. Du må være kanal OP for å gjøre dette."
 
 #: ../libpurple/protocols/irc/parse.c:140
-msgid ""
-"operwall &lt;message&gt;:  If you don't know what this is, you probably "
-"can't use it."
-msgstr ""
-"operwall &lt;message&gt;:  Om du ikke vet hva dette er, kan du sannsynligvis "
-"ikke bruke dette."
+msgid "operwall &lt;message&gt;:  If you don't know what this is, you probably can't use it."
+msgstr "operwall &lt;message&gt;:  Om du ikke vet hva dette er, kan du sannsynligvis ikke bruke dette."
 
 #: ../libpurple/protocols/irc/parse.c:141
-#, fuzzy
 msgid "operserv: Send a command to operserv"
-msgstr "quote [...]:  Send en rå kommando til serveren."
+msgstr "operserv:  Send en kommando til operserv"
 
 #: ../libpurple/protocols/irc/parse.c:142
-msgid ""
-"part [room] [message]:  Leave the current channel, or a specified channel, "
-"with an optional message."
-msgstr ""
-"part [room] [message]:  Forlat nåværende kanal eller en spesifisert kanal "
-"med en beskjed."
+msgid "part [room] [message]:  Leave the current channel, or a specified channel, with an optional message."
+msgstr "part [room] [message]:  Forlat nåværende kanal eller en spesifisert kanal med en beskjed."
 
 #: ../libpurple/protocols/irc/parse.c:143
-msgid ""
-"ping [nick]:  Asks how much lag a user (or the server if no user specified) "
-"has."
+msgid "ping [nick]:  Asks how much lag a user (or the server if no user specified) has."
 msgstr "ping [nick]:  Send ping til en bruker."
 
 #: ../libpurple/protocols/irc/parse.c:144
-msgid ""
-"query &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as "
-"opposed to a channel)."
-msgstr ""
-"query &lt;nick&gt; &lt;message&gt;:  Send en privat beskjed til en bruker "
-"(vises ikke i kanal)."
+msgid "query &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as opposed to a channel)."
+msgstr "query &lt;nick&gt; &lt;message&gt;:  Send en privat beskjed til en bruker (vises ikke i kanal)."
 
 #: ../libpurple/protocols/irc/parse.c:145
 msgid "quit [message]:  Disconnect from the server, with an optional message."
@@ -4792,12 +4827,8 @@
 msgstr "quote [...]:  Send en rå kommando til serveren."
 
 #: ../libpurple/protocols/irc/parse.c:147
-msgid ""
-"remove &lt;nick&gt; [message]:  Remove someone from a room. You must be a "
-"channel operator to do this."
-msgstr ""
-"remove &lt;nick&gt; [message]:  Fjern noen fra et rom. Du må være kanal OP "
-"for å gjøre dette."
+msgid "remove &lt;nick&gt; [message]:  Remove someone from a room. You must be a channel operator to do this."
+msgstr "remove &lt;nick&gt; [message]:  Fjern noen fra et rom. Du må være kanal OP for å gjøre dette."
 
 #: ../libpurple/protocols/irc/parse.c:148
 msgid "time: Displays the current local time at the IRC server."
@@ -4813,32 +4844,23 @@
 
 #: ../libpurple/protocols/irc/parse.c:151
 msgid "version [nick]: send CTCP VERSION request to a user"
-msgstr ""
+msgstr "versjon [nick]: send CTCP VERSION forespørsel til en bruker"
 
 #: ../libpurple/protocols/irc/parse.c:152
-msgid ""
-"voice &lt;nick1&gt; [nick2] ...:  Grant channel voice status to someone. You "
-"must be a channel operator to do this."
-msgstr ""
-"voice &lt;nick1&gt; [nick2] ...:  Gi voice til noen. Du må være kanal OP for "
-"å gjøre dette."
+msgid "voice &lt;nick1&gt; [nick2] ...:  Grant channel voice status to someone. You must be a channel operator to do this."
+msgstr "voice &lt;nick1&gt; [nick2] ...:  Gi voice til noen. Du må være kanal OP for å gjøre dette."
 
 #: ../libpurple/protocols/irc/parse.c:153
-msgid ""
-"wallops &lt;message&gt;:  If you don't know what this is, you probably can't "
-"use it."
-msgstr ""
-"wallops &lt;message&gt;:  Om du ikke vet hva dette er, kan du sannsynligvis "
-"ikke bruke det."
+msgid "wallops &lt;message&gt;:  If you don't know what this is, you probably can't use it."
+msgstr "wallops &lt;message&gt;:  Om du ikke vet hva dette er, kan du sannsynligvis ikke bruke det."
 
 #: ../libpurple/protocols/irc/parse.c:154
 msgid "whois [server] &lt;nick&gt;:  Get information on a user."
 msgstr "whois [server] &lt;nick&gt;:  Hent informasjon om en bruker."
 
 #: ../libpurple/protocols/irc/parse.c:155
-#, fuzzy
 msgid "whowas &lt;nick&gt;: Get information on a user that has logged off."
-msgstr "whois [server] &lt;nick&gt;:  Hent informasjon om en bruker."
+msgstr "whowas &lt;nick&gt;: Få informasjon om en bruker som er logget av."
 
 #: ../libpurple/protocols/irc/parse.c:465
 #, c-format
@@ -4854,8 +4876,10 @@
 msgstr "CTCP PING-svar"
 
 #: ../libpurple/protocols/irc/parse.c:577
-#: ../libpurple/protocols/irc/parse.c:581 ../libpurple/protocols/toc/toc.c:191
-#: ../libpurple/protocols/toc/toc.c:694 ../libpurple/protocols/toc/toc.c:710
+#: ../libpurple/protocols/irc/parse.c:581
+#: ../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 "Frakoblet."
@@ -4869,36 +4893,26 @@
 
 #: ../libpurple/protocols/jabber/adhoccommands.c:139
 #: ../libpurple/protocols/jabber/adhoccommands.c:140
-#, fuzzy
 msgid "Ad-Hoc Command Failed"
-msgstr "Kommando deaktivert"
-
-#: ../libpurple/protocols/jabber/adhoccommands.c:173
-#, fuzzy
+msgstr "Ad-Hoc Kommando Feilet"
+
+#: ../libpurple/protocols/jabber/adhoccommands.c:176
 msgid "execute"
-msgstr "Uventet"
+msgstr "utfør"
 
 #: ../libpurple/protocols/jabber/auth.c:53
 msgid "Server requires TLS/SSL for login.  No TLS/SSL support found."
-msgstr ""
-"Tjeneren krever TLS/SSL for å logge inn, men støtte for dette ble ikke "
-"funnet."
+msgstr "Tjeneren krever TLS/SSL for å logge inn, men støtte for dette ble ikke funnet."
 
 #: ../libpurple/protocols/jabber/auth.c:116
 msgid "Server requires plaintext authentication over an unencrypted stream"
-msgstr ""
-"Tjeneren forlanger identitetsbekreftelse i ren tekst over en ukryptert "
-"forbindelse"
+msgstr "Tjeneren forlanger identitetsbekreftelse i ren tekst over en ukryptert forbindelse"
 
 #: ../libpurple/protocols/jabber/auth.c:319
 #: ../libpurple/protocols/jabber/auth.c:508
-#, fuzzy, c-format
-msgid ""
-"%s requires plaintext authentication over an unencrypted connection.  Allow "
-"this and continue authentication?"
-msgstr ""
-"Denne tjeneren forlanger autentifikasjon i ren tekst over en ukryptert "
-"forbindelse. Tillat dette og fortsett identitetsbekreftelse?"
+#, c-format
+msgid "%s requires plaintext authentication over an unencrypted connection.  Allow this and continue authentication?"
+msgstr "%s forlanger autentifikasjon i ren tekst over en ukryptert forbindelse. Tillat dette og fortsett identitetsbekreftelse?"
 
 #: ../libpurple/protocols/jabber/auth.c:321
 #: ../libpurple/protocols/jabber/auth.c:322
@@ -4927,22 +4941,17 @@
 msgstr "Ugyldig svar fra tjener."
 
 #: ../libpurple/protocols/jabber/auth.c:600
-msgid ""
-"This server requires plaintext authentication over an unencrypted "
-"connection.  Allow this and continue authentication?"
-msgstr ""
-"Denne tjeneren forlanger autentifikasjon i ren tekst over en ukryptert "
-"forbindelse. Tillat dette og fortsett identitetsbekreftelse?"
+msgid "This server requires plaintext authentication over an unencrypted connection.  Allow this and continue authentication?"
+msgstr "Denne tjeneren forlanger autentifikasjon i ren tekst over en ukryptert forbindelse. Tillat dette og fortsett identitetsbekreftelse?"
 
 #: ../libpurple/protocols/jabber/auth.c:797
 #: ../libpurple/protocols/jabber/auth.c:820
 msgid "Invalid challenge from server"
-msgstr "Ugyldig utfordring fra tjener."
+msgstr "Ugyldig utfordring fra server"
 
 #: ../libpurple/protocols/jabber/auth.c:892
-#, fuzzy
 msgid "SASL error"
-msgstr "Lesefeil"
+msgstr "SASL feil"
 
 #: ../libpurple/protocols/jabber/buddy.c:283
 #: ../libpurple/protocols/jabber/buddy.c:1219
@@ -5024,49 +5033,43 @@
 
 #: ../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:1768
+#: ../libpurple/protocols/oscar/oscar.c:3745
 msgid "Birthday"
 msgstr "Fødselsdag"
 
 #: ../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
+#: ../libpurple/protocols/jabber/usermood.c:175
+#: ../pidgin/gtkblist.c:3314
 #: ../pidgin/gtkprefs.c:739
 msgid "Description"
 msgstr "Beskrivelse"
 
 #: ../libpurple/protocols/jabber/buddy.c:722
 #: ../libpurple/protocols/jabber/buddy.c:723
-#, fuzzy
 msgid "Edit XMPP vCard"
-msgstr "Rediger vCard for Jabber"
+msgstr "Edit XMPP vCard"
 
 #: ../libpurple/protocols/jabber/buddy.c:724
-msgid ""
-"All items below are optional. Enter only the information with which you feel "
-"comfortable."
-msgstr ""
-"Alle feltene nedenfor er valgfrie. Du trenger bare å skrive den "
-"informasjonen du ønsker"
+msgid "All items below are optional. Enter only the information with which you feel comfortable."
+msgstr "Alle feltene nedenfor er valgfrie. Du trenger bare å skrive den informasjonen du ønsker."
 
 #: ../libpurple/protocols/jabber/buddy.c:795
 #: ../libpurple/protocols/jabber/buddy.c:960
-#, fuzzy
 msgid "Client"
-msgstr "By"
+msgstr "Klient"
 
 #: ../libpurple/protocols/jabber/buddy.c:799
 #: ../libpurple/protocols/jabber/buddy.c:964
-#, fuzzy
 msgid "Operating System"
-msgstr "Skjul operativsystem"
+msgstr "Operativsystem"
 
 #: ../libpurple/protocols/jabber/buddy.c:815
 #: ../libpurple/protocols/jabber/buddy.c:975
 msgid "Last Activity"
-msgstr ""
+msgstr "Siste aktivitet"
 
 #: ../libpurple/protocols/jabber/buddy.c:817
 #: ../libpurple/protocols/jabber/buddy.c:977
@@ -5077,7 +5080,7 @@
 #: ../libpurple/protocols/jabber/buddy.c:819
 #: ../libpurple/protocols/jabber/buddy.c:979
 msgid "Service Discovery Items"
-msgstr ""
+msgstr "Service Discovery Items"
 
 #: ../libpurple/protocols/jabber/buddy.c:821
 #: ../libpurple/protocols/jabber/buddy.c:981
@@ -5093,35 +5096,33 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:825
 #: ../libpurple/protocols/jabber/buddy.c:985
-#, fuzzy
 msgid "Multi-User Chat Extended Presence Information"
-msgstr "Brukeren har ingen kataloginformasjon."
+msgstr "Brukeren har ingen kataloginformasjon"
 
 #: ../libpurple/protocols/jabber/buddy.c:827
 #: ../libpurple/protocols/jabber/buddy.c:987
 msgid "In-Band Bytestreams"
-msgstr ""
+msgstr "In-Band Bytestreams"
 
 #: ../libpurple/protocols/jabber/buddy.c:829
 #: ../libpurple/protocols/jabber/buddy.c:989
-#, fuzzy
 msgid "Ad-Hoc Commands"
-msgstr "Kommando"
+msgstr "Ad-Hoc Kommandoer"
 
 #: ../libpurple/protocols/jabber/buddy.c:831
 #: ../libpurple/protocols/jabber/buddy.c:991
 msgid "PubSub Service"
-msgstr ""
+msgstr "PubSub Service"
 
 #: ../libpurple/protocols/jabber/buddy.c:833
 #: ../libpurple/protocols/jabber/buddy.c:993
 msgid "SOCKS5 Bytestreams"
-msgstr ""
+msgstr "SOCKS5 Bytestreams"
 
 #: ../libpurple/protocols/jabber/buddy.c:835
 #: ../libpurple/protocols/jabber/buddy.c:995
 msgid "Out of Band Data"
-msgstr ""
+msgstr "Out of Band Data"
 
 #: ../libpurple/protocols/jabber/buddy.c:837
 #: ../libpurple/protocols/jabber/buddy.c:997
@@ -5145,7 +5146,7 @@
 #: ../libpurple/protocols/jabber/buddy.c:843
 #: ../libpurple/protocols/jabber/buddy.c:1003
 msgid "User Avatar"
-msgstr ""
+msgstr "Bruker Avatar"
 
 #: ../libpurple/protocols/jabber/buddy.c:845
 #: ../libpurple/protocols/jabber/buddy.c:1005
@@ -5155,15 +5156,13 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:847
 #: ../libpurple/protocols/jabber/buddy.c:1007
-#, fuzzy
 msgid "Software Version"
-msgstr "Denne versjonen er ikke støttet"
+msgstr "Software Versjon"
 
 #: ../libpurple/protocols/jabber/buddy.c:849
 #: ../libpurple/protocols/jabber/buddy.c:1009
-#, fuzzy
 msgid "Stream Initiation"
-msgstr "Organisasjon"
+msgstr "Stream Initiation"
 
 #: ../libpurple/protocols/jabber/buddy.c:851
 #: ../libpurple/protocols/jabber/buddy.c:1011
@@ -5192,8 +5191,9 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:859
 #: ../libpurple/protocols/jabber/buddy.c:1019
+#, fuzzy
 msgid "Encrypted Session Negotiations"
-msgstr ""
+msgstr "Krypterte formidlinger av økt"
 
 #: ../libpurple/protocols/jabber/buddy.c:861
 #: ../libpurple/protocols/jabber/buddy.c:1021
@@ -5227,8 +5227,9 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:871
 #: ../libpurple/protocols/jabber/buddy.c:1031
+#, fuzzy
 msgid "Jingle Audio"
-msgstr ""
+msgstr "Live Audio"
 
 #: ../libpurple/protocols/jabber/buddy.c:873
 #: ../libpurple/protocols/jabber/buddy.c:1033
@@ -5239,17 +5240,17 @@
 #: ../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
@@ -5260,7 +5261,7 @@
 #: ../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
@@ -5316,42 +5317,43 @@
 
 #: ../libpurple/protocols/jabber/buddy.c:901
 #: ../libpurple/protocols/jabber/buddy.c:1061
+#, fuzzy
 msgid "Entity Time"
-msgstr ""
+msgstr "Enhets Tid"
 
 #: ../libpurple/protocols/jabber/buddy.c:903
 #: ../libpurple/protocols/jabber/buddy.c:1063
 msgid "Delayed Delivery"
-msgstr ""
+msgstr "Forsinket Levering"
 
 #: ../libpurple/protocols/jabber/buddy.c:905
 #: ../libpurple/protocols/jabber/buddy.c:1065
 msgid "Collaborative Data Objects"
-msgstr ""
+msgstr "Samarbeidende Data Objekter"
 
 #: ../libpurple/protocols/jabber/buddy.c:907
 #: ../libpurple/protocols/jabber/buddy.c:1067
 msgid "File Repository and Sharing"
-msgstr ""
+msgstr "Fil Oppbevaring og Deling"
 
 #: ../libpurple/protocols/jabber/buddy.c:909
 #: ../libpurple/protocols/jabber/buddy.c:1069
 msgid "STUN Service Discovery for Jingle"
-msgstr ""
+msgstr "STUN Service Discovery for Jingle"
 
 #: ../libpurple/protocols/jabber/buddy.c:911
 #: ../libpurple/protocols/jabber/buddy.c:1071
 msgid "Simplified Encrypted Session Negotiation"
-msgstr ""
+msgstr "Forenklet formidling av kryptert økt"
 
 #: ../libpurple/protocols/jabber/buddy.c:913
 #: ../libpurple/protocols/jabber/buddy.c:1073
 msgid "Hop Check"
-msgstr ""
+msgstr "Hop Sjekk"
 
 #: ../libpurple/protocols/jabber/buddy.c:921
 #: ../libpurple/protocols/jabber/buddy.c:1081
-#: ../libpurple/protocols/oscar/oscar.c:2906
+#: ../libpurple/protocols/oscar/oscar.c:2902
 msgid "Capabilities"
 msgstr "Evner"
 
@@ -5367,9 +5369,8 @@
 #: ../libpurple/protocols/jabber/jabber.c:1577
 #: ../libpurple/protocols/jabber/jabber.c:1600
 #: ../libpurple/protocols/jabber/jabber.c:1623
-#, fuzzy
 msgid "Priority"
-msgstr "Port"
+msgstr "Prioritet"
 
 #: ../libpurple/protocols/jabber/buddy.c:1237
 #: ../libpurple/protocols/silc/ops.c:994
@@ -5379,8 +5380,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:3784
+#: ../libpurple/protocols/oscar/oscar.c:3797
 #: ../libpurple/protocols/qq/buddy_info.c:56
 #: ../libpurple/protocols/silc/ops.c:1030
 #: ../libpurple/protocols/silc10/ops.c:1064
@@ -5399,118 +5400,108 @@
 msgid "Logo"
 msgstr "Logo"
 
-#: ../libpurple/protocols/jabber/buddy.c:1942
+#: ../libpurple/protocols/jabber/buddy.c:1945
 msgid "Un-hide From"
 msgstr "Fjern fraværsmarkering for"
 
-#: ../libpurple/protocols/jabber/buddy.c:1946
+#: ../libpurple/protocols/jabber/buddy.c:1949
 msgid "Temporarily Hide From"
 msgstr "Midlertidig borte for"
 
 #. && NOT ME
-#: ../libpurple/protocols/jabber/buddy.c:1954
+#: ../libpurple/protocols/jabber/buddy.c:1957
 msgid "Cancel Presence Notification"
 msgstr "Avbryt varsling av tilstedeværelse"
 
-#: ../libpurple/protocols/jabber/buddy.c:1961
+#: ../libpurple/protocols/jabber/buddy.c:1964
 msgid "(Re-)Request authorization"
 msgstr "Spør på nytt om godkjenning"
 
 #. 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 "Fjern abonnement"
 
-#: ../libpurple/protocols/jabber/buddy.c:1985
-#, fuzzy
+#: ../libpurple/protocols/jabber/buddy.c:1988
 msgid "Log In"
-msgstr "Innlogging"
-
-#: ../libpurple/protocols/jabber/buddy.c:1989
-#, fuzzy
+msgstr "Logg inn"
+
+#: ../libpurple/protocols/jabber/buddy.c:1992
 msgid "Log Out"
-msgstr "Logget ut"
-
-#: ../libpurple/protocols/jabber/buddy.c:2035
+msgstr "Logg ut"
+
+#: ../libpurple/protocols/jabber/buddy.c:2038
 #: ../libpurple/protocols/jabber/jabber.c:1553
 msgid "Chatty"
 msgstr "Pratsom"
 
-#: ../libpurple/protocols/jabber/buddy.c:2039
+#: ../libpurple/protocols/jabber/buddy.c:2042
 msgid "Extended Away"
 msgstr "Utvidet borte"
 
-#: ../libpurple/protocols/jabber/buddy.c:2041
+#: ../libpurple/protocols/jabber/buddy.c:2044
 #: ../libpurple/protocols/jabber/jabber.c:1622
 #: ../libpurple/protocols/oscar/oscar.c:727
-#: ../libpurple/protocols/oscar/oscar.c:5808
+#: ../libpurple/protocols/oscar/oscar.c:5806
 #: ../libpurple/protocols/sametime/sametime.c:3297
-#, c-format
 msgid "Do Not Disturb"
 msgstr "Ikke forstyrr"
 
-#: ../libpurple/protocols/jabber/buddy.c:2208
+#: ../libpurple/protocols/jabber/buddy.c:2211
 msgid "JID"
-msgstr ""
-
-#: ../libpurple/protocols/jabber/buddy.c:2212
-#: ../libpurple/protocols/jabber/buddy.c:2391
-#: ../libpurple/protocols/oscar/oscar.c:3711
+msgstr "JID"
+
+#: ../libpurple/protocols/jabber/buddy.c:2215
+#: ../libpurple/protocols/jabber/buddy.c:2394
+#: ../libpurple/protocols/oscar/oscar.c:3707
 msgid "Last Name"
 msgstr "Etternavn"
 
-#: ../libpurple/protocols/jabber/buddy.c:2244
+#: ../libpurple/protocols/jabber/buddy.c:2247
 msgid "The following are the results of your search"
 msgstr "Følgende resultat fra ditt søk"
 
 #. current comment from Jabber User Directory users.jabber.org
-#: ../libpurple/protocols/jabber/buddy.c:2319
-msgid ""
-"Find a contact by entering the search criteria in the given fields. Note: "
-"Each field supports wild card searches (%)"
-msgstr ""
-
-#: ../libpurple/protocols/jabber/buddy.c:2339
-#, fuzzy
+#: ../libpurple/protocols/jabber/buddy.c:2322
+msgid "Find a contact by entering the search criteria in the given fields. Note: Each field supports wild card searches (%)"
+msgstr "Finn en kontakt ved å skrive inn søkekriterier i gitte felter. NB: Hvert felt har støtte for wild card søk (%)"
+
+#: ../libpurple/protocols/jabber/buddy.c:2342
 msgid "Directory Query Failed"
-msgstr "Direktekopling feilet"
-
-#: ../libpurple/protocols/jabber/buddy.c:2340
-#, fuzzy
+msgstr "Mappe Forespørsel Feilet"
+
+#: ../libpurple/protocols/jabber/buddy.c:2343
 msgid "Could not query the directory server."
-msgstr "Kunne ikke starte filoverføring"
+msgstr "Kunne ikke legge til kø hos katalog server."
 
 #. Try to translate the message (see static message
 #. list in jabber_user_dir_comments[])
-#: ../libpurple/protocols/jabber/buddy.c:2374
-#, fuzzy, c-format
+#: ../libpurple/protocols/jabber/buddy.c:2377
+#, c-format
 msgid "Server Instructions: %s"
-msgstr "Tjenerinformasjon"
-
-#: ../libpurple/protocols/jabber/buddy.c:2381
-#, fuzzy
+msgstr "Server Instructions: %s"
+
+#: ../libpurple/protocols/jabber/buddy.c:2384
 msgid "Fill in one or more fields to search for any matching XMPP users."
-msgstr ""
-"Fyll inn ett eller flere felt for å søke etter matchende Jabber brukere."
-
-#: ../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 "Fyll inn ett eller flere felt for å søke etter matchende XMPP brukere."
+
+#: ../libpurple/protocols/jabber/buddy.c:2404
+#: ../libpurple/protocols/novell/novell.c:1490
+#: ../libpurple/protocols/oscar/oscar.c:3710
+#: ../libpurple/protocols/oscar/oscar.c:3719
 msgid "E-Mail Address"
 msgstr "E-postadresse"
 
 #
-#: ../libpurple/protocols/jabber/buddy.c:2410
-#: ../libpurple/protocols/jabber/buddy.c:2411
-#, fuzzy
+#: ../libpurple/protocols/jabber/buddy.c:2413
+#: ../libpurple/protocols/jabber/buddy.c:2414
 msgid "Search for XMPP users"
-msgstr "_Søk etter:"
+msgstr "Søk etter XMPP-brukere"
 
 #. "Search"
-#: ../libpurple/protocols/jabber/buddy.c:2412
+#: ../libpurple/protocols/jabber/buddy.c:2415
 #: ../libpurple/protocols/qq/group.c:123
 #: ../libpurple/protocols/qq/group_im.c:147
 #: ../libpurple/protocols/qq/sys_msg.c:174
@@ -5522,29 +5513,25 @@
 msgid "Search"
 msgstr "Søk"
 
-#: ../libpurple/protocols/jabber/buddy.c:2427
-#, fuzzy
+#: ../libpurple/protocols/jabber/buddy.c:2430
 msgid "Invalid Directory"
-msgstr "Ugyldig feil"
-
-#: ../libpurple/protocols/jabber/buddy.c:2444
-#, fuzzy
+msgstr "Ugyldig mappe"
+
+#: ../libpurple/protocols/jabber/buddy.c:2447
 msgid "Enter a User Directory"
-msgstr "Kan ikke sende en katalog."
-
-#: ../libpurple/protocols/jabber/buddy.c:2445
-#, fuzzy
+msgstr "Kan ikke sende en katalog"
+
+#: ../libpurple/protocols/jabber/buddy.c:2448
 msgid "Select a user directory to search"
-msgstr "Velg en konferanseserver å spørre"
+msgstr "Velg en brukermappe å søke i"
 
 #
-#: ../libpurple/protocols/jabber/buddy.c:2448
-#, fuzzy
+#: ../libpurple/protocols/jabber/buddy.c:2451
 msgid "Search Directory"
-msgstr "_Søk etter:"
+msgstr "Søke Katalog"
 
 #: ../libpurple/protocols/jabber/chat.c:41
-#: ../libpurple/protocols/oscar/oscar.c:5294
+#: ../libpurple/protocols/oscar/oscar.c:5290
 #: ../libpurple/protocols/yahoo/yahoochat.c:1048
 msgid "_Room:"
 msgstr "_Rom:"
@@ -5618,19 +5605,16 @@
 #: ../libpurple/protocols/jabber/chat.c:689
 #: ../libpurple/protocols/silc/ops.c:1456
 #: ../libpurple/protocols/silc10/ops.c:1451
-#, fuzzy
 msgid "Error retrieving room list"
 msgstr "Klarte ikke hente romliste"
 
 #: ../libpurple/protocols/jabber/chat.c:737
-#, fuzzy
 msgid "Invalid Server"
-msgstr "Ugyldig tjenernavn"
+msgstr "Ugyldig Server"
 
 #: ../libpurple/protocols/jabber/chat.c:781
-#, fuzzy
 msgid "Enter a Conference Server"
-msgstr "Kople til en konferansetjener"
+msgstr "Skriv inn  en konferansetjener"
 
 #: ../libpurple/protocols/jabber/chat.c:782
 msgid "Select a conference server to query"
@@ -5646,7 +5630,7 @@
 
 #: ../libpurple/protocols/jabber/jabber.c:145
 msgid "You require encryption, but it is not available on this server."
-msgstr ""
+msgstr "Du krever kryptering, men det er ikke støtte for det på denne serveren."
 
 #: ../libpurple/protocols/jabber/jabber.c:259
 #: ../libpurple/protocols/jabber/jabber.c:312
@@ -5660,14 +5644,16 @@
 msgstr "Lesefeil"
 
 #: ../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:2557
+#: ../libpurple/protocols/yahoo/yahoo.c:2589
 #, c-format
 msgid ""
 "Could not establish a connection with the server:\n"
 "%s"
 msgstr ""
+"Kunne ikke etablere kontakt med serveren:\n"
+"%s"
 
 #: ../libpurple/protocols/jabber/jabber.c:529
 msgid "Unable to create socket"
@@ -5675,13 +5661,12 @@
 
 #: ../libpurple/protocols/jabber/jabber.c:575
 #: ../libpurple/protocols/jabber/jabber.c:1063
-#, fuzzy
 msgid "Invalid XMPP ID"
-msgstr "Ugyldig ID"
+msgstr "Ugyldig XMPP ID"
 
 #: ../libpurple/protocols/jabber/jabber.c:580
 msgid "Invalid XMPP ID. Domain must be set."
-msgstr ""
+msgstr "Ugyldig XMPP ID. Domenet må være satt."
 
 #: ../libpurple/protocols/jabber/jabber.c:656
 #, c-format
@@ -5689,14 +5674,14 @@
 msgstr "Registrering av %s@%s vellykket"
 
 #: ../libpurple/protocols/jabber/jabber.c:662
-#, fuzzy, c-format
+#, c-format
 msgid "Registration to %s successful"
-msgstr "Registrering av %s@%s vellykket"
+msgstr "Registrering til %s vellykket"
 
 #: ../libpurple/protocols/jabber/jabber.c:664
 #: ../libpurple/protocols/jabber/jabber.c:665
 msgid "Registration Successful"
-msgstr "Registreringen var vellykket!"
+msgstr "Registreringen var vellykket"
 
 #: ../libpurple/protocols/jabber/jabber.c:673
 #: ../libpurple/protocols/jabber/jabber.c:674
@@ -5704,21 +5689,19 @@
 msgstr "Registrering feilet"
 
 #: ../libpurple/protocols/jabber/jabber.c:692
-#, fuzzy, c-format
+#, c-format
 msgid "Registration from %s successfully removed"
-msgstr "Registrering av %s@%s vellykket"
+msgstr "Registrering av %s ble fjernet"
 
 #: ../libpurple/protocols/jabber/jabber.c:694
 #: ../libpurple/protocols/jabber/jabber.c:695
-#, fuzzy
 msgid "Unregistration Successful"
-msgstr "Registreringen var vellykket!"
+msgstr "Avregistreringen var vellykket"
 
 #: ../libpurple/protocols/jabber/jabber.c:703
 #: ../libpurple/protocols/jabber/jabber.c:704
-#, fuzzy
 msgid "Unregistration Failed"
-msgstr "Registrering feilet"
+msgstr "Avregistrering feilet"
 
 #: ../libpurple/protocols/jabber/jabber.c:864
 #: ../libpurple/protocols/jabber/jabber.c:865
@@ -5726,13 +5709,12 @@
 msgstr "Du er allerede registrert"
 
 #: ../libpurple/protocols/jabber/jabber.c:962
-#: ../libpurple/protocols/oscar/oscar.c:3790
-#: ../libpurple/protocols/oscar/oscar.c:3803
+#: ../libpurple/protocols/oscar/oscar.c:3786
+#: ../libpurple/protocols/oscar/oscar.c:3799
 msgid "State"
 msgstr "Fylke/stat"
 
 #: ../libpurple/protocols/jabber/jabber.c:967
-#, fuzzy
 msgid "Postal code"
 msgstr "Postnummer"
 
@@ -5756,10 +5738,8 @@
 msgstr "Registrer"
 
 #: ../libpurple/protocols/jabber/jabber.c:994
-#, fuzzy
-msgid ""
-"Please fill out the information below to change your account registration."
-msgstr "Fyll ut feltene under for å registrere den nye kontoen din."
+msgid "Please fill out the information below to change your account registration."
+msgstr "Fyll ut feltene under for å forandre registrering av kontoen din."
 
 #: ../libpurple/protocols/jabber/jabber.c:997
 msgid "Please fill out the information below to register your new account."
@@ -5767,9 +5747,8 @@
 
 #: ../libpurple/protocols/jabber/jabber.c:1005
 #: ../libpurple/protocols/jabber/jabber.c:1006
-#, fuzzy
 msgid "Register New XMPP Account"
-msgstr "Registrere ny jabber-konto"
+msgstr "Registrer Ny XMPP-Konto"
 
 #: ../libpurple/protocols/jabber/jabber.c:1007
 #: ../libpurple/protocols/jabber/jabber.c:1016
@@ -5777,56 +5756,53 @@
 msgstr "Registrer"
 
 #: ../libpurple/protocols/jabber/jabber.c:1012
-#, fuzzy, c-format
+#, c-format
 msgid "Change Account Registration at %s"
 msgstr "Endre brukerinformasjon for %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:1013
-#, fuzzy, c-format
+#, c-format
 msgid "Register New Account at %s"
-msgstr "Registrere ny jabber-konto"
+msgstr "Registrere Ny Konto på %s"
 
 #
 #: ../libpurple/protocols/jabber/jabber.c:1016
-#, fuzzy
 msgid "Change Registration"
-msgstr "Registreringsfeil"
+msgstr "Forandre Registrering"
 
 #: ../libpurple/protocols/jabber/jabber.c:1120
 #: ../libpurple/protocols/jabber/jabber.c:1121
-#, fuzzy
 msgid "Error unregistering account"
-msgstr "Feil ved endring av kontoinformasjon"
+msgstr "Feil ved avregistrering av konto"
 
 #: ../libpurple/protocols/jabber/jabber.c:1126
 #: ../libpurple/protocols/jabber/jabber.c:1127
 msgid "Account successfully unregistered"
-msgstr ""
+msgstr "Avregistrering av konto vellykket"
 
 #: ../libpurple/protocols/jabber/jabber.c:1284
 msgid "Initializing Stream"
-msgstr "Nullstiller datastrøm"
+msgstr "Initialiserer datastrøm"
 
 #: ../libpurple/protocols/jabber/jabber.c:1289
-#, fuzzy
 msgid "Initializing SSL/TLS"
-msgstr "Nullstiller datastrøm"
+msgstr "Initialiserer SSL/TLS"
 
 #: ../libpurple/protocols/jabber/jabber.c:1293
-#: ../libpurple/protocols/msn/session.c:351
+#: ../libpurple/protocols/msn/session.c:390
 msgid "Authenticating"
 msgstr "Autentiserer"
 
 #: ../libpurple/protocols/jabber/jabber.c:1302
 msgid "Re-initializing Stream"
-msgstr "Nullstiller datastrøm på nytt"
+msgstr "Re-Initialiserer datastrøm"
 
 #: ../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/oscar/oscar.c:826
-#: ../libpurple/protocols/oscar/oscar.c:5602
+#: ../libpurple/protocols/oscar/oscar.c:5600
 msgid "Not Authorized"
 msgstr "Ikke godkjent"
 
@@ -5835,7 +5811,6 @@
 msgstr "Begge"
 
 #: ../libpurple/protocols/jabber/jabber.c:1444
-#, fuzzy
 msgid "From (To pending)"
 msgstr "Fra (Til avventende)"
 
@@ -5849,7 +5824,6 @@
 msgstr "Til"
 
 #: ../libpurple/protocols/jabber/jabber.c:1451
-#, fuzzy
 msgid "None (To pending)"
 msgstr "Ingen (til avventende)"
 
@@ -5883,9 +5857,8 @@
 #: ../libpurple/protocols/jabber/jabber.c:1580
 #: ../libpurple/protocols/jabber/jabber.c:1603
 #: ../libpurple/protocols/jabber/jabber.c:1626
-#, fuzzy
 msgid "Mood Text"
-msgstr "Sinnsstemning"
+msgstr "Sinnsstemnings tekst"
 
 #: ../libpurple/protocols/jabber/jabber.c:1535
 #: ../libpurple/protocols/jabber/jabber.c:1558
@@ -5893,14 +5866,13 @@
 #: ../libpurple/protocols/jabber/jabber.c:1604
 #: ../libpurple/protocols/jabber/jabber.c:1627
 msgid "Tune Artist"
-msgstr ""
+msgstr "Artist"
 
 #: ../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 "Tittel"
 
@@ -5910,7 +5882,7 @@
 #: ../libpurple/protocols/jabber/jabber.c:1606
 #: ../libpurple/protocols/jabber/jabber.c:1629
 msgid "Tune Album"
-msgstr ""
+msgstr "Album"
 
 #: ../libpurple/protocols/jabber/jabber.c:1538
 #: ../libpurple/protocols/jabber/jabber.c:1561
@@ -5918,16 +5890,15 @@
 #: ../libpurple/protocols/jabber/jabber.c:1607
 #: ../libpurple/protocols/jabber/jabber.c:1630
 msgid "Tune Genre"
-msgstr ""
+msgstr "Sjanger"
 
 #: ../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 "Kommentar om kontakt:"
+msgstr "Kommentar"
 
 #: ../libpurple/protocols/jabber/jabber.c:1540
 #: ../libpurple/protocols/jabber/jabber.c:1563
@@ -5935,7 +5906,7 @@
 #: ../libpurple/protocols/jabber/jabber.c:1609
 #: ../libpurple/protocols/jabber/jabber.c:1632
 msgid "Tune Track"
-msgstr ""
+msgstr "Spor"
 
 #
 #: ../libpurple/protocols/jabber/jabber.c:1541
@@ -5943,7 +5914,6 @@
 #: ../libpurple/protocols/jabber/jabber.c:1587
 #: ../libpurple/protocols/jabber/jabber.c:1610
 #: ../libpurple/protocols/jabber/jabber.c:1633
-#, fuzzy
 msgid "Tune Time"
 msgstr "Tid"
 
@@ -5953,7 +5923,7 @@
 #: ../libpurple/protocols/jabber/jabber.c:1611
 #: ../libpurple/protocols/jabber/jabber.c:1634
 msgid "Tune Year"
-msgstr ""
+msgstr "År"
 
 #: ../libpurple/protocols/jabber/jabber.c:1543
 #: ../libpurple/protocols/jabber/jabber.c:1566
@@ -5961,14 +5931,13 @@
 #: ../libpurple/protocols/jabber/jabber.c:1612
 #: ../libpurple/protocols/jabber/jabber.c:1635
 msgid "Tune URL"
-msgstr ""
+msgstr "URL"
 
 #: ../libpurple/protocols/jabber/jabber.c:1545
 #: ../libpurple/protocols/jabber/jabber.c:1568
 #: ../libpurple/protocols/jabber/jabber.c:1591
 #: ../libpurple/protocols/jabber/jabber.c:1614
 #: ../libpurple/protocols/jabber/jabber.c:1637
-#, fuzzy
 msgid "Allow Buzz"
 msgstr "Tillat"
 
@@ -5983,7 +5952,7 @@
 #: ../libpurple/protocols/jabber/jabber.c:1670
 #: ../libpurple/protocols/jabber/jabber.c:1671
 msgid "Error changing password"
-msgstr "Feil under endring av passord."
+msgstr "Feil ved skifting av passord"
 
 #: ../libpurple/protocols/jabber/jabber.c:1728
 msgid "Password (again)"
@@ -5991,16 +5960,15 @@
 
 #: ../libpurple/protocols/jabber/jabber.c:1734
 #: ../libpurple/protocols/jabber/jabber.c:1735
-#, fuzzy
 msgid "Change XMPP Password"
-msgstr "Bytt passord"
+msgstr "Endre XMPP-passord"
 
 #: ../libpurple/protocols/jabber/jabber.c:1735
 msgid "Please enter your new password"
 msgstr "Skriv inn ditt nye passord"
 
 #: ../libpurple/protocols/jabber/jabber.c:1749
-#: ../libpurple/protocols/oscar/oscar.c:6388
+#: ../libpurple/protocols/oscar/oscar.c:6386
 #: ../libpurple/protocols/silc/silc.c:1093
 #: ../libpurple/protocols/silc10/silc.c:1004
 msgid "Set User Info..."
@@ -6008,7 +5976,7 @@
 
 #. if (js->protocol_options & CHANGE_PASSWORD) {
 #: ../libpurple/protocols/jabber/jabber.c:1754
-#: ../libpurple/protocols/oscar/oscar.c:6399
+#: ../libpurple/protocols/oscar/oscar.c:6397
 #: ../libpurple/protocols/silc/silc.c:1089
 #: ../libpurple/protocols/silc10/silc.c:1000
 msgid "Change Password..."
@@ -6017,9 +5985,8 @@
 #
 #. }
 #: ../libpurple/protocols/jabber/jabber.c:1759
-#, fuzzy
 msgid "Search for Users..."
-msgstr "_Søk etter:"
+msgstr "Søk etter brukere..."
 
 #: ../libpurple/protocols/jabber/jabber.c:1845
 msgid "Bad Request"
@@ -6048,12 +6015,11 @@
 
 #: ../libpurple/protocols/jabber/jabber.c:1857
 msgid "Item Not Found"
-msgstr ""
+msgstr "Sak ikke funnet"
 
 #: ../libpurple/protocols/jabber/jabber.c:1859
-#, fuzzy
 msgid "Malformed XMPP ID"
-msgstr "Ugyldig jabber-ID"
+msgstr "Ugyldig XMPP-ID"
 
 #: ../libpurple/protocols/jabber/jabber.c:1861
 msgid "Not Acceptable"
@@ -6104,7 +6070,6 @@
 msgstr "Godkjenning avbrutt"
 
 #: ../libpurple/protocols/jabber/jabber.c:1894
-#, fuzzy
 msgid "Incorrect encoding in authorization"
 msgstr "Feil koding i godkjenning"
 
@@ -6228,24 +6193,24 @@
 msgstr "Klarte ikke forby brukeren %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:2072
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown affiliation: \"%s\""
-msgstr "Ukjent kommando: %s"
+msgstr "Ukjent tilhørighet:\" %s\""
 
 #: ../libpurple/protocols/jabber/jabber.c:2077
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to affiliate user %s as \"%s\""
-msgstr "Kunne ikke invitere bruker (%s)."
+msgstr "Kunne ikke knytte til bruker %s som \"%s\""
 
 #: ../libpurple/protocols/jabber/jabber.c:2096
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown role: \"%s\""
-msgstr "Ukjent kommando: %s"
+msgstr "Ukjent rolle: \"%s\""
 
 #: ../libpurple/protocols/jabber/jabber.c:2101
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to set role \"%s\" for user: %s"
-msgstr "Kunne ikke sende beskjed: %s"
+msgstr "Kunne ikke sette rolle \"%s\" for bruker: %s"
 
 #: ../libpurple/protocols/jabber/jabber.c:2154
 #, c-format
@@ -6261,82 +6226,90 @@
 #: ../libpurple/protocols/jabber/jabber.c:2217
 #, c-format
 msgid "Unable to buzz, because there is nothing known about user %s."
-msgstr ""
+msgstr "Kunne ikke vekke, fordi det er ingenting kjent med bruker %s."
 
 #: ../libpurple/protocols/jabber/jabber.c:2213
 #, c-format
 msgid "Unable to buzz, because user %s might be offline."
-msgstr ""
+msgstr "Kunne ikke vekke, fordi bruker %s kan være avlogget."
 
 #: ../libpurple/protocols/jabber/jabber.c:2239
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to buzz, because the user %s does not support it."
-msgstr "Kunne ikke spille av lyd fordi lydfilen (%s) ikke eksisterer."
-
-#: ../libpurple/protocols/jabber/jabber.c:2253
+msgstr "Kunne ikke vekke, fordi brukeren %s ikke støtter det."
+
+#: ../libpurple/protocols/jabber/jabber.c:2250
+#: ../libpurple/protocols/yahoo/yahoo.c:4118
+msgid "Buzz"
+msgstr "Vekke"
+
+#: ../libpurple/protocols/jabber/jabber.c:2251
+#: ../libpurple/protocols/jabber/message.c:307
+#: ../libpurple/protocols/yahoo/yahoo.c:4119
+#, c-format
+msgid "%s has buzzed you!"
+msgstr "%s har buzzet deg!"
+
+#: ../libpurple/protocols/jabber/jabber.c:2252
+#: ../libpurple/protocols/yahoo/yahoo.c:4120
+#, c-format
+msgid "Buzzing %s..."
+msgstr "Vekker %s..."
+
+#: ../libpurple/protocols/jabber/jabber.c:2291
 msgid "config:  Configure a chat room."
-msgstr "config:  Endre innstillingene for et samtalerom"
-
-#: ../libpurple/protocols/jabber/jabber.c:2257
+msgstr "config:  Endre innstillingene for et samtalerom."
+
+#: ../libpurple/protocols/jabber/jabber.c:2295
 msgid "configure:  Configure a chat room."
-msgstr "configure:  Endre innstillingene for et samtalerom"
-
-#: ../libpurple/protocols/jabber/jabber.c:2266
+msgstr "configure:  Endre innstillingene for et samtalerom."
+
+#: ../libpurple/protocols/jabber/jabber.c:2304
 msgid "part [room]:  Leave the room."
-msgstr "part [rom]:  Forlat rommet"
-
-#: ../libpurple/protocols/jabber/jabber.c:2271
+msgstr "part [rom]:  Forlat rommet."
+
+#: ../libpurple/protocols/jabber/jabber.c:2309
 msgid "register:  Register with a chat room."
 msgstr "register:  Registrer med et gruppesamtalerom."
 
-#: ../libpurple/protocols/jabber/jabber.c:2277
+#: ../libpurple/protocols/jabber/jabber.c:2315
 msgid "topic [new topic]:  View or change the topic."
-msgstr "topic [nytt emne]:  Vis eller endre emnet"
-
-#: ../libpurple/protocols/jabber/jabber.c:2283
+msgstr "topic [nytt emne]:  Vis eller endre emnet."
+
+#: ../libpurple/protocols/jabber/jabber.c:2321
 msgid "ban &lt;user&gt; [room]:  Ban a user from the room."
-msgstr "ban &lt;bruker&gt; [rom]:  Forby en bruker fra rommet"
-
-#: ../libpurple/protocols/jabber/jabber.c:2289
-msgid ""
-"affiliate &lt;user&gt; &lt;owner|admin|member|outcast|none&gt;: Set a user's "
-"affiliation with the room."
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:2295
-msgid ""
-"role &lt;user&gt; &lt;moderator|participant|visitor|none&gt;: Set a user's "
-"role in the room."
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:2301
-#, fuzzy
+msgstr "ban &lt;bruker&gt; [rom]:  Forby en bruker fra rommet."
+
+#: ../libpurple/protocols/jabber/jabber.c:2327
+msgid "affiliate &lt;user&gt; &lt;owner|admin|member|outcast|none&gt;: Set a user's affiliation with the room."
+msgstr "Knytt &lt;bruker&gt; &lt;eier|admin|medlem|utstøtt|ingen&gt;: Sett en brukers tilknyting til rommet."
+
+#: ../libpurple/protocols/jabber/jabber.c:2333
+msgid "role &lt;user&gt; &lt;moderator|participant|visitor|none&gt;: Set a user's role in the room."
+msgstr "rolle &lt;user&gt; &lt;moderator|deltaker|besøkende|ingen&gt;: Sett en brukers rolle i rommet."
+
+#: ../libpurple/protocols/jabber/jabber.c:2339
 msgid "invite &lt;user&gt; [message]:  Invite a user to the room."
-msgstr "invite &lt;bruker&gt; [rom]:  Inviter en bruker til rommet"
-
-#: ../libpurple/protocols/jabber/jabber.c:2307
+msgstr "invite &lt;bruker&gt; [rom]:  Inviter en bruker til rommet."
+
+#: ../libpurple/protocols/jabber/jabber.c:2345
 msgid "join: &lt;room&gt; [server]:  Join a chat on this server."
-msgstr ""
-"join: &lt;rom&gt; [vert]:  Bli med i en gruppesamtale på denne serveren"
-
-#: ../libpurple/protocols/jabber/jabber.c:2313
+msgstr "join: &lt;rom&gt; [vert]:  Bli med i en samtale på denne serveren."
+
+#: ../libpurple/protocols/jabber/jabber.c:2351
 msgid "kick &lt;user&gt; [room]:  Kick a user from the room."
-msgstr "kick &lt;bruker&gt; [rom]:  Spark en bruker ut av rommet"
-
-#: ../libpurple/protocols/jabber/jabber.c:2318
-msgid ""
-"msg &lt;user&gt; &lt;message&gt;:  Send a private message to another user."
-msgstr ""
-"msg &lt;bruker&gt; &lt;melding&gt;:  Send en privatmelding til en annen "
-"bruker"
-
-#: ../libpurple/protocols/jabber/jabber.c:2324
+msgstr "kick &lt;bruker&gt; [rom]:  Spark en bruker ut av rommet."
+
+#: ../libpurple/protocols/jabber/jabber.c:2356
+msgid "msg &lt;user&gt; &lt;message&gt;:  Send a private message to another user."
+msgstr "msg &lt;bruker&gt; &lt;melding&gt;:  Send en privatmelding til en annen bruker."
+
+#: ../libpurple/protocols/jabber/jabber.c:2362
 msgid "ping &lt;jid&gt;:\tPing a user/component/server."
-msgstr ""
-
-#: ../libpurple/protocols/jabber/jabber.c:2329
-#: ../libpurple/protocols/yahoo/yahoo.c:4145
-#, fuzzy
+msgstr "ping &lt;jid&gt;:\tPing en bruker/komponent/server."
+
+#: ../libpurple/protocols/jabber/jabber.c:2367
+#: ../libpurple/protocols/yahoo/yahoo.c:4144
 msgid "buzz: Buzz a user to get their attention"
 msgstr "buzz: Buzz en kontakt for å få deres oppmerksomhet"
 
@@ -6352,52 +6325,49 @@
 #. *  description
 #: ../libpurple/protocols/jabber/libxmpp.c:170
 #: ../libpurple/protocols/jabber/libxmpp.c:172
-#, fuzzy
 msgid "XMPP Protocol Plugin"
-msgstr "MSN-protokolltillegg"
+msgstr "XMPP-protokolltillegg"
 
 #
 #. 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
-#, fuzzy
+#: ../libpurple/protocols/jabber/libxmpp.c:202
+#: ../pidgin/gtkaccount.c:506
 msgid "Domain"
-msgstr "Rumensk"
+msgstr "Domene"
 
 #: ../libpurple/protocols/jabber/libxmpp.c:210
-#, fuzzy
 msgid "Require SSL/TLS"
-msgstr "Krev TLS"
+msgstr "Krever SSL/TLS"
 
 #: ../libpurple/protocols/jabber/libxmpp.c:214
-#, fuzzy
 msgid "Force old (port 5223) SSL"
-msgstr "Tving bruk av gammel SSL"
+msgstr "Tving bruk av gammel SSL (port 5223)"
 
 #: ../libpurple/protocols/jabber/libxmpp.c:219
 msgid "Allow plaintext auth over unencrypted streams"
 msgstr "Tillat identitetsbekreftelse i ren tekst over ukrypterte forbindelser"
 
 #: ../libpurple/protocols/jabber/libxmpp.c:224
-#: ../libpurple/protocols/myspace/myspace.c:3277
-#: ../libpurple/protocols/simple/simple.c:1902
-#, fuzzy
+#: ../libpurple/protocols/myspace/myspace.c:3275
+#: ../libpurple/protocols/simple/simple.c:1904
 msgid "Connect port"
-msgstr "Koble til"
+msgstr "Koble til 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/myspace/myspace.c:3272
 #: ../libpurple/protocols/silc/silc.c:1914
-#: ../libpurple/protocols/silc10/silc.c:1857 ../pidgin/gtkaccount.c:837
+#: ../libpurple/protocols/silc10/silc.c:1857
+#: ../pidgin/gtkaccount.c:837
 msgid "Connect server"
 msgstr "Koble til tjener"
 
 #: ../libpurple/protocols/jabber/message.c:106
-#, fuzzy, c-format
+#, c-format
 msgid "%s has left the conversation."
-msgstr "%s har blitt invitert til denne samtalen."
+msgstr "%s har forlatt samtalen."
 
 #: ../libpurple/protocols/jabber/message.c:161
 #, c-format
@@ -6420,15 +6390,8 @@
 msgstr "Beskjedlevering til %s feilet: %s"
 
 #: ../libpurple/protocols/jabber/message.c:278
-#, fuzzy
 msgid "XMPP Message Error"
-msgstr "Jabber beskjedfeil"
-
-#: ../libpurple/protocols/jabber/message.c:307
-#: ../libpurple/protocols/yahoo/yahoo.c:4120
-#, fuzzy, c-format
-msgid "%s has buzzed you!"
-msgstr "Brukeren har blokkert deg"
+msgstr "XMPP beskjedfeil"
 
 #: ../libpurple/protocols/jabber/message.c:407
 #, c-format
@@ -6439,39 +6402,33 @@
 msgid "XML Parse error"
 msgstr "XML-parsefeil"
 
-#: ../libpurple/protocols/jabber/presence.c:427
+#: ../libpurple/protocols/jabber/presence.c:422
 msgid "Unknown Error in presence"
 msgstr "Ukjent feil i tilstedeværelse"
 
-#: ../libpurple/protocols/jabber/presence.c:508
-#: ../libpurple/protocols/jabber/presence.c:509
+#: ../libpurple/protocols/jabber/presence.c:503
+#: ../libpurple/protocols/jabber/presence.c:504
 msgid "Create New Room"
 msgstr "Skap nytt samtalerom"
 
-#: ../libpurple/protocols/jabber/presence.c:510
-msgid ""
-"You are creating a new room.  Would you like to configure it, or accept the "
-"default settings?"
-msgstr ""
-"Du er i ferd med å lage et nytt rom. Ønsker du å endre innstillingene, eller "
-"bruke standardinnstillingene?"
-
-#: ../libpurple/protocols/jabber/presence.c:516
-#, fuzzy
+#: ../libpurple/protocols/jabber/presence.c:505
+msgid "You are creating a new room.  Would you like to configure it, or accept the default settings?"
+msgstr "Du er i ferd med å lage et nytt rom. Ønsker du å endre innstillingene, eller bruke standardinnstillingene?"
+
+#: ../libpurple/protocols/jabber/presence.c:511
 msgid "_Configure Room"
-msgstr "Konfigurer rom"
-
-#: ../libpurple/protocols/jabber/presence.c:517
-#, fuzzy
+msgstr "_Konfigurer rom"
+
+#: ../libpurple/protocols/jabber/presence.c:512
 msgid "_Accept Defaults"
-msgstr "Aksepter standardinstillinger"
-
-#: ../libpurple/protocols/jabber/presence.c:559
+msgstr "_Aksepter standardinstillinger"
+
+#: ../libpurple/protocols/jabber/presence.c:554
 #, c-format
 msgid "Error in chat %s"
 msgstr "Feil i gruppesamtale %s"
 
-#: ../libpurple/protocols/jabber/presence.c:563
+#: ../libpurple/protocols/jabber/presence.c:558
 #, c-format
 msgid "Error joining chat %s"
 msgstr "Klarte ikke bli med i gruppesamtale %s"
@@ -6488,14 +6445,14 @@
 msgstr "Filsending feilet"
 
 #: ../libpurple/protocols/jabber/si.c:838
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to send file to %s, invalid JID"
-msgstr "Kunne ikke sende beskjed til %s."
+msgstr "Kunne ikke sende fil til %s, ugyldig JID"
 
 #: ../libpurple/protocols/jabber/si.c:840
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to send file to %s, user is not online"
-msgstr "Klarte ikke sende fil til %s - brukeren støtter ikke filoverføringer"
+msgstr "Klarte ikke sende fil til %s, brukeren er ikke pålogget"
 
 #: ../libpurple/protocols/jabber/si.c:842
 #, fuzzy, c-format
@@ -6505,7 +6462,7 @@
 #: ../libpurple/protocols/jabber/si.c:857
 #, c-format
 msgid "Please select which resource of %s you would like to send a file to"
-msgstr ""
+msgstr "Vennligst velg hvilken ressurs av %s du vil sende en fil til"
 
 #: ../libpurple/protocols/jabber/si.c:873
 #, fuzzy
@@ -6520,39 +6477,32 @@
 
 #: ../libpurple/protocols/jabber/usermood.c:181
 msgid "Please select your mood from the list."
-msgstr ""
+msgstr "Vennligst velg din stemning fra listen."
 
 #: ../libpurple/protocols/jabber/usermood.c:183
 #: ../libpurple/protocols/jabber/usernick.c:78
-#, fuzzy
 msgid "Set"
-msgstr "_Sett"
+msgstr "Sett"
 
 #: ../libpurple/protocols/jabber/usermood.c:191
-#, fuzzy
 msgid "Set Mood..."
-msgstr "Lagre fil..."
-
-#: ../libpurple/protocols/jabber/usernick.c:76
-#, fuzzy
-msgid "Set User Nickname"
-msgstr "Sett brukergrense"
+msgstr "Sett Sinnstemning..."
 
 #: ../libpurple/protocols/jabber/usernick.c:76
-#, fuzzy
+msgid "Set User Nickname"
+msgstr "Sett Brukers Skjermnavn"
+
+#: ../libpurple/protocols/jabber/usernick.c:76
 msgid "Please specify a new nickname for you."
-msgstr "Vennligst skriv inn nytt navn for gruppen."
+msgstr "Vennligst spesifiser et nytt skjermnavn for deg."
 
 #: ../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
+msgid "This information is visible to all contacts on your contact list, so choose something appropriate."
+msgstr "Denne informasjonen vises til alle dine kontakter i kontaktlisten din, så velg noe passende."
+
+#: ../libpurple/protocols/jabber/usernick.c:100
 msgid "Set Nickname..."
-msgstr "Kallenavn"
+msgstr "Sett Nick..."
 
 #: ../libpurple/protocols/jabber/xdata.c:378
 #, fuzzy
@@ -6564,265 +6514,221 @@
 msgid "Select an action"
 msgstr "Velg fil"
 
-#: ../libpurple/protocols/msn/dialog.c:110
+#: ../libpurple/protocols/msn/contact.c:207
+msgid "Unable to connect to contact server"
+msgstr "Kan ikke koble til tjener"
+
+#: ../libpurple/protocols/msn/contact.c:954
+#, fuzzy
+msgid "Unable to retrieve MSN Address Book"
+msgstr "Legg til i adresseboka"
+
+#: ../libpurple/protocols/msn/dialog.c:118
 #, c-format
 msgid "Buddy list synchronization issue in %s (%s)"
-msgstr "Synkronisasjonsproblem med vennelista i %s (%s)"
-
-#: ../libpurple/protocols/msn/dialog.c:116
-#, c-format
-msgid ""
-"%s on the local list is inside the group \"%s\" but not on the server list. "
-"Do you want this buddy to be added?"
-msgstr ""
-"%s er på den lokale lista innenfor gruppa \"%s\", men ikke på tjenerlista. "
-"Ønsker du at denne kontakten skal bli lagt til?"
+msgstr "Synkronisasjonsproblem med kontaktlisten i %s (%s)"
 
 #: ../libpurple/protocols/msn/dialog.c:124
 #, c-format
-msgid ""
-"%s is on the local list but not on the server list. Do you want this buddy "
-"to be added?"
-msgstr ""
-"%s er på den lokale lista, men ikke på tjenerlista. Ønsker du at denne "
-"kontakten skal bli lagt til?"
+msgid "%s on the local list is inside the group \"%s\" but not on the server list. Do you want this buddy to be added?"
+msgstr "%s er på den lokale lista innenfor gruppa \"%s\", men ikke på tjenerlista. Ønsker du at denne kontakten skal bli lagt til?"
+
+#: ../libpurple/protocols/msn/dialog.c:132
+#, c-format
+msgid "%s is on the local list but not on the server list. Do you want this buddy to be added?"
+msgstr "%s er på den lokale lista, men ikke på tjenerlista. Ønsker du at denne kontakten skal bli lagt til?"
 
 #: ../libpurple/protocols/msn/error.c:36
-#, c-format
 msgid "Unable to parse message"
-msgstr "Kunne ikke tolke beskjed."
+msgstr "Kunne ikke tolke beskjed"
 
 #: ../libpurple/protocols/msn/error.c:41
-#, fuzzy, c-format
 msgid "Syntax Error (probably a client bug)"
-msgstr "Syntaksfeil (sannsynligvis en Gaim-bug)"
+msgstr "Syntaksfeil (sannsynligvis en Pidgin-bug)"
 
 #: ../libpurple/protocols/msn/error.c:46
-#, c-format
 msgid "Invalid e-mail address"
 msgstr "Ugyldig epostadresse"
 
 #: ../libpurple/protocols/msn/error.c:49
-#, c-format
 msgid "User does not exist"
 msgstr "Brukeren eksisterer ikke"
 
 #: ../libpurple/protocols/msn/error.c:53
-#, fuzzy, c-format
 msgid "Fully qualified domain name missing"
 msgstr "Fullstending domenenavn mangler"
 
 #: ../libpurple/protocols/msn/error.c:56
-#, fuzzy, c-format
 msgid "Already logged in"
 msgstr "Allerede logget inn"
 
 #: ../libpurple/protocols/msn/error.c:59
-#, fuzzy, c-format
 msgid "Invalid screen name"
 msgstr "Ugyldig brukernavn"
 
 #: ../libpurple/protocols/msn/error.c:62
-#, fuzzy, c-format
 msgid "Invalid friendly name"
 msgstr "Ugyldig kallenavn"
 
 #: ../libpurple/protocols/msn/error.c:65
-#, fuzzy, c-format
 msgid "List full"
 msgstr "Listen er full"
 
 #: ../libpurple/protocols/msn/error.c:68
-#, c-format
 msgid "Already there"
 msgstr "Du er allerede der"
 
 #: ../libpurple/protocols/msn/error.c:72
-#, c-format
 msgid "Not on list"
 msgstr "Ikke på listen"
 
 #: ../libpurple/protocols/msn/error.c:75
 #: ../libpurple/protocols/zephyr/zephyr.c:756
-#, c-format
 msgid "User is offline"
 msgstr "Brukeren er avlogget"
 
 #: ../libpurple/protocols/msn/error.c:78
-#, c-format
 msgid "Already in the mode"
 msgstr "Du er allerede i modusen"
 
 #: ../libpurple/protocols/msn/error.c:82
-#, c-format
 msgid "Already in opposite list"
 msgstr "Du er allerede i den andre listen"
 
 #: ../libpurple/protocols/msn/error.c:86
-#, c-format
 msgid "Too many groups"
 msgstr "For mange grupper"
 
 #: ../libpurple/protocols/msn/error.c:89
-#, c-format
 msgid "Invalid group"
 msgstr "Ugyldig gruppe"
 
 #: ../libpurple/protocols/msn/error.c:92
-#, c-format
 msgid "User not in group"
 msgstr "Brukeren er ikke i gruppen"
 
 #: ../libpurple/protocols/msn/error.c:95
-#, c-format
 msgid "Group name too long"
 msgstr "Gruppenavnet er for langt"
 
 #: ../libpurple/protocols/msn/error.c:98
-#, c-format
 msgid "Cannot remove group zero"
 msgstr "Kan ikke fjerne gruppe null"
 
 #: ../libpurple/protocols/msn/error.c:103
-#, fuzzy, c-format
 msgid "Tried to add a user to a group that doesn't exist"
 msgstr "Prøvde å legge en kontakt til i en ikke-eksisterende gruppe"
 
 #: ../libpurple/protocols/msn/error.c:107
-#, c-format
 msgid "Switchboard failed"
 msgstr "Feil med switchboard-tjenesten"
 
 #: ../libpurple/protocols/msn/error.c:111
-#, fuzzy, c-format
+#, fuzzy
 msgid "Notify transfer failed"
 msgstr "Overføring av varsling feilet"
 
 #: ../libpurple/protocols/msn/error.c:116
-#, c-format
 msgid "Required fields missing"
 msgstr "Du har ikke fylt inn alle nødvendige felt"
 
 #: ../libpurple/protocols/msn/error.c:120
-#, c-format
 msgid "Too many hits to a FND"
 msgstr "For mange treff på en FND"
 
 #: ../libpurple/protocols/msn/error.c:124
 #: ../libpurple/protocols/oscar/oscar.c:120
-#, c-format
 msgid "Not logged in"
 msgstr "Ikke pålogget"
 
 #: ../libpurple/protocols/msn/error.c:128
-#, fuzzy, c-format
 msgid "Service temporarily unavailable"
-msgstr "Tjenesten midlertidig uttilgjengelig"
+msgstr "Tjenesten midlertidig utilgjengelig"
 
 #: ../libpurple/protocols/msn/error.c:131
-#, c-format
 msgid "Database server error"
 msgstr "Feil på databasetjeneren"
 
 #: ../libpurple/protocols/msn/error.c:135
-#, c-format
 msgid "Command disabled"
 msgstr "Kommando deaktivert"
 
 #: ../libpurple/protocols/msn/error.c:139
-#, c-format
 msgid "File operation error"
 msgstr "Filoperasjonsfeil"
 
 #: ../libpurple/protocols/msn/error.c:143
-#, c-format
 msgid "Memory allocation error"
 msgstr "Feil ved minneallokering"
 
 #: ../libpurple/protocols/msn/error.c:147
-#, c-format
 msgid "Wrong CHL value sent to server"
 msgstr "Feil CHL-verdi sendt til tjener"
 
 #: ../libpurple/protocols/msn/error.c:152
-#, c-format
 msgid "Server busy"
 msgstr "Tjeneren er opptatt"
 
 #: ../libpurple/protocols/msn/error.c:155
 #: ../libpurple/protocols/msn/error.c:170
 #: ../libpurple/protocols/msn/error.c:230
-#, c-format
 msgid "Server unavailable"
 msgstr "Tjeneren er ikke tilgjengelig"
 
 #: ../libpurple/protocols/msn/error.c:158
-#, fuzzy, c-format
+#, fuzzy
 msgid "Peer notification server down"
 msgstr "Varslingstjeneren er ikke tilgjengelig"
 
 #: ../libpurple/protocols/msn/error.c:162
-#, c-format
 msgid "Database connect error"
 msgstr "Kunne ikke koble til databasen"
 
 #: ../libpurple/protocols/msn/error.c:167
-#, c-format
 msgid "Server is going down (abandon ship)"
 msgstr "Tjeneren er på vei nei (redde seg den som kan)"
 
 #: ../libpurple/protocols/msn/error.c:174
-#, c-format
 msgid "Error creating connection"
 msgstr "Feil: kunne ikke koble til"
 
 #: ../libpurple/protocols/msn/error.c:179
-#, c-format
 msgid "CVR parameters are either unknown or not allowed"
 msgstr "CVR-parametre er enten ukjent eller ikke tillatt"
 
 #: ../libpurple/protocols/msn/error.c:183
-#, c-format
 msgid "Unable to write"
 msgstr "Kunne ikke skrive"
 
 #: ../libpurple/protocols/msn/error.c:186
-#, c-format
 msgid "Session overload"
 msgstr "Sesjonsoverlast"
 
 #: ../libpurple/protocols/msn/error.c:190
-#, c-format
 msgid "User is too active"
 msgstr "Brukeren er for aktiv"
 
 #: ../libpurple/protocols/msn/error.c:193
-#, c-format
 msgid "Too many sessions"
 msgstr "For mange sesjoner"
 
 #: ../libpurple/protocols/msn/error.c:196
-#, c-format
 msgid "Passport not verified"
 msgstr "Passport-konto er ikke blitt verifisert"
 
 #: ../libpurple/protocols/msn/error.c:199
-#, c-format
 msgid "Bad friend file"
 msgstr "Ugyldig 'friend'-fil"
 
 #: ../libpurple/protocols/msn/error.c:203
-#, c-format
 msgid "Not expected"
 msgstr "Uventet"
 
 #: ../libpurple/protocols/msn/error.c:209
-#, c-format
 msgid "Friendly name changes too rapidly"
 msgstr "Visningsnavnet endres for raskt"
 
 #: ../libpurple/protocols/msn/error.c:218
-#, c-format
 msgid "Server too busy"
 msgstr "Tjeneren er for opptatt"
 
@@ -6830,33 +6736,28 @@
 #: ../libpurple/protocols/oscar/oscar.c:1380
 #: ../libpurple/protocols/silc/silc.c:233
 #: ../libpurple/protocols/silc10/ops.c:1709
-#: ../libpurple/protocols/toc/toc.c:728 ../libpurple/proxy.c:1380
-#, c-format
+#: ../libpurple/protocols/toc/toc.c:728
+#: ../libpurple/proxy.c:1380
 msgid "Authentication failed"
 msgstr "Autentisering feilet"
 
 #: ../libpurple/protocols/msn/error.c:225
-#, c-format
 msgid "Not allowed when offline"
 msgstr "Ikke tillatt når avlogget"
 
 #: ../libpurple/protocols/msn/error.c:233
-#, c-format
 msgid "Not accepting new users"
 msgstr "Nye brukere vil ikke bli godtatt"
 
 #: ../libpurple/protocols/msn/error.c:237
-#, c-format
 msgid "Kids Passport without parental consent"
 msgstr "Passport for barn, men har ikke foreldregodkjenning"
 
 #: ../libpurple/protocols/msn/error.c:241
-#, c-format
 msgid "Passport account not yet verified"
 msgstr "Passport-konto er ikke blitt verifisert enda"
 
 #: ../libpurple/protocols/msn/error.c:244
-#, c-format
 msgid "Bad ticket"
 msgstr "Bad ticket"
 
@@ -6872,417 +6773,391 @@
 
 #: ../libpurple/protocols/msn/msn.c:130
 msgid "Nudge"
-msgstr ""
+msgstr "Nudge"
 
 #: ../libpurple/protocols/msn/msn.c:131
-#, fuzzy, c-format
+#, c-format
 msgid "%s has nudged you!"
-msgstr "%s er borte."
+msgstr "%s har nudga deg!"
 
 #: ../libpurple/protocols/msn/msn.c:132
 #, c-format
 msgid "Nudging %s..."
-msgstr ""
+msgstr "Nudging %s..."
 
 #: ../libpurple/protocols/msn/msn.c:174
 msgid "Your new MSN friendly name is too long."
 msgstr "Det nye MSN-kallenavnet er for langt."
 
-#: ../libpurple/protocols/msn/msn.c:282
+#: ../libpurple/protocols/msn/msn.c:285
 msgid "Set your friendly name."
 msgstr "Sett kallenavn."
 
-#: ../libpurple/protocols/msn/msn.c:283
+#: ../libpurple/protocols/msn/msn.c:286
 msgid "This is the name that other MSN buddies will see you as."
 msgstr "Dette er navnet som andre MSN-kompiser vil se deg som."
 
-#: ../libpurple/protocols/msn/msn.c:301
+#: ../libpurple/protocols/msn/msn.c:304
 msgid "Set your home phone number."
 msgstr "Sett telefonnummer (hjemme)."
 
-#: ../libpurple/protocols/msn/msn.c:318
+#: ../libpurple/protocols/msn/msn.c:321
 msgid "Set your work phone number."
 msgstr "Sett telefonnummer (arbeid)."
 
-#: ../libpurple/protocols/msn/msn.c:335
+#: ../libpurple/protocols/msn/msn.c:338
 msgid "Set your mobile phone number."
-msgstr "Sett mobiltelefonnummer"
-
-#: ../libpurple/protocols/msn/msn.c:350
+msgstr "Sett ditt mobiltelefonnummer."
+
+#: ../libpurple/protocols/msn/msn.c:353
 msgid "Allow MSN Mobile pages?"
-msgstr "Tillat tekstmeldinger via MSN"
-
-#: ../libpurple/protocols/msn/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?"
-msgstr ""
-"Ønsker du å tillate eller forby kontakter å sende deg tekstmeldinger via MSN?"
-
-#: ../libpurple/protocols/msn/msn.c:357
+msgstr "Tillat tekstmeldinger via MSN?"
+
+#: ../libpurple/protocols/msn/msn.c:354
+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?"
+msgstr "Ønsker du å tillate eller forby kontakter å sende deg tekstmeldinger via MSN?"
+
+#: ../libpurple/protocols/msn/msn.c:360
 msgid "Allow"
 msgstr "Tillat"
 
-#: ../libpurple/protocols/msn/msn.c:358
+#: ../libpurple/protocols/msn/msn.c:361
 msgid "Disallow"
 msgstr "Forby"
 
-#: ../libpurple/protocols/msn/msn.c:374
+#: ../libpurple/protocols/msn/msn.c:377
 msgid "This Hotmail account may not be active."
 msgstr "Det kan hende denne Hotmail kontoen ikke er aktiv."
 
-#: ../libpurple/protocols/msn/msn.c:400
+#: ../libpurple/protocols/msn/msn.c:403
 msgid "Send a mobile message."
-msgstr "Send tekstmelding"
-
-#: ../libpurple/protocols/msn/msn.c:402
+msgstr "Send tekstmelding."
+
+#: ../libpurple/protocols/msn/msn.c:405
 msgid "Page"
 msgstr "Send"
 
-#: ../libpurple/protocols/msn/msn.c:549
-#, fuzzy
-msgid "Has you"
-msgstr "Har deg"
-
-#: ../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:610
+#: ../libpurple/protocols/msn/msn.c:635
+#: ../libpurple/protocols/msn/msn.c:642
+#: ../libpurple/protocols/msn/msn.c:649
+#: ../libpurple/protocols/msn/msn.c:656
+#: ../libpurple/protocols/msn/msn.c:662
+#: ../libpurple/protocols/msn/msn.c:668
+msgid "Current media"
+msgstr "Gjeldende media"
+
+#: ../libpurple/protocols/msn/msn.c:647
+#: ../libpurple/protocols/msn/state.c:33
+#: ../libpurple/protocols/yahoo/yahoo.c:3076
+#: ../libpurple/protocols/yahoo/yahoo.c:3760
 msgid "Be Right Back"
 msgstr "Straks tilbake"
 
-#: ../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/msn/msn.c:654
+#: ../libpurple/protocols/msn/state.c:31
+#: ../libpurple/protocols/novell/novell.c:2827
+#: ../libpurple/protocols/novell/novell.c:2957
 #: ../libpurple/protocols/silc/buddy.c:1480
 #: ../libpurple/protocols/silc/silc.c:56
 #: ../libpurple/protocols/silc10/buddy.c:1480
 #: ../libpurple/protocols/silc10/silc.c:47
-#: ../libpurple/protocols/yahoo/yahoo.c:3079
-#: ../libpurple/protocols/yahoo/yahoo.c:3764
+#: ../libpurple/protocols/yahoo/yahoo.c:3078
+#: ../libpurple/protocols/yahoo/yahoo.c:3763
 msgid "Busy"
 msgstr "Opptatt"
 
-#: ../libpurple/protocols/msn/msn.c:587
-#: ../libpurple/protocols/yahoo/yahoo.c:3087
-#: ../libpurple/protocols/yahoo/yahoo.c:3776
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:660
+#: ../libpurple/protocols/yahoo/yahoo.c:3086
+#: ../libpurple/protocols/yahoo/yahoo.c:3775
 msgid "On the Phone"
 msgstr "I telefonen"
 
-#: ../libpurple/protocols/msn/msn.c:591
-#: ../libpurple/protocols/yahoo/yahoo.c:3091
-#: ../libpurple/protocols/yahoo/yahoo.c:3782
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:666
+#: ../libpurple/protocols/yahoo/yahoo.c:3090
+#: ../libpurple/protocols/yahoo/yahoo.c:3781
 msgid "Out to Lunch"
 msgstr "Ute til lunsj"
 
-#: ../libpurple/protocols/msn/msn.c:619
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:697
 msgid "Set Friendly Name..."
-msgstr "Sett kallenavn"
-
-#: ../libpurple/protocols/msn/msn.c:624
-#, fuzzy
+msgstr "Sett kallenavn..."
+
+#: ../libpurple/protocols/msn/msn.c:702
 msgid "Set Home Phone Number..."
-msgstr "Sett telefonnummer (hjemme)"
-
-#: ../libpurple/protocols/msn/msn.c:628
-#, fuzzy
+msgstr "Sett telefonnummer (hjemme)..."
+
+#: ../libpurple/protocols/msn/msn.c:706
 msgid "Set Work Phone Number..."
-msgstr "Sett telefonnummer (arbeid)"
-
-#: ../libpurple/protocols/msn/msn.c:632
-#, fuzzy
+msgstr "Sett telefonnummer (arbeid)..."
+
+#: ../libpurple/protocols/msn/msn.c:710
 msgid "Set Mobile Phone Number..."
-msgstr "Sett mobiltelefonnummer"
-
-#: ../libpurple/protocols/msn/msn.c:638
-#, fuzzy
+msgstr "Sett telefonnummer (mobil)..."
+
+#: ../libpurple/protocols/msn/msn.c:716
 msgid "Enable/Disable Mobile Devices..."
-msgstr "Bruk/ikke bruk mobile enheter"
-
-#: ../libpurple/protocols/msn/msn.c:643
-#, fuzzy
+msgstr "Bruk/ikke bruk mobile enheter..."
+
+#: ../libpurple/protocols/msn/msn.c:721
 msgid "Allow/Disallow Mobile Pages..."
-msgstr "Tillate/forby tekstmeldinger"
-
-#: ../libpurple/protocols/msn/msn.c:654
+msgstr "Tillate/forby tekstmeldinger..."
+
+#: ../libpurple/protocols/msn/msn.c:732
 msgid "Open Hotmail Inbox"
 msgstr "Åpne Hotmail Inbox"
 
-#: ../libpurple/protocols/msn/msn.c:678
+#: ../libpurple/protocols/msn/msn.c:756
 msgid "Send to Mobile"
 msgstr "Send til mobil"
 
-#: ../libpurple/protocols/msn/msn.c:688
-#: ../libpurple/protocols/novell/novell.c:3408
+#: ../libpurple/protocols/msn/msn.c:766
+#: ../libpurple/protocols/novell/novell.c:3413
 msgid "Initiate _Chat"
 msgstr "Start gruppesamtale"
 
-#: ../libpurple/protocols/msn/msn.c:726
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:804
 msgid "SSL support is needed for MSN. Please install a supported SSL library."
-msgstr ""
-"SSL-støtte kreves for MSN, vennligst installer et støttet SSL-bibliotek. Se "
-"http://gaim.sf.net/faq-ssl.php for mer informasjon."
-
-#: ../libpurple/protocols/msn/msn.c:754
+msgstr "SSL-støtte kreves for MSN. Vennligst installer et støttet SSL-bibliotek."
+
+#: ../libpurple/protocols/msn/msn.c:832
 msgid "Failed to connect to server."
 msgstr "Klarte ikke koble til tjener."
 
-#: ../libpurple/protocols/msn/msn.c:1510 ../libpurple/protocols/msn/msn.c:1858
+#: ../libpurple/protocols/msn/msn.c:1620
+#: ../libpurple/protocols/msn/msn.c:1968
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:808
 msgid "Error retrieving profile"
 msgstr "Klarte ikke hente profil"
 
-#: ../libpurple/protocols/msn/msn.c:1581 ../pidgin/plugins/convcolors.c:309
-#: ../pidgin/plugins/pidginrc.c:366
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:1691
+#: ../pidgin/plugins/convcolors.c:309
+#: ../pidgin/plugins/pidginrc.c:360
 msgid "General"
-msgstr "Kjønn"
-
-#: ../libpurple/protocols/msn/msn.c:1588
+msgstr "Generellt "
+
+#: ../libpurple/protocols/msn/msn.c:1698
 #: ../libpurple/protocols/myspace/user.c:110
-#: ../libpurple/protocols/oscar/oscar.c:3755
+#: ../libpurple/protocols/oscar/oscar.c:3751
 #: ../libpurple/protocols/qq/buddy_info.c:45
 #: ../libpurple/protocols/qq/qq.c:221
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1081
 msgid "Age"
 msgstr "Alder"
 
-#: ../libpurple/protocols/msn/msn.c:1590
+#: ../libpurple/protocols/msn/msn.c:1700
 #: ../libpurple/protocols/qq/buddy_info.c:51
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1096
 msgid "Occupation"
 msgstr "Yrke"
 
-#: ../libpurple/protocols/msn/msn.c:1591
+#: ../libpurple/protocols/msn/msn.c:1701
 #: ../libpurple/protocols/myspace/user.c:119
-#: ../libpurple/protocols/novell/novell.c:1478
+#: ../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 "Sted"
 
-#: ../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:1706
+#: ../libpurple/protocols/msn/msn.c:1898
+#: ../libpurple/protocols/msn/msn.c:1904
+#: ../libpurple/protocols/msn/msn.c:1911
 msgid "Hobbies and Interests"
 msgstr "Hobbyer og interesser"
 
-#: ../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:1712
+#: ../libpurple/protocols/msn/msn.c:1832
+#: ../libpurple/protocols/msn/msn.c:1838
+#: ../libpurple/protocols/msn/msn.c:1845
+#: ../libpurple/protocols/msn/msn.c:1853
+#: ../libpurple/protocols/msn/msn.c:1860
 msgid "A Little About Me"
 msgstr "Noen ord om meg"
 
-#: ../libpurple/protocols/msn/msn.c:1619
+#: ../libpurple/protocols/msn/msn.c:1729
 msgid "Social"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:1621
+msgstr "Sosial"
+
+#: ../libpurple/protocols/msn/msn.c:1731
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1086
 msgid "Marital Status"
 msgstr "Sivilstatus"
 
-#: ../libpurple/protocols/msn/msn.c:1622
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:1732
 msgid "Interests"
-msgstr "Sett _inn"
-
-#: ../libpurple/protocols/msn/msn.c:1623
-#, fuzzy
+msgstr "Interesser"
+
+#: ../libpurple/protocols/msn/msn.c:1733
 msgid "Pets"
-msgstr "Porter"
-
-#: ../libpurple/protocols/msn/msn.c:1624
-#, fuzzy
+msgstr "Dyr"
+
+#: ../libpurple/protocols/msn/msn.c:1734
 msgid "Hometown"
-msgstr "Maskin ukjent"
-
-#: ../libpurple/protocols/msn/msn.c:1625
+msgstr "Hjemby"
+
+#: ../libpurple/protocols/msn/msn.c:1735
 msgid "Places Lived"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:1626
+msgstr "Steder du har bodd"
+
+#: ../libpurple/protocols/msn/msn.c:1736
 msgid "Fashion"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:1627
+msgstr "Mote"
+
+#: ../libpurple/protocols/msn/msn.c:1737
 msgid "Humor"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:1628
+msgstr "Humor"
+
+#: ../libpurple/protocols/msn/msn.c:1738
 msgid "Music"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:1629 ../libpurple/protocols/msn/msn.c:1810
-#: ../libpurple/protocols/msn/msn.c:1816
+msgstr "Musikk"
+
+#: ../libpurple/protocols/msn/msn.c:1739
+#: ../libpurple/protocols/msn/msn.c:1920
+#: ../libpurple/protocols/msn/msn.c:1926
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1138
 msgid "Favorite Quote"
 msgstr "Yndlingssitat"
 
-#: ../libpurple/protocols/msn/msn.c:1646
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:1756
 msgid "Contact Info"
-msgstr "Kontoinformasjon"
-
-#: ../libpurple/protocols/msn/msn.c:1647
-#, fuzzy
+msgstr "Kontaktinformasjon"
+
+#: ../libpurple/protocols/msn/msn.c:1757
 msgid "Personal"
-msgstr "Tittel"
-
-#: ../libpurple/protocols/msn/msn.c:1650
+msgstr "Personlig"
+
+#: ../libpurple/protocols/msn/msn.c:1760
 msgid "Significant Other"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:1651
-#, fuzzy
+msgstr "Annet Spesielt"
+
+#: ../libpurple/protocols/msn/msn.c:1761
 msgid "Home Phone"
-msgstr "Hjemmeside"
-
-#: ../libpurple/protocols/msn/msn.c:1652
-#, fuzzy
+msgstr "Hjemmetelefon"
+
+#: ../libpurple/protocols/msn/msn.c:1762
 msgid "Home Phone 2"
-msgstr "Sett telefonnummer (hjemme)"
-
-#: ../libpurple/protocols/msn/msn.c:1653
-#: ../libpurple/protocols/oscar/oscar.c:3793
+msgstr "Hjemmetelefon 2"
+
+#: ../libpurple/protocols/msn/msn.c:1763
+#: ../libpurple/protocols/oscar/oscar.c:3789
 msgid "Home Address"
 msgstr "Hjemstedsadresse"
 
-#: ../libpurple/protocols/msn/msn.c:1654
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:1764
 msgid "Personal Mobile"
-msgstr "Tittel"
-
-#: ../libpurple/protocols/msn/msn.c:1655
-#, fuzzy
+msgstr "Mobil"
+
+#: ../libpurple/protocols/msn/msn.c:1765
 msgid "Home Fax"
-msgstr "Hjemmeside"
-
-#: ../libpurple/protocols/msn/msn.c:1656
-#, fuzzy
+msgstr "Fax"
+
+#: ../libpurple/protocols/msn/msn.c:1766
 msgid "Personal E-Mail"
-msgstr "Tittel"
-
-#: ../libpurple/protocols/msn/msn.c:1657
-#, fuzzy
+msgstr "E-post"
+
+#: ../libpurple/protocols/msn/msn.c:1767
 msgid "Personal IM"
-msgstr "Tittel"
-
-#: ../libpurple/protocols/msn/msn.c:1659
+msgstr "Lynmelding"
+
+#: ../libpurple/protocols/msn/msn.c:1769
 msgid "Anniversary"
-msgstr ""
+msgstr "Bursdag"
 
 #. Business
-#: ../libpurple/protocols/msn/msn.c:1675
+#: ../libpurple/protocols/msn/msn.c:1785
 msgid "Work"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:1677
+msgstr "Arbeid"
+
+#: ../libpurple/protocols/msn/msn.c:1787
 #: ../libpurple/protocols/silc/ops.c:1010
 #: ../libpurple/protocols/silc10/ops.c:1044
 msgid "Job Title"
 msgstr "Tittel"
 
-#: ../libpurple/protocols/msn/msn.c:1678
-#: ../libpurple/protocols/oscar/oscar.c:3814
+#: ../libpurple/protocols/msn/msn.c:1788
+#: ../libpurple/protocols/oscar/oscar.c:3810
 msgid "Company"
 msgstr "Firma"
 
-#: ../libpurple/protocols/msn/msn.c:1679
-#: ../libpurple/protocols/novell/novell.c:1480
+#: ../libpurple/protocols/msn/msn.c:1789
+#: ../libpurple/protocols/novell/novell.c:1482
 msgid "Department"
 msgstr "Avdeling"
 
-#: ../libpurple/protocols/msn/msn.c:1680
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:1790
 msgid "Profession"
-msgstr "Framdrift"
-
-#: ../libpurple/protocols/msn/msn.c:1681
-#, fuzzy
+msgstr "Yrke"
+
+#: ../libpurple/protocols/msn/msn.c:1791
 msgid "Work Phone"
-msgstr "Telefon"
-
-#: ../libpurple/protocols/msn/msn.c:1682
-#, fuzzy
+msgstr "Arbeids Telefon"
+
+#: ../libpurple/protocols/msn/msn.c:1792
 msgid "Work Phone 2"
-msgstr "Sett telefonnummer (arbeid)"
-
-#: ../libpurple/protocols/msn/msn.c:1683
-#: ../libpurple/protocols/oscar/oscar.c:3806
+msgstr "Arbeids Telefon 2"
+
+#: ../libpurple/protocols/msn/msn.c:1793
+#: ../libpurple/protocols/oscar/oscar.c:3802
 msgid "Work Address"
 msgstr "Arbeidsadresse"
 
-#: ../libpurple/protocols/msn/msn.c:1684
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:1794
 msgid "Work Mobile"
-msgstr "Send til mobil"
-
-#: ../libpurple/protocols/msn/msn.c:1685
-#, fuzzy
+msgstr "Mobil Jobb"
+
+#: ../libpurple/protocols/msn/msn.c:1795
 msgid "Work Pager"
-msgstr "Hjemmeside"
-
-#: ../libpurple/protocols/msn/msn.c:1686
+msgstr "Telefonsøker Jobb"
+
+#: ../libpurple/protocols/msn/msn.c:1796
 msgid "Work Fax"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:1687
-#, fuzzy
+msgstr "Fax Jobb"
+
+#: ../libpurple/protocols/msn/msn.c:1797
 msgid "Work E-Mail"
-msgstr "E-post"
-
-#: ../libpurple/protocols/msn/msn.c:1688
+msgstr "E-post Arbeid"
+
+#: ../libpurple/protocols/msn/msn.c:1798
 msgid "Work IM"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:1689
-#, fuzzy
+msgstr "Lynmelding Arbeid"
+
+#: ../libpurple/protocols/msn/msn.c:1799
 msgid "Start Date"
-msgstr "Fylke/stat"
-
-#: ../libpurple/protocols/msn/msn.c:1759 ../libpurple/protocols/msn/msn.c:1765
-#: ../libpurple/protocols/msn/msn.c:1772 ../libpurple/protocols/msn/msn.c:1779
+msgstr "Start Dato"
+
+#: ../libpurple/protocols/msn/msn.c:1869
+#: ../libpurple/protocols/msn/msn.c:1875
+#: ../libpurple/protocols/msn/msn.c:1882
+#: ../libpurple/protocols/msn/msn.c:1889
 msgid "Favorite Things"
 msgstr "Favoritt-ting"
 
-#: ../libpurple/protocols/msn/msn.c:1824
+#: ../libpurple/protocols/msn/msn.c:1934
 msgid "Last Updated"
 msgstr "Sist oppdatert"
 
-#: ../libpurple/protocols/msn/msn.c:1835
+#: ../libpurple/protocols/msn/msn.c:1945
 #: ../libpurple/protocols/qq/buddy_info.c:60
 #: ../libpurple/protocols/silc/ops.c:1026
 #: ../libpurple/protocols/silc10/ops.c:1060
 msgid "Homepage"
 msgstr "Hjemmeside"
 
-#: ../libpurple/protocols/msn/msn.c:1859
+#: ../libpurple/protocols/msn/msn.c:1969
 msgid "The user has not created a public profile."
-msgstr "Brukeren har ikke opprettet en offentlig profil"
-
-#: ../libpurple/protocols/msn/msn.c:1860
-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 "
-"public profile."
-msgstr ""
-"MSN klarte ikke å finne brukerens profil. Dette betyr enten at brukeren ikke "
-"eksisterer, eller at brukeren ikke har opprettet en offentlig profil"
-
-#: ../libpurple/protocols/msn/msn.c:1864
-#, fuzzy
-msgid ""
-"Could not find any information in the user's profile. The user most likely "
-"does not exist."
-msgstr ""
-"Gaim klarte ikke finne noen informasjon i brukerens profil. Antakelig "
-"eksisterer brukeren ikke."
-
-#: ../libpurple/protocols/msn/msn.c:1872
+msgstr "Brukeren har ikke opprettet en offentlig profil."
+
+#: ../libpurple/protocols/msn/msn.c:1970
+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 public profile."
+msgstr "MSN klarte ikke å finne brukerens profil. Dette betyr enten at brukeren ikke eksisterer, eller at brukeren ikke har opprettet en offentlig profil."
+
+#: ../libpurple/protocols/msn/msn.c:1974
+msgid "Could not find any information in the user's profile. The user most likely does not exist."
+msgstr "Pidgin klarte ikke finne noen informasjon i brukerens profil. Antakelig eksisterer brukeren ikke."
+
+#: ../libpurple/protocols/msn/msn.c:1982
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1240
 msgid "Profile URL"
 msgstr "Profil URL"
@@ -7297,31 +7172,127 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/msn/msn.c:2158 ../libpurple/protocols/msn/msn.c:2160
-#, fuzzy
-msgid "MSN Protocol Plugin"
-msgstr "AIM/ICQ-protokolltillegg"
-
-#: ../libpurple/protocols/msn/msn.c:2194
+#: ../libpurple/protocols/msn/msn.c:2269
+#: ../libpurple/protocols/msn/msn.c:2271
+msgid "Windows Live Messenger Protocol Plugin"
+msgstr "Windows Live Messenger protolltillegg"
+
+#: ../libpurple/protocols/msn/msn.c:2306
 msgid "Use HTTP Method"
 msgstr "Bruk HTTP-metode"
 
 #
-#: ../libpurple/protocols/msn/msn.c:2199
-#, fuzzy
+#: ../libpurple/protocols/msn/msn.c:2311
 msgid "HTTP Method Server"
-msgstr "IPC testtjener"
-
-#: ../libpurple/protocols/msn/msn.c:2204
+msgstr "HTTP Method Server"
+
+#: ../libpurple/protocols/msn/msn.c:2316
 msgid "Show custom smileys"
-msgstr ""
-
-#: ../libpurple/protocols/msn/msn.c:2212
-#, fuzzy
+msgstr "Vis custom smileys"
+
+#: ../libpurple/protocols/msn/msn.c:2324
 msgid "nudge: nudge a user to get their attention"
 msgstr "nudge: nudge en kontakt for å få deres oppmerksomhet"
 
-#: ../libpurple/protocols/msn/nexus.c:146
+#: ../libpurple/protocols/msn/nexus.c:137
+msgid "Windows Live ID authentication:Unable to connect"
+msgstr "Windows Live ID autentisering: Kunne ikke tilkoble"
+
+#: ../libpurple/protocols/msn/nexus.c:275
+msgid "Windows Live ID authentication Failed"
+msgstr "Windows Live ID autentisering Feilet"
+
+#: ../libpurple/protocols/msn/notification.c:191
+#, c-format
+msgid "%s is not a valid group."
+msgstr "%s er ikke et gyldig navn på en gruppe."
+
+#: ../libpurple/protocols/msn/notification.c:197
+#: ../libpurple/protocols/msn/notification.c:938
+#: ../libpurple/protocols/msn/session.c:369
+msgid "Unknown error."
+msgstr "Ukjent feil."
+
+#: ../libpurple/protocols/msn/notification.c:200
+#, c-format
+msgid "%s on %s (%s)"
+msgstr "%s på %s (%s)"
+
+#: ../libpurple/protocols/msn/notification.c:518
+#, c-format
+msgid "%s just sent you a Nudge!"
+msgstr "%s har sendt deg en Nudge!"
+
+#: ../libpurple/protocols/msn/notification.c:843
+#, c-format
+msgid "Unknown error (%d)"
+msgstr "Ukjent feil (%d)"
+
+#: ../libpurple/protocols/msn/notification.c:844
+#: ../libpurple/protocols/sametime/sametime.c:4425
+msgid "Unable to add user"
+msgstr "Klarte ikke å legge til bruker"
+
+#: ../libpurple/protocols/msn/notification.c:904
+#, c-format
+msgid "Unable to add user on %s (%s)"
+msgstr "Klarte ikke legge til bruker på %s (%s)"
+
+#: ../libpurple/protocols/msn/notification.c:908
+#, c-format
+msgid "Unable to block user on %s (%s)"
+msgstr "Klarte ikke blokkere brukeren på %s (%s)"
+
+#: ../libpurple/protocols/msn/notification.c:912
+#, c-format
+msgid "Unable to permit user on %s (%s)"
+msgstr "Klarte ikke tillate bruker på %s (%s)"
+
+#: ../libpurple/protocols/msn/notification.c:920
+#, c-format
+msgid "%s could not be added because your buddy list is full."
+msgstr "%s kunne ikke bli lagt til kontaktlista, fordi din kontaktliste er full."
+
+#: ../libpurple/protocols/msn/notification.c:929
+#, c-format
+msgid "%s is not a valid passport account."
+msgstr "%s er ikke en gyldig passport-konto."
+
+#: ../libpurple/protocols/msn/notification.c:934
+msgid "Service Temporarily Unavailable."
+msgstr "Tjenesten Midlertidig Utilgjengelig."
+
+#: ../libpurple/protocols/msn/notification.c:1272
+msgid "Unable to rename group"
+msgstr "Kunne ikke endre navn på gruppe"
+
+#: ../libpurple/protocols/msn/notification.c:1327
+msgid "Unable to delete group"
+msgstr "Kunne ikke slette gruppe"
+
+#: ../libpurple/protocols/msn/notification.c:1943
+#, c-format
+msgid ""
+"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"
+"\n"
+"After the maintenance has been completed, you will be able to successfully sign in."
+msgid_plural ""
+"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"
+"\n"
+"After the maintenance has been completed, you will be able to successfully sign in."
+msgstr[0] ""
+"MSN-tjeneren vil stenge ned pga. vedlikeholdsarbeid i løpet av %d minutt. Du vil da bli frakoblet, så vennligst avslutt eventuelle samtaler før det.\n"
+"\n"
+"Etter at vedlikeholdsarbeidet er ferdig, kan du logge på igjen."
+msgstr[1] ""
+"MSN-tjeneren vil stenge ned pga. vedlikeholdsarbeid i løpet av %d minutter. Du vil da bli frakoblet, så vennligst avslutt eventuelle samtaler før det.\n"
+"\n"
+"Etter at vedlikeholdsarbeidet er ferdig, kan du logge på igjen."
+
+#: ../libpurple/protocols/msn/oim.c:141
+msgid "Unable to connect to OIM server"
+msgstr "Kan ikke koble til OIM server"
+
 #: ../libpurple/protocols/msn/servconn.c:135
 #: ../libpurple/protocols/qq/qq_proxy.c:242
 #: ../libpurple/protocols/qq/qq_proxy.c:321
@@ -7341,88 +7312,6 @@
 msgid "Unable to connect"
 msgstr "Kunne ikke koble til"
 
-#: ../libpurple/protocols/msn/notification.c:178
-#, c-format
-msgid "%s is not a valid group."
-msgstr "%s er ikke et gyldig navn på en gruppe."
-
-#: ../libpurple/protocols/msn/notification.c:184
-#: ../libpurple/protocols/msn/notification.c:532
-#: ../libpurple/protocols/msn/session.c:330
-msgid "Unknown error."
-msgstr "Ukjent feil."
-
-#: ../libpurple/protocols/msn/notification.c:187
-#, c-format
-msgid "%s on %s (%s)"
-msgstr "%s på %s (%s)"
-
-#: ../libpurple/protocols/msn/notification.c:498
-#, c-format
-msgid "Unable to add user on %s (%s)"
-msgstr "Klarte ikke legge til bruker på %s (%s)"
-
-#: ../libpurple/protocols/msn/notification.c:502
-#, c-format
-msgid "Unable to block user on %s (%s)"
-msgstr "Klarte ikke blokkere brukeren på %s (%s)"
-
-#: ../libpurple/protocols/msn/notification.c:506
-#, c-format
-msgid "Unable to permit user on %s (%s)"
-msgstr "Klarte ikke tillate bruker på %s (%s)"
-
-#: ../libpurple/protocols/msn/notification.c:514
-#, c-format
-msgid "%s could not be added because your buddy list is full."
-msgstr ""
-"%s kunne ikke bli lagt til kontaktlista, fordi din kontaktliste er full."
-
-#: ../libpurple/protocols/msn/notification.c:523
-#, c-format
-msgid "%s is not a valid passport account."
-msgstr "%s er ikke et gyldig passport-konto"
-
-#: ../libpurple/protocols/msn/notification.c:528
-#, fuzzy
-msgid "Service Temporarily Unavailable."
-msgstr "Tjenesten midlertidig uttilgjengelig"
-
-#: ../libpurple/protocols/msn/notification.c:851
-msgid "Unable to rename group"
-msgstr "Kunne ikke endre navn på gruppe"
-
-#: ../libpurple/protocols/msn/notification.c:906
-msgid "Unable to delete group"
-msgstr "Kunne ikke slette gruppe"
-
-#: ../libpurple/protocols/msn/notification.c:1325
-#, c-format
-msgid ""
-"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"
-"\n"
-"After the maintenance has been completed, you will be able to successfully "
-"sign in."
-msgid_plural ""
-"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"
-"\n"
-"After the maintenance has been completed, you will be able to successfully "
-"sign in."
-msgstr[0] ""
-"MSN-tjeneren vil stenge ned pga. vedlikeholdsarbeid i løpet av %d minutt. Du "
-"vil da bli frakoblet, så vennligst avslutt eventuelle samtaler før det.\n"
-"\n"
-"Etter at vedlikeholdsarbeidet er ferdig, kan du logge på igjen."
-msgstr[1] ""
-"MSN-tjeneren vil stenge ned pga. vedlikeholdsarbeid i løpet av %d minutter. "
-"Du vil da bli frakoblet, så vennligst avslutt eventuelle samtaler før det.\n"
-"\n"
-"Etter at vedlikeholdsarbeidet er ferdig, kan du logge på igjen."
-
 #: ../libpurple/protocols/msn/servconn.c:137
 msgid "Writing error"
 msgstr "Feil ved skriving"
@@ -7432,67 +7321,63 @@
 msgstr "Feil ved lesing"
 
 #: ../libpurple/protocols/msn/servconn.c:146
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Connection error from %s server:\n"
 "%s"
 msgstr ""
-"Tilkoplingsfeil fra %s tjener (%s):\n"
+"Tilkoplingsfeil fra %s tjener:\n"
 "%s"
 
-#: ../libpurple/protocols/msn/session.c:299
+#: ../libpurple/protocols/msn/session.c:336
 msgid "Our protocol is not supported by the server."
-msgstr "Vår protokoll er ikke støttet av tjeneren"
-
-#: ../libpurple/protocols/msn/session.c:303
+msgstr "Vår protokoll er ikke støttet av tjeneren."
+
+#: ../libpurple/protocols/msn/session.c:340
 msgid "Error parsing HTTP."
 msgstr "Feil under tolkning av HTTP."
 
-#: ../libpurple/protocols/msn/session.c:307
+#: ../libpurple/protocols/msn/session.c:344
 #: ../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 "Du ble logget av fordi du har logget på et annet sted."
 
-#: ../libpurple/protocols/msn/session.c:310
+#: ../libpurple/protocols/msn/session.c:349
 msgid "The MSN servers are temporarily unavailable. Please wait and try again."
-msgstr ""
-"MSN-tjenerene er midlertidig utilgjengelig.Vennligst prøv igjen senere."
-
-#: ../libpurple/protocols/msn/session.c:315
+msgstr "MSN-tjenerene er midlertidig utilgjengelig.Vennligst prøv igjen senere."
+
+#: ../libpurple/protocols/msn/session.c:354
 msgid "The MSN servers are going down temporarily."
 msgstr "MSN-tjenerne vil bli utilgjengelig en liten stund."
 
-#: ../libpurple/protocols/msn/session.c:320
+#: ../libpurple/protocols/msn/session.c:359
 #, c-format
 msgid "Unable to authenticate: %s"
 msgstr "Klarte ikke autentisere: %s"
 
-#: ../libpurple/protocols/msn/session.c:325
-msgid ""
-"Your MSN buddy list is temporarily unavailable. Please wait and try again."
-msgstr ""
-"Din MSN-kontaktliste er midlertidig utilgjengelig. Vennligst prøv igjen "
-"senere."
-
-#: ../libpurple/protocols/msn/session.c:346
-#: ../libpurple/protocols/msn/session.c:348
+#: ../libpurple/protocols/msn/session.c:364
+msgid "Your MSN buddy list is temporarily unavailable. Please wait and try again."
+msgstr "Din MSN-kontaktliste er midlertidig utilgjengelig. Vennligst prøv igjen senere."
+
+#: ../libpurple/protocols/msn/session.c:385
+#: ../libpurple/protocols/msn/session.c:387
 msgid "Handshaking"
 msgstr "Håndtrykk"
 
-#: ../libpurple/protocols/msn/session.c:349
+#: ../libpurple/protocols/msn/session.c:388
 msgid "Starting authentication"
 msgstr "Starter godkjenning"
 
-#: ../libpurple/protocols/msn/session.c:350
+#: ../libpurple/protocols/msn/session.c:389
 msgid "Getting cookie"
 msgstr "Henter informasjonskapsel"
 
-#: ../libpurple/protocols/msn/session.c:352
+#: ../libpurple/protocols/msn/session.c:391
 msgid "Sending cookie"
 msgstr "Sender informasjonskapsel"
 
-#: ../libpurple/protocols/msn/session.c:353
+#: ../libpurple/protocols/msn/session.c:392
 msgid "Retrieving buddy list"
 msgstr "Henter kontaktliste"
 
@@ -7514,8 +7399,7 @@
 
 #: ../libpurple/protocols/msn/switchboard.c:408
 msgid "Message could not be sent, not allowed while invisible:"
-msgstr ""
-"Meldingen ble ikke sendt, du ikke kan sende meldinger når du er usynlig:"
+msgstr "Meldingen ble ikke sendt, du ikke kan sende meldinger når du er usynlig:"
 
 #: ../libpurple/protocols/msn/switchboard.c:412
 msgid "Message could not be sent because the user is offline:"
@@ -7526,278 +7410,253 @@
 msgstr "Meldingen kunne ikke bli sendt på grunn av en tilkoblingfeil:"
 
 #: ../libpurple/protocols/msn/switchboard.c:420
-#, fuzzy
 msgid "Message could not be sent because we are sending too quickly:"
-msgstr "Meldingen kunne ikke bli sendt, brukeren er frakoblet:"
+msgstr "Meldingen kunne ikke bli sendt fordi du sender for fort:"
 
 #: ../libpurple/protocols/msn/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:"
-msgstr ""
+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:"
+msgstr "Beskjeden kunne ikke bli sendt fordi vi kunne ikke opprette en økt med serveren. Dette er sannsynligvis et server problem, prøv igjen om noen minutter:"
 
 #: ../libpurple/protocols/msn/switchboard.c:431
-msgid ""
-"Message could not be sent because an error with the switchboard occurred:"
-msgstr ""
-"Meldingen kunne ikke bli sendt, da det skjedde en feil med sentralbordet:"
+msgid "Message could not be sent because an error with the switchboard occurred:"
+msgstr "Meldingen kunne ikke bli sendt, da det skjedde en feil med sentralbordet:"
 
 #: ../libpurple/protocols/msn/switchboard.c:439
 msgid "Message may have not been sent because an unknown error occurred:"
 msgstr "Meldingen kunne ikke bli sendt på grunn av en ukjent feil:"
 
-#: ../libpurple/protocols/msn/userlist.c:252
-#, fuzzy, c-format
+#: ../libpurple/protocols/msn/userlist.c:243
+#, c-format
 msgid "%s has added you to his or her buddy list."
-msgstr "Brukeren %s ønsker å legge til %s i kontaktlisten sin."
-
-#: ../libpurple/protocols/msn/userlist.c:321
-#, fuzzy, c-format
+msgstr "%s har lagt deg til i kontaktlisten sin."
+
+#: ../libpurple/protocols/msn/userlist.c:312
+#, c-format
 msgid "%s has removed you from his or her buddy list."
 msgstr "%s har fjernet deg fra sin kontaktliste."
 
-#: ../libpurple/protocols/msn/userlist.c:643
-#, fuzzy, c-format
+#. 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
+#, c-format
 msgid "Unable to add \"%s\"."
-msgstr "Kunne ikke lese fil %s."
-
-#: ../libpurple/protocols/msn/userlist.c:645
-#, fuzzy
+msgstr "Kunne ikke legge til \"%s\"."
+
+#: ../libpurple/protocols/msn/userlist.c:696
 msgid "The screen name specified is invalid."
-msgstr "Den inntastede SecurID-nøkkelen er ugyldig."
+msgstr "Skjermnavnet du spsifiserte er ikke gyldig"
 
 #: ../libpurple/protocols/myspace/myspace.c:111
 msgid "Missing Cipher"
-msgstr ""
+msgstr "Manglende Summering"
 
 #: ../libpurple/protocols/myspace/myspace.c:112
 msgid "The RC4 cipher could not be found"
-msgstr ""
+msgstr "RC4 summeringen kunne ikke bli funnet"
 
 #: ../libpurple/protocols/myspace/myspace.c:113
-msgid ""
-"Upgrade to a libpurple with RC4 support (>= 2.0.1). MySpaceIM plugin will "
-"not be loaded."
-msgstr ""
+msgid "Upgrade to a libpurple with RC4 support (>= 2.0.1). MySpaceIM plugin will not be loaded."
+msgstr "Oppgrader til en libpurple med RC4 støtte (>= 2.0.1). MySpaceIM tillegg vil ikke bli lastet."
 
 #: ../libpurple/protocols/myspace/myspace.c:286
 #, c-format
-msgid ""
-"Sorry, passwords over %d characters in length (yours is %d) are not "
-"supported by MySpace."
-msgstr ""
+msgid "Sorry, passwords over %d characters in length (yours is %d) are not supported by MySpace."
+msgstr "Sorry, passord over %d tegn (du har %d) er ikke støttet av MySpace."
 
 #. 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:1798
 msgid "MySpaceIM Error"
-msgstr ""
+msgstr "MySpaceIM Feil"
 
 #: ../libpurple/protocols/myspace/myspace.c:349
-#, fuzzy
 msgid "Reading challenge"
 msgstr "Leser data"
 
 #: ../libpurple/protocols/myspace/myspace.c:355
-#, fuzzy
 msgid "Unexpected challenge length from server"
-msgstr "Ugyldig utfordring fra tjener."
+msgstr "Ugyldig utfordring fra tjener"
 
 #: ../libpurple/protocols/myspace/myspace.c:359
-#, fuzzy
 msgid "Logging in"
-msgstr "Logging"
-
-#: ../libpurple/protocols/myspace/myspace.c:1286
+msgstr "Logger inn"
+
+#: ../libpurple/protocols/myspace/myspace.c:1278
 #, c-format
 msgid "Connection to server lost (no data received within %d seconds)"
-msgstr ""
+msgstr "Tilkobling til server mistet (ingen data mottatt iløpet av %d sekunder)"
 
 #. Can't write _()'d strings in array initializers. Workaround.
-#: ../libpurple/protocols/myspace/myspace.c:1328
-#, fuzzy
+#: ../libpurple/protocols/myspace/myspace.c:1321
 msgid "New mail messages"
-msgstr "Ny fraværsbeskjed"
-
-#: ../libpurple/protocols/myspace/myspace.c:1329
+msgstr "Nye e-post beskjeder"
+
+#: ../libpurple/protocols/myspace/myspace.c:1322
 msgid "New blog comments"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:1330
+msgstr "Nye blog kommentarer"
+
+#: ../libpurple/protocols/myspace/myspace.c:1323
 msgid "New profile comments"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:1331
+msgstr "Nye profil kommentarer"
+
+#: ../libpurple/protocols/myspace/myspace.c:1324
 msgid "New friend requests!"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:1332
+msgstr "Nye venne-forespørsler!"
+
+#: ../libpurple/protocols/myspace/myspace.c:1325
 msgid "New picture comments"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:1360
+msgstr "Nye bilde kommentarer"
+
+#: ../libpurple/protocols/myspace/myspace.c:1355
 msgid "MySpace"
-msgstr ""
+msgstr "Myspace"
 
 #. The session is now set up, ready to be connected. This emits the
 #. * signedOn signal, so clients can now do anything with msimprpl, and
 #. * we're ready for it (session key, userid, username all setup).
-#: ../libpurple/protocols/myspace/myspace.c:1543
+#: ../libpurple/protocols/myspace/myspace.c:1538
 #: ../libpurple/protocols/sametime/sametime.c:1544
-#, fuzzy
 msgid "Connected"
-msgstr "Koble til"
-
-#: ../libpurple/protocols/myspace/myspace.c:1554
-#: ../libpurple/protocols/myspace/myspace.c:1556
-#, fuzzy
+msgstr "Tilkoblet"
+
+#: ../libpurple/protocols/myspace/myspace.c:1549
+#: ../libpurple/protocols/myspace/myspace.c:1551
 msgid "No username set"
-msgstr "Skjermnavn ikke oppgitt."
-
-#: ../libpurple/protocols/myspace/myspace.c:1555
-msgid ""
-"Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile."
-"username and choose a username and try to login again."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:1782
+msgstr "Skjermnavn ikke oppgitt"
+
+#: ../libpurple/protocols/myspace/myspace.c:1550
+msgid "Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile.username and choose a username and try to login again."
+msgstr "Vennligst gå til http://editprofile.myspace.com/index.cfm?fuseaction=profile.username og velg et brukernavn og prøv å logge inn igjen."
+
+#: ../libpurple/protocols/myspace/myspace.c:1777
 #, c-format
 msgid "Protocol error, code %d: %s"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:1972
-#: ../libpurple/protocols/myspace/myspace.c:2006
-#, fuzzy
+msgstr "Protokoll feil, kode %d: %s"
+
+#: ../libpurple/protocols/myspace/myspace.c:1970
+#: ../libpurple/protocols/myspace/myspace.c:2004
 msgid "Failed to add buddy"
-msgstr "Kunne ikke bli med kontakt i samtale"
-
-#: ../libpurple/protocols/myspace/myspace.c:1972
-#, fuzzy
+msgstr "Kunne ikke legge til kontakt"
+
+#: ../libpurple/protocols/myspace/myspace.c:1970
 msgid "'addbuddy' command failed."
-msgstr "Importer kontaktliste fra tjener"
-
-#: ../libpurple/protocols/myspace/myspace.c:2006
-#: ../libpurple/protocols/myspace/myspace.c:2247
+msgstr "'addbuddy' kommando feilet."
+
+#: ../libpurple/protocols/myspace/myspace.c:2004
+#: ../libpurple/protocols/myspace/myspace.c:2245
 #, fuzzy
 msgid "persist command failed"
 msgstr "Feil med switchboard-tjenesten"
 
-#: ../libpurple/protocols/myspace/myspace.c:2115
+#: ../libpurple/protocols/myspace/myspace.c:2113
 #, c-format
 msgid "No such user: %s"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:2116
-#, fuzzy
+msgstr "Ingen slik bruker: %s"
+
+#: ../libpurple/protocols/myspace/myspace.c:2114
 msgid "User lookup"
-msgstr "Brukerrom"
-
-#: ../libpurple/protocols/myspace/myspace.c:2228
-#: ../libpurple/protocols/myspace/myspace.c:2247
-#: ../libpurple/protocols/myspace/myspace.c:2269
-#, fuzzy
+msgstr "Lete opp bruker"
+
+#: ../libpurple/protocols/myspace/myspace.c:2226
+#: ../libpurple/protocols/myspace/myspace.c:2245
+#: ../libpurple/protocols/myspace/myspace.c:2267
 msgid "Failed to remove buddy"
-msgstr "Kunne ikke bli med kontakt i samtale"
-
-#: ../libpurple/protocols/myspace/myspace.c:2228
+msgstr "Kunne ikke fjerne kontakt"
+
+#: ../libpurple/protocols/myspace/myspace.c:2226
 msgid "'delbuddy' command failed"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:2269
-#, fuzzy
+msgstr "'delbuddy' kommando feilet"
+
+#: ../libpurple/protocols/myspace/myspace.c:2267
 msgid "blocklist command failed"
-msgstr "Feil med switchboard-tjenesten"
-
-#: ../libpurple/protocols/myspace/myspace.c:2315
+msgstr "blocklist kommando feilet"
+
+#: ../libpurple/protocols/myspace/myspace.c:2313
 #, fuzzy
 msgid "Invalid input condition"
 msgstr "Fullfører tilkobling"
 
 #. 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:2331
+#: ../libpurple/protocols/myspace/myspace.c:2362
 #, fuzzy
 msgid "Read buffer full"
 msgstr "Køen er full"
 
-#: ../libpurple/protocols/myspace/myspace.c:2402
-#, fuzzy
+#: ../libpurple/protocols/myspace/myspace.c:2400
 msgid "Unparseable message"
-msgstr "Kunne ikke tolke beskjed."
-
-#: ../libpurple/protocols/myspace/myspace.c:2471
-#, fuzzy, c-format
+msgstr "Kunne ikke tolke beskjed"
+
+#: ../libpurple/protocols/myspace/myspace.c:2469
+#, c-format
 msgid "Couldn't connect to host: %s (%d)"
-msgstr "Kunne ikke koble til"
-
-#: ../libpurple/protocols/myspace/myspace.c:2642
+msgstr "Kunne ikke koble til vert: %s (%d)"
+
+#: ../libpurple/protocols/myspace/myspace.c:2640
 #, fuzzy
 msgid "IM Friends"
 msgstr "Vinduer for direktemeldinger"
 
-#: ../libpurple/protocols/myspace/myspace.c:2741
-#, c-format
-msgid ""
-"%d buddies were added or updated from the server (including buddies already "
-"on the server-side list)"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:2742
-#, fuzzy
+#: ../libpurple/protocols/myspace/myspace.c:2739
+#, c-format
+msgid "%d buddies were added or updated from the server (including buddies already on the server-side list)"
+msgstr "%d kompiser ble lagt til eller oppdatert fra serveren (inkludert kompiser allerede på server-side listen)"
+
+#: ../libpurple/protocols/myspace/myspace.c:2740
 msgid "Add contacts from server"
-msgstr "Ugyldig svar fra tjener."
-
-#: ../libpurple/protocols/myspace/myspace.c:2794
-#: ../libpurple/protocols/myspace/myspace.c:2859
+msgstr "Ugyldig svar fra tjener"
+
+#: ../libpurple/protocols/myspace/myspace.c:2792
+#: ../libpurple/protocols/myspace/myspace.c:2857
 msgid "Add friends from MySpace.com"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:2795
+msgstr "Legg til venner fra MySpace.com"
+
+#: ../libpurple/protocols/myspace/myspace.c:2793
 #, fuzzy
 msgid "Importing friends failed"
 msgstr "Ugyldig 'friend'-fil"
 
 #. TODO: find out how
-#: ../libpurple/protocols/myspace/myspace.c:2851
+#: ../libpurple/protocols/myspace/myspace.c:2849
 msgid "Find people..."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:2854
-#, fuzzy
+msgstr "Finn folk..."
+
+#: ../libpurple/protocols/myspace/myspace.c:2852
 msgid "Change IM name..."
-msgstr "Bytt passord..."
+msgstr "Bytt lynmeldingsnavn..."
+
+#: ../libpurple/protocols/myspace/myspace.c:3154
+msgid "myim URL handler"
+msgstr "myim URL behandler"
+
+#: ../libpurple/protocols/myspace/myspace.c:3155
+msgid "No suitable MySpaceIM account could be found to open this myim URL."
+msgstr "Ingen passende MySpaceIM konto ble funnet for å åpne myim URL."
 
 #: ../libpurple/protocols/myspace/myspace.c:3156
-msgid "myim URL handler"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:3157
-msgid "No suitable MySpaceIM account could be found to open this myim URL."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:3158
 msgid "Enable the proper MySpaceIM account and try again."
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:3281
+msgstr "Slå på den rette MySpaceIM kontoen og prøv igjen."
+
+#: ../libpurple/protocols/myspace/myspace.c:3279
+#, fuzzy
 msgid "Show display name in status text"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:3284
+msgstr "Vis navn i status tekst"
+
+#: ../libpurple/protocols/myspace/myspace.c:3282
 #, fuzzy
 msgid "Show headline in status text"
 msgstr "Vis aliasnavn i titteltekster"
 
-#: ../libpurple/protocols/myspace/myspace.c:3289
-#, fuzzy
+#: ../libpurple/protocols/myspace/myspace.c:3287
 msgid "Send emoticons"
-msgstr "Lydinnstillinger"
-
-#: ../libpurple/protocols/myspace/myspace.c:3294
+msgstr "Send animasjons ikoner"
+
+#: ../libpurple/protocols/myspace/myspace.c:3292
 msgid "Screen resolution (dots per inch)"
-msgstr ""
-
-#: ../libpurple/protocols/myspace/myspace.c:3297
+msgstr "Skjerm oppløsning (dots per inch)"
+
+#: ../libpurple/protocols/myspace/myspace.c:3295
 #, fuzzy
 msgid "Base font size (points)"
 msgstr "Større skrift"
@@ -7805,182 +7664,174 @@
 #: ../libpurple/protocols/myspace/user.c:95
 #: ../libpurple/protocols/zephyr/zephyr.c:786
 #: ../libpurple/protocols/zephyr/zephyr.c:1204
-#, fuzzy
 msgid "User"
-msgstr "Brukere"
+msgstr "Bruker"
 
 #. TODO: link to username, if available
 #: ../libpurple/protocols/myspace/user.c:102
-#: ../libpurple/protocols/oscar/oscar.c:2964
+#: ../libpurple/protocols/oscar/oscar.c:2960
 msgid "Profile"
 msgstr "Profil"
 
 #: ../libpurple/protocols/myspace/user.c:124
-#, fuzzy
 msgid "Headline"
-msgstr "Avslå"
+msgstr "Overskrift"
 
 #: ../libpurple/protocols/myspace/user.c:129
-#, fuzzy
 msgid "Song"
-msgstr "_Sortering:"
+msgstr "Sang"
 
 #: ../libpurple/protocols/myspace/user.c:134
 msgid "Total Friends"
-msgstr ""
+msgstr "Antall venner"
 
 #: ../libpurple/protocols/myspace/user.c:145
 #: ../libpurple/protocols/myspace/user.c:148
 #: ../libpurple/protocols/myspace/user.c:151
-#, fuzzy
 msgid "Client Version"
-msgstr "Lukk samtalen"
+msgstr "Klient Versjon"
 
 #. TODO: icons for each zap
 #: ../libpurple/protocols/myspace/zap.c:44
 #: ../libpurple/protocols/myspace/zap.c:177
 msgid "Zap"
-msgstr ""
+msgstr "Zap"
 
 #: ../libpurple/protocols/myspace/zap.c:44
 #, c-format
 msgid "%s has zapped you!"
-msgstr ""
+msgstr "%s har zappet deg!"
 
 #: ../libpurple/protocols/myspace/zap.c:44
 #, c-format
 msgid "Zapping %s..."
-msgstr ""
+msgstr "Zapper %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:45
-#, fuzzy
 msgid "Whack"
-msgstr "Tilbake"
+msgstr "Klaske"
 
 #: ../libpurple/protocols/myspace/zap.c:45
-#, fuzzy, c-format
+#, c-format
 msgid "%s has whacked you!"
-msgstr "Brukeren har blokkert deg"
+msgstr "%s har klasket deg!"
 
 #: ../libpurple/protocols/myspace/zap.c:45
 #, c-format
 msgid "Whacking %s..."
-msgstr ""
+msgstr "Klasker %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:46
-#, fuzzy
 msgid "Torch"
-msgstr "Tema:"
+msgstr "Fakkel"
 
 #: ../libpurple/protocols/myspace/zap.c:46
-#, fuzzy, c-format
+#, c-format
 msgid "%s has torched you!"
-msgstr "Brukeren har blokkert deg"
+msgstr "%s har sendt deg en fakkel!"
 
 #: ../libpurple/protocols/myspace/zap.c:46
 #, c-format
 msgid "Torching %s..."
-msgstr ""
+msgstr "Slår %s med stokk..."
 
 #: ../libpurple/protocols/myspace/zap.c:47
 msgid "Smooch"
-msgstr ""
+msgstr "Smooch"
 
 #: ../libpurple/protocols/myspace/zap.c:47
-#, fuzzy, c-format
+#, c-format
 msgid "%s has smooched you!"
-msgstr "Brukeren har blokkert deg"
+msgstr "%s har smoochet deg!"
 
 #: ../libpurple/protocols/myspace/zap.c:47
 #, c-format
 msgid "Smooching %s..."
-msgstr ""
+msgstr "Smooching %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:48
 msgid "Hug"
-msgstr ""
+msgstr "Klem"
 
 #: ../libpurple/protocols/myspace/zap.c:48
-#, fuzzy, c-format
+#, c-format
 msgid "%s has hugged you!"
-msgstr "%s er borte."
+msgstr "%s har klemmet deg!"
 
 #: ../libpurple/protocols/myspace/zap.c:48
 #, c-format
 msgid "Hugging %s..."
-msgstr ""
+msgstr "Klemmer %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:49
-#, fuzzy
 msgid "Slap"
-msgstr "Slovakisk"
+msgstr "Klapse"
 
 #: ../libpurple/protocols/myspace/zap.c:49
-#, fuzzy, c-format
+#, c-format
 msgid "%s has slapped you!"
-msgstr "%s har sluttet å skrive til deg (%s)"
+msgstr "%s har klapset til deg!"
 
 #: ../libpurple/protocols/myspace/zap.c:49
 #, c-format
 msgid "Slapping %s..."
-msgstr ""
+msgstr "Klapser %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:50
-#, fuzzy
 msgid "Goose"
-msgstr "Borte"
+msgstr "Gås"
 
 #: ../libpurple/protocols/myspace/zap.c:50
-#, fuzzy, c-format
+#, c-format
 msgid "%s has goosed you!"
-msgstr "%s er borte."
+msgstr "%s har sendt deg en gås!"
 
 #: ../libpurple/protocols/myspace/zap.c:50
-#, fuzzy, c-format
+#, c-format
 msgid "Goosing %s..."
-msgstr "Slår opp %s"
+msgstr "Sender gås til %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:51
 msgid "High-five"
-msgstr ""
+msgstr "High-five"
 
 #: ../libpurple/protocols/myspace/zap.c:51
-#, fuzzy, c-format
+#, c-format
 msgid "%s has high-fived you!"
-msgstr "%s har logget på (%s)"
+msgstr "%s har high-five'et deg!"
 
 #: ../libpurple/protocols/myspace/zap.c:51
 #, c-format
 msgid "High-fiving %s..."
-msgstr ""
+msgstr "High-fiving %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:52
 msgid "Punk"
-msgstr ""
+msgstr "Punk"
 
 #: ../libpurple/protocols/myspace/zap.c:52
 #, c-format
 msgid "%s has punk'd you!"
-msgstr ""
+msgstr "%s har punk'et deg!"
 
 #: ../libpurple/protocols/myspace/zap.c:52
 #, c-format
 msgid "Punking %s..."
-msgstr ""
+msgstr "Punking %s..."
 
 #: ../libpurple/protocols/myspace/zap.c:53
 msgid "Raspberry"
-msgstr ""
+msgstr "Bringebær"
 
 #: ../libpurple/protocols/myspace/zap.c:53
 #, c-format
 msgid "%s has raspberried you!"
-msgstr ""
+msgstr "%s har gitt deg bringebær!"
 
 #: ../libpurple/protocols/myspace/zap.c:53
 #, c-format
 msgid "Raspberrying %s..."
-msgstr ""
+msgstr "Gir bringebær til %s..."
 
 #: ../libpurple/protocols/novell/nmuser.c:1864
 #, fuzzy
@@ -8020,9 +7871,8 @@
 msgstr "Passordet har løpt ut"
 
 #: ../libpurple/protocols/novell/nmuser.c:1894
-#, fuzzy
 msgid "Incorrect password"
-msgstr "Feil passord."
+msgstr "Feil passord"
 
 #: ../libpurple/protocols/novell/nmuser.c:1897
 msgid "User not found"
@@ -8057,9 +7907,8 @@
 msgstr "Hovedarkiv er feil satt opp"
 
 #: ../libpurple/protocols/novell/nmuser.c:1922
-#, fuzzy
 msgid "Incorrect screen name or password"
-msgstr "Feil kallenavn eller passord."
+msgstr "Feil kallenavn eller passord"
 
 #: ../libpurple/protocols/novell/nmuser.c:1925
 #, fuzzy
@@ -8068,12 +7917,8 @@
 
 #: ../libpurple/protocols/novell/nmuser.c:1928
 #, fuzzy
-msgid ""
-"Your account has been disabled because too many incorrect passwords were "
-"entered"
-msgstr ""
-"Kontoen din har blitt deaktivert på grunn av for mange ugyldige inntastede "
-"passord"
+msgid "Your account has been disabled because too many incorrect passwords were entered"
+msgstr "Kontoen din har blitt deaktivert på grunn av for mange ugyldige inntastede passord"
 
 #: ../libpurple/protocols/novell/nmuser.c:1931
 msgid "You cannot add the same person twice to a conversation"
@@ -8084,7 +7929,6 @@
 msgstr "Du har nådd grensen for antall tillatte kontakter"
 
 #: ../libpurple/protocols/novell/nmuser.c:1938
-#, fuzzy
 msgid "You have entered an incorrect screen name"
 msgstr "Du har tastet inn et ugyldig brukernavn"
 
@@ -8101,11 +7945,8 @@
 msgstr "Brukeren har blokkert deg"
 
 #: ../libpurple/protocols/novell/nmuser.c:1950
-msgid ""
-"This evaluation version does not allow more than ten users to log in at one "
-"time"
-msgstr ""
-"Denne testversjonen tillater ikke mer enn ti samtidige innloggede brukere"
+msgid "This evaluation version does not allow more than ten users to log in at one time"
+msgstr "Denne testversjonen tillater ikke mer enn ti samtidige innloggede brukere"
 
 #: ../libpurple/protocols/novell/nmuser.c:1953
 msgid "The user is either offline or you are blocked"
@@ -8119,115 +7960,107 @@
 #: ../libpurple/protocols/novell/novell.c:124
 #, c-format
 msgid "Login failed (%s)."
-msgstr "Pålogging feilet (%s)"
-
-#: ../libpurple/protocols/novell/novell.c:247
+msgstr "Pålogging feilet (%s)."
+
+#: ../libpurple/protocols/novell/novell.c:249
 #, c-format
 msgid "Unable to send message. Could not get details for user (%s)."
 msgstr "Kunne ikke sende beskjed. Klarte ikke hente brukerdetaljer (%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 "Kunne ikke legge til %s til kontaktlisten din (%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 "Kunne ikke sende beskjed (%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 "Kunne ikke invitere bruker (%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 ""
-"Klarte ikke sende beskjed til %s. Kunne ikke sette opp konferansen (%s)."
-
-#: ../libpurple/protocols/novell/novell.c:537
+msgstr "Klarte ikke sende beskjed til %s. Kunne ikke sette opp konferansen (%s)."
+
+#: ../libpurple/protocols/novell/novell.c:539
 #, c-format
 msgid "Unable to send message. Could not create the conference (%s)."
 msgstr "Klarte ikke sende beskjed. Kunne ikke sette opp konferansen (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:584
-#, c-format
-msgid ""
-"Unable to move user %s to folder %s in the server side list. Error while "
-"creating folder (%s)."
-msgstr ""
-"Klarte ikke flytte brukeren %s til mappe %s i lista på tjenersiden. En feil "
-"oppsto under opprettelse av mappe (%s)."
-
-#: ../libpurple/protocols/novell/novell.c:632
-#, c-format
-msgid ""
-"Unable to add %s to your buddy list. Error creating folder in server side "
-"list (%s)."
-msgstr ""
-"Klarte ikke legge til %s i kontaktlista. En feil oppsto under opprettelse i "
-"lista på tjenersiden (%s)."
-
-#: ../libpurple/protocols/novell/novell.c:705
+#: ../libpurple/protocols/novell/novell.c:586
+#, c-format
+msgid "Unable to move user %s to folder %s in the server side list. Error while creating folder (%s)."
+msgstr "Klarte ikke flytte brukeren %s til mappe %s i lista på tjenersiden. En feil oppsto under opprettelse av mappe (%s)."
+
+#: ../libpurple/protocols/novell/novell.c:634
+#, c-format
+msgid "Unable to add %s to your buddy list. Error creating folder in server side list (%s)."
+msgstr "Klarte ikke legge til %s i kontaktlista. En feil oppsto under opprettelse i lista på tjenersiden (%s)."
+
+#: ../libpurple/protocols/novell/novell.c:707
 #, c-format
 msgid "Could not get details for user %s (%s)."
 msgstr "Kunne ikke hente detaljer for brukeren %s (%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 "Kunne ikke legge til bruker til privatliste (%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 "Kunne ikke legge til %s til nektingsliste (%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 "Kunne ikke legge til %s til tillatelsesliste (%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 "Kunne ikke fjerne %s fra privatliste (%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 "Klarte ikke endre personsvernsinstillinger på tjenersiden (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:1012
+#: ../libpurple/protocols/novell/novell.c:1014
 #, c-format
 msgid "Unable to create conference (%s)."
 msgstr "Klarte ikke opprette konferanse (%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 "Feil i kommunikasjon med tjener, stenger forbindelse."
 
-#: ../libpurple/protocols/novell/novell.c:1476
+#: ../libpurple/protocols/novell/novell.c:1478
 msgid "Telephone Number"
 msgstr "Telefonnummer"
 
-#: ../libpurple/protocols/novell/novell.c:1482
+#: ../libpurple/protocols/novell/novell.c:1484
 msgid "Personal Title"
 msgstr "Tittel"
 
 # VAR: E-post
-#: ../libpurple/protocols/novell/novell.c:1486
+#: ../libpurple/protocols/novell/novell.c:1488
+#, fuzzy
 msgid "Mailstop"
-msgstr ""
-
-#: ../libpurple/protocols/novell/novell.c:1502
+msgstr "E-poststopp"
+
+#: ../libpurple/protocols/novell/novell.c:1504
 #: ../libpurple/protocols/sametime/sametime.c:4122
 msgid "User ID"
 msgstr "Brukerid"
@@ -8238,41 +8071,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 "Fullt navn"
 
-#: ../libpurple/protocols/novell/novell.c:1637
+#: ../libpurple/protocols/novell/novell.c:1639
 #, c-format
 msgid "GroupWise Conference %d"
 msgstr "GroupWise-konferanse %d"
 
-#: ../libpurple/protocols/novell/novell.c:1668
+#: ../libpurple/protocols/novell/novell.c:1670
 msgid "Unable to make SSL connection to server."
 msgstr "Klarte ikke opprette SSL-forbindelse med tjeneren."
 
-#: ../libpurple/protocols/novell/novell.c:1720
+#: ../libpurple/protocols/novell/novell.c:1722
 msgid "Authenticating..."
 msgstr "Autentiserer..."
 
-#: ../libpurple/protocols/novell/novell.c:1732
+#: ../libpurple/protocols/novell/novell.c:1734
 msgid "Unable to connect to server."
 msgstr "Kan ikke koble til tjener."
 
-#: ../libpurple/protocols/novell/novell.c:1735
+#: ../libpurple/protocols/novell/novell.c:1737
 msgid "Waiting for response..."
 msgstr "Venter på svar..."
 
-#: ../libpurple/protocols/novell/novell.c:1870
+#: ../libpurple/protocols/novell/novell.c:1872
 #, c-format
 msgid "%s has been invited to this conversation."
 msgstr "%s har blitt invitert til denne samtalen."
 
-#: ../libpurple/protocols/novell/novell.c:1898
+#: ../libpurple/protocols/novell/novell.c:1900
 msgid "Invitation to Conversation"
 msgstr "Invitasjon til samtale"
 
-#: ../libpurple/protocols/novell/novell.c:1899
+#: ../libpurple/protocols/novell/novell.c:1901
 #, c-format
 msgid ""
 "Invitation from: %s\n"
@@ -8283,43 +8116,34 @@
 "\n"
 "Sent: %s"
 
-#: ../libpurple/protocols/novell/novell.c:1901
+#: ../libpurple/protocols/novell/novell.c:1903
 msgid "Would you like to join the conversation?"
 msgstr "Ønsker du å bli med i samtalen?"
 
-#. 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 ""
-"Du ble logget av fordi du har logget på med dette skjermnavnet et annet sted."
-
-#: ../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 "Du ble logget av fordi du har logget på med dette skjermnavnet et annet sted."
+
+#: ../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 "%s ser ut til å være  frakoplet, og mottok ikke meldingen du sendte."
 
 #. 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.
-#: ../libpurple/protocols/novell/novell.c:2167
-msgid ""
-"Unable to connect to server. Please enter the address of the server you wish "
-"to connect to."
-msgstr ""
-"Klarte ikke kople til tjener, skriv inn adressen til tjeneren du ønsker å "
-"kople til."
-
-#: ../libpurple/protocols/novell/novell.c:2195
+#: ../libpurple/protocols/novell/novell.c:2172
+msgid "Unable to connect to server. Please enter the address of the server you wish to connect to."
+msgstr "Klarte ikke kople til tjener, skriv inn adressen til tjeneren du ønsker å kople til."
+
+#: ../libpurple/protocols/novell/novell.c:2200
 msgid "Error. SSL support is not installed."
 msgstr "Feil: SSL-støtte er ikke installert."
 
-#: ../libpurple/protocols/novell/novell.c:2504
-#, c-format
+#: ../libpurple/protocols/novell/novell.c:2509
 msgid "This conference has been closed. No more messages can be sent."
-msgstr ""
-"Denne konferansen har blitt stengt, ingen flere meldinger kan bli sendt."
+msgstr "Denne konferansen har blitt stengt, ingen flere meldinger kan bli sendt."
 
 #. *< type
 #. *< ui_requirement
@@ -8331,47 +8155,55 @@
 #. *< 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 "Novel GroupWise Messenger protolltillegg"
 
-#: ../libpurple/protocols/novell/novell.c:3545
+#: ../libpurple/protocols/novell/novell.c:3550
 msgid "Server address"
 msgstr "Tjeneradresse"
 
-#: ../libpurple/protocols/novell/novell.c:3549
+#: ../libpurple/protocols/novell/novell.c:3554
 msgid "Server port"
 msgstr "Tjenerport"
 
-#: ../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
-#, fuzzy
+#: ../libpurple/protocols/oscar/flap_connection.c:389
+#: ../libpurple/protocols/yahoo/yahoo.c:2468
+#: ../libpurple/protocols/yahoo/yahoo.c:2635
+#: ../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
 msgid "Server closed the connection."
-msgstr "Feil: kunne ikke koble til"
-
-#: ../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
-#, fuzzy, c-format
+msgstr "Tjeneren lukket forbindelsen."
+
+#: ../libpurple/protocols/oscar/flap_connection.c:391
+#: ../libpurple/protocols/yahoo/yahoo.c:2462
+#: ../libpurple/protocols/yahoo/yahoo.c:2629
+#: ../libpurple/proxy.c:593
+#: ../libpurple/proxy.c:1128
+#: ../libpurple/proxy.c:1237
+#: ../libpurple/proxy.c:1337
+#: ../libpurple/proxy.c:1465
+#, c-format
 msgid ""
 "Lost connection with server:\n"
 "%s"
-msgstr "Du har blitt koblet fra tjeneren."
-
-#: ../libpurple/protocols/oscar/flap_connection.c:392
-#: ../libpurple/proxy.c:1145 ../libpurple/proxy.c:1250
-#: ../libpurple/proxy.c:1349 ../libpurple/proxy.c:1421
+msgstr ""
+"Mistet forbindelse med server:\n"
+"%s"
+
+#: ../libpurple/protocols/oscar/flap_connection.c:394
+#: ../libpurple/proxy.c:1145
+#: ../libpurple/proxy.c:1250
+#: ../libpurple/proxy.c:1349
+#: ../libpurple/proxy.c:1421
 #: ../libpurple/proxy.c:1478
-#, fuzzy
 msgid "Received invalid data on connection with server."
-msgstr "Klarte ikke opprette SSL-forbindelse med tjeneren."
+msgstr "Mottok ugyldig data i kontakt med tjeneren."
 
 #. *< type
 #. *< ui_requirement
@@ -8385,7 +8217,6 @@
 #. *  description
 #: ../libpurple/protocols/oscar/libaim.c:118
 #: ../libpurple/protocols/oscar/libaim.c:120
-#, fuzzy
 msgid "AIM Protocol Plugin"
 msgstr "AIM/ICQ-protokolltillegg"
 
@@ -8401,38 +8232,35 @@
 #. *  description
 #: ../libpurple/protocols/oscar/libicq.c:118
 #: ../libpurple/protocols/oscar/libicq.c:120
-#, fuzzy
 msgid "ICQ Protocol Plugin"
-msgstr "IRC-protokolltillegg"
+msgstr "ICQ-protokolltillegg"
 
 #: ../libpurple/protocols/oscar/libicq.c:147
-#: ../libpurple/protocols/yahoo/yahoo.c:4410
+#: ../libpurple/protocols/yahoo/yahoo.c:4409
 #: ../libpurple/protocols/zephyr/zephyr.c:2997
 msgid "Encoding"
-msgstr "Tegnkoding:"
+msgstr "Tegnkoding"
 
 #: ../libpurple/protocols/oscar/odc.c:40
-#, fuzzy
 msgid "The remote user has closed the connection."
-msgstr "Fjerntliggende bruker kan ikke nås over nettverket lenger"
+msgstr "Fjerntliggende bruker har lukket forbindelsen."
 
 #: ../libpurple/protocols/oscar/odc.c:42
-#, fuzzy
 msgid "The remote user has declined your request."
-msgstr "Brukeren har blokkert deg"
+msgstr "Brukeren har nektet din forespørsel."
 
 #: ../libpurple/protocols/oscar/odc.c:44
 #, c-format
 msgid "Lost connection with the remote user:<br>%s"
-msgstr ""
+msgstr "Mistet forbindelse til bruker:<br>%s"
 
 #: ../libpurple/protocols/oscar/odc.c:47
 msgid "Received invalid data on connection with remote user."
-msgstr ""
+msgstr "Mottok ugyldig data på forbindelse med annen bruker."
 
 #: ../libpurple/protocols/oscar/odc.c:49
 msgid "Could not establish a connection with the remote user."
-msgstr ""
+msgstr "Kunne ikke etablere en forbindelse med bruker."
 
 #: ../libpurple/protocols/oscar/odc.c:560
 #, fuzzy
@@ -8442,7 +8270,7 @@
 #: ../libpurple/protocols/oscar/oft.c:656
 #, c-format
 msgid "File %s is %s, which is larger than the maximum size of %s."
-msgstr ""
+msgstr "Filen %s er %s, som er større enn det som er max. størrelse av %s."
 
 #: ../libpurple/protocols/oscar/oscar.c:116
 msgid "Invalid error"
@@ -8541,25 +8369,18 @@
 msgstr "Ikke mens du er på AOL"
 
 #: ../libpurple/protocols/oscar/oscar.c:348
-msgid ""
-"(There was an error receiving this message.  The buddy you are speaking with "
-"is probably using a different encoding than expected.  If you know what "
-"encoding he is using, you can specify it in the advanced account options for "
-"your AIM/ICQ account.)"
-msgstr ""
+msgid "(There was an error receiving this message.  The buddy you are speaking with is probably using a different encoding than expected.  If you know what encoding he is using, you can specify it in the advanced account options for your AIM/ICQ account.)"
+msgstr "(Det oppsto en feil i mottak av denne beskjeden.  Kompisen du snakker med bruker sannsynligvis en annen koding enn forventet.  Om du vet hvilken koding han bruker, kan du spesifisere dette i avanserte konto instillinger for din AIM/ICQ konto.)"
 
 # Lusete klient :P
 #: ../libpurple/protocols/oscar/oscar.c:457
 #, fuzzy, c-format
-msgid ""
-"(There was an error receiving this message.  Either you and %s have "
-"different encodings selected, or %s has a buggy client.)"
-msgstr ""
-"(Det oppsto en feil under mottak av denne meldingen. Kontakten du snakker "
-"til har sannsynligvis en lusete klient.)"
+msgid "(There was an error receiving this message.  Either you and %s have different encodings selected, or %s has a buggy client.)"
+msgstr "(Det oppsto en feil under mottak av denne meldingen. Kontakten du snakker til har sannsynligvis en lusete klient.)"
 
 #. Label
-#: ../libpurple/protocols/oscar/oscar.c:639 ../pidgin/gtkutils.c:2387
+#: ../libpurple/protocols/oscar/oscar.c:639
+#: ../pidgin/gtkutils.c:2387
 #: ../pidgin/gtkutils.c:2417
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:332
 msgid "Buddy Icon"
@@ -8582,7 +8403,7 @@
 msgstr "Samtale"
 
 #: ../libpurple/protocols/oscar/oscar.c:651
-#: ../libpurple/protocols/oscar/oscar.c:6010
+#: ../libpurple/protocols/oscar/oscar.c:6008
 msgid "Get File"
 msgstr "Laste ned fil"
 
@@ -8596,7 +8417,7 @@
 
 #: ../libpurple/protocols/oscar/oscar.c:664
 msgid "Send Buddy List"
-msgstr "Sende kontaktliste"
+msgstr "Send kontaktliste"
 
 #: ../libpurple/protocols/oscar/oscar.c:667
 msgid "ICQ Direct Connect"
@@ -8655,70 +8476,72 @@
 msgstr "Kamera"
 
 #: ../libpurple/protocols/oscar/oscar.c:725
-#: ../libpurple/protocols/oscar/oscar.c:5780
-#, c-format
+#: ../libpurple/protocols/oscar/oscar.c:5778
 msgid "Free For Chat"
 msgstr "Tilgjengelig for samtale"
 
 #: ../libpurple/protocols/oscar/oscar.c:729
-#: ../libpurple/protocols/oscar/oscar.c:5815
-#, c-format
+#: ../libpurple/protocols/oscar/oscar.c:5813
 msgid "Not Available"
 msgstr "Ikke tilgjengelig"
 
 #: ../libpurple/protocols/oscar/oscar.c:731
-#: ../libpurple/protocols/oscar/oscar.c:5801
-#, c-format
+#: ../libpurple/protocols/oscar/oscar.c:5799
 msgid "Occupied"
 msgstr "Opptatt"
 
 #: ../libpurple/protocols/oscar/oscar.c:735
-#, fuzzy, c-format
+#, fuzzy
 msgid "Web Aware"
 msgstr "Web-oppmerksom"
 
-#: ../libpurple/protocols/oscar/oscar.c:737 ../libpurple/protocols/qq/qq.c:183
+#: ../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
-#, c-format
+#: ../libpurple/protocols/yahoo/yahoo.c:3094
+#: ../libpurple/status.c:157
+#: ../pidgin/gtkdocklet.c:446
+#: ../pidgin/gtkstatusbox.c:1060
 msgid "Invisible"
 msgstr "Usynlig"
 
 #: ../libpurple/protocols/oscar/oscar.c:739
-#, c-format
 msgid "Online"
 msgstr "Pålogget"
 
 #: ../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:3703
+#: ../libpurple/protocols/yahoo/yahoo_profile.c:721
+#: ../pidgin/gtkprefs.c:1128
 msgid "IP Address"
 msgstr "IP-adresse"
 
 #: ../libpurple/protocols/oscar/oscar.c:845
-#: ../libpurple/protocols/oscar/oscar.c:2891
+#: ../libpurple/protocols/oscar/oscar.c:2887
 msgid "Warning Level"
 msgstr "Advarselsnivåer"
 
 #: ../libpurple/protocols/oscar/oscar.c:855
-#, fuzzy
 msgid "Buddy Comment"
-msgstr "Kommentar om kontakt:"
+msgstr "Kontakt Kommentar"
 
 #: ../libpurple/protocols/oscar/oscar.c:995
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Could not connect to authentication server:\n"
 "%s"
-msgstr "Kunne ikke koble til for dataoverføring."
+msgstr ""
+"Kunne ikke koble til autentiserings server:\n"
+"%s"
 
 #: ../libpurple/protocols/oscar/oscar.c:1003
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Could not connect to BOS server:\n"
 "%s"
-msgstr "Klarte ikke koble til tjener."
+msgstr ""
+"Klarte ikke koble til BOS server:\n"
+"%s"
 
 #: ../libpurple/protocols/oscar/oscar.c:1043
 msgid "Screen name sent"
@@ -8735,25 +8558,18 @@
 
 #: ../libpurple/protocols/oscar/oscar.c:1260
 #, fuzzy, c-format
-msgid ""
-"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."
-msgstr ""
-"Klarte ikke logge på: Kunne ikke logge på som %s fordi skjermnavnet er "
-"ugyldig. Skjermnavn må enten starte med en bokstav og kun inneholde tall, "
-"bokstaver, og mellomrom, eller bare inneholde tall."
+msgid "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."
+msgstr "Klarte ikke logge på: Kunne ikke logge på som %s fordi skjermnavnet er ugyldig. Skjermnavn må enten starte med en bokstav og kun inneholde tall, bokstaver, og mellomrom, eller bare inneholde tall."
 
 #: ../libpurple/protocols/oscar/oscar.c:1345
-#: ../libpurple/protocols/yahoo/yahoo.c:2105
-#, fuzzy
+#: ../libpurple/protocols/yahoo/yahoo.c:2104
 msgid "Invalid screen name."
-msgstr "Ugyldig brukernavn,"
+msgstr "Ugyldig brukernavn."
 
 #: ../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/qq/login_logout.c:485
+#: ../libpurple/protocols/simple/simple.c:1047
+#: ../libpurple/protocols/yahoo/yahoo.c:2125
 msgid "Incorrect password."
 msgstr "Feil passord."
 
@@ -8768,18 +8584,13 @@
 
 #: ../libpurple/protocols/oscar/oscar.c:1366
 #: ../libpurple/protocols/oscar/oscar.c:1377
-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."
-msgstr ""
-"Du har koblet til og koblet fra for hurtig. Vent ti minutter og prøv igjen. "
-"Hvis du fortsetter å prøve nå, vil du måtte vente enda lenger."
+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."
+msgstr "Du har koblet til og koblet fra for hurtig. Vent ti minutter og prøv igjen. Hvis du fortsetter å prøve nå, vil du måtte vente enda lenger."
 
 #: ../libpurple/protocols/oscar/oscar.c:1371
 #, c-format
 msgid "The client version you are using is too old. Please upgrade at %s"
-msgstr ""
-"Klientversjonen av programmet er for gammel. Vennligst oppgrader her: %s"
+msgstr "Klientversjonen av programmet er for gammel. Vennligst oppgrader på %s"
 
 #: ../libpurple/protocols/oscar/oscar.c:1410
 msgid "Could Not Connect"
@@ -8805,100 +8616,86 @@
 #. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
 #.
 #: ../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
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:2228
+#: ../libpurple/protocols/oscar/oscar.c:2277
+#: ../libpurple/protocols/oscar/oscar.c:5883
+#: ../libpurple/protocols/oscar/oscar.c:6164
+#: ../libpurple/request.h:1388
 msgid "_OK"
 msgstr "_OK"
 
 #: ../libpurple/protocols/oscar/oscar.c:1491
 #: ../libpurple/protocols/oscar/oscar.c:1534
 #, c-format
-msgid ""
-"You may be disconnected shortly.  You may want to use TOC until this is "
-"fixed.  Check %s for updates."
-msgstr ""
-"Du kan bli frakoblet ganske snart. Du vil kanskje bruke TOC inntil dette er "
-"ordnet. Sjekk %s for oppdateringer."
+msgid "You may be disconnected shortly.  You may want to use TOC until this is fixed.  Check %s for updates."
+msgstr "Du kan bli frakoblet ganske snart. Du vil kanskje bruke TOC inntil dette er ordnet. Sjekk %s for oppdateringer."
 
 #: ../libpurple/protocols/oscar/oscar.c:1494
 #: ../libpurple/protocols/oscar/oscar.c:1537
-#, fuzzy
 msgid "Unable to get a valid AIM login hash."
-msgstr "Gaim klarte ikke å motta gyldig AIM-påloggingshash."
+msgstr "Klarte ikke å motta gyldig AIM-påloggingshash."
 
 #: ../libpurple/protocols/oscar/oscar.c:1622
 #, fuzzy, c-format
 msgid "You may be disconnected shortly.  Check %s for updates."
-msgstr ""
-"Du kan bli frakoblet ganske snart. Du vil kanskje bruke TOC inntil dette er "
-"ordnet. Sjekk %s for oppdateringer."
+msgstr "Du kan bli frakoblet ganske snart. Du vil kanskje bruke TOC inntil dette er ordnet. Sjekk %s for oppdateringer."
 
 #: ../libpurple/protocols/oscar/oscar.c:1625
-#, fuzzy
 msgid "Unable to get a valid login hash."
-msgstr "Gaim klarte ikke å motta en gyldig påloggingshash."
+msgstr "Klarte ikke å motta en gyldig påloggingshash."
 
 #: ../libpurple/protocols/oscar/oscar.c:1655
 msgid "Password sent"
 msgstr "Passord sendt"
 
 #: ../libpurple/protocols/oscar/oscar.c:1711
-#, fuzzy
 msgid "Unable to initialize connection"
-msgstr "Kunne ikke lage ny tilkobling."
-
-#: ../libpurple/protocols/oscar/oscar.c:2202
+msgstr "Kunne ikke lage ny tilkobling"
+
+#: ../libpurple/protocols/oscar/oscar.c:2198
 msgid "Please authorize me so I can add you to my buddy list."
-msgstr ""
-"Vennligst godkjenn meg slik at jeg kan legge deg til i kontaktlisten min."
-
-#: ../libpurple/protocols/oscar/oscar.c:2230
+msgstr "Vennligst godkjenn meg slik at jeg kan legge deg til i kontaktlisten min."
+
+#: ../libpurple/protocols/oscar/oscar.c:2226
 msgid "Authorization Request Message:"
 msgstr "Beskjed i godkjenningsforespørsel:"
 
-#: ../libpurple/protocols/oscar/oscar.c:2231
+#: ../libpurple/protocols/oscar/oscar.c:2227
 msgid "Please authorize me!"
 msgstr "Vennligst godkjenn meg!"
 
-#: ../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:2268
+#: ../libpurple/protocols/oscar/oscar.c:2276
+#: ../libpurple/protocols/oscar/oscar.c:2403
+#: ../libpurple/protocols/oscar/oscar.c:5259
+#: ../libpurple/protocols/yahoo/yahoo.c:1029
 msgid "No reason given."
 msgstr "Ingen grunn spesifisert."
 
-#: ../libpurple/protocols/oscar/oscar.c:2279
+#: ../libpurple/protocols/oscar/oscar.c:2275
 msgid "Authorization Denied Message:"
 msgstr "Godkjenning nektet, grunn:"
 
-#: ../libpurple/protocols/oscar/oscar.c:2407
-#, c-format
-msgid ""
-"The user %u has denied your request to add them to your buddy list for the "
-"following reason:\n"
+#: ../libpurple/protocols/oscar/oscar.c:2403
+#, c-format
+msgid ""
+"The user %u has denied your request to add them to your buddy list for the following reason:\n"
 "%s"
 msgstr ""
-"Brukeren %u har avslått din forespørsel om å bli lagt til i din kontaktliste "
-"med følgende grunn:\n"
+"Brukeren %u har avslått din forespørsel om å bli lagt til i din kontaktliste med følgende grunn:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2408
+#: ../libpurple/protocols/oscar/oscar.c:2404
 msgid "ICQ authorization denied."
 msgstr "ICQ-godkjenning avslått."
 
 #. Someone has granted you authorization
-#: ../libpurple/protocols/oscar/oscar.c:2415
+#: ../libpurple/protocols/oscar/oscar.c:2411
 #, c-format
 msgid "The user %u has granted your request to add them to your buddy list."
-msgstr ""
-"Brukeren %u har godtatt din forespørsel om å bli lagt til i kontaktlisten "
-"din."
-
-#: ../libpurple/protocols/oscar/oscar.c:2423
+msgstr "Brukeren %u har godtatt din forespørsel om å bli lagt til i kontaktlisten din."
+
+#: ../libpurple/protocols/oscar/oscar.c:2419
 #, c-format
 msgid ""
 "You have received a special message\n"
@@ -8911,7 +8708,7 @@
 "Fra: %s [%s]\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2431
+#: ../libpurple/protocols/oscar/oscar.c:2427
 #, c-format
 msgid ""
 "You have received an ICQ page\n"
@@ -8924,7 +8721,7 @@
 "Fra: %s [%s]\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2439
+#: ../libpurple/protocols/oscar/oscar.c:2435
 #, c-format
 msgid ""
 "You have received an ICQ e-mail from %s [%s]\n"
@@ -8937,69 +8734,60 @@
 "Beskjed:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2460
+#: ../libpurple/protocols/oscar/oscar.c:2456
 #, c-format
 msgid "ICQ user %u has sent you a buddy: %s (%s)"
 msgstr "ICQ-brukeren %u har sent deg en kontakt: %s (%s)"
 
-#: ../libpurple/protocols/oscar/oscar.c:2466
+#: ../libpurple/protocols/oscar/oscar.c:2462
 msgid "Do you want to add this buddy to your buddy list?"
 msgstr "Ønsker du å legge denne kontakten til i kontaktlisten din?"
 
-#: ../libpurple/protocols/oscar/oscar.c:2471 ../pidgin/gtkroomlist.c:309
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:2467
+#: ../pidgin/gtkroomlist.c:309
 msgid "_Add"
-msgstr "Legg til"
-
-#: ../libpurple/protocols/oscar/oscar.c:2472
-#, fuzzy
+msgstr "_Legg til"
+
+#: ../libpurple/protocols/oscar/oscar.c:2468
 msgid "_Decline"
-msgstr "Avslå"
-
-#: ../libpurple/protocols/oscar/oscar.c:2596
+msgstr "_Avslå"
+
+#: ../libpurple/protocols/oscar/oscar.c:2592
 #, 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] "Du har gått glipp av %hu beskjed fra %s fordi den var ugyldig."
 msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi de var ugyldige."
 
-#: ../libpurple/protocols/oscar/oscar.c:2605
+#: ../libpurple/protocols/oscar/oscar.c:2601
 #, 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] "Du har gått glipp av %hu beskjed fra %s fordi den var for stor."
 msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi de var for store."
 
-#: ../libpurple/protocols/oscar/oscar.c:2614
-#, c-format
-msgid ""
-"You missed %hu message from %s because the rate limit has been exceeded."
-msgid_plural ""
-"You missed %hu messages from %s because the rate limit has been exceeded."
-msgstr[0] ""
-"Du har gått glipp av %hu beskjed fra %s fordi hastighetsgrensen har blitt "
-"overskredet."
-msgstr[1] ""
-"Du har gått glipp av %hu beskjeder fra %s fordi hastighetsgrensen har blitt "
-"overskredet."
-
-#: ../libpurple/protocols/oscar/oscar.c:2623
+#: ../libpurple/protocols/oscar/oscar.c:2610
+#, 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] "Du har gått glipp av %hu beskjed fra %s fordi hastighetsgrensen har blitt overskredet."
+msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi hastighetsgrensen har blitt overskredet."
+
+#: ../libpurple/protocols/oscar/oscar.c:2619
 #, c-format
 msgid "You missed %hu message from %s because he/she was too evil."
 msgid_plural "You missed %hu messages from %s because he/she was too evil."
-msgstr[0] ""
-"Du har gått glipp av %hu beskjed fra %s fordi vedkommende var for ond."
-msgstr[1] ""
-"Du har gått glipp av %hu beskjeder fra %s fordi vedkommende var for ond."
-
-#: ../libpurple/protocols/oscar/oscar.c:2632
+msgstr[0] "Du har gått glipp av %hu beskjed fra %s fordi vedkommende var for ond."
+msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi vedkommende var for ond."
+
+#: ../libpurple/protocols/oscar/oscar.c:2628
 #, 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."
 msgstr[0] "Du har gått glipp av %hu beskjed fra %s fordi du er for ond."
 msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi du er for ond."
 
-#: ../libpurple/protocols/oscar/oscar.c:2641
+#: ../libpurple/protocols/oscar/oscar.c:2637
 #, 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."
@@ -9007,563 +8795,465 @@
 msgstr[1] "Du har gått glipp av %hu beskjeder fra %s, ingen grunn oppgitt."
 
 #. Data is assumed to be the destination sn
-#: ../libpurple/protocols/oscar/oscar.c:2796
+#: ../libpurple/protocols/oscar/oscar.c:2792
 #, c-format
 msgid "Unable to send message: %s"
 msgstr "Kunne ikke sende beskjed: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2796
-#: ../libpurple/protocols/oscar/oscar.c:2801
-#: ../libpurple/protocols/oscar/oscar.c:2865
+#: ../libpurple/protocols/oscar/oscar.c:2792
+#: ../libpurple/protocols/oscar/oscar.c:2797
+#: ../libpurple/protocols/oscar/oscar.c:2861
 msgid "Unknown reason."
 msgstr "Ukjent grunn."
 
-#: ../libpurple/protocols/oscar/oscar.c:2799
+#: ../libpurple/protocols/oscar/oscar.c:2795
 #: ../libpurple/protocols/sametime/sametime.c:2409
 #, c-format
 msgid "Unable to send message to %s:"
-msgstr "Kunne ikke sende beskjed til %s."
-
-#: ../libpurple/protocols/oscar/oscar.c:2865
+msgstr "Kunne ikke sende beskjed til %s:"
+
+#: ../libpurple/protocols/oscar/oscar.c:2861
 #, c-format
 msgid "User information not available: %s"
 msgstr "Brukerinformasjon er ikke tilgjengelig: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2896
+#: ../libpurple/protocols/oscar/oscar.c:2892
 msgid "Online Since"
 msgstr "Pålogget siden"
 
-#: ../libpurple/protocols/oscar/oscar.c:2901
+#: ../libpurple/protocols/oscar/oscar.c:2897
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1185
 msgid "Member Since"
 msgstr "Medlem siden"
 
-#: ../libpurple/protocols/oscar/oscar.c:2936
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:2932
 msgid "Available Message"
-msgstr "Tilstedebeskjed:"
-
-#: ../libpurple/protocols/oscar/oscar.c:3044
+msgstr "Tilstedebeskjed"
+
+#: ../libpurple/protocols/oscar/oscar.c:3040
 msgid "Your AIM connection may be lost."
 msgstr "AIM-tilkoblingen kan være brutt."
 
 #. The conversion failed!
-#: ../libpurple/protocols/oscar/oscar.c:3232
-msgid ""
-"[Unable to display a message from this user because it contained invalid "
-"characters.]"
-msgstr ""
-"[Klarte ikke vise en melding fra denne brukeren da den inneholdt ugyldige "
-"tegn.]"
-
-#: ../libpurple/protocols/oscar/oscar.c:3396
-msgid ""
-"The last action you attempted could not be performed because you are over "
-"the rate limit. Please wait 10 seconds and try again."
-msgstr ""
-"Den siste kommandoen ble ikke utført fordi du har overskredet "
-"hastighetsgrensen. Vennligst vent 10 sekunder og prøv igjen."
-
-#: ../libpurple/protocols/oscar/oscar.c:3479
+#: ../libpurple/protocols/oscar/oscar.c:3228
+msgid "[Unable to display a message from this user because it contained invalid characters.]"
+msgstr "[Klarte ikke vise en melding fra denne brukeren da den inneholdt ugyldige tegn.]"
+
+#: ../libpurple/protocols/oscar/oscar.c:3392
+msgid "The last action you attempted could not be performed because you are over the rate limit. Please wait 10 seconds and try again."
+msgstr "Den siste kommandoen ble ikke utført fordi du har overskredet hastighetsgrensen. Vennligst vent 10 sekunder og prøv igjen."
+
+#: ../libpurple/protocols/oscar/oscar.c:3475
 #: ../libpurple/protocols/toc/toc.c:977
 #, c-format
 msgid "You have been disconnected from chat room %s."
 msgstr "Du har blitt koblet fra samtalegruppen %s."
 
-#: ../libpurple/protocols/oscar/oscar.c:3729
+#: ../libpurple/protocols/oscar/oscar.c:3725
 #: ../libpurple/protocols/silc/util.c:585
 #: ../libpurple/protocols/silc10/util.c:581
 msgid "Mobile Phone"
 msgstr "Mobiltelefon"
 
-#: ../libpurple/protocols/oscar/oscar.c:3759
+#: ../libpurple/protocols/oscar/oscar.c:3755
 msgid "Personal Web Page"
 msgstr "Personlig hjemmeside"
 
-#: ../libpurple/protocols/oscar/oscar.c:3783
+#: ../libpurple/protocols/oscar/oscar.c:3779
 #: ../libpurple/protocols/qq/buddy_info.c:40
 msgid "Additional Information"
 msgstr "Tilleggsinformasjon"
 
-#: ../libpurple/protocols/oscar/oscar.c:3791
-#: ../libpurple/protocols/oscar/oscar.c:3804
+#: ../libpurple/protocols/oscar/oscar.c:3787
+#: ../libpurple/protocols/oscar/oscar.c:3800
 msgid "Zip Code"
 msgstr "Postnummer"
 
-#: ../libpurple/protocols/oscar/oscar.c:3815
+#: ../libpurple/protocols/oscar/oscar.c:3811
 msgid "Division"
 msgstr "Avdeling"
 
-#: ../libpurple/protocols/oscar/oscar.c:3816
+#: ../libpurple/protocols/oscar/oscar.c:3812
 msgid "Position"
 msgstr "Stilling"
 
-#: ../libpurple/protocols/oscar/oscar.c:3818
+#: ../libpurple/protocols/oscar/oscar.c:3814
 msgid "Web Page"
 msgstr "Hjemmeside"
 
-#: ../libpurple/protocols/oscar/oscar.c:3821
+#: ../libpurple/protocols/oscar/oscar.c:3817
 msgid "Work Information"
 msgstr "Arbeid ekstra info"
 
-#: ../libpurple/protocols/oscar/oscar.c:3877
+#: ../libpurple/protocols/oscar/oscar.c:3873
 msgid "Pop-Up Message"
 msgstr "Varslingsbeskjed"
 
-#: ../libpurple/protocols/oscar/oscar.c:3917
-#, fuzzy, c-format
+#: ../libpurple/protocols/oscar/oscar.c:3913
+#, c-format
 msgid "The following screen name is associated with %s"
 msgid_plural "The following screen names are associated with %s"
-msgstr[0] "De følgende skjermnavnene er assosierte med %s"
+msgstr[0] "Det følgende skjermnavnet er assosierte med %s"
 msgstr[1] "De følgende skjermnavnene er assosierte med %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:3922
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:3918
 msgid "Screen name"
-msgstr "_Skjermnavn"
-
-#: ../libpurple/protocols/oscar/oscar.c:3948
+msgstr "Skjermnavn"
+
+#: ../libpurple/protocols/oscar/oscar.c:3944
 #, c-format
 msgid "No results found for e-mail address %s"
 msgstr "Ingen resultater funnet for e-postadresse %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:3969
+#: ../libpurple/protocols/oscar/oscar.c:3965
 #, c-format
 msgid "You should receive an e-mail asking to confirm %s."
 msgstr "Du vil motta en e-post hvor du blir bedt om å bekrefte %s."
 
-#: ../libpurple/protocols/oscar/oscar.c:3971
+#: ../libpurple/protocols/oscar/oscar.c:3967
 msgid "Account Confirmation Requested"
 msgstr "Kontobekreftelse forespurt"
 
-#: ../libpurple/protocols/oscar/oscar.c:4002
-#, c-format
+#: ../libpurple/protocols/oscar/oscar.c:3998
 msgid "Error Changing Account Info"
 msgstr "Feil ved endring av kontoinformasjon"
 
-#: ../libpurple/protocols/oscar/oscar.c:4005
-#, c-format
-msgid ""
-"Error 0x%04x: Unable to format screen name because the requested screen name "
-"differs from the original."
-msgstr ""
-"Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte "
-"skjermnavnet er forskjellig fra det opprinnelige."
-
-#: ../libpurple/protocols/oscar/oscar.c:4008
+#: ../libpurple/protocols/oscar/oscar.c:4001
+#, c-format
+msgid "Error 0x%04x: Unable to format screen name because the requested screen name differs from the original."
+msgstr "Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte skjermnavnet er forskjellig fra det opprinnelige."
+
+#: ../libpurple/protocols/oscar/oscar.c:4004
 #, fuzzy, c-format
 msgid "Error 0x%04x: Unable to format screen name because it is invalid."
-msgstr ""
-"Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte "
-"skjermnavnet er for langt."
-
-#: ../libpurple/protocols/oscar/oscar.c:4011
-#, c-format
-msgid ""
-"Error 0x%04x: Unable to format screen name because the requested screen name "
-"is too long."
-msgstr ""
-"Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte "
-"skjermnavnet er for langt."
-
-#: ../libpurple/protocols/oscar/oscar.c:4014
-#, c-format
-msgid ""
-"Error 0x%04x: Unable to change e-mail address because there is already a "
-"request pending for this screen name."
-msgstr ""
-"Feil 0x%04x: Kunne ikke endre e-postadressen fordi det finnes en utestående "
-"forespørsel for dette skjermnavnet."
-
-#: ../libpurple/protocols/oscar/oscar.c:4017
-#, c-format
-msgid ""
-"Error 0x%04x: Unable to change e-mail address because the given address has "
-"too many screen names associated with it."
-msgstr ""
-"Feil 0x%04x: Kunne ikke endre e-postadressen fordi den gitte adressen har "
-"for mange skjermnavn assosiert ved seg."
-
-#: ../libpurple/protocols/oscar/oscar.c:4020
-#, c-format
-msgid ""
-"Error 0x%04x: Unable to change e-mail address because the given address is "
-"invalid."
-msgstr ""
-"Feil 0x%04x: Kunne ikke endre e-postadressen fordi den gitte adressen er "
-"ugyldig."
-
-#: ../libpurple/protocols/oscar/oscar.c:4023
+msgstr "Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte skjermnavnet er for langt."
+
+#: ../libpurple/protocols/oscar/oscar.c:4007
+#, c-format
+msgid "Error 0x%04x: Unable to format screen name because the requested screen name is too long."
+msgstr "Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte skjermnavnet er for langt."
+
+#: ../libpurple/protocols/oscar/oscar.c:4010
+#, c-format
+msgid "Error 0x%04x: Unable to change e-mail address because there is already a request pending for this screen name."
+msgstr "Feil 0x%04x: Kunne ikke endre e-postadressen fordi det finnes en utestående forespørsel for dette skjermnavnet."
+
+#: ../libpurple/protocols/oscar/oscar.c:4013
+#, c-format
+msgid "Error 0x%04x: Unable to change e-mail address because the given address has too many screen names associated with it."
+msgstr "Feil 0x%04x: Kunne ikke endre e-postadressen fordi den gitte adressen har for mange skjermnavn assosiert ved seg."
+
+#: ../libpurple/protocols/oscar/oscar.c:4016
+#, c-format
+msgid "Error 0x%04x: Unable to change e-mail address because the given address is invalid."
+msgstr "Feil 0x%04x: Kunne ikke endre e-postadressen fordi den gitte adressen er ugyldig."
+
+#: ../libpurple/protocols/oscar/oscar.c:4019
 #, c-format
 msgid "Error 0x%04x: Unknown error."
 msgstr "Feil 0x%04x: Ukjent feil."
 
-#: ../libpurple/protocols/oscar/oscar.c:4033
+#: ../libpurple/protocols/oscar/oscar.c:4029
 #, c-format
 msgid "The e-mail address for %s is %s"
 msgstr "E-postadressen for %s er %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:4035
+#: ../libpurple/protocols/oscar/oscar.c:4031
 msgid "Account Info"
 msgstr "Kontoinformasjon"
 
-#: ../libpurple/protocols/oscar/oscar.c:4218
-msgid ""
-"Your IM Image was not sent. You must be Direct Connected to send IM Images."
-msgstr ""
-"Ditt direktemeldingsbilde ble ikke sendt. Du må være direkte tilkoplet for å "
-"sende direktemeldingsbilder"
-
-#: ../libpurple/protocols/oscar/oscar.c:4489
+#: ../libpurple/protocols/oscar/oscar.c:4214
+msgid "Your IM Image was not sent. You must be Direct Connected to send IM Images."
+msgstr "Ditt direktemeldingsbilde ble ikke sendt. Du må være direkte tilkoplet for og sende direktemeldingsbilder."
+
+#: ../libpurple/protocols/oscar/oscar.c:4485
 msgid "Unable to set AIM profile."
 msgstr "Kunne ikke sette AIM-profil."
 
-#: ../libpurple/protocols/oscar/oscar.c:4490
-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 "
-"fully connected."
-msgstr ""
-"Du har antakeligvis prøvd å lagre profilinformasjon før "
-"innloggingsprosedyren var ferdig. Din profil er ennå ikke blitt lagret. Prøv "
-"å lagre den igjen når du er ferdig pålogget."
-
-#: ../libpurple/protocols/oscar/oscar.c:4504
-#, fuzzy, c-format
-msgid ""
-"The maximum profile length of %d byte has been exceeded.  It has been "
-"truncated for you."
-msgid_plural ""
-"The maximum profile length of %d bytes has been exceeded.  It has been "
-"truncated for you."
-msgstr[0] ""
-"Maksimum profillengde på %d bytes har blitt overskredet. Gaim har avkortet "
-"den før den ble lagret."
-msgstr[1] ""
-"Maksimum profillengde på %d bytes har blitt overskredet. Gaim har avkortet "
-"den før den ble lagret."
-
-#: ../libpurple/protocols/oscar/oscar.c:4509
+#: ../libpurple/protocols/oscar/oscar.c:4486
+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 fully connected."
+msgstr "Du har antakeligvis prøvd å lagre profilinformasjon før innloggingsprosedyren var ferdig. Din profil er ennå ikke blitt lagret. Prøv å lagre den igjen når du er ferdig pålogget."
+
+#: ../libpurple/protocols/oscar/oscar.c:4500
+#, c-format
+msgid "The maximum profile length of %d byte has been exceeded.  It has been truncated for you."
+msgid_plural "The maximum profile length of %d bytes has been exceeded.  It has been truncated for you."
+msgstr[0] "Maksimum profillengde på %d byte har blitt overskredet. Pidgin har avkortet den før den ble lagret."
+msgstr[1] "Maksimum profillengde på %d bytes har blitt overskredet. Pidgin har avkortet den før den ble lagret."
+
+#: ../libpurple/protocols/oscar/oscar.c:4505
 msgid "Profile too long."
 msgstr "Profilen er for stor."
 
-#: ../libpurple/protocols/oscar/oscar.c:4554
-#, fuzzy, c-format
-msgid ""
-"The maximum away message length of %d byte has been exceeded.  It has been "
-"truncated for you."
-msgid_plural ""
-"The maximum away message length of %d bytes has been exceeded.  It has been "
-"truncated for you."
-msgstr[0] ""
-"Maksimumslengden på %d bytes for fraværsbeskjeder har blitt overskredet. "
-"Gaim har avkortet den."
-msgstr[1] ""
-"Maksimumslengden på %d bytes for fraværsbeskjeder har blitt overskredet. "
-"Gaim har avkortet den."
-
-#: ../libpurple/protocols/oscar/oscar.c:4559
+#: ../libpurple/protocols/oscar/oscar.c:4550
+#, c-format
+msgid "The maximum away message length of %d byte has been exceeded.  It has been truncated for you."
+msgid_plural "The maximum away message length of %d bytes has been exceeded.  It has been truncated for you."
+msgstr[0] "Maksimumslengden på %d bytes for fraværsbeskjeder har blitt overskredet. Pidgin har avkortet den."
+msgstr[1] "Maksimumslengden på %d bytes for fraværsbeskjeder har blitt overskredet. Pidgin har avkortet den."
+
+#: ../libpurple/protocols/oscar/oscar.c:4555
 msgid "Away message too long."
 msgstr "Fraværsbeskjeden er for lang."
 
-#: ../libpurple/protocols/oscar/oscar.c:4628
+#: ../libpurple/protocols/oscar/oscar.c:4624
 #, fuzzy, c-format
-msgid ""
-"Could not add the buddy %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."
-msgstr ""
-"Klarte ikke legge til kontakten %s fordi skjermnavnet er ugyldig. Skjernavn "
-"må enten starte med en bokstav og inneholde kun bokstaver, tall, og "
-"mellomrom, eller bare inneholde nummer."
-
-#: ../libpurple/protocols/oscar/oscar.c:4630
-#: ../libpurple/protocols/oscar/oscar.c:5060
-#: ../libpurple/protocols/oscar/oscar.c:5075
+msgid "Could not add the buddy %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."
+msgstr "Klarte ikke legge til kontakten %s fordi skjermnavnet er ugyldig. Skjernavn må enten starte med en bokstav og inneholde kun bokstaver, tall, og mellomrom, eller bare inneholde nummer."
+
+#: ../libpurple/protocols/oscar/oscar.c:4626
+#: ../libpurple/protocols/oscar/oscar.c:5056
+#: ../libpurple/protocols/oscar/oscar.c:5071
 msgid "Unable To Add"
 msgstr "Kunne ikke legge til"
 
-#: ../libpurple/protocols/oscar/oscar.c:4739
+#: ../libpurple/protocols/oscar/oscar.c:4735
 msgid "Unable To Retrieve Buddy List"
 msgstr "Kunne ikke hente kontaktliste"
 
-#: ../libpurple/protocols/oscar/oscar.c:4740
-#, fuzzy
-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."
-msgstr ""
-"Gaim klarte ikke å hente kontaktlisten din fra AIM-tjenerne. Kontaktlisten "
-"er ikke tapt, og vil sannsynligvis bli tilgjengelig i løpet av få timer."
-
-#: ../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:4736
+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."
+msgstr "Pidgin klarte ikke å hente kontaktlisten din fra AIM-tjenerne. Kontaktlisten er ikke tapt, og vil sannsynligvis bli tilgjengelig i løpet av få timer."
+
+#: ../libpurple/protocols/oscar/oscar.c:4918
+#: ../libpurple/protocols/oscar/oscar.c:4920
+#: ../libpurple/protocols/oscar/oscar.c:5136
+#: ../libpurple/protocols/oscar/oscar.c:5137
+#: ../libpurple/protocols/oscar/oscar.c:5142
 msgid "Orphans"
 msgstr "Ugrupperte"
 
-#: ../libpurple/protocols/oscar/oscar.c:5058
-#, c-format
-msgid ""
-"Could not add the buddy %s because you have too many buddies in your buddy "
-"list.  Please remove one and try again."
-msgstr ""
-"Kunne ikke legge til kontakten %s fordi du har for mange kontakter i listen. "
-"Vennligst fjern en og prøv igjen."
-
-#: ../libpurple/protocols/oscar/oscar.c:5058
-#: ../libpurple/protocols/oscar/oscar.c:5073
+#: ../libpurple/protocols/oscar/oscar.c:5054
+#, c-format
+msgid "Could not add the buddy %s because you have too many buddies in your buddy list.  Please remove one and try again."
+msgstr "Kunne ikke legge til kontakten %s fordi du har for mange kontakter i listen. Vennligst fjern en og prøv igjen."
+
+#: ../libpurple/protocols/oscar/oscar.c:5054
+#: ../libpurple/protocols/oscar/oscar.c:5069
 msgid "(no name)"
 msgstr "(uten navn)"
 
-#: ../libpurple/protocols/oscar/oscar.c:5072
-#, fuzzy, c-format
+#: ../libpurple/protocols/oscar/oscar.c:5068
+#, c-format
 msgid "Could not add the buddy %s for an unknown reason."
-msgstr "Din kommando feilet av ukjent årsak."
-
-#: ../libpurple/protocols/oscar/oscar.c:5178
-#, c-format
-msgid ""
-"The user %s has given you permission to add you to their buddy list.  Do you "
-"want to add them?"
-msgstr ""
-"Brukeren %s har gitt deg tillatelse til å legge deg til i kontaktlisten sin. "
-"Ønsker du å legge til vedkommende?"
-
-#: ../libpurple/protocols/oscar/oscar.c:5186
+msgstr "Kunne ikke legge til kontakten %s pga ukjent årsak."
+
+#: ../libpurple/protocols/oscar/oscar.c:5174
+#, c-format
+msgid "The user %s has given you permission to add you to their buddy list.  Do you want to add them?"
+msgstr "Brukeren %s har gitt deg tillatelse til å legge deg til i kontaktlisten sin. Ønsker du å legge til vedkommende?"
+
+#: ../libpurple/protocols/oscar/oscar.c:5182
 msgid "Authorization Given"
 msgstr "Godkjent"
 
 #. Granted
-#: ../libpurple/protocols/oscar/oscar.c:5259
+#: ../libpurple/protocols/oscar/oscar.c:5255
 #, c-format
 msgid "The user %s has granted your request to add them to your buddy list."
-msgstr ""
-"Brukeren %s har akseptert din forespørsel om å bli lagt til i kontaktlisten "
-"din."
-
-#: ../libpurple/protocols/oscar/oscar.c:5260
+msgstr "Brukeren %s har akseptert din forespørsel om å bli lagt til i kontaktlisten din."
+
+#: ../libpurple/protocols/oscar/oscar.c:5256
 msgid "Authorization Granted"
 msgstr "Godkjent"
 
 #. Denied
-#: ../libpurple/protocols/oscar/oscar.c:5263
-#, c-format
-msgid ""
-"The user %s has denied your request to add them to your buddy list for the "
-"following reason:\n"
+#: ../libpurple/protocols/oscar/oscar.c:5259
+#, c-format
+msgid ""
+"The user %s has denied your request to add them to your buddy list for the following reason:\n"
 "%s"
 msgstr ""
-"Brukeren %s har avslått din forespørsel om å bli lagt til i din kontaktliste "
-"med følgende grun:\n"
+"Brukeren %s har avslått din forespørsel om å bli lagt til i din kontaktliste med følgende grun:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:5264
+#: ../libpurple/protocols/oscar/oscar.c:5260
 msgid "Authorization Denied"
 msgstr "Ikke godkjent"
 
-#: ../libpurple/protocols/oscar/oscar.c:5300
+#: ../libpurple/protocols/oscar/oscar.c:5296
 #: ../libpurple/protocols/toc/toc.c:1371
 msgid "_Exchange:"
 msgstr "_Utveksling:"
 
-#: ../libpurple/protocols/oscar/oscar.c:5340
+#: ../libpurple/protocols/oscar/oscar.c:5336
 msgid "Invalid chat name specified."
 msgstr "Ugyldig gruppesamtalenavn oppgitt."
 
-#: ../libpurple/protocols/oscar/oscar.c:5409
+#: ../libpurple/protocols/oscar/oscar.c:5405
 msgid "Your IM Image was not sent. You cannot send IM Images in AIM chats."
-msgstr ""
-"Ditt direktemeldingsbilde ble ikke sendt. Du kan ikke sende "
-"direktemeldingsbilder i AIM-samtalegrupper."
-
-#: ../libpurple/protocols/oscar/oscar.c:5569
-#: ../libpurple/protocols/oscar/oscar.c:5574
+msgstr "Ditt direktemeldingsbilde ble ikke sendt. Du kan ikke sende direktemeldingsbilder i AIM-samtalegrupper."
+
+#: ../libpurple/protocols/oscar/oscar.c:5567
+#: ../libpurple/protocols/oscar/oscar.c:5572
 msgid "Away Message"
 msgstr "Fraværsbeskjed"
 
-#: ../libpurple/protocols/oscar/oscar.c:5574
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:5572
 msgid "<i>(retrieving)</i>"
-msgstr " <i>(registrert)</i>"
-
-#: ../libpurple/protocols/oscar/oscar.c:5774
+msgstr "<i>(mottar)</i>"
+
+#: ../libpurple/protocols/oscar/oscar.c:5772
 msgid "iTunes Music Store Link"
-msgstr ""
-
-#: ../libpurple/protocols/oscar/oscar.c:5882
+msgstr "iTunes Music Store Link"
+
+#: ../libpurple/protocols/oscar/oscar.c:5880
 #, c-format
 msgid "Buddy Comment for %s"
-msgstr "Kontaktkommentar for %s"
-
-#: ../libpurple/protocols/oscar/oscar.c:5883
+msgstr "Kontakt Kommentar for %s"
+
+#: ../libpurple/protocols/oscar/oscar.c:5881
 msgid "Buddy Comment:"
-msgstr "Kontaktkommentar:"
-
-#: ../libpurple/protocols/oscar/oscar.c:5930
+msgstr "Kontakt Kommentar:"
+
+#: ../libpurple/protocols/oscar/oscar.c:5928
 #, c-format
 msgid "You have selected to open a Direct IM connection with %s."
 msgstr "Du har valgt å åpne en direktemelding til %s."
 
-#: ../libpurple/protocols/oscar/oscar.c:5934
-#, fuzzy
-msgid ""
-"Because this reveals your IP address, it may be considered a security risk.  "
-"Do you wish to continue?"
-msgstr ""
-"Dette vil avsløre din IP-adresse til mottakeren, og medføre en (minimal) "
-"sikkerhetsrisiko. Ønsker du å fortsette?"
-
-#: ../libpurple/protocols/oscar/oscar.c:5940
+#: ../libpurple/protocols/oscar/oscar.c:5932
+#, fuzzy
+msgid "Because this reveals your IP address, it may be considered a security risk.  Do you wish to continue?"
+msgstr "Dette vil avsløre din IP-adresse til mottakeren, og medføre en (minimal) sikkerhetsrisiko. Ønsker du å fortsette?"
+
+#: ../libpurple/protocols/oscar/oscar.c:5938
 #: ../libpurple/protocols/oscar/peer.c:1045
-#, fuzzy
 msgid "C_onnect"
-msgstr "Koble til"
-
-#: ../libpurple/protocols/oscar/oscar.c:5975
-#, fuzzy
+msgstr "K_oble til"
+
+#: ../libpurple/protocols/oscar/oscar.c:5973
 msgid "Get AIM Info"
-msgstr "Hent informasjon"
-
-#: ../libpurple/protocols/oscar/oscar.c:5981
+msgstr "Hent AIM Informasjon"
+
+#: ../libpurple/protocols/oscar/oscar.c:5979
 msgid "Edit Buddy Comment"
-msgstr "Rediger kontaktkommentar"
-
-#: ../libpurple/protocols/oscar/oscar.c:5989
+msgstr "Endre Kontakt Kommentar"
+
+#: ../libpurple/protocols/oscar/oscar.c:5987
 msgid "Get Status Msg"
 msgstr "Hent statusbeskjed"
 
-#: ../libpurple/protocols/oscar/oscar.c:6002
+#: ../libpurple/protocols/oscar/oscar.c:6000
 msgid "Direct IM"
 msgstr "Direkte samtale"
 
-#: ../libpurple/protocols/oscar/oscar.c:6024
+#: ../libpurple/protocols/oscar/oscar.c:6022
 msgid "Re-request Authorization"
 msgstr "Spør på nytt om godkjenning"
 
-#: ../libpurple/protocols/oscar/oscar.c:6083
+#: ../libpurple/protocols/oscar/oscar.c:6081
 #, fuzzy
 msgid "Require authorization"
 msgstr "Spør om godkjenning"
 
-#: ../libpurple/protocols/oscar/oscar.c:6086
+#: ../libpurple/protocols/oscar/oscar.c:6084
 msgid "Web aware (enabling this will cause you to receive SPAM!)"
-msgstr ""
-
-#: ../libpurple/protocols/oscar/oscar.c:6091
+msgstr "Web aware (slår du på denne vil du motta SPAM!)"
+
+#: ../libpurple/protocols/oscar/oscar.c:6089
 #, fuzzy
 msgid "ICQ Privacy Options"
 msgstr "Proxyinnstillinger"
 
-#: ../libpurple/protocols/oscar/oscar.c:6110
+#: ../libpurple/protocols/oscar/oscar.c:6108
 msgid "The new formatting is invalid."
 msgstr "Den nye formateringen er ugyldig."
 
-#: ../libpurple/protocols/oscar/oscar.c:6111
+#: ../libpurple/protocols/oscar/oscar.c:6109
 msgid "Screen name formatting can change only capitalization and whitespace."
-msgstr ""
-"Skjermnavn-formatering kan bare endre på store/små bokstaver og mellomrom."
-
-#: ../libpurple/protocols/oscar/oscar.c:6164
+msgstr "Skjermnavn-formatering kan bare endre på store/små bokstaver og mellomrom."
+
+#: ../libpurple/protocols/oscar/oscar.c:6162
 msgid "Change Address To:"
 msgstr "Endre adresse til:"
 
-#: ../libpurple/protocols/oscar/oscar.c:6210
+#: ../libpurple/protocols/oscar/oscar.c:6208
 msgid "<i>you are not waiting for authorization</i>"
 msgstr "<i>du venter ikke på godkjenning</i>"
 
-#: ../libpurple/protocols/oscar/oscar.c:6213
+#: ../libpurple/protocols/oscar/oscar.c:6211
 msgid "You are awaiting authorization from the following buddies"
 msgstr "Du venter på godkjenning fra disse kontaktene"
 
-#: ../libpurple/protocols/oscar/oscar.c:6214
-msgid ""
-"You can re-request authorization from these buddies by right-clicking on "
-"them and selecting \"Re-request Authorization.\""
-msgstr ""
-"Du kan spørre om godkjenning på nytt hos disse kontaktene ved å høyreklikke "
-"på dem og velge \"Spør på nytt om godkjenning\"."
+#: ../libpurple/protocols/oscar/oscar.c:6212
+msgid "You can re-request authorization from these buddies by right-clicking on them and selecting \"Re-request Authorization.\""
+msgstr "Du kan spørre om godkjenning på nytt hos disse kontaktene ved å høyreklikke på dem og velge \"Spør på nytt om Godkjenning.\""
+
+#: ../libpurple/protocols/oscar/oscar.c:6229
+msgid "Find Buddy by E-Mail"
+msgstr "Finn Kontakt etter e-post"
+
+#: ../libpurple/protocols/oscar/oscar.c:6230
+msgid "Search for a buddy by e-mail address"
+msgstr "Søk etter en kontakt ved hjelp av e-postadresse"
 
 #: ../libpurple/protocols/oscar/oscar.c:6231
-msgid "Find Buddy by E-Mail"
-msgstr "Finn kontakt etter e-post"
-
-#: ../libpurple/protocols/oscar/oscar.c:6232
-msgid "Search for a buddy by e-mail address"
-msgstr "Kontaktsøk etter e-postadresse"
-
-#: ../libpurple/protocols/oscar/oscar.c:6233
 msgid "Type the e-mail address of the buddy you are searching for."
 msgstr "Skriv inn e-postadressen til den du søker etter."
 
-#: ../libpurple/protocols/oscar/oscar.c:6236
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:6234
 msgid "_Search"
-msgstr "Søk"
-
-#: ../libpurple/protocols/oscar/oscar.c:6394
+msgstr "_Søk"
+
+#: ../libpurple/protocols/oscar/oscar.c:6392
 msgid "Set User Info (URL)..."
 msgstr "Sett brukerinfo (URL)..."
 
-#: ../libpurple/protocols/oscar/oscar.c:6405
+#: ../libpurple/protocols/oscar/oscar.c:6403
 msgid "Change Password (URL)"
 msgstr "Endre passord (URL)"
 
-#: ../libpurple/protocols/oscar/oscar.c:6409
+#: ../libpurple/protocols/oscar/oscar.c:6407
 msgid "Configure IM Forwarding (URL)"
 msgstr "Konfigurer beskjedvideresending (URL)"
 
 #. ICQ actions
-#: ../libpurple/protocols/oscar/oscar.c:6419
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:6417
 msgid "Set Privacy Options..."
-msgstr "Vis flere valg"
+msgstr "Sett Privatliv Instillinger..."
 
 #. AIM actions
-#: ../libpurple/protocols/oscar/oscar.c:6426
+#: ../libpurple/protocols/oscar/oscar.c:6424
 msgid "Confirm Account"
 msgstr "Bekrefte konto"
 
-#: ../libpurple/protocols/oscar/oscar.c:6430
+#: ../libpurple/protocols/oscar/oscar.c:6428
 #, fuzzy
 msgid "Display Currently Registered E-Mail Address"
 msgstr "Vis nåværende registrert adresse"
 
-#: ../libpurple/protocols/oscar/oscar.c:6434
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:6432
 msgid "Change Currently Registered E-Mail Address..."
-msgstr "Endre nåværende registrert adresse"
-
-#: ../libpurple/protocols/oscar/oscar.c:6441
+msgstr "Endre Nåværende Registrert e-post Adresse..."
+
+#: ../libpurple/protocols/oscar/oscar.c:6439
 msgid "Show Buddies Awaiting Authorization"
 msgstr "Vis kontakter som venter på godkjenning"
 
-#: ../libpurple/protocols/oscar/oscar.c:6447
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:6445
 msgid "Search for Buddy by E-Mail Address..."
-msgstr "Vennesøk etter e-postadresse"
-
-#: ../libpurple/protocols/oscar/oscar.c:6452
+msgstr "Søk etter kontakter ved hjelp av e-postadresser..."
+
+#: ../libpurple/protocols/oscar/oscar.c:6450
 msgid "Search for Buddy by Information"
 msgstr "Vennesøk etter informasjon"
 
-#: ../libpurple/protocols/oscar/oscar.c:6520
+#: ../libpurple/protocols/oscar/oscar.c:6518
 #, fuzzy
 msgid "Use recent buddies group"
 msgstr "Brukeren er ikke i gruppen"
 
-#: ../libpurple/protocols/oscar/oscar.c:6523
-#, fuzzy
+#: ../libpurple/protocols/oscar/oscar.c:6521
 msgid "Show how long you have been idle"
-msgstr "Lar deg manuelt sette hvor lenge du har vært borte."
-
-#: ../libpurple/protocols/oscar/oscar.c:6678
+msgstr "Vis hvor lenge du har vært inaktiv"
+
+#: ../libpurple/protocols/oscar/oscar.c:6676
 msgid ""
 "Always use ICQ proxy server for file transfers\n"
 "(slower, but does not reveal your IP address)"
 msgstr ""
+"Alltid bruk ICQ proxy server for filoverføring\n"
+"(saktere, men avslører ikke din IP adresse)"
 
 #: ../libpurple/protocols/oscar/peer.c:697
 #, c-format
@@ -9571,12 +9261,12 @@
 msgstr "Spør %s om å kople til oss på %s:%hu for direktesamtale."
 
 #: ../libpurple/protocols/oscar/peer.c:782
-#, fuzzy, c-format
+#, c-format
 msgid "Attempting to connect to %s:%hu."
-msgstr "Forsøker å kople til %s på %s:%hu for direktesamtale."
+msgstr "Forsøker å kople til %s:%hu."
 
 #: ../libpurple/protocols/oscar/peer.c:856
-#, fuzzy, c-format
+#, fuzzy
 msgid "Attempting to connect via proxy server."
 msgstr "Forsøker å kople til %s på %s:%hu for direktesamtale."
 
@@ -9586,14 +9276,8 @@
 msgstr "%s har akkurat spurt om direkte tilkobling til %s"
 
 #: ../libpurple/protocols/oscar/peer.c:1037
-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 "
-"considered a privacy risk."
-msgstr ""
-"Dette krever at det opprettes en direkte tilkobling mellom de to "
-"datamaskinene, men er nødvendig for å sende bilder. Dette kan være en "
-"(minimal) sikkerhetsrisiko fordi mottakeren da ser IP-adressen din."
+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 considered a privacy risk."
+msgstr "Dette krever at det opprettes en direkte tilkobling mellom de to datamaskinene, men er nødvendig for å sende bilder. Dette kan være en (minimal) sikkerhetsrisiko fordi mottakeren da ser IP-adressen din."
 
 #: ../libpurple/protocols/qq/buddy_info.c:39
 #, fuzzy
@@ -9607,190 +9291,166 @@
 
 #: ../libpurple/protocols/qq/buddy_info.c:42
 msgid "QQ Number"
-msgstr ""
+msgstr "QQ Nummer"
 
 #: ../libpurple/protocols/qq/buddy_info.c:47
-#, fuzzy
 msgid "Country/Region"
 msgstr "Land"
 
 #: ../libpurple/protocols/qq/buddy_info.c:48
 msgid "Province/State"
-msgstr ""
+msgstr "Fylke/stat"
 
 #: ../libpurple/protocols/qq/buddy_info.c:50
 msgid "Horoscope Symbol"
-msgstr ""
+msgstr "Horoskoptegn"
 
 #: ../libpurple/protocols/qq/buddy_info.c:52
 msgid "Zodiac Sign"
-msgstr ""
+msgstr "Stjernetegn"
 
 #: ../libpurple/protocols/qq/buddy_info.c:53
 msgid "Blood Type"
-msgstr ""
+msgstr "Blodtype"
 
 #: ../libpurple/protocols/qq/buddy_info.c:54
-#, fuzzy
 msgid "College"
-msgstr "_Lukk"
+msgstr "Universitet"
 
 #: ../libpurple/protocols/qq/buddy_info.c:55
 msgid "Email"
 msgstr "E-post"
 
 #: ../libpurple/protocols/qq/buddy_info.c:57
-#, fuzzy
 msgid "Zipcode"
 msgstr "Postnummer"
 
 #: ../libpurple/protocols/qq/buddy_info.c:58
-#, fuzzy
 msgid "Cellphone Number"
-msgstr "Telefonnummer"
+msgstr "Mobilnummer"
 
 #: ../libpurple/protocols/qq/buddy_info.c:59
-#, fuzzy
 msgid "Phone Number"
 msgstr "Telefonnummer"
 
 #: ../libpurple/protocols/qq/buddy_info.c:64
 msgid "Aquarius"
-msgstr ""
+msgstr "Vannmannen"
 
 #: ../libpurple/protocols/qq/buddy_info.c:64
-#, fuzzy
 msgid "Pisces"
-msgstr "Bilder"
+msgstr "Fiskene"
 
 #: ../libpurple/protocols/qq/buddy_info.c:64
-#, fuzzy
 msgid "Aries"
-msgstr "Adresse"
+msgstr "Væren"
 
 #: ../libpurple/protocols/qq/buddy_info.c:64
-#, fuzzy
 msgid "Taurus"
-msgstr "Tyrkisk"
+msgstr "Tyren"
 
 #: ../libpurple/protocols/qq/buddy_info.c:65
-#, fuzzy
 msgid "Gemini"
-msgstr "Tysk"
+msgstr "Tvillingen"
 
 #: ../libpurple/protocols/qq/buddy_info.c:65
-#, fuzzy
 msgid "Cancer"
-msgstr "_Avbryt"
+msgstr "Krepsen"
 
 #: ../libpurple/protocols/qq/buddy_info.c:65
 msgid "Leo"
-msgstr ""
+msgstr "Løven"
 
 #: ../libpurple/protocols/qq/buddy_info.c:65
 msgid "Virgo"
-msgstr ""
+msgstr "Jomfruen"
 
 #: ../libpurple/protocols/qq/buddy_info.c:65
 msgid "Libra"
-msgstr ""
+msgstr "Vekten"
 
 #: ../libpurple/protocols/qq/buddy_info.c:66
-#, fuzzy
 msgid "Scorpio"
-msgstr "Abonnement"
+msgstr "Skorpionen"
 
 #: ../libpurple/protocols/qq/buddy_info.c:66
 msgid "Sagittarius"
-msgstr ""
+msgstr "Skytten"
 
 #: ../libpurple/protocols/qq/buddy_info.c:66
 msgid "Capricorn"
-msgstr ""
+msgstr "Steinbukken"
 
 #: ../libpurple/protocols/qq/buddy_info.c:71
-#, fuzzy
 msgid "Rat"
-msgstr "Direkte"
+msgstr "Rotte"
 
 #: ../libpurple/protocols/qq/buddy_info.c:71
 msgid "Ox"
-msgstr ""
+msgstr "Okse"
 
 #
 #: ../libpurple/protocols/qq/buddy_info.c:71
-#, fuzzy
 msgid "Tiger"
-msgstr "Tid"
+msgstr "Tiger"
 
 #: ../libpurple/protocols/qq/buddy_info.c:71
 msgid "Rabbit"
-msgstr ""
+msgstr "Hare"
 
 #: ../libpurple/protocols/qq/buddy_info.c:72
 msgid "Dragon"
-msgstr ""
+msgstr "Drage"
 
 #: ../libpurple/protocols/qq/buddy_info.c:72
-#, fuzzy
 msgid "Snake"
-msgstr "Lagre"
+msgstr "Slange"
 
 #: ../libpurple/protocols/qq/buddy_info.c:72
-#, fuzzy
 msgid "Horse"
-msgstr "Porter"
+msgstr "Hest"
 
 #: ../libpurple/protocols/qq/buddy_info.c:72
 msgid "Goat"
-msgstr ""
+msgstr "Geit"
 
 #: ../libpurple/protocols/qq/buddy_info.c:72
-#, fuzzy
 msgid "Monkey"
-msgstr "Ingen"
+msgstr "Ape"
 
 #: ../libpurple/protocols/qq/buddy_info.c:73
-#, fuzzy
 msgid "Rooster"
-msgstr "Registrer"
+msgstr "Hane"
 
 #: ../libpurple/protocols/qq/buddy_info.c:73
 msgid "Dog"
-msgstr ""
+msgstr "Hund"
 
 #: ../libpurple/protocols/qq/buddy_info.c:73
-#, fuzzy
 msgid "Pig"
-msgstr "Ping"
+msgstr "Gris"
 
 #: ../libpurple/protocols/qq/buddy_info.c:78
-#, fuzzy
 msgid "Other"
-msgstr "Opera"
+msgstr "Andre"
 
 #: ../libpurple/protocols/qq/buddy_info.c:481
 #: ../libpurple/protocols/qq/buddy_info.c:482
-#, fuzzy
 msgid "Modify my information"
-msgstr "Kontaktinformasjon"
+msgstr "Endre min informasjon"
 
 #: ../libpurple/protocols/qq/buddy_info.c:483
-#, fuzzy
 msgid "Update my information"
-msgstr "Brukerinformasjon"
+msgstr "Oppdater min informasjon"
 
 #: ../libpurple/protocols/qq/buddy_info.c:507
-#, fuzzy
 msgid "Your information has been updated"
-msgstr "Passordet ditt har blitt endret."
+msgstr "Din informasjon har blitt oppdatert"
 
 #: ../libpurple/protocols/qq/buddy_info.c:560
 #, c-format
-msgid ""
-"Setting custom faces is not currently supported. Please choose an image from "
-"%s."
-msgstr ""
+msgid "Setting custom faces is not currently supported. Please choose an image from %s."
+msgstr "Å sette custum fjes er for tiden ikke støttet. Vennligst velg et bilde fra %s."
 
 #: ../libpurple/protocols/qq/buddy_info.c:577
 #: ../libpurple/protocols/qq/buddy_info.c:590
@@ -9806,18 +9466,17 @@
 
 #: ../libpurple/protocols/qq/buddy_opt.c:209
 msgid "Input your reason:"
-msgstr ""
+msgstr "Sett inn din grunn:"
 
 #: ../libpurple/protocols/qq/buddy_opt.c:212
-#, fuzzy
 msgid "Reject request"
-msgstr "Uventet forespørsel"
+msgstr "Avslå forespørsel"
 
 #. title
 #: ../libpurple/protocols/qq/buddy_opt.c:213
 #: ../libpurple/protocols/qq/group_opt.c:141
 msgid "Sorry, you are not my type..."
-msgstr ""
+msgstr "Dessverre, du er ikke min type..."
 
 #: ../libpurple/protocols/qq/buddy_opt.c:277
 #, fuzzy
@@ -9827,12 +9486,12 @@
 #. TODO: We don't really need to notify the user about this, do we?
 #: ../libpurple/protocols/qq/buddy_opt.c:309
 msgid "You have successfully removed a buddy"
-msgstr ""
+msgstr "Fjerning av kompis var vellykket"
 
 #. TODO: Does the user really need to be notified about this?
 #: ../libpurple/protocols/qq/buddy_opt.c:338
 msgid "You have successfully removed yourself from your friend's buddy list"
-msgstr ""
+msgstr "Fjerning av deg selv fra kompisen dins venneliste var vellykket"
 
 #: ../libpurple/protocols/qq/buddy_opt.c:404
 #, fuzzy, c-format
@@ -9842,7 +9501,7 @@
 #: ../libpurple/protocols/qq/buddy_opt.c:406
 #: ../libpurple/protocols/qq/group_join.c:136
 msgid "Input request here"
-msgstr ""
+msgstr "Sett inn forspørsel her"
 
 #. TODO: Awkward string to fix post string freeze - standardize auth dialogues? -evands
 #: ../libpurple/protocols/qq/buddy_opt.c:407
@@ -9861,9 +9520,9 @@
 msgstr "Send"
 
 #: ../libpurple/protocols/qq/buddy_opt.c:418
-#, fuzzy, c-format
+#, c-format
 msgid "You have added %d to buddy list"
-msgstr "Legg til brukeren i kontaktlisten din"
+msgstr "Legg til brukeren %d i kontaktlisten din"
 
 #: ../libpurple/protocols/qq/buddy_opt.c:515
 #, fuzzy
@@ -9877,12 +9536,11 @@
 
 #: ../libpurple/protocols/qq/group.c:65
 msgid "ID: "
-msgstr ""
+msgstr "ID: "
 
 #: ../libpurple/protocols/qq/group.c:98
-#, fuzzy
 msgid "Group ID"
-msgstr "Gruppe:"
+msgstr "Gruppe ID"
 
 #: ../libpurple/protocols/qq/group.c:100
 #, fuzzy
@@ -9901,28 +9559,27 @@
 
 #: ../libpurple/protocols/qq/group.c:119
 msgid "QQ Qun"
-msgstr ""
+msgstr "QQ Qun"
 
 #: ../libpurple/protocols/qq/group.c:120
-#, fuzzy
 msgid "Please enter external group ID"
-msgstr "Vennligst skriv inn navnet på gruppen som skal legges til."
+msgstr "Vennligst skriv ekstern gruppe ID"
 
 #: ../libpurple/protocols/qq/group.c:121
 msgid "You can only search for permanent QQ groups\n"
-msgstr ""
+msgstr "Du kan kun søke etter permanente QQ grupper\n"
 
 #: ../libpurple/protocols/qq/group_im.c:126
 #, c-format
 msgid "User %d requested to join group %d"
-msgstr ""
+msgstr "Bruker %d spør om du vil være med i gruppen %d"
 
 #: ../libpurple/protocols/qq/group_im.c:127
 #: ../libpurple/protocols/qq/group_im.c:181
 #: ../libpurple/protocols/qq/sys_msg.c:193
-#, fuzzy, c-format
+#, c-format
 msgid "Reason: %s"
-msgstr "Brukere på %s: %s"
+msgstr "Grunn: %s"
 
 #: ../libpurple/protocols/qq/group_im.c:136
 #: ../libpurple/protocols/qq/group_im.c:183
@@ -9943,48 +9600,47 @@
 #: ../libpurple/protocols/qq/sys_msg.c:91
 #: ../libpurple/protocols/qq/sys_msg.c:248
 msgid "Approve"
-msgstr ""
+msgstr "Godkjenn"
 
 #: ../libpurple/protocols/qq/group_im.c:180
 #, c-format
 msgid "Your request to join group %d has been rejected by admin %d"
-msgstr ""
+msgstr "Din forespørsel til å bli med i gruppen %d har blitt avslått av admin %d"
 
 #: ../libpurple/protocols/qq/group_im.c:221
 #, c-format
 msgid "Your request to join group %d has been approved by admin %d"
-msgstr ""
+msgstr "Din forespørsel til å bli med i gruppen %d har blitt godkjent av admin %d"
 
 #: ../libpurple/protocols/qq/group_im.c:257
 #, c-format
 msgid "You [%d] have left group \"%d\""
-msgstr ""
+msgstr "Du [%d] har forlatt gruppen \"%d\""
 
 #: ../libpurple/protocols/qq/group_im.c:291
 #, c-format
 msgid "You [%d] have been added to group \"%d\""
-msgstr ""
+msgstr "Du [%d] har blitt lagt til i gruppen \"%d\""
 
 #: ../libpurple/protocols/qq/group_im.c:292
-#, fuzzy
 msgid "This group has been added to your buddy list"
-msgstr "Ønsker du å legge denne kontakten til i kontaktlisten din?"
+msgstr "Denne gruppen har blitt lagt til kontaktlisten din"
 
 #: ../libpurple/protocols/qq/group_internal.c:41
 msgid "I am not a member"
-msgstr ""
+msgstr "Jeg ikke en medlem"
 
 #: ../libpurple/protocols/qq/group_internal.c:44
 msgid "I am a member"
-msgstr ""
+msgstr "Jeg er en medlem"
 
 #: ../libpurple/protocols/qq/group_internal.c:47
 msgid "I am applying to join"
-msgstr ""
+msgstr "Jeg søker om å bli med"
 
 #: ../libpurple/protocols/qq/group_internal.c:50
 msgid "I am the admin"
-msgstr ""
+msgstr "Jeg er admin"
 
 #: ../libpurple/protocols/qq/group_internal.c:53
 #, fuzzy
@@ -9994,24 +9650,23 @@
 #: ../libpurple/protocols/qq/group_join.c:82
 #, fuzzy
 msgid "This group does not allow others to join"
-msgstr ""
-"Denne testversjonen tillater ikke mer enn ti samtidige innloggede brukere"
+msgstr "Denne testversjonen tillater ikke mer enn ti samtidige innloggede brukere"
 
 #: ../libpurple/protocols/qq/group_join.c:233
 msgid "You have successfully left the group"
-msgstr ""
+msgstr "Du har forlatt gruppen"
 
 #: ../libpurple/protocols/qq/group_join.c:257
 msgid "QQ Group Auth"
-msgstr ""
+msgstr "QQ Group Auth"
 
 #: ../libpurple/protocols/qq/group_join.c:258
 msgid "Your authorization request has been accepted by the QQ server"
-msgstr ""
+msgstr "Din autoriserings forespørsel har blitt godtatt av QQ serveren"
 
 #: ../libpurple/protocols/qq/group_join.c:329
 msgid "You entered a group ID outside the acceptable range"
-msgstr ""
+msgstr "Du tastet inn en gruppe ID utenfor den aksepterte rekkevidden"
 
 #: ../libpurple/protocols/qq/group_join.c:360
 #, fuzzy
@@ -10023,11 +9678,13 @@
 "Note, if you are the creator, \n"
 "this operation will eventually remove this Qun."
 msgstr ""
+"NB, om du er lageren, \n"
+"denne operasjonen vil til slutt fjerne denne Qun."
 
 #: ../libpurple/protocols/qq/group_network.c:92
 #, c-format
 msgid "Code [0x%02X]: %s"
-msgstr ""
+msgstr "Kode [0x%02X]: %s"
 
 #: ../libpurple/protocols/qq/group_network.c:93
 #, fuzzy
@@ -10042,21 +9699,20 @@
 msgstr "Er du sikker på at du vil slette \"%s\"?"
 
 #: ../libpurple/protocols/qq/group_opt.c:137
-#, fuzzy
 msgid "Enter your reason:"
-msgstr "%s er ikke pålogget."
+msgstr "Skriv din grunn:"
 
 #: ../libpurple/protocols/qq/group_opt.c:235
 msgid "You have successfully modified Qun member"
-msgstr ""
+msgstr "Modifisering av Qun medlem vellykket"
 
 #: ../libpurple/protocols/qq/group_opt.c:305
 msgid "You have successfully modified Qun information"
-msgstr ""
+msgstr "Modifisering av Qun informasjon vellykket"
 
 #: ../libpurple/protocols/qq/group_opt.c:392
 msgid "You have successfully created a Qun"
-msgstr ""
+msgstr "Laging av Qun vellykket"
 
 #: ../libpurple/protocols/qq/group_opt.c:394
 #, fuzzy
@@ -10074,27 +9730,25 @@
 msgstr "Send beskjed"
 
 #: ../libpurple/protocols/qq/im.c:576
-#, fuzzy
 msgid "Failed to send IM."
-msgstr "Kunne ikke bli med i samtalegruppen"
+msgstr "Feilet i å sende direktemelding."
 
 #: ../libpurple/protocols/qq/keep_alive.c:87
-#, fuzzy
 msgid "Keep alive error"
-msgstr "Feil ved lesing"
+msgstr "Hold i livet feil"
 
 #: ../libpurple/protocols/qq/login_logout.c:408
 #, fuzzy
 msgid "Error requesting login token"
 msgstr "Feil: kunne ikke koble til"
 
-#: ../libpurple/protocols/qq/login_logout.c:486
-#, fuzzy
+#: ../libpurple/protocols/qq/login_logout.c:488
 msgid "Unable to login, check debug log"
-msgstr "Kunne ikke logge på AIM"
+msgstr "Kunne ikke logge inn, sjekk debug logg"
 
 #. we didn't successfully connect. tdt->toc_fd is valid here
-#: ../libpurple/protocols/qq/qq.c:139 ../libpurple/protocols/toc/toc.c:173
+#: ../libpurple/protocols/qq/qq.c:139
+#: ../libpurple/protocols/toc/toc.c:173
 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:109
 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:189
 #: ../libpurple/protocols/yahoo/ycht.c:549
@@ -10178,7 +9832,8 @@
 msgid "Set My Information"
 msgstr "Tjenerinformasjon"
 
-#: ../libpurple/protocols/qq/qq.c:536 ../libpurple/protocols/toc/toc.c:1680
+#: ../libpurple/protocols/qq/qq.c:536
+#: ../libpurple/protocols/toc/toc.c:1680
 msgid "Change Password"
 msgstr "Bytt passord"
 
@@ -10189,12 +9844,11 @@
 
 #: ../libpurple/protocols/qq/qq.c:560
 msgid "Leave this QQ Qun"
-msgstr ""
+msgstr "Forlat denne QQ Qun"
 
 #: ../libpurple/protocols/qq/qq.c:584
-#, fuzzy
 msgid "Block this buddy"
-msgstr "Blokker brukeren"
+msgstr "Blokker denne kontakten"
 
 #. *< type
 #. *< ui_requirement
@@ -10206,10 +9860,10 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/qq/qq.c:725 ../libpurple/protocols/qq/qq.c:727
-#, fuzzy
+#: ../libpurple/protocols/qq/qq.c:725
+#: ../libpurple/protocols/qq/qq.c:727
 msgid "QQ Protocol\tPlugin"
-msgstr "IRC-protokolltillegg"
+msgstr "QQ Protokoll\tTillegg"
 
 #: ../libpurple/protocols/qq/qq.c:752
 #, fuzzy
@@ -10238,9 +9892,9 @@
 msgstr "Filsending feilet"
 
 #: ../libpurple/protocols/qq/send_file.c:736
-#, fuzzy, c-format
+#, c-format
 msgid "%d canceled the transfer of %s"
-msgstr "%s avbrøt overføringen av %s"
+msgstr "%d avbrøt overføringen av %s"
 
 #: ../libpurple/protocols/qq/sendqueue.c:123
 #, fuzzy
@@ -10254,9 +9908,8 @@
 msgstr "Pålogging feilet (%s)"
 
 #: ../libpurple/protocols/qq/sys_msg.c:110
-#, fuzzy
 msgid "Do you want to add this buddy?"
-msgstr "Ønsker du å legge denne kontakten til i kontaktlisten din?"
+msgstr "Ønsker du å legge denne kontakten?"
 
 #. only need to get value
 #: ../libpurple/protocols/qq/sys_msg.c:166
@@ -10271,35 +9924,35 @@
 msgstr "Ønsker du å overskrive den?"
 
 #: ../libpurple/protocols/qq/sys_msg.c:176
-#, fuzzy, c-format
+#, c-format
 msgid "%s has added you [%s] to his or her buddy list"
-msgstr "Brukeren %s ønsker å legge til %s i kontaktlisten sin."
+msgstr "%s har lagt til deg [%s] til sin kontaktliste"
 
 #: ../libpurple/protocols/qq/sys_msg.c:192
 #, c-format
 msgid "User %s rejected your request"
-msgstr ""
+msgstr "Buker %s har avslått din forespørsel"
 
 #: ../libpurple/protocols/qq/sys_msg.c:212
 #, c-format
 msgid "User %s approved your request"
-msgstr ""
+msgstr "Buker %s har godkjent din forespørsel"
 
 #. TODO: this should go through purple_account_request_authorization()
 #: ../libpurple/protocols/qq/sys_msg.c:238
-#, fuzzy, c-format
+#, c-format
 msgid "%s wants to add you [%s] as a friend"
-msgstr "%s ønsker å sende deg en fil."
+msgstr "%s ønsker å legge deg [%s] som en venn"
 
 #: ../libpurple/protocols/qq/sys_msg.c:239
-#, fuzzy, c-format
+#, c-format
 msgid "Message: %s"
-msgstr "Beskjed:"
+msgstr "Beskjed: %s"
 
 #: ../libpurple/protocols/qq/sys_msg.c:261
-#, fuzzy, c-format
+#, c-format
 msgid "%s is not in your buddy list"
-msgstr "Legg til brukeren i kontaktlisten din"
+msgstr "%s er ikke i kontaktlisten"
 
 #: ../libpurple/protocols/sametime/sametime.c:417
 #, fuzzy
@@ -10317,9 +9970,9 @@
 msgstr "<b>Bruker:</b> %s<br>"
 
 #: ../libpurple/protocols/sametime/sametime.c:1293
-#, fuzzy, c-format
+#, c-format
 msgid "Info for Group %s"
-msgstr "Info for %s"
+msgstr "Info for gruppe %s"
 
 #: ../libpurple/protocols/sametime/sametime.c:1295
 #, fuzzy
@@ -10327,9 +9980,8 @@
 msgstr "Arbeid ekstra info"
 
 #: ../libpurple/protocols/sametime/sametime.c:1327
-#, fuzzy
 msgid "Invite Group to Conference..."
-msgstr "Start konferanse"
+msgstr "Innviter Gruppe til Konferanse..."
 
 #: ../libpurple/protocols/sametime/sametime.c:1337
 #, fuzzy
@@ -10347,12 +9999,14 @@
 msgstr "Venter på at overføringen skal starte"
 
 #: ../libpurple/protocols/sametime/sametime.c:1514
+#, fuzzy
 msgid "Handshake Acknowledged, Sending Login"
-msgstr ""
+msgstr "Håndtrykk Mottatt, Sender Innlogging"
 
 #: ../libpurple/protocols/sametime/sametime.c:1519
+#, fuzzy
 msgid "Waiting for Login Acknowledgement"
-msgstr ""
+msgstr "Venter på innloggins mottak"
 
 #: ../libpurple/protocols/sametime/sametime.c:1524
 #, fuzzy
@@ -10365,8 +10019,9 @@
 msgstr "Logger på"
 
 #: ../libpurple/protocols/sametime/sametime.c:1534
+#, fuzzy
 msgid "Login Acknowledged"
-msgstr ""
+msgstr "Innlogging Mottatt"
 
 #: ../libpurple/protocols/sametime/sametime.c:1539
 #, fuzzy
@@ -10375,13 +10030,12 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:1645
 #, c-format
-msgid ""
-"A Sametime administrator has issued the following announcement on server %s"
-msgstr ""
+msgid "A Sametime administrator has issued the following announcement on server %s"
+msgstr "En Sametime admin har satt følgende kunngjøring på serveren %s"
 
 #: ../libpurple/protocols/sametime/sametime.c:1650
 msgid "Sametime Administrator Announcement"
-msgstr ""
+msgstr "Sametime Administrator Kunngjøring"
 
 #: ../libpurple/protocols/sametime/sametime.c:1702
 #, fuzzy
@@ -10389,21 +10043,20 @@
 msgstr "Tilkoblingen lukket"
 
 #: ../libpurple/protocols/sametime/sametime.c:1709
-#, fuzzy, c-format
+#, c-format
 msgid "Error reading from socket: %s"
-msgstr "Feil under lesing fra socket."
+msgstr "Feil ved lesing fra socket: %s"
 
 #. this is a regular connect, error out
 #: ../libpurple/protocols/sametime/sametime.c:1732
 #: ../libpurple/protocols/sametime/sametime.c:3726
-#, fuzzy
 msgid "Unable to connect to host"
-msgstr "Kan ikke koble til tjener."
+msgstr "Kan ikke koble til tjener"
 
 #: ../libpurple/protocols/sametime/sametime.c:1770
 #, c-format
 msgid "Announcement from %s"
-msgstr ""
+msgstr "Kunngjøring fra %s"
 
 #: ../libpurple/protocols/sametime/sametime.c:1944
 #, fuzzy
@@ -10422,23 +10075,21 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:3229
 msgid "Microphone"
-msgstr ""
+msgstr "Mikrofon"
 
 #: ../libpurple/protocols/sametime/sametime.c:3230
 msgid "Speakers"
-msgstr ""
+msgstr "Høytalere"
 
 #: ../libpurple/protocols/sametime/sametime.c:3231
-#, fuzzy
 msgid "Video Camera"
-msgstr "Videosamtale"
+msgstr "Videokamera"
 
 #
 #: ../libpurple/protocols/sametime/sametime.c:3269
 #: ../libpurple/protocols/sametime/sametime.c:4145
-#, fuzzy
 msgid "Supports"
-msgstr "støtte"
+msgstr "Støtter"
 
 #: ../libpurple/protocols/sametime/sametime.c:3274
 #: ../libpurple/protocols/sametime/sametime.c:4119
@@ -10453,10 +10104,8 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:3381
 #, c-format
-msgid ""
-"Please enter a topic for the new conference, and an invitation message to be "
-"sent to %s"
-msgstr ""
+msgid "Please enter a topic for the new conference, and an invitation message to be sent to %s"
+msgstr "Vennligst sett topic for en ny konferanse, og en invitasjons beskjed vil bli sendt til %s"
 
 #: ../libpurple/protocols/sametime/sametime.c:3385
 #, fuzzy
@@ -10474,9 +10123,8 @@
 msgstr "Start konferanse"
 
 #: ../libpurple/protocols/sametime/sametime.c:3458
-#, fuzzy
 msgid "Create New Conference..."
-msgstr "Start konferanse"
+msgstr "Start Ny Konferanse..."
 
 #: ../libpurple/protocols/sametime/sametime.c:3465
 #, fuzzy
@@ -10485,27 +10133,23 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:3466
 #, c-format
-msgid ""
-"Select a conference from the list below to send an invite to user %s. Select "
-"\"Create New Conference\" if you'd like to create a new conference to invite "
-"this user to."
-msgstr ""
+msgid "Select a conference from the list below to send an invite to user %s. Select \"Create New Conference\" if you'd like to create a new conference to invite this user to."
+msgstr "Velg en konferanse fra listen under for å sende en invitasjon til bruker %s. Velg \"Start Ny Konferanse\" om du vil starte en ny konferanse og invitere denne brukeren til."
 
 #: ../libpurple/protocols/sametime/sametime.c:3471
-#, fuzzy
 msgid "Invite to Conference"
-msgstr "Start konferanse"
+msgstr "Innviter til Konferanse"
 
 #: ../libpurple/protocols/sametime/sametime.c:3562
-#, fuzzy
 msgid "Invite to Conference..."
-msgstr "Start konferanse"
+msgstr "Innviter til Konferanse..."
 
 #: ../libpurple/protocols/sametime/sametime.c:3567
 msgid "Send TEST Announcement"
-msgstr ""
-
-#: ../libpurple/protocols/sametime/sametime.c:3586 ../pidgin/gtkconv.c:4354
+msgstr "Send TEST Kunngjøring"
+
+#: ../libpurple/protocols/sametime/sametime.c:3586
+#: ../pidgin/gtkconv.c:4417
 msgid "Topic:"
 msgstr "Tema:"
 
@@ -10516,10 +10160,10 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:3636
 #, c-format
-msgid ""
-"No host or IP address has been configured for the Meanwhile account %s. "
-"Please enter one below to continue logging in."
-msgstr ""
+msgid "No host or IP address has been configured for the Meanwhile account %s. Please enter one below to continue logging in."
+msgstr ""
+"Ingen vert eller IP adresse har blitt konfigurert for Meanwhile kontoen %s. "
+"Vennligst skriv inn en under for å fortsette innloggingen."
 
 #: ../libpurple/protocols/sametime/sametime.c:3641
 #, fuzzy
@@ -10531,14 +10175,15 @@
 msgid "No Sametime Community Server Specified"
 msgstr "Kobler til SILC-tjener"
 
-#: ../libpurple/protocols/sametime/sametime.c:3644 ../pidgin/gtkblist.c:4041
+#: ../libpurple/protocols/sametime/sametime.c:3644
+#: ../pidgin/gtkblist.c:4323
 msgid "Connect"
 msgstr "Koble til"
 
 #: ../libpurple/protocols/sametime/sametime.c:4135
 #, c-format
 msgid "Unknown (0x%04x)<br>"
-msgstr ""
+msgstr "Ukjent (0x%04x)<br>"
 
 #: ../libpurple/protocols/sametime/sametime.c:4137
 #, fuzzy
@@ -10547,27 +10192,22 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:4301
 #: ../libpurple/protocols/sametime/sametime.c:5506
-#, fuzzy
 msgid "User Name"
 msgstr "Brukernavn"
 
 #: ../libpurple/protocols/sametime/sametime.c:4304
 #: ../libpurple/protocols/sametime/sametime.c:5509
 msgid "Sametime ID"
-msgstr ""
+msgstr "Sametime ID"
 
 #: ../libpurple/protocols/sametime/sametime.c:4328
 msgid "An ambiguous user ID was entered"
-msgstr ""
+msgstr "En ugyldig bruker ID ble skrevet"
 
 #: ../libpurple/protocols/sametime/sametime.c:4329
-#, fuzzy, c-format
-msgid ""
-"The identifier '%s' may possibly refer to any of the following users. Please "
-"select the correct user from the list below to add them to your buddy list."
-msgstr ""
-"Men enn en bruker ble funnet med det samme navnet. Velg den korrekte "
-"brukeren fra lista for å legge til kontaktlista."
+#, c-format
+msgid "The identifier '%s' may possibly refer to any of the following users. Please select the correct user from the list below to add them to your buddy list."
+msgstr "Men enn en bruker ble funnet med det samme navnet %s. Velg den korrekte brukeren fra lista for å legge til kontaktlista."
 
 #: ../libpurple/protocols/sametime/sametime.c:4334
 #, fuzzy
@@ -10581,15 +10221,8 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:4420
 #, c-format
-msgid ""
-"The identifier '%s' did not match any users in your Sametime community. This "
-"entry has been removed from your buddy list."
-msgstr ""
-
-#: ../libpurple/protocols/sametime/sametime.c:4425
-#, fuzzy
-msgid "Unable to add user"
-msgstr "Klarte ikke forby brukeren %s"
+msgid "The identifier '%s' did not match any users in your Sametime community. This entry has been removed from your buddy list."
+msgstr "Brukeren %s matchet ikke noen av brukerne i ditt Sametime nettverk. Denne oppføringen har blitt fjernet fra kontaktlisten din."
 
 #: ../libpurple/protocols/sametime/sametime.c:5011
 #, fuzzy, c-format
@@ -10606,14 +10239,12 @@
 msgstr "Sende kontaktliste"
 
 #: ../libpurple/protocols/sametime/sametime.c:5151
-#, fuzzy
 msgid "Buddy List Storage Mode"
-msgstr "Kontaktlistesortering"
+msgstr "Lagrings metode for Kontaktliste"
 
 #: ../libpurple/protocols/sametime/sametime.c:5154
-#, fuzzy
 msgid "Local Buddy List Only"
-msgstr "Dockable kontaktliste"
+msgstr "Kun Lokal Kontaktliste"
 
 #: ../libpurple/protocols/sametime/sametime.c:5156
 #, fuzzy
@@ -10627,27 +10258,26 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:5160
 msgid "Synchronize List with Server"
-msgstr ""
+msgstr "Synkroniser Liste med Server"
 
 #: ../libpurple/protocols/sametime/sametime.c:5215
 #, c-format
 msgid "Import Sametime List for Account %s"
-msgstr ""
+msgstr "Importer Samtime Liste for Konto %s"
 
 #: ../libpurple/protocols/sametime/sametime.c:5255
 #, c-format
 msgid "Export Sametime List for Account %s"
-msgstr ""
+msgstr "Eksporter Samtime Liste for Konto %s"
 
 #: ../libpurple/protocols/sametime/sametime.c:5309
-#, fuzzy
 msgid "Unable to add group: group exists"
-msgstr "Kunne ikke legge til %s til nektingsliste (%s)."
+msgstr "Kunne ikke legge til gruppe: gruppen eksisterer"
 
 #: ../libpurple/protocols/sametime/sametime.c:5310
 #, c-format
 msgid "A group named '%s' already exists in your buddy list."
-msgstr ""
+msgstr "En gruppe ved navn '%s' eksisterer allerede i kontaktlisten din."
 
 #: ../libpurple/protocols/sametime/sametime.c:5313
 #: ../libpurple/protocols/sametime/sametime.c:5443
@@ -10657,19 +10287,16 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:5372
 msgid "Possible Matches"
-msgstr ""
+msgstr "Mulige Matcher"
 
 #: ../libpurple/protocols/sametime/sametime.c:5388
 msgid "Notes Address Book group results"
-msgstr ""
+msgstr "Noterer Adressebok resultater for gruppe"
 
 #: ../libpurple/protocols/sametime/sametime.c:5389
 #, c-format
-msgid ""
-"The identifier '%s' may possibly refer to any of the following Notes Address "
-"Book groups. Please select the correct group from the list below to add it "
-"to your buddy list."
-msgstr ""
+msgid "The identifier '%s' may possibly refer to any of the following Notes Address Book groups. Please select the correct group from the list below to add it to your buddy list."
+msgstr "'%s' kan referere til hvilken som helst av Notat Adressebok gruppene. Vennligst velg den rette gruppen fra listen under for å legge den til i kontaktlisten din."
 
 #: ../libpurple/protocols/sametime/sametime.c:5394
 #, fuzzy
@@ -10683,10 +10310,8 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:5439
 #, c-format
-msgid ""
-"The identifier '%s' did not match any Notes Address Book groups in your "
-"Sametime community."
-msgstr ""
+msgid "The identifier '%s' did not match any Notes Address Book groups in your Sametime community."
+msgstr "'%s' matchet inne noen Notat Adressebok gruppe i ditt Sametime nettverk."
 
 #: ../libpurple/protocols/sametime/sametime.c:5480
 #, fuzzy
@@ -10694,10 +10319,8 @@
 msgstr "Legg til i adresseboka"
 
 #: ../libpurple/protocols/sametime/sametime.c:5481
-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."
-msgstr ""
+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."
+msgstr "Skriv inn navnet på en Notat Adressebok gruppe i feltet nedenfor, for å legge til gruppen og dens medlemmer til kontaktlisten din."
 
 #: ../libpurple/protocols/sametime/sametime.c:5530
 #, fuzzy, c-format
@@ -10706,74 +10329,64 @@
 
 #: ../libpurple/protocols/sametime/sametime.c:5531
 #, c-format
-msgid ""
-"The identifier '%s' may possibly refer to any of the following users. You "
-"may add these users to your buddy list or send them messages with the action "
-"buttons below."
-msgstr ""
-
-#: ../libpurple/protocols/sametime/sametime.c:5538 ../pidgin/gtknotify.c:756
+msgid "The identifier '%s' may possibly refer to any of the following users. You may add these users to your buddy list or send them messages with the action buttons below."
+msgstr "'%s' kan referere til hvilken som helst av de følgende brukerne. Du kan legge til disse brukerne til kontaktlisten din eller sende dem beskjeder med handlings knappene under."
+
+#: ../libpurple/protocols/sametime/sametime.c:5538
+#: ../pidgin/gtknotify.c:755
 msgid "Search Results"
 msgstr "Søkeresultater"
 
 #: ../libpurple/protocols/sametime/sametime.c:5563
-#, fuzzy
 msgid "No matches"
 msgstr "Ingen treff"
 
 #: ../libpurple/protocols/sametime/sametime.c:5564
 #, c-format
 msgid "The identifier '%s' did not match any users in your Sametime community."
-msgstr ""
+msgstr "'%s' matchet ikke noen av brukerne i ditt Sametime nettverk."
 
 #: ../libpurple/protocols/sametime/sametime.c:5568
-#, fuzzy
 msgid "No Matches"
 msgstr "Ingen treff"
 
 #
 #: ../libpurple/protocols/sametime/sametime.c:5605
-#, fuzzy
 msgid "Search for a user"
-msgstr "_Søk etter:"
+msgstr "Søk etter en bruker"
 
 #: ../libpurple/protocols/sametime/sametime.c:5606
-msgid ""
-"Enter a name or partial ID in the field below to search for matching users "
-"in your Sametime community."
-msgstr ""
+msgid "Enter a name or partial ID in the field below to search for matching users in your Sametime community."
+msgstr "Skriv inn et navn eller delvis ID i feltet under for å søke etter matchende brukere i ditt Sametime nettverk."
 
 #: ../libpurple/protocols/sametime/sametime.c:5609
-#, fuzzy
 msgid "User Search"
-msgstr "Søk"
+msgstr "Bruker Søk"
 
 #: ../libpurple/protocols/sametime/sametime.c:5622
 msgid "Import Sametime List..."
-msgstr ""
+msgstr "Importer Sametime Liste..."
 
 #: ../libpurple/protocols/sametime/sametime.c:5626
 msgid "Export Sametime List..."
-msgstr ""
+msgstr "Eksporter Sametime Liste..."
 
 #: ../libpurple/protocols/sametime/sametime.c:5630
-#, fuzzy
 msgid "Add Notes Address Book Group..."
-msgstr "Legg til i adresseboka"
+msgstr "Legg til i adresseboka..."
 
 #: ../libpurple/protocols/sametime/sametime.c:5634
-#, fuzzy
 msgid "User Search..."
-msgstr "Søk"
+msgstr "Bruker Søk..."
 
 #: ../libpurple/protocols/sametime/sametime.c:5740
 msgid "Force login (ignore server redirects)"
-msgstr ""
+msgstr "Tving innlogging (ignorer server redirects)"
 
 #. pretend to be Sametime Connect
 #: ../libpurple/protocols/sametime/sametime.c:5750
 msgid "Hide client identity"
-msgstr ""
+msgstr "Skjul klient identitet"
 
 #: ../libpurple/protocols/silc/buddy.c:52
 #: ../libpurple/protocols/silc/buddy.c:410
@@ -10787,7 +10400,7 @@
 #: ../libpurple/protocols/silc10/ft.c:338
 #, c-format
 msgid "User %s is not present in the network"
-msgstr "Brukeren %s er ikke tilgjengelig i nettverket."
+msgstr "Brukeren %s er ikke tilgjengelig i nettverket"
 
 #: ../libpurple/protocols/silc/buddy.c:53
 #: ../libpurple/protocols/silc/buddy.c:110
@@ -10856,11 +10469,8 @@
 #: ../libpurple/protocols/silc/buddy.c:298
 #: ../libpurple/protocols/silc10/buddy.c:295
 #, c-format
-msgid ""
-"Key agreement request received from %s. Would you like to perform the key "
-"agreement?"
-msgstr ""
-"Nøkkelavtaleforespørsel motatt fra %s. Ønsker du å gjennomføre nøkkelavtalen?"
+msgid "Key agreement request received from %s. Would you like to perform the key agreement?"
+msgstr "Nøkkelavtaleforespørsel motatt fra %s. Ønsker du å gjennomføre nøkkelavtalen?"
 
 #: ../libpurple/protocols/silc/buddy.c:302
 #: ../libpurple/protocols/silc10/buddy.c:299
@@ -10967,13 +10577,8 @@
 
 #: ../libpurple/protocols/silc/buddy.c:726
 #: ../libpurple/protocols/silc10/buddy.c:738
-msgid ""
-"You cannot receive buddy notifications until you import his/her public key.  "
-"You can use the Get Public Key command to get the public key."
-msgstr ""
-"Du kan ikke motta kontaktvarslinger før du importerer hans/hennes offentlige "
-"nøkkel. Du kan bruke Hent offentlig nøkkel-kommandoen for å få den "
-"offentlige nøkkelen."
+msgid "You cannot receive buddy notifications until you import his/her public key.  You can use the Get Public Key command to get the public key."
+msgstr "Du kan ikke motta kontaktvarslinger før du importerer hans/hennes offentlige nøkkel. Du kan bruke Hent offentlig nøkkel-kommandoen for å få den offentlige nøkkelen."
 
 #. Open file selector to select the public key.
 #: ../libpurple/protocols/silc/buddy.c:1059
@@ -10989,18 +10594,13 @@
 
 #: ../libpurple/protocols/silc/buddy.c:1073
 #: ../libpurple/protocols/silc10/buddy.c:1081
-msgid ""
-"To add the buddy you must import his/her public key. Press Import to import "
-"a public key."
-msgstr ""
-"For å legge til kontakten må du importere hans/hennes offentlige nøkkel. "
-"Trykk Import for å importere en offentlig nøkkel."
+msgid "To add the buddy you must import his/her public key. Press Import to import a public key."
+msgstr "For å legge til kontakten må du importere hans/hennes offentlige nøkkel. Trykk Import for å importere en offentlig nøkkel."
 
 #: ../libpurple/protocols/silc/buddy.c:1077
 #: ../libpurple/protocols/silc10/buddy.c:1085
-#, fuzzy
 msgid "_Import..."
-msgstr "Importer..."
+msgstr "_Importer..."
 
 #: ../libpurple/protocols/silc/buddy.c:1183
 #: ../libpurple/protocols/silc10/buddy.c:1181
@@ -11009,21 +10609,13 @@
 
 #: ../libpurple/protocols/silc/buddy.c:1185
 #: ../libpurple/protocols/silc10/buddy.c:1183
-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."
-msgstr ""
-"Mer enn en bruker ble funnet med den samme offentlige nøkkelen. Velg den "
-"korrekte brukeren fra lista for å legge til kontaktlista."
+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."
+msgstr "Mer enn en bruker ble funnet med den samme offentlige nøkkelen. Velg den korrekte brukeren fra lista for å legge til kontaktlista."
 
 #: ../libpurple/protocols/silc/buddy.c:1187
 #: ../libpurple/protocols/silc10/buddy.c:1185
-msgid ""
-"More than one user was found with the same name. Select the correct user "
-"from the list to add to the buddy list."
-msgstr ""
-"Men enn en bruker ble funnet med det samme navnet. Velg den korrekte "
-"brukeren fra lista for å legge til kontaktlista."
+msgid "More than one user was found with the same name. Select the correct user from the list to add to the buddy list."
+msgstr "Men enn en bruker ble funnet med det samme navnet. Velg den korrekte brukeren fra lista for å legge til kontaktlista."
 
 #: ../libpurple/protocols/silc/buddy.c:1474
 #: ../libpurple/protocols/silc10/buddy.c:1474
@@ -11221,7 +10813,7 @@
 #: ../libpurple/protocols/silc/buddy.c:1661
 #: ../libpurple/protocols/silc10/buddy.c:1660
 msgid "Get Public Key..."
-msgstr "Hent offentlig nøkkel"
+msgstr "Hent offentlig nøkkel..."
 
 # Litt voldelig?
 #: ../libpurple/protocols/silc/buddy.c:1668
@@ -11237,7 +10829,7 @@
 #: ../libpurple/protocols/silc10/buddy.c:1677
 #: ../libpurple/protocols/silc10/chat.c:977
 msgid "Draw On Whiteboard"
-msgstr ""
+msgstr "Tegn på Tavle"
 
 #: ../libpurple/protocols/silc/chat.c:39
 #: ../libpurple/protocols/silc10/chat.c:39
@@ -11303,7 +10895,7 @@
 # Urk... moduser?
 #: ../libpurple/protocols/silc/chat.c:153
 #: ../libpurple/protocols/silc10/chat.c:152
-#, fuzzy, c-format
+#, fuzzy
 msgid "<br><b>Channel Modes:</b> "
 msgstr "<br><b>Kanalmoduser:</b> "
 
@@ -11345,19 +10937,8 @@
 
 #: ../libpurple/protocols/silc/chat.c:435
 #: ../libpurple/protocols/silc10/chat.c:413
-#, c-format
-msgid ""
-"Channel authentication is used to secure the channel from unauthorized "
-"access. The authentication may be based on passphrase and digital "
-"signatures. If passphrase is set, it is required to be able to join. If "
-"channel public keys are set then only users whose public keys are listed are "
-"able to join."
-msgstr ""
-"Kanalgodkjenning er brukt for å sikre kanalen fra uautorisert tilgang. "
-"Autentifikasjonen kan være basert på en nøkkelsetning og digitale "
-"signaturer. Dersom nøkkelsetning er valgt, er dette krevd for å bli med. "
-"Dersom digitale signaturer er valgt, så kan kun brukere hvis offentlige "
-"nøkkler er listet bli med."
+msgid "Channel authentication is used to secure the channel from unauthorized access. The authentication may be based on passphrase and digital signatures. If passphrase is set, it is required to be able to join. If channel public keys are set then only users whose public keys are listed are able to join."
+msgstr "Kanalgodkjenning er brukt for å sikre kanalen fra uautorisert tilgang. Autentifikasjonen kan være basert på en nøkkelsetning og digitale signaturer. Dersom nøkkelsetning er valgt, er dette krevd for å bli med. Dersom digitale signaturer er valgt, så kan kun brukere hvis offentlige nøkkler er listet bli med."
 
 #: ../libpurple/protocols/silc/chat.c:444
 #: ../libpurple/protocols/silc/chat.c:445
@@ -11413,8 +10994,7 @@
 #: ../libpurple/protocols/silc/chat.c:743
 #: ../libpurple/protocols/silc10/chat.c:727
 msgid "Set user limit on channel. Set to zero to reset user limit."
-msgstr ""
-"Velg brukergrense til kanalen. Velg null for å nullstille brukergrense."
+msgstr "Velg brukergrense til kanalen. Velg null for å nullstille brukergrense."
 
 #: ../libpurple/protocols/silc/chat.c:907
 #: ../libpurple/protocols/silc10/chat.c:891
@@ -11479,8 +11059,7 @@
 #: ../libpurple/protocols/silc/chat.c:1045
 #: ../libpurple/protocols/silc10/chat.c:1102
 #, c-format
-msgid ""
-"You have to join the %s channel before you are able to join the private group"
+msgid "You have to join the %s channel before you are able to join the private group"
 msgstr "Du må bli med i %s-kanalen før du kan bli med i den private gruppa"
 
 #: ../libpurple/protocols/silc/chat.c:1047
@@ -11514,15 +11093,22 @@
 #: ../libpurple/protocols/silc10/chat.c:1300
 #: ../libpurple/protocols/silc10/silc.c:1138
 msgid "Unknown command"
-msgstr "Ukjent kommando:"
-
-#: ../libpurple/protocols/silc/ft.c:85 ../libpurple/protocols/silc/ft.c:101
-#: ../libpurple/protocols/silc/ft.c:104 ../libpurple/protocols/silc/ft.c:108
-#: ../libpurple/protocols/silc/ft.c:112 ../libpurple/protocols/silc/ft.c:116
-#: ../libpurple/protocols/silc/ft.c:120 ../libpurple/protocols/silc/ft.c:272
-#: ../libpurple/protocols/silc/ft.c:277 ../libpurple/protocols/silc/ft.c:282
-#: ../libpurple/protocols/silc/ft.c:288 ../libpurple/protocols/silc/ft.c:425
-#: ../libpurple/protocols/silc10/ft.c:89 ../libpurple/protocols/silc10/ft.c:92
+msgstr "Ukjent kommando"
+
+#: ../libpurple/protocols/silc/ft.c:85
+#: ../libpurple/protocols/silc/ft.c:101
+#: ../libpurple/protocols/silc/ft.c:104
+#: ../libpurple/protocols/silc/ft.c:108
+#: ../libpurple/protocols/silc/ft.c:112
+#: ../libpurple/protocols/silc/ft.c:116
+#: ../libpurple/protocols/silc/ft.c:120
+#: ../libpurple/protocols/silc/ft.c:272
+#: ../libpurple/protocols/silc/ft.c:277
+#: ../libpurple/protocols/silc/ft.c:282
+#: ../libpurple/protocols/silc/ft.c:288
+#: ../libpurple/protocols/silc/ft.c:425
+#: ../libpurple/protocols/silc10/ft.c:89
+#: ../libpurple/protocols/silc10/ft.c:92
 #: ../libpurple/protocols/silc10/ft.c:96
 #: ../libpurple/protocols/silc10/ft.c:100
 #: ../libpurple/protocols/silc10/ft.c:104
@@ -11534,26 +11120,32 @@
 msgid "Secure File Transfer"
 msgstr "Sikret filoverføring"
 
-#: ../libpurple/protocols/silc/ft.c:86 ../libpurple/protocols/silc/ft.c:102
-#: ../libpurple/protocols/silc/ft.c:105 ../libpurple/protocols/silc/ft.c:109
-#: ../libpurple/protocols/silc/ft.c:113 ../libpurple/protocols/silc/ft.c:117
-#: ../libpurple/protocols/silc/ft.c:121 ../libpurple/protocols/silc10/ft.c:90
-#: ../libpurple/protocols/silc10/ft.c:93 ../libpurple/protocols/silc10/ft.c:97
+#: ../libpurple/protocols/silc/ft.c:86
+#: ../libpurple/protocols/silc/ft.c:102
+#: ../libpurple/protocols/silc/ft.c:105
+#: ../libpurple/protocols/silc/ft.c:109
+#: ../libpurple/protocols/silc/ft.c:113
+#: ../libpurple/protocols/silc/ft.c:117
+#: ../libpurple/protocols/silc/ft.c:121
+#: ../libpurple/protocols/silc10/ft.c:90
+#: ../libpurple/protocols/silc10/ft.c:93
+#: ../libpurple/protocols/silc10/ft.c:97
 #: ../libpurple/protocols/silc10/ft.c:101
 #: ../libpurple/protocols/silc10/ft.c:105
 msgid "Error during file transfer"
 msgstr "Feil under filoverføring"
 
 #: ../libpurple/protocols/silc/ft.c:87
-#, fuzzy
 msgid "Remote disconnected"
-msgstr "Frakoblet."
-
-#: ../libpurple/protocols/silc/ft.c:106 ../libpurple/protocols/silc10/ft.c:94
+msgstr "Frakoblet"
+
+#: ../libpurple/protocols/silc/ft.c:106
+#: ../libpurple/protocols/silc10/ft.c:94
 msgid "Permission denied"
 msgstr "Tilgang nektet"
 
-#: ../libpurple/protocols/silc/ft.c:110 ../libpurple/protocols/silc10/ft.c:98
+#: ../libpurple/protocols/silc/ft.c:110
+#: ../libpurple/protocols/silc10/ft.c:98
 msgid "Key agreement failed"
 msgstr "Nøkkelavtale feilet"
 
@@ -11567,36 +11159,44 @@
 msgid "Creating connection failed"
 msgstr "Tilkopling feilet"
 
-#: ../libpurple/protocols/silc/ft.c:122 ../libpurple/protocols/silc10/ft.c:102
+#: ../libpurple/protocols/silc/ft.c:122
+#: ../libpurple/protocols/silc10/ft.c:102
 #, fuzzy
 msgid "File transfer session does not exist"
 msgstr "Filoverføringsøkt eksisterer ikke"
 
-#: ../libpurple/protocols/silc/ft.c:273 ../libpurple/protocols/silc10/ft.c:206
+#: ../libpurple/protocols/silc/ft.c:273
+#: ../libpurple/protocols/silc10/ft.c:206
 msgid "No file transfer session active"
 msgstr "Ingen filoverføringsøkt aktiv"
 
-#: ../libpurple/protocols/silc/ft.c:278 ../libpurple/protocols/silc10/ft.c:211
+#: ../libpurple/protocols/silc/ft.c:278
+#: ../libpurple/protocols/silc10/ft.c:211
 msgid "File transfer already started"
 msgstr "Filoverføring allerede avbrutt"
 
-#: ../libpurple/protocols/silc/ft.c:283 ../libpurple/protocols/silc10/ft.c:216
+#: ../libpurple/protocols/silc/ft.c:283
+#: ../libpurple/protocols/silc10/ft.c:216
 msgid "Could not perform key agreement for file transfer"
 msgstr "Kunne ikke gjennomføre nøkkelavtale for filoverføring"
 
-#: ../libpurple/protocols/silc/ft.c:289 ../libpurple/protocols/silc10/ft.c:222
+#: ../libpurple/protocols/silc/ft.c:289
+#: ../libpurple/protocols/silc10/ft.c:222
 msgid "Could not start the file transfer"
 msgstr "Kunne ikke starte filoverføring"
 
-#: ../libpurple/protocols/silc/ft.c:426 ../libpurple/protocols/silc10/ft.c:341
+#: ../libpurple/protocols/silc/ft.c:426
+#: ../libpurple/protocols/silc10/ft.c:341
 msgid "Cannot send file"
 msgstr "Kan ikke sende fil"
 
 #: ../libpurple/protocols/silc/ops.c:57
+#, fuzzy
 msgid "Error occurred"
-msgstr ""
-
-#: ../libpurple/protocols/silc/ops.c:533 ../libpurple/protocols/silc/ops.c:542
+msgstr "Feil"
+
+#: ../libpurple/protocols/silc/ops.c:533
+#: ../libpurple/protocols/silc/ops.c:542
 #: ../libpurple/protocols/silc/ops.c:551
 #: ../libpurple/protocols/silc10/ops.c:554
 #: ../libpurple/protocols/silc10/ops.c:563
@@ -11635,7 +11235,8 @@
 msgid "You have been kicked off <I>%s</I> by <I>%s</I> (%s)"
 msgstr "Du har blitt sparket av <I>%s</I> av <I>%s</I> (%s)"
 
-#: ../libpurple/protocols/silc/ops.c:718 ../libpurple/protocols/silc/ops.c:723
+#: ../libpurple/protocols/silc/ops.c:718
+#: ../libpurple/protocols/silc/ops.c:723
 #: ../libpurple/protocols/silc/ops.c:728
 #: ../libpurple/protocols/silc10/ops.c:742
 #: ../libpurple/protocols/silc10/ops.c:747
@@ -11644,7 +11245,8 @@
 msgid "You have been killed by %s (%s)"
 msgstr "Du har blitt drept av %s (%s)"
 
-#: ../libpurple/protocols/silc/ops.c:749 ../libpurple/protocols/silc/ops.c:754
+#: ../libpurple/protocols/silc/ops.c:749
+#: ../libpurple/protocols/silc/ops.c:754
 #: ../libpurple/protocols/silc/ops.c:759
 #: ../libpurple/protocols/silc10/ops.c:773
 #: ../libpurple/protocols/silc10/ops.c:778
@@ -11700,7 +11302,7 @@
 #: ../libpurple/protocols/silc10/chat.c:1039
 #, c-format
 msgid "You are channel founder on <I>%s</I>"
-msgstr "Du er kanalstifter på <l>%s<l>"
+msgstr "Du er kanalstifter på <I>%s</I>"
 
 #: ../libpurple/protocols/silc/ops.c:1131
 #: ../libpurple/protocols/silc10/chat.c:1043
@@ -11740,9 +11342,8 @@
 
 #: ../libpurple/protocols/silc/ops.c:1292
 #: ../libpurple/protocols/silc10/ops.c:1298
-#, fuzzy
 msgid "_More..."
-msgstr "Mer..."
+msgstr "_Mer..."
 
 #: ../libpurple/protocols/silc/ops.c:1369
 #: ../libpurple/protocols/silc/silc.c:1077
@@ -11870,7 +11471,7 @@
 
 #: ../libpurple/protocols/silc/ops.c:1648
 msgid "WATCH"
-msgstr ""
+msgstr "WATCH"
 
 #: ../libpurple/protocols/silc/ops.c:1648
 #, fuzzy
@@ -11901,21 +11502,20 @@
 msgid "Passphrase required"
 msgstr "Nøkkelsetning kreves"
 
-#: ../libpurple/protocols/silc/pk.c:98 ../libpurple/protocols/silc10/pk.c:104
-#, c-format
-msgid ""
-"Received %s's public key. Your local copy does not match this key. Would you "
-"still like to accept this public key?"
-msgstr ""
-"Mottok %s's offentlige nøkkel, men din lokale kopi stemmer ikke overens med "
-"denne nøkkelen. Ønsker du fremdeles å akseptere denne nøkkelen?"
-
-#: ../libpurple/protocols/silc/pk.c:103 ../libpurple/protocols/silc10/pk.c:109
+#: ../libpurple/protocols/silc/pk.c:98
+#: ../libpurple/protocols/silc10/pk.c:104
+#, c-format
+msgid "Received %s's public key. Your local copy does not match this key. Would you still like to accept this public key?"
+msgstr "Mottok %s's offentlige nøkkel, men din lokale kopi stemmer ikke overens med denne nøkkelen. Ønsker du fremdeles å akseptere denne nøkkelen?"
+
+#: ../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 "Mottok %s's offentlige nøkkel. Ønsker du å akseptere denne nøkkelen?"
 
-#: ../libpurple/protocols/silc/pk.c:107 ../libpurple/protocols/silc10/pk.c:113
+#: ../libpurple/protocols/silc/pk.c:107
+#: ../libpurple/protocols/silc10/pk.c:113
 #, c-format
 msgid ""
 "Fingerprint and babbleprint for the %s key are:\n"
@@ -11923,19 +11523,25 @@
 "%s\n"
 "%s\n"
 msgstr ""
-
-#: ../libpurple/protocols/silc/pk.c:110 ../libpurple/protocols/silc/pk.c:139
+"Fingeravtrykk og skravleavtrykk for %s nøkkelen er:\n"
+"\n"
+"%s\n"
+"%s\n"
+
+#: ../libpurple/protocols/silc/pk.c:110
+#: ../libpurple/protocols/silc/pk.c:139
 #: ../libpurple/protocols/silc10/pk.c:116
 #: ../libpurple/protocols/silc10/pk.c:142
 msgid "Verify Public Key"
 msgstr "Bekreft offentlig nøkkel"
 
-#: ../libpurple/protocols/silc/pk.c:115 ../libpurple/protocols/silc10/pk.c:121
-#, fuzzy
+#: ../libpurple/protocols/silc/pk.c:115
+#: ../libpurple/protocols/silc10/pk.c:121
 msgid "_View..."
-msgstr "Vis..."
-
-#: ../libpurple/protocols/silc/pk.c:140 ../libpurple/protocols/silc10/pk.c:143
+msgstr "_Vis..."
+
+#: ../libpurple/protocols/silc/pk.c:140
+#: ../libpurple/protocols/silc10/pk.c:143
 msgid "Unsupported public key type"
 msgstr "Ustøttet offentlig nøkkeltype"
 
@@ -11957,12 +11563,8 @@
 # Er det virkelig "kople til på nytt"?
 #: ../libpurple/protocols/silc/silc.c:238
 #: ../libpurple/protocols/silc10/ops.c:1714
-#, fuzzy
-msgid ""
-"Resuming detached session failed. Press Reconnect to create new connection."
-msgstr ""
-"Fortsettelse av løsnet økt misslyktes. Trykk Kople til på nytt for å lage en "
-"ny forbindelse"
+msgid "Resuming detached session failed. Press Reconnect to create new connection."
+msgstr "Fortsettelse av løsnet økt misslyktes. Trykk Kople til på nytt for å lage en ny forbindelse."
 
 #: ../libpurple/protocols/silc/silc.c:265
 #: ../libpurple/protocols/silc/silc.c:311
@@ -11982,15 +11584,14 @@
 msgstr "Kobler til SILC-tjener"
 
 #: ../libpurple/protocols/silc/silc.c:352
-#, fuzzy, c-format
+#, fuzzy
 msgid "Could not load SILC key pair"
 msgstr "Kunne ikke laste den offentlige nøkkelen"
 
 #: ../libpurple/protocols/silc/silc.c:366
 #: ../libpurple/protocols/silc10/silc.c:355
-#, fuzzy
 msgid "Unable to create connection"
-msgstr "Kunne ikke lage ny tilkobling."
+msgstr "Kunne ikke lage ny tilkobling"
 
 #: ../libpurple/protocols/silc/silc.c:395
 #: ../libpurple/protocols/silc10/silc.c:267
@@ -12004,9 +11605,8 @@
 msgstr "Kan ikke klargjøre SILC klientforbindelse"
 
 #: ../libpurple/protocols/silc/silc.c:445
-#, fuzzy
 msgid "Error loading SILC key pair"
-msgstr "Genererer SILC-nøkkelpar..."
+msgstr "Genererer SILC-nøkkelpar"
 
 #: ../libpurple/protocols/silc/silc.c:739
 #: ../libpurple/protocols/silc10/silc.c:650
@@ -12014,14 +11614,13 @@
 msgstr "Dit nåværende humør"
 
 #: ../libpurple/protocols/silc/silc.c:741
-#: ../libpurple/protocols/silc10/silc.c:652 ../pidgin/gtkprefs.c:1641
-#, c-format
+#: ../libpurple/protocols/silc10/silc.c:652
+#: ../pidgin/gtkprefs.c:1643
 msgid "Normal"
 msgstr "Normal"
 
 #: ../libpurple/protocols/silc/silc.c:755
 #: ../libpurple/protocols/silc10/silc.c:666
-#, fuzzy
 msgid "In love"
 msgstr "Forelsket"
 
@@ -12086,27 +11685,21 @@
 
 #
 #: ../libpurple/protocols/silc/silc.c:812
-#, fuzzy
 msgid "Timezone (UTC)"
-msgstr "Tidssone"
+msgstr "Tidssone (UTC)"
 
 #: ../libpurple/protocols/silc/silc.c:816
 #: ../libpurple/protocols/silc/silc.c:817
 #: ../libpurple/protocols/silc10/silc.c:729
 #: ../libpurple/protocols/silc10/silc.c:730
+#, fuzzy
 msgid "User Online Status Attributes"
-msgstr ""
+msgstr "Brukers påloggings kjennetegn"
 
 #: ../libpurple/protocols/silc/silc.c:818
 #: ../libpurple/protocols/silc10/silc.c:731
-msgid ""
-"You can let other users see your online status information and your personal "
-"information. Please fill the information you would like other users to see "
-"about yourself."
-msgstr ""
-"Du kan la andre brukere se din tilkoblingsstatusinformasjon og din "
-"personlige informasjon. Fyll inn informasjonen du ønsker at andre skal se om "
-"deg."
+msgid "You can let other users see your online status information and your personal information. Please fill the information you would like other users to see about yourself."
+msgstr "Du kan la andre brukere se din tilkoblingsstatusinformasjon og din personlige informasjon. Fyll inn informasjonen du ønsker at andre skal se om deg."
 
 #: ../libpurple/protocols/silc/silc.c:859
 #: ../libpurple/protocols/silc/silc.c:865
@@ -12128,9 +11721,8 @@
 #: ../libpurple/protocols/silc/silc.c:1481
 #: ../libpurple/protocols/silc10/silc.c:773
 #: ../libpurple/protocols/silc10/silc.c:1410
-#, fuzzy
 msgid "There is no Message of the Day associated with this connection"
-msgstr "Det er ingen dagens melding assosiert med denne tilkoblingen."
+msgstr "Det er ingen Dagens Melding assosiert med denne tilkoblingen"
 
 #: ../libpurple/protocols/silc/silc.c:911
 #: ../libpurple/protocols/silc/silc.c:957
@@ -12146,9 +11738,8 @@
 
 #: ../libpurple/protocols/silc/silc.c:911
 #: ../libpurple/protocols/silc10/silc.c:824
-#, fuzzy
 msgid "Passphrases do not match"
-msgstr "De nye passordene stemmer ikke overens."
+msgstr "De nye passordene stemmer ikke overens"
 
 #: ../libpurple/protocols/silc/silc.c:957
 #: ../libpurple/protocols/silc10/silc.c:868
@@ -12158,9 +11749,8 @@
 
 #: ../libpurple/protocols/silc/silc.c:996
 #: ../libpurple/protocols/silc10/silc.c:907
-#, fuzzy
 msgid "Key length"
-msgstr "Nøkkellengde: \t%d biter\n"
+msgstr "Nøkkellengde"
 
 #: ../libpurple/protocols/silc/silc.c:998
 #: ../libpurple/protocols/silc10/silc.c:909
@@ -12176,9 +11766,8 @@
 
 #: ../libpurple/protocols/silc/silc.c:1023
 #: ../libpurple/protocols/silc10/silc.c:934
-#, fuzzy
 msgid "Passphrase (retype)"
-msgstr "Passord sendt"
+msgstr "Passord (skriv inn på nytt)"
 
 #: ../libpurple/protocols/silc/silc.c:1030
 #: ../libpurple/protocols/silc10/silc.c:941
@@ -12207,7 +11796,7 @@
 #: ../libpurple/protocols/silc10/silc.c:1095
 #, c-format
 msgid "User <I>%s</I> is not present in the network"
-msgstr "Brukeren <l>%s<l> er ikke tilstedeværende på nettverket"
+msgstr "Brukeren <I>%s</I> er ikke tilstedeværende på nettverket"
 
 #: ../libpurple/protocols/silc/silc.c:1357
 #: ../libpurple/protocols/silc10/silc.c:1286
@@ -12245,9 +11834,9 @@
 
 #: ../libpurple/protocols/silc/silc.c:1590
 #: ../libpurple/protocols/silc10/silc.c:1519
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown command: %s, (may be a client bug)"
-msgstr "Ukjent kommando: %s, er kansje en lus i Gaim."
+msgstr "Ukjent kommando: %s, (kan være en klient bug)"
 
 #: ../libpurple/protocols/silc/silc.c:1653
 #: ../libpurple/protocols/silc10/silc.c:1582
@@ -12267,8 +11856,7 @@
 #: ../libpurple/protocols/silc/silc.c:1666
 #: ../libpurple/protocols/silc10/silc.c:1595
 msgid "join &lt;channel&gt; [&lt;password&gt;]:  Join a chat on this network"
-msgstr ""
-"join &lt;channel&gt; [&lt;password&gt;]:  Join en samtale på dette nettverket"
+msgstr "join &lt;channel&gt; [&lt;password&gt;]:  Join en samtale på dette nettverket"
 
 #: ../libpurple/protocols/silc/silc.c:1670
 #: ../libpurple/protocols/silc10/silc.c:1599
@@ -12284,14 +11872,12 @@
 #: ../libpurple/protocols/silc10/silc.c:1607
 #: ../libpurple/protocols/zephyr/zephyr.c:2685
 msgid "msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user"
-msgstr ""
-"msg &lt;nick&gt; &lt;message&gt;:  Send en privat beskjed til en bruker"
+msgstr "msg &lt;nick&gt; &lt;message&gt;:  Send en privat beskjed til en bruker"
 
 #: ../libpurple/protocols/silc/silc.c:1682
 #: ../libpurple/protocols/silc10/silc.c:1611
 msgid "query &lt;nick&gt; [&lt;message&gt;]:  Send a private message to a user"
-msgstr ""
-"query &lt;nick&gt; [&lt;message&gt;]:  Send en privat beskjed til en bruker"
+msgstr "query &lt;nick&gt; [&lt;message&gt;]:  Send en privat beskjed til en bruker"
 
 #: ../libpurple/protocols/silc/silc.c:1686
 #: ../libpurple/protocols/silc10/silc.c:1615
@@ -12330,21 +11916,13 @@
 
 #: ../libpurple/protocols/silc/silc.c:1716
 #: ../libpurple/protocols/silc10/silc.c:1645
-msgid ""
-"cmode &lt;channel&gt; [+|-&lt;modes&gt;] [arguments]:  Change or display "
-"channel modes"
-msgstr ""
-"cmode &lt;channel&gt; [+|-&lt;modes&gt;] [arguments]:  Forandre eller vis "
-"kanal modus"
+msgid "cmode &lt;channel&gt; [+|-&lt;modes&gt;] [arguments]:  Change or display channel modes"
+msgstr "cmode &lt;channel&gt; [+|-&lt;modes&gt;] [arguments]:  Forandre eller vis kanal modus"
 
 #: ../libpurple/protocols/silc/silc.c:1720
 #: ../libpurple/protocols/silc10/silc.c:1649
-msgid ""
-"cumode &lt;channel&gt; +|-&lt;modes&gt; &lt;nick&gt;:  Change nick's modes "
-"on channel"
-msgstr ""
-"cumode &lt;channel&gt; +|-&lt;modes&gt; &lt;nick&gt;:  Forandre nick modus "
-"på kanal"
+msgid "cumode &lt;channel&gt; +|-&lt;modes&gt; &lt;nick&gt;:  Change nick's modes on channel"
+msgstr "cumode &lt;channel&gt; +|-&lt;modes&gt; &lt;nick&gt;:  Forandre nick modus på kanal"
 
 #: ../libpurple/protocols/silc/silc.c:1724
 #: ../libpurple/protocols/silc10/silc.c:1653
@@ -12358,12 +11936,8 @@
 
 #: ../libpurple/protocols/silc/silc.c:1732
 #: ../libpurple/protocols/silc10/silc.c:1661
-msgid ""
-"invite &lt;channel&gt; [-|+]&lt;nick&gt;:  invite nick or add/remove from "
-"channel invite list"
-msgstr ""
-"invite &lt;channel&gt; [-|+]&lt;nick&gt;:  inviter nick eller legg til/fjern "
-"fra kanalens invitasjonsliste"
+msgid "invite &lt;channel&gt; [-|+]&lt;nick&gt;:  invite nick or add/remove from channel invite list"
+msgstr "invite &lt;channel&gt; [-|+]&lt;nick&gt;:  inviter nick eller legg til/fjern fra kanalens invitasjonsliste"
 
 #: ../libpurple/protocols/silc/silc.c:1736
 #: ../libpurple/protocols/silc10/silc.c:1665
@@ -12383,8 +11957,7 @@
 #: ../libpurple/protocols/silc/silc.c:1748
 #: ../libpurple/protocols/silc10/silc.c:1677
 msgid "getkey &lt;nick|server&gt;:  Retrieve client's or server's public key"
-msgstr ""
-"getkey &lt;nick|server&gt;:  Få klientens eller serverens offentlige nøkkel"
+msgstr "getkey &lt;nick|server&gt;:  Få klientens eller serverens offentlige nøkkel"
 
 #: ../libpurple/protocols/silc/silc.c:1752
 #: ../libpurple/protocols/silc10/silc.c:1681
@@ -12403,12 +11976,8 @@
 
 #: ../libpurple/protocols/silc/silc.c:1765
 #: ../libpurple/protocols/silc10/silc.c:1694
-msgid ""
-"names [-count|-ops|-halfops|-voices|-normal] &lt;channel(s)&gt;:  List "
-"specific users in channel(s)"
-msgstr ""
-"names [-count|-ops|-halfops|-voices|-normal] &lt;channel(s)&gt;:  Vis "
-"spesifiserte brukere i kanalen/kanlaene"
+msgid "names [-count|-ops|-halfops|-voices|-normal] &lt;channel(s)&gt;:  List specific users in channel(s)"
+msgstr "names [-count|-ops|-halfops|-voices|-normal] &lt;channel(s)&gt;:  Vis spesifiserte brukere i kanalen/kanlaene"
 
 #. *< type
 #. *< ui_requirement
@@ -12431,7 +12000,8 @@
 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/silc10/silc.c:1853
+#: ../pidgin/gtkprefs.c:2038
 msgid "Network"
 msgstr "Nettverk"
 
@@ -12450,16 +12020,16 @@
 #: ../libpurple/protocols/silc/silc.c:1935
 #: ../libpurple/protocols/silc10/silc.c:1878
 msgid "Cipher"
-msgstr ""
+msgstr "Siffrer"
 
 #: ../libpurple/protocols/silc/silc.c:1945
 #: ../libpurple/protocols/silc10/silc.c:1888
 msgid "HMAC"
-msgstr ""
+msgstr "HMAC"
 
 #: ../libpurple/protocols/silc/silc.c:1948
 msgid "Use Perfect Forward Secrecy"
-msgstr ""
+msgstr "Bruker Perfekt Hemmeligholdelse Fremover"
 
 #: ../libpurple/protocols/silc/silc.c:1952
 #: ../libpurple/protocols/silc10/silc.c:1891
@@ -12475,13 +12045,12 @@
 #: ../libpurple/protocols/silc/silc.c:1958
 #: ../libpurple/protocols/silc10/silc.c:1897
 msgid "Block messages to whiteboard"
-msgstr ""
+msgstr "Blokker beskjeder til tavle"
 
 #: ../libpurple/protocols/silc/silc.c:1961
 #: ../libpurple/protocols/silc10/silc.c:1900
-#, fuzzy
 msgid "Automatically open whiteboard"
-msgstr "_Automatisk ekspander kontakter"
+msgstr "Åpne tavle automatisk"
 
 #: ../libpurple/protocols/silc/silc.c:1964
 #: ../libpurple/protocols/silc10/silc.c:1903
@@ -12498,9 +12067,8 @@
 
 #: ../libpurple/protocols/silc/util.c:215
 #: ../libpurple/protocols/silc/util.c:257
-#, fuzzy
 msgid "Cannot create SILC key pair\n"
-msgstr "Genererer SILC-nøkkelpar..."
+msgstr "Genererer SILC-nøkkelpar\n"
 
 #. Hint for translators: Please check the tabulator width here and in
 #. the next strings (short strings: 2 tabs, longer strings 1 tab,
@@ -12519,7 +12087,7 @@
 
 #: ../libpurple/protocols/silc/util.c:362
 #: ../libpurple/protocols/silc10/util.c:359
-#, fuzzy, c-format
+#, c-format
 msgid "E-Mail: \t\t%s\n"
 msgstr "E-post: \t\t%s\n"
 
@@ -12554,9 +12122,9 @@
 msgstr "Nøkkellengde: \t%d biter\n"
 
 #: ../libpurple/protocols/silc/util.c:372
-#, fuzzy, c-format
+#, c-format
 msgid "Version: \t%s\n"
-msgstr "Organisasjon: \t%s\n"
+msgstr "Versjon: \t%s\n"
 
 #: ../libpurple/protocols/silc/util.c:374
 #: ../libpurple/protocols/silc10/util.c:369
@@ -12577,6 +12145,8 @@
 "Public Key Babbleprint:\n"
 "%s"
 msgstr ""
+"Offentlig Nøkkel Skravleavtrykk:\n"
+"%s"
 
 #: ../libpurple/protocols/silc/util.c:379
 #: ../libpurple/protocols/silc/util.c:380
@@ -12603,81 +12173,75 @@
 #: ../libpurple/protocols/silc/util.c:587
 #: ../libpurple/protocols/silc10/util.c:583
 msgid "PDA"
-msgstr "Personlig digital assistent"
+msgstr "PDA"
 
 #: ../libpurple/protocols/silc/util.c:589
 #: ../libpurple/protocols/silc10/util.c:585
 msgid "Terminal"
 msgstr "Terminal"
 
-#: ../libpurple/protocols/silc/wb.c:284 ../libpurple/protocols/silc10/wb.c:284
+#: ../libpurple/protocols/silc/wb.c:284
+#: ../libpurple/protocols/silc10/wb.c:284
 #, c-format
 msgid "%s sent message to whiteboard. Would you like to open the whiteboard?"
-msgstr ""
-
-#: ../libpurple/protocols/silc/wb.c:288 ../libpurple/protocols/silc10/wb.c:288
-#, c-format
-msgid ""
-"%s sent message to whiteboard on %s channel. Would you like to open the "
-"whiteboard?"
-msgstr ""
-
-#: ../libpurple/protocols/silc/wb.c:302 ../libpurple/protocols/silc10/wb.c:302
+msgstr "%s sendte beskjed til tavle. Vil du åpne tavlen?"
+
+#: ../libpurple/protocols/silc/wb.c:288
+#: ../libpurple/protocols/silc10/wb.c:288
+#, c-format
+msgid "%s sent message to whiteboard on %s channel. Would you like to open the whiteboard?"
+msgstr "%s sendte en beskjed til tavle på kanal %s. Vil du åpne tavlen?"
+
+#: ../libpurple/protocols/silc/wb.c:302
+#: ../libpurple/protocols/silc10/wb.c:302
 msgid "Whiteboard"
-msgstr ""
+msgstr "Tavle"
 
 #: ../libpurple/protocols/silc10/ops.c:1559
 msgid "No server statistics available"
 msgstr "Ingen tjenerstatistikk tilgjengelig"
 
 #: ../libpurple/protocols/silc10/ops.c:1931
-#, fuzzy, c-format
+#, fuzzy
 msgid "Failure: Version mismatch, upgrade your client"
 msgstr "Feil versjon, vennligst oppgrader din klient"
 
 #: ../libpurple/protocols/silc10/ops.c:1934
-#, c-format
 msgid "Failure: Remote does not trust/support your public key"
-msgstr ""
-"Fjernliggende part støtter eller stoler ikke på ikke din offentlige nøkkel"
+msgstr "Fjernliggende part støtter eller stoler ikke på ikke din offentlige nøkkel"
 
 #: ../libpurple/protocols/silc10/ops.c:1937
-#, fuzzy, c-format
+#, fuzzy
 msgid "Failure: Remote does not support proposed KE group"
 msgstr "Fjerntliggende part støtter ikke foreslått KE-gruppe"
 
 #: ../libpurple/protocols/silc10/ops.c:1940
-#, c-format
 msgid "Failure: Remote does not support proposed cipher"
 msgstr "Fjerntliggende part støtter ikke foreslått krypteringsmetode"
 
 #: ../libpurple/protocols/silc10/ops.c:1943
-#, fuzzy, c-format
+#, fuzzy
 msgid "Failure: Remote does not support proposed PKCS"
 msgstr "Fjerntliggende part støtter ikke foreslått PKCS"
 
 #: ../libpurple/protocols/silc10/ops.c:1946
-#, fuzzy, c-format
+#, fuzzy
 msgid "Failure: Remote does not support proposed hash function"
 msgstr "Fjerntliggende part støtter ikke foreslått nøkkelfunksjon"
 
 #: ../libpurple/protocols/silc10/ops.c:1949
-#, c-format
 msgid "Failure: Remote does not support proposed HMAC"
 msgstr "Fjerntliggende part støtter ikke foreslått HMAC"
 
 #: ../libpurple/protocols/silc10/ops.c:1951
-#, c-format
 msgid "Failure: Incorrect signature"
 msgstr "Ugyldig signatur"
 
 #: ../libpurple/protocols/silc10/ops.c:1953
-#, c-format
 msgid "Failure: Invalid cookie"
 msgstr "Ugyldig informasjonskapsel"
 
 #: ../libpurple/protocols/silc10/ops.c:1964
-#, c-format
 msgid "Failure: Authentication failed"
 msgstr "Autentisering feilet"
 
@@ -12686,14 +12250,12 @@
 msgstr "Kan ikke klargjøre SILC klientforbindelse"
 
 #: ../libpurple/protocols/silc10/silc.c:290
-#, fuzzy
 msgid "John Noname"
-msgstr "Etternavn:"
+msgstr "Ola Normann"
 
 #: ../libpurple/protocols/silc10/silc.c:320
-#, fuzzy
 msgid "Cannot find/access ~/.silc directory"
-msgstr "Kan ikke sende en katalog."
+msgstr "Kan ikke finne/åpne ~/.silc katalog"
 
 #: ../libpurple/protocols/silc10/silc.c:334
 #, fuzzy, c-format
@@ -12702,39 +12264,37 @@
 
 #. TODO: do we really want to disconnect on a failure to write?
 #: ../libpurple/protocols/simple/simple.c:416
-#, fuzzy
 msgid "Could not write"
-msgstr "Kunne ikke sende"
+msgstr "Kunne ikke skrive"
 
 #: ../libpurple/protocols/simple/simple.c:438
-#: ../libpurple/protocols/simple/simple.c:1529
+#: ../libpurple/protocols/simple/simple.c:1531
 msgid "Could not connect"
 msgstr "Kunne ikke koble til"
 
-#: ../libpurple/protocols/simple/simple.c:1059
+#: ../libpurple/protocols/simple/simple.c:1061
 #, fuzzy
 msgid "Unknown server response."
 msgstr "Ukjent feil."
 
-#: ../libpurple/protocols/simple/simple.c:1563
-#: ../libpurple/protocols/simple/simple.c:1605
-#: ../libpurple/protocols/simple/simple.c:1618
-#: ../libpurple/protocols/simple/simple.c:1669
+#: ../libpurple/protocols/simple/simple.c:1565
+#: ../libpurple/protocols/simple/simple.c:1607
+#: ../libpurple/protocols/simple/simple.c:1620
+#: ../libpurple/protocols/simple/simple.c:1671
 #, fuzzy
 msgid "Could not create listen socket"
 msgstr "Kunne ikke opprette socket"
 
-#: ../libpurple/protocols/simple/simple.c:1586
+#: ../libpurple/protocols/simple/simple.c:1588
 #, fuzzy
 msgid "Couldn't resolve host"
 msgstr "Kunne ikke koble til"
 
-#: ../libpurple/protocols/simple/simple.c:1677
-#, fuzzy
+#: ../libpurple/protocols/simple/simple.c:1679
 msgid "Could not resolve hostname"
-msgstr "Kan ikke finne datamaskinnavnet."
-
-#: ../libpurple/protocols/simple/simple.c:1694
+msgstr "Kan ikke finne datamaskinnavnet"
+
+#: ../libpurple/protocols/simple/simple.c:1696
 #, fuzzy
 msgid "SIP screen names may not contain whitespaces or @ symbols"
 msgstr "IRC-kallenavn kan ikke inneholde mellomrom"
@@ -12747,43 +12307,41 @@
 #. *< id
 #. *< name
 #. *< version
-#: ../libpurple/protocols/simple/simple.c:1870
-#, fuzzy
+#: ../libpurple/protocols/simple/simple.c:1872
 msgid "SIP/SIMPLE Protocol Plugin"
-msgstr "SILC-protokolltillegg"
+msgstr "SILC/SIMPLE-Protokolltillegg"
 
 #. *  summary
-#: ../libpurple/protocols/simple/simple.c:1871
-#, fuzzy
+#: ../libpurple/protocols/simple/simple.c:1873
 msgid "The SIP/SIMPLE Protocol Plugin"
-msgstr "SILC-protokolltillegg"
-
-#: ../libpurple/protocols/simple/simple.c:1899
+msgstr "SIP/SIMPLE-Protokolltillegget"
+
+#: ../libpurple/protocols/simple/simple.c:1901
 #, fuzzy
 msgid "Publish status (note: everyone may watch you)"
 msgstr "Publiser status (NB: alle kan se deg)"
 
-#: ../libpurple/protocols/simple/simple.c:1905
+#: ../libpurple/protocols/simple/simple.c:1907
 #, fuzzy
 msgid "Use UDP"
 msgstr "Brukerid"
 
-#: ../libpurple/protocols/simple/simple.c:1907
+#: ../libpurple/protocols/simple/simple.c:1909
 #, fuzzy
 msgid "Use proxy"
 msgstr "Ingen proxy"
 
-#: ../libpurple/protocols/simple/simple.c:1909
+#: ../libpurple/protocols/simple/simple.c:1911
 #, fuzzy
 msgid "Proxy"
 msgstr "Ingen proxy"
 
-#: ../libpurple/protocols/simple/simple.c:1911
+#: ../libpurple/protocols/simple/simple.c:1913
 #, fuzzy
 msgid "Auth User"
 msgstr "AP-bruker"
 
-#: ../libpurple/protocols/simple/simple.c:1913
+#: ../libpurple/protocols/simple/simple.c:1915
 #, fuzzy
 msgid "Auth Domain"
 msgstr "Automatisk"
@@ -12829,7 +12387,6 @@
 msgstr "Advarsel %s er ikke tillatt."
 
 #: ../libpurple/protocols/toc/toc.c:503
-#, c-format
 msgid "A message has been dropped, you are exceeding the server speed limit."
 msgstr "En beskjed ble forkastet. Du overskrider tjenerens fartsgrense."
 
@@ -12854,47 +12411,38 @@
 msgstr "Du gikk glipp av en beskjed fra %s fordi den ble sendt for raskt."
 
 #: ../libpurple/protocols/toc/toc.c:518
-#, c-format
 msgid "Failure."
 msgstr "Feil."
 
 #: ../libpurple/protocols/toc/toc.c:521
-#, c-format
 msgid "Too many matches."
 msgstr "For mange treff."
 
 #: ../libpurple/protocols/toc/toc.c:524
-#, c-format
 msgid "Need more qualifiers."
 msgstr "Trenger flere parametre."
 
 #: ../libpurple/protocols/toc/toc.c:527
-#, c-format
 msgid "Dir service temporarily unavailable."
 msgstr "Katalogtjenesten er midlertidig utilgjengelig."
 
 #: ../libpurple/protocols/toc/toc.c:530
-#, c-format
 msgid "E-mail lookup restricted."
 msgstr "E-postoppslag er begrenset."
 
 #: ../libpurple/protocols/toc/toc.c:533
-#, c-format
 msgid "Keyword ignored."
 msgstr "Nøkkelord ignorert."
 
 #: ../libpurple/protocols/toc/toc.c:536
-#, c-format
 msgid "No keywords."
 msgstr "Ingen nøkkelord."
 
 #: ../libpurple/protocols/toc/toc.c:539
-#, c-format
 msgid "User has no directory information."
 msgstr "Brukeren har ingen kataloginformasjon."
 
 #: ../libpurple/protocols/toc/toc.c:543
-#, c-format
 msgid "Country not supported."
 msgstr "Land ikke støttet."
 
@@ -12904,28 +12452,21 @@
 msgstr "Ukjent feil: %s."
 
 #: ../libpurple/protocols/toc/toc.c:549
-#, fuzzy, c-format
+#, fuzzy
 msgid "Incorrect screen name or password."
 msgstr "Feil kallenavn eller passord."
 
 #: ../libpurple/protocols/toc/toc.c:552
-#, c-format
 msgid "The service is temporarily unavailable."
 msgstr "Tjenesten er midlertidig utilgjengelig."
 
 #: ../libpurple/protocols/toc/toc.c:555
-#, c-format
 msgid "Your warning level is currently too high to log in."
 msgstr "Advarselsnivået ditt er satt for høyt for å logge inn."
 
 #: ../libpurple/protocols/toc/toc.c:558
-#, c-format
-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."
-msgstr ""
-"Du har koblet til og koblet fra for hurtig. Vent ti minutter og prøv igjen. "
-"Hvis du fortsetter å prøve nå, vil du måtte vente enda lenger."
+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."
+msgstr "Du har koblet til og koblet fra for hurtig. Vent ti minutter og prøv igjen. Hvis du fortsetter å prøve nå, vil du måtte vente enda lenger."
 
 #: ../libpurple/protocols/toc/toc.c:560
 #, c-format
@@ -12956,12 +12497,13 @@
 
 #: ../libpurple/protocols/toc/toc.c:995
 msgid "Password Change Successful"
-msgstr "Passordet er endret."
-
-#: ../libpurple/protocols/toc/toc.c:1366 ../pidgin/gtkblist.c:5582
-#: ../pidgin/gtkblist.c:5932
+msgstr "Passordet er endret"
+
+#: ../libpurple/protocols/toc/toc.c:1366
+#: ../pidgin/gtkblist.c:5871
+#: ../pidgin/gtkblist.c:6227
 msgid "_Group:"
-msgstr "Gruppe:"
+msgstr "_Gruppe:"
 
 #: ../libpurple/protocols/toc/toc.c:1535
 msgid "Get Dir Info"
@@ -12980,8 +12522,10 @@
 msgid "File transfer failed; other side probably canceled."
 msgstr "Filoverføringen mislyktes - sannsynligvis avbrutt på den andre siden."
 
-#: ../libpurple/protocols/toc/toc.c:1878 ../libpurple/protocols/toc/toc.c:1918
-#: ../libpurple/protocols/toc/toc.c:2042 ../libpurple/protocols/toc/toc.c:2130
+#: ../libpurple/protocols/toc/toc.c:1878
+#: ../libpurple/protocols/toc/toc.c:1918
+#: ../libpurple/protocols/toc/toc.c:2042
+#: ../libpurple/protocols/toc/toc.c:2130
 msgid "Could not connect for transfer."
 msgstr "Kunne ikke koble til for dataoverføring."
 
@@ -12990,9 +12534,8 @@
 msgstr "Kunne ikke skrive filhode. Filen vil ikke bli overført."
 
 #: ../libpurple/protocols/toc/toc.c:2175
-#, fuzzy
 msgid "Save As..."
-msgstr "Lagre ikon som..."
+msgstr "Lagre som..."
 
 #: ../libpurple/protocols/toc/toc.c:2209
 #, c-format
@@ -13016,253 +12559,223 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/toc/toc.c:2306 ../libpurple/protocols/toc/toc.c:2308
+#: ../libpurple/protocols/toc/toc.c:2306
+#: ../libpurple/protocols/toc/toc.c:2308
 msgid "TOC Protocol Plugin"
 msgstr "TOC-protokolltillegg"
 
-#: ../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 ""
-
-#: ../libpurple/protocols/yahoo/yahoo.c:838
+msgstr "%s har sendt deg en webcam invitasjon som enda ikke er støttet."
+
+#: ../libpurple/protocols/yahoo/yahoo.c:840
 msgid "Your Yahoo! message did not get sent."
 msgstr "Din Yahoo!-beskjed ble ikke sendt."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:960
+#: ../libpurple/protocols/yahoo/yahoo.c:959
 #, c-format
 msgid "Yahoo! system message for %s:"
 msgstr "Yahoo! systemmelding for %s:"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1029
+#: ../libpurple/protocols/yahoo/yahoo.c:1028
 #, fuzzy
 msgid "Authorization denied message:"
 msgstr "Godkjenning nektet, grunn:"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1047
-#, c-format
-msgid ""
-"%s has (retroactively) denied your request to add them to your list for the "
-"following reason: %s."
-msgstr ""
-"%s har (tilbakevirkende) avslått din forespørsel om å bli lagt til i "
-"kontaktlisten med følgende grunn: %s."
-
-#: ../libpurple/protocols/yahoo/yahoo.c:1050
+#: ../libpurple/protocols/yahoo/yahoo.c:1046
+#, c-format
+msgid "%s has (retroactively) denied your request to add them to your list for the following reason: %s."
+msgstr "%s har (tilbakevirkende) avslått din forespørsel om å bli lagt til i kontaktlisten med følgende grunn: %s."
+
+#: ../libpurple/protocols/yahoo/yahoo.c:1049
 #, c-format
 msgid "%s has (retroactively) denied your request to add them to your list."
-msgstr ""
-"%s har (tilbakevirkende) avslått din forespørsel om å bli lagt til i "
-"kontaktlisten din."
-
-#: ../libpurple/protocols/yahoo/yahoo.c:1052
+msgstr "%s har (tilbakevirkende) avslått din forespørsel om å bli lagt til i kontaktlisten din."
+
+#: ../libpurple/protocols/yahoo/yahoo.c:1051
 msgid "Add buddy rejected"
 msgstr "Legge til kontakt avslått"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1994
-#, fuzzy, c-format
-msgid ""
-"The Yahoo server has requested the use of an unrecognized authentication "
-"method.  You will probably not be able to successfully sign on to Yahoo.  "
-"Check %s for updates."
-msgstr ""
-"Yahoo-tjeneren har forespurt bruk av en ukjent autentiseringsmetode. Denne "
-"versjonen av Gaim vil antakeligvis ikke være i stand til å logge på Yahoo. "
-"Sjekk %s for oppdateringer."
-
-#: ../libpurple/protocols/yahoo/yahoo.c:1997
+#: ../libpurple/protocols/yahoo/yahoo.c:1993
+#, c-format
+msgid "The Yahoo server has requested the use of an unrecognized authentication method.  You will probably not be able to successfully sign on to Yahoo.  Check %s for updates."
+msgstr "Yahoo-tjeneren har forespurt bruk av en ukjent autentiseringsmetode. Denne versjonen av Pidgin vil antakeligvis ikke være i stand til å logge på Yahoo. Sjekk %s for oppdateringer."
+
+#: ../libpurple/protocols/yahoo/yahoo.c:1996
 msgid "Failed Yahoo! Authentication"
 msgstr "Yahoo!-autentisering feilet"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2063
-#, c-format
-msgid ""
-"You have tried to ignore %s, but the user is on your buddy list.  Clicking "
-"\"Yes\" will remove and ignore the buddy."
-msgstr ""
-"Du forsøkte å ignorere %s, men vedkommende er i kontaktlisten din. Hvis du "
-"klikker på \"Ja\" vil kontakten fjernes og ignoreres."
-
-#: ../libpurple/protocols/yahoo/yahoo.c:2066
+#: ../libpurple/protocols/yahoo/yahoo.c:2062
+#, c-format
+msgid "You have tried to ignore %s, but the user is on your buddy list.  Clicking \"Yes\" will remove and ignore the buddy."
+msgstr "Du forsøkte å ignorere %s, men vedkommende er i kontaktlisten din. Hvis du klikker på \"Ja\" vil kontakten fjernes og ignoreres."
+
+#: ../libpurple/protocols/yahoo/yahoo.c:2065
 msgid "Ignore buddy?"
 msgstr "Ignorere kontakt?"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2129
+#: ../libpurple/protocols/yahoo/yahoo.c:2128
 msgid "Your account is locked, please log in to the Yahoo! website."
-msgstr "Din konto har blitt låst, vennligst logg inn på Yahoo! nettsiden"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:2132
+msgstr "Din konto har blitt låst, vennligst logg inn på Yahoo! nettsiden."
+
+#: ../libpurple/protocols/yahoo/yahoo.c:2131
 #, c-format
 msgid "Unknown error number %d. Logging into the Yahoo! website may fix this."
-msgstr ""
-"Ukjent feilkode %d.\n"
-"Om du logger inn på Yahoo! sin nettside, kan dette  kansje løse problemet"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:2186
+msgstr "Ukjent feilkode %d. Om du logger inn på Yahoo! sin nettside, kan dette  kanskje løse problemet."
+
+#: ../libpurple/protocols/yahoo/yahoo.c:2185
 #, c-format
 msgid "Could not add buddy %s to group %s to the server list on account %s."
-msgstr ""
-"Kunne ikke legge til kontakt %s i gruppen %s i tjenerlisten på konto %s."
-
-#: ../libpurple/protocols/yahoo/yahoo.c:2189
+msgstr "Kunne ikke legge til kontakt %s i gruppen %s i tjenerlisten på konto %s."
+
+#: ../libpurple/protocols/yahoo/yahoo.c:2188
 msgid "Could not add buddy to server list"
 msgstr "Kunne ikke legge kontakt til tjenerens kontaktliste"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2308
+#: ../libpurple/protocols/yahoo/yahoo.c:2307
 #, c-format
 msgid "[ Audible %s/%s/%s.swf ] %s"
-msgstr ""
-
-#: ../libpurple/protocols/yahoo/yahoo.c:2651
+msgstr "[ Hørbar %s/%s/%s.swf ] %s"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:2650
 #, fuzzy
 msgid "Received unexpected HTTP response from server."
 msgstr "Ugyldig svar fra tjener."
 
-#: ../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:2674
+#: ../libpurple/protocols/yahoo/yahoo.c:2860
+#: ../libpurple/protocols/yahoo/yahoo.c:2963
+#: ../libpurple/protocols/yahoo/yahoo.c:2973
 #: ../libpurple/protocols/yahoo/yahoochat.c:1514
 #: ../libpurple/protocols/yahoo/yahoochat.c:1584
 #: ../libpurple/protocols/yahoo/ycht.c:585
 msgid "Connection problem"
 msgstr "Problem ved tilkobling"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2701
+#: ../libpurple/protocols/yahoo/yahoo.c:2700
 #, fuzzy, c-format
 msgid ""
 "Lost connection with %s:\n"
 "%s"
 msgstr "Samtaler med %s"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2726
+#: ../libpurple/protocols/yahoo/yahoo.c:2725
 #, c-format
 msgid ""
 "Could not establish a connection with %s:\n"
 "%s"
 msgstr ""
-
-#: ../libpurple/protocols/yahoo/yahoo.c:3081
-#: ../libpurple/protocols/yahoo/yahoo.c:3767
-#, fuzzy
+"Kunne ikke koble til med %s:\n"
+"%s"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:3080
+#: ../libpurple/protocols/yahoo/yahoo.c:3766
 msgid "Not at Home"
 msgstr "Ikke hjemme"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3083
-#: ../libpurple/protocols/yahoo/yahoo.c:3770
-#, fuzzy
+#: ../libpurple/protocols/yahoo/yahoo.c:3082
+#: ../libpurple/protocols/yahoo/yahoo.c:3769
 msgid "Not at Desk"
 msgstr "Ikke ved skrivebordet"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3085
-#: ../libpurple/protocols/yahoo/yahoo.c:3773
-#, fuzzy
+#: ../libpurple/protocols/yahoo/yahoo.c:3084
+#: ../libpurple/protocols/yahoo/yahoo.c:3772
 msgid "Not in Office"
 msgstr "Ikke på kontoret"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3089
-#: ../libpurple/protocols/yahoo/yahoo.c:3779
+#: ../libpurple/protocols/yahoo/yahoo.c:3088
+#: ../libpurple/protocols/yahoo/yahoo.c:3778
 msgid "On Vacation"
 msgstr "På ferie"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3093
-#: ../libpurple/protocols/yahoo/yahoo.c:3785
+#: ../libpurple/protocols/yahoo/yahoo.c:3092
+#: ../libpurple/protocols/yahoo/yahoo.c:3784
 msgid "Stepped Out"
 msgstr "Ute"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3186
-#: ../libpurple/protocols/yahoo/yahoo.c:3216
+#: ../libpurple/protocols/yahoo/yahoo.c:3185
+#: ../libpurple/protocols/yahoo/yahoo.c:3215
 msgid "Not on server list"
 msgstr "Ikke på tjenerlisten"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3233
-#: ../libpurple/protocols/yahoo/yahoo.c:3291
+#: ../libpurple/protocols/yahoo/yahoo.c:3232
+#: ../libpurple/protocols/yahoo/yahoo.c:3290
 #, fuzzy
 msgid "Appear Online"
 msgstr "Lat som avlogget"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3236
-#: ../libpurple/protocols/yahoo/yahoo.c:3312
+#: ../libpurple/protocols/yahoo/yahoo.c:3235
+#: ../libpurple/protocols/yahoo/yahoo.c:3311
 #, fuzzy
 msgid "Appear Permanently Offline"
 msgstr "Lat som avlogget"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3254
+#: ../libpurple/protocols/yahoo/yahoo.c:3253
 #, fuzzy
 msgid "Presence"
 msgstr "Innstillinger"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3297
+#: ../libpurple/protocols/yahoo/yahoo.c:3296
 msgid "Appear Offline"
 msgstr "Lat som avlogget"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3306
+#: ../libpurple/protocols/yahoo/yahoo.c:3305
 #, fuzzy
 msgid "Don't Appear Permanently Offline"
 msgstr "Lat som avlogget"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3354
+#: ../libpurple/protocols/yahoo/yahoo.c:3353
 msgid "Join in Chat"
 msgstr "Bli med i samtalegruppe"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3360
+#: ../libpurple/protocols/yahoo/yahoo.c:3359
 msgid "Initiate Conference"
 msgstr "Start konferanse"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3388
+#: ../libpurple/protocols/yahoo/yahoo.c:3387
 #, fuzzy
 msgid "Presence Settings"
 msgstr "Skjulte Innstillinger"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3394
+#: ../libpurple/protocols/yahoo/yahoo.c:3393
 msgid "Start Doodling"
 msgstr "Start kruseduller"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3495
+#: ../libpurple/protocols/yahoo/yahoo.c:3494
 #, fuzzy
 msgid "Activate which ID?"
 msgstr "Aktiver hvilken ID?"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3506
+#: ../libpurple/protocols/yahoo/yahoo.c:3505
 msgid "Join whom in chat?"
 msgstr "Bli med hvem i samtalegruppe?"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3518
+#: ../libpurple/protocols/yahoo/yahoo.c:3517
 msgid "Activate ID..."
 msgstr "Aktiver ID..."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3522
+#: ../libpurple/protocols/yahoo/yahoo.c:3521
 #, fuzzy
 msgid "Join User in Chat..."
 msgstr "Bli med bruker i samtalegruppe..."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3527
+#: ../libpurple/protocols/yahoo/yahoo.c:3526
 #, fuzzy
 msgid "Open Inbox"
 msgstr "Åpne Hotmail Inbox"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4119
-#, fuzzy
-msgid "Buzz"
-msgstr "Buzz!!"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4121
-#, c-format
-msgid "Buzzing %s..."
-msgstr ""
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4136
+#: ../libpurple/protocols/yahoo/yahoo.c:4135
 #, fuzzy
 msgid "join &lt;room&gt;:  Join a chat room on the Yahoo network"
-msgstr ""
-"join: &lt;rom&gt; [vert]:  Bli med i en gruppesamtale på denne serveren"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4141
+msgstr "join: &lt;rom&gt; [vert]:  Bli med i en gruppesamtale på denne serveren"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:4140
 #, fuzzy
 msgid "list: List rooms on the Yahoo network"
 msgstr "list:  Vis kanaler på dette nettverket"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4149
+#: ../libpurple/protocols/yahoo/yahoo.c:4148
 msgid "doodle: Request user to start a Doodle session"
 msgstr "doodle: Forespør en bruker om å starte en Doodle session"
 
@@ -13276,72 +12789,68 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/yahoo/yahoo.c:4358
-#: ../libpurple/protocols/yahoo/yahoo.c:4360
+#: ../libpurple/protocols/yahoo/yahoo.c:4357
+#: ../libpurple/protocols/yahoo/yahoo.c:4359
 msgid "Yahoo Protocol Plugin"
-msgstr "Yahoo-protokolltillegg"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4383
+msgstr "Yahoo-Protokolltillegg"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:4382
 msgid "Yahoo Japan"
 msgstr "Yahoo Japan"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4386
+#: ../libpurple/protocols/yahoo/yahoo.c:4385
 #, fuzzy
 msgid "Pager server"
 msgstr "Proxytjener"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4389
-#, fuzzy
+#: ../libpurple/protocols/yahoo/yahoo.c:4388
 msgid "Japan Pager server"
-msgstr "Japansk personsøker-adresse:"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4392
+msgstr "Japansk Personsøker server"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:4391
 msgid "Pager port"
-msgstr "Personsøker-port:"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4395
+msgstr "Personsøker-port"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:4394
 #, fuzzy
 msgid "File transfer server"
 msgstr "Filoverføringsvert"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4398
+#: ../libpurple/protocols/yahoo/yahoo.c:4397
 #, fuzzy
 msgid "Japan file transfer server"
 msgstr "Japansk filoverføringsvert"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4401
+#: ../libpurple/protocols/yahoo/yahoo.c:4400
 msgid "File transfer port"
 msgstr "Filoverføringsport"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4404
-#, fuzzy
+#: ../libpurple/protocols/yahoo/yahoo.c:4403
 msgid "Chat room locale"
-msgstr "Samtaleromslisteadresse"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4407
+msgstr "Samtaleroms språk"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:4406
 msgid "Ignore conference and chatroom invitations"
-msgstr ""
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4415
-#, fuzzy
+msgstr "Ignorer konferanse og samtalerom invitasjoner"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:4414
 msgid "Chat room list URL"
-msgstr "Samtaleromslisteadresse"
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4418
+msgstr "Samtaleroms URL"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:4417
 msgid "Yahoo Chat server"
-msgstr ""
-
-#: ../libpurple/protocols/yahoo/yahoo.c:4421
-#, fuzzy
+msgstr "Yahoo Chat server"
+
+#: ../libpurple/protocols/yahoo/yahoo.c:4420
 msgid "Yahoo Chat port"
-msgstr "Yahoo Japan"
+msgstr "Yahoo Chat port"
 
 #. Write a local message to this conversation showing that a request for a
 #. * Doodle session has been made
 #.
 #: ../libpurple/protocols/yahoo/yahoo_doodle.c:98
 msgid "Sent Doodle request."
-msgstr ""
+msgstr "Sendte Doodle forespørsel."
 
 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:270
 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:279
@@ -13364,20 +12873,12 @@
 msgstr "Yahoo!-profil"
 
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:838
-msgid ""
-"Sorry, profiles marked as containing adult content are not supported at this "
-"time."
-msgstr ""
-"Beklager, profiler som er markert med vokseninnhold er for tiden ikke "
-"støttet."
+msgid "Sorry, profiles marked as containing adult content are not supported at this time."
+msgstr "Beklager, profiler som er markert med vokseninnhold er for tiden ikke støttet."
 
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:840
-#, fuzzy
-msgid ""
-"If you wish to view this profile, you will need to visit this link in your "
-"web browser:"
-msgstr ""
-"Hvis du ønsker å vise denne profilen, må du åpne denne lenken i en nettleser"
+msgid "If you wish to view this profile, you will need to visit this link in your web browser:"
+msgstr "Hvis du ønsker å vise denne profilen, må du åpne denne lenken i en nettleser:"
 
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1034
 msgid "Yahoo! ID"
@@ -13411,7 +12912,6 @@
 msgstr "Kul lenke 3"
 
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1190
-#, fuzzy
 msgid "Last Update"
 msgstr "Sist oppdatert"
 
@@ -13422,31 +12922,16 @@
 
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1205
 #, fuzzy
-msgid ""
-"Sorry, this profile seems to be in a language or format that is not "
-"supported at this time."
-msgstr ""
-"Beklager, men denne profilen ser ut til å være i et språk som for øyeblikket "
-"ikke er støttet."
+msgid "Sorry, this profile seems to be in a language or format that is not supported at this time."
+msgstr "Beklager, men denne profilen ser ut til å være i et språk som for øyeblikket ikke er støttet."
 
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1221
-msgid ""
-"Could not retrieve the user's profile. This most likely is a temporary "
-"server-side problem. Please try again later."
-msgstr ""
-"Kunne ikke hente ned brukerens profil. Dette er mest sannsynlig et "
-"midlertidig server-problem. Vennligst prøv igjen senere."
+msgid "Could not retrieve the user's profile. This most likely is a temporary server-side problem. Please try again later."
+msgstr "Kunne ikke hente ned brukerens profil. Dette er mest sannsynlig et midlertidig server-problem. Vennligst prøv igjen senere."
 
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1224
-msgid ""
-"Could not retrieve the user's profile. This most likely means that the user "
-"does not exist; however, Yahoo! sometimes does fail to find a user's "
-"profile. If you know that the user exists, please try again later."
-msgstr ""
-"Kunne ikke hente ned brukerens profil. Dette betyr sannsynligvis at brukeren "
-"ikke eksisterer, men merk at Yahoo! noen ganger ikke greier å finne en "
-"brukers profil. Om du vet at brukeren eksisterer, vennligst prøv igjen "
-"senere."
+msgid "Could not retrieve the user's profile. This most likely means that the user does not exist; however, Yahoo! sometimes does fail to find a user's profile. If you know that the user exists, please try again later."
+msgstr "Kunne ikke hente ned brukerens profil. Dette betyr sannsynligvis at brukeren ikke eksisterer, men merk at Yahoo! noen ganger ikke greier å finne en brukers profil. Om du vet at brukeren eksisterer, vennligst prøv igjen senere."
 
 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1231
 msgid "The user's profile is empty."
@@ -13467,15 +12952,13 @@
 
 #. -6
 #: ../libpurple/protocols/yahoo/yahoochat.c:441
-#, fuzzy
 msgid "Unknown room"
-msgstr "Ukjent feil"
+msgstr "Ukjent rom"
 
 #. -15
 #: ../libpurple/protocols/yahoo/yahoochat.c:444
-#, fuzzy
 msgid "Maybe the room is full"
-msgstr "Kanskje rommet er fullt?"
+msgstr "Kanskje rommet er fullt"
 
 #. -35
 #: ../libpurple/protocols/yahoo/yahoochat.c:447
@@ -13484,10 +12967,8 @@
 msgstr "Ikke tilgjengelig"
 
 #: ../libpurple/protocols/yahoo/yahoochat.c:451
-msgid ""
-"Unknown error. You may need to logout and wait five minutes before being "
-"able to rejoin a chatroom"
-msgstr ""
+msgid "Unknown error. You may need to logout and wait five minutes before being able to rejoin a chatroom"
+msgstr "Ukjent feil. Det kan hende du må logge ut og vente fem minutter før du kan entre samtalerommet igjen"
 
 #: ../libpurple/protocols/yahoo/yahoochat.c:534
 #, c-format
@@ -13529,20 +13010,18 @@
 msgstr "Problem ved tilkobling til YHCT-tjener."
 
 #: ../libpurple/protocols/yahoo/ycht.c:475
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Lost connection with server\n"
 "%s"
-msgstr "Du har blitt koblet fra tjeneren."
+msgstr ""
+"Du har blitt koblet fra tjeneren\n"
+"%s"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:354
 #, fuzzy
-msgid ""
-"(There was an error converting this message.\t Check the 'Encoding' option "
-"in the Account Editor)"
-msgstr ""
-"(Det oppstod en feil under konverteringen av denne beskjeden.\t Sjekk "
-"'encoding'-innstillingen i kontooppsettet)"
+msgid "(There was an error converting this message.\t Check the 'Encoding' option in the Account Editor)"
+msgstr "(Det oppstod en feil under konverteringen av denne beskjeden.\t Sjekk 'encoding'-innstillingen i kontooppsettet)"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:752
 #, fuzzy, c-format
@@ -13551,9 +13030,8 @@
 
 #: ../libpurple/protocols/zephyr/zephyr.c:791
 #: ../libpurple/protocols/zephyr/zephyr.c:1210
-#, fuzzy
 msgid "Hidden or not logged-in"
-msgstr "<br>Gjemt eller ikke logget inn"
+msgstr "Gjemt eller ikke logget inn"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:797
 #: ../libpurple/protocols/zephyr/zephyr.c:1212
@@ -13593,8 +13071,7 @@
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2700
 msgid "instance &lt;instance&gt;: Set the instance to be used on this class"
-msgstr ""
-"instance &lt;instance&gt;: Sett hendelse som skal brukes for denne klassen"
+msgstr "instance &lt;instance&gt;: Sett hendelse som skal brukes for denne klassen"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2705
 msgid "inst &lt;instance&gt;: Set the instance to be used on this class"
@@ -13602,44 +13079,35 @@
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2710
 msgid "topic &lt;instance&gt;: Set the instance to be used on this class"
-msgstr ""
-"topic &lt;instance&gt;: Sett hendelse som skal brukes for denne klassen"
+msgstr "topic &lt;instance&gt;: Sett hendelse som skal brukes for denne klassen"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2716
 msgid "sub &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Join a new chat"
-msgstr ""
-"ub &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Join en ny samtale"
+msgstr "ub &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Join en ny samtale"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2721
-msgid ""
-"zi &lt;instance&gt;: Send a message to &lt;message,<i>instance</i>,*&gt;"
-msgstr ""
+msgid "zi &lt;instance&gt;: Send a message to &lt;message,<i>instance</i>,*&gt;"
+msgstr "zi &lt;instance&gt;: Send en beskjed til &lt;beskjed,<i>instance</i>,*&gt;"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2727
-msgid ""
-"zci &lt;class&gt; &lt;instance&gt;: Send a message to &lt;<i>class</i>,"
-"<i>instance</i>,*&gt;"
-msgstr ""
+msgid "zci &lt;class&gt; &lt;instance&gt;: Send a message to &lt;<i>class</i>,<i>instance</i>,*&gt;"
+msgstr "zci &lt;class&gt; &lt;instance&gt;: Send en beskjed til &lt;<i>class</i>,<i>instance</i>,*&gt;"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2733
-msgid ""
-"zcir &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;"
-"<i>class</i>,<i>instance</i>,<i>recipient</i>&gt;"
-msgstr ""
+msgid "zcir &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;<i>class</i>,<i>instance</i>,<i>recipient</i>&gt;"
+msgstr "zcir &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Send en beskjed til &lt;<i>class</i>,<i>instance</i>,<i>recipient</i>&gt;"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2739
-msgid ""
-"zir &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;MESSAGE,"
-"<i>instance</i>,<i>recipient</i>&gt;"
-msgstr ""
+msgid "zir &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;MESSAGE,<i>instance</i>,<i>recipient</i>&gt;"
+msgstr "zir &lt;instance&gt; &lt;recipient&gt;: Send en beskjed til &lt;MESSAGE,<i>instance</i>,<i>recipient</i>&gt;"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2744
 msgid "zc &lt;class&gt;: Send a message to &lt;<i>class</i>,PERSONAL,*&gt;"
-msgstr ""
+msgstr "zc &lt;class&gt;: Send en beskjed til &lt;<i>class</i>,PERSONAL,*&gt;"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2850
 msgid "Resubscribe"
-msgstr "Abboner på nytt"
+msgstr "Aboner på nytt"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2853
 msgid "Retrieve subscriptions from server"
@@ -13661,30 +13129,32 @@
 msgstr "Zephyr-protokolltillegg"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2973
-#, fuzzy
 msgid "Use tzc"
-msgstr "Enhet"
+msgstr "Bruk tzc"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2976
-#, fuzzy
 msgid "tzc command"
-msgstr "Ingen slik kommando"
+msgstr "tzc kommando"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2979
+#, fuzzy
 msgid "Export to .anyone"
-msgstr ""
+msgstr "Eksporter til .anyone"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2982
+#, fuzzy
 msgid "Export to .zephyr.subs"
-msgstr ""
+msgstr "Eksporter til .zephyr.subs"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2985
+#, fuzzy
 msgid "Import from .anyone"
-msgstr ""
+msgstr "Importer fra .anyone"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2988
+#, fuzzy
 msgid "Import from .zephyr.subs"
-msgstr ""
+msgstr "Importer fra .zephyr.subs"
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2991
 #, fuzzy
@@ -13693,9 +13163,11 @@
 
 #: ../libpurple/protocols/zephyr/zephyr.c:2994
 msgid "Exposure"
-msgstr ""
-
-#: ../libpurple/proxy.c:459 ../libpurple/proxy.c:894 ../libpurple/proxy.c:1049
+msgstr "Eksponering"
+
+#: ../libpurple/proxy.c:459
+#: ../libpurple/proxy.c:894
+#: ../libpurple/proxy.c:1049
 #: ../libpurple/proxy.c:1617
 #, fuzzy, c-format
 msgid ""
@@ -13706,56 +13178,54 @@
 #: ../libpurple/proxy.c:659
 #, c-format
 msgid "Unable to parse response from HTTP proxy: %s\n"
-msgstr ""
-
-#: ../libpurple/proxy.c:698 ../libpurple/proxy.c:744 ../libpurple/proxy.c:780
+msgstr "Kunne ikke analysere syntaktisk respons fra HTTP proxy: %s\n"
+
+#: ../libpurple/proxy.c:698
+#: ../libpurple/proxy.c:744
+#: ../libpurple/proxy.c:780
 #: ../libpurple/proxy.c:792
 #, fuzzy, c-format
 msgid "HTTP proxy connection error %d"
 msgstr "Tilkoplingsfeil til mellomtjener %d"
 
 #: ../libpurple/proxy.c:788
-#, fuzzy, c-format
+#, c-format
 msgid "Access denied: HTTP proxy server forbids port %d tunneling."
-msgstr "Tilgang nektet: Mellomtjener nekter å formidle tunell for port %d"
+msgstr "Tilgang nektet: Mellomtjener nekter å formidle tunell for port %d."
 
 #: ../libpurple/proxy.c:1012
-#, fuzzy, c-format
+#, c-format
 msgid "Error resolving %s"
-msgstr "Klarte ikke bli med i gruppesamtale %s"
+msgstr "Error resolving %s"
 
 #: ../libpurple/proxy.c:1714
-#, fuzzy
 msgid "Could not resolve host name"
-msgstr "Kan ikke finne datamaskinnavnet."
+msgstr "Kan ikke finne datamaskinnavnet"
 
 #. *
 #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
 #.
 #: ../libpurple/request.h:1378
-#, fuzzy
 msgid "_Yes"
-msgstr "Ja"
+msgstr "_Ja"
 
 #: ../libpurple/request.h:1378
-#, fuzzy
 msgid "_No"
-msgstr "Nei"
+msgstr "_Nei"
 
 #. *
 #. * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
 #.
 #: ../libpurple/request.h:1398
-#, fuzzy
 msgid "_Accept"
-msgstr "Godta"
+msgstr "_Godta"
 
 #. *
 #. * The default message to use when the user becomes auto-away.
 #.
 #: ../libpurple/savedstatuses.c:48
 msgid "I'm not here right now"
-msgstr ""
+msgstr "Jeg er ikke her akkurat nå"
 
 #: ../libpurple/savedstatuses.c:535
 #, fuzzy
@@ -13770,26 +13240,26 @@
 #: ../libpurple/server.c:302
 #, c-format
 msgid "Requesting %s's attention..."
-msgstr ""
+msgstr "Forespør %s's oppmerksomhet..."
 
 #: ../libpurple/server.c:347
-#, fuzzy, c-format
+#, c-format
 msgid "%s has requested your attention!"
-msgstr "%s hentet informasjon om deg"
-
-#: ../libpurple/server.c:796
+msgstr "%s har forespurt din oppmerksomhet!"
+
+#: ../libpurple/server.c:793
 #, fuzzy, c-format
 msgid ""
 "%s has invited %s to the chat room %s:\n"
 "%s"
 msgstr "Brukeren '%s' inviterer %s til samtalerom: '%s\n"
 
-#: ../libpurple/server.c:801
+#: ../libpurple/server.c:798
 #, c-format
 msgid "%s has invited %s to the chat room %s\n"
 msgstr "Brukeren '%s' inviterer %s til samtalerom: '%s\n"
 
-#: ../libpurple/server.c:805
+#: ../libpurple/server.c:802
 msgid "Accept chat invitation?"
 msgstr "Aksepter samtaleinvitasjon?"
 
@@ -13817,184 +13287,184 @@
 msgid "Unset"
 msgstr "Enhet"
 
-#: ../libpurple/status.c:156 ../pidgin/gtkstatusbox.c:1059
-#, fuzzy
+#: ../libpurple/status.c:156
+#: ../pidgin/gtkstatusbox.c:1059
 msgid "Do not disturb"
 msgstr "Ikke forstyrr"
 
 #: ../libpurple/status.c:159
-#, fuzzy
 msgid "Extended away"
 msgstr "Utvidet borte"
 
 #: ../libpurple/status.c:160
-#, fuzzy
 msgid "Mobile"
-msgstr "Mobiltelefon"
+msgstr "Mobil"
 
 #: ../libpurple/status.c:609
-#, fuzzy, c-format
+#, c-format
 msgid "%s changed status from %s to %s"
-msgstr "%s har endret kanaltema til: %s"
-
-#: ../libpurple/status.c:619
-#, fuzzy, c-format
+msgstr "%s har endret status fra %s til %s"
+
+#: ../libpurple/status.c:612
+#, c-format
+msgid "%s (%s) changed status from %s to %s"
+msgstr "%s (%s) har endret status fra %s til %s"
+
+#: ../libpurple/status.c:623
+#, c-format
 msgid "%s is now %s"
-msgstr "%s heter nå %s"
-
-#: ../libpurple/status.c:624
-#, fuzzy, c-format
+msgstr "%s er nå %s"
+
+#: ../libpurple/status.c:625
+#, c-format
+msgid "%s (%s) is now %s"
+msgstr "%s (%s) er nå %s"
+
+#: ../libpurple/status.c:631
+#, c-format
 msgid "%s is no longer %s"
-msgstr "%s er tilbake."
-
-#: ../libpurple/status.c:1234
+msgstr "%s er ikke lenger %s"
+
+#: ../libpurple/status.c:633
+#, c-format
+msgid "%s (%s) is no longer %s"
+msgstr "%s (%s) er ikke lenger %s"
+
+#: ../libpurple/status.c:1244
 #, c-format
 msgid "%s became idle"
 msgstr "%s har blitt inaktiv"
 
-#: ../libpurple/status.c:1251
+#: ../libpurple/status.c:1261
 #, c-format
 msgid "%s became unidle"
 msgstr "%s har blitt aktiv"
 
-#: ../libpurple/status.c:1314
-#, fuzzy, c-format
+#: ../libpurple/status.c:1324
+#, c-format
 msgid "+++ %s became idle"
 msgstr "%s har blitt inaktiv"
 
-#: ../libpurple/status.c:1316
-#, fuzzy, c-format
+#: ../libpurple/status.c:1326
+#, c-format
 msgid "+++ %s became unidle"
 msgstr "%s har blitt aktiv"
 
-#: ../libpurple/util.c:718
+#: ../libpurple/util.c:701
 #, c-format
 msgid "%x %X"
-msgstr ""
-
-#: ../libpurple/util.c:2722
-#, fuzzy, c-format
+msgstr "%x %X"
+
+#: ../libpurple/util.c:2705
+#, c-format
 msgid "Error Reading %s"
-msgstr ""
-"Klarte ikke lese %s:\n"
-"%s\n"
-
-#: ../libpurple/util.c:2723
-#, fuzzy, c-format
-msgid ""
-"An error was encountered reading your %s.  They have not been loaded, and "
-"the old file has been renamed to %s~."
-msgstr ""
-"Det oppstod en feil under innlasting av kontaktlisten din. Den har ikke "
-"blitt lastet, og den gamle filen ble flyttet til blist.xml~."
-
-#: ../libpurple/util.c:3223
+msgstr "Feil ved lesing av %s"
+
+#: ../libpurple/util.c:2706
+#, c-format
+msgid "An error was encountered reading your %s.  They have not been loaded, and the old file has been renamed to %s~."
+msgstr "Det oppstod en feil under lesing av %s. Den har ikke blitt lastet, og den gamle filen ble flyttet til %s~."
+
+#: ../libpurple/util.c:3206
 msgid "Calculating..."
 msgstr "Beregner..."
 
-#: ../libpurple/util.c:3226
+#: ../libpurple/util.c:3209
 msgid "Unknown."
 msgstr "Ukjent."
 
-#: ../libpurple/util.c:3252
-#, fuzzy, c-format
+#: ../libpurple/util.c:3235
+#, c-format
 msgid "%d second"
 msgid_plural "%d seconds"
-msgstr[0] "sekund"
-msgstr[1] "sekunder"
-
-#: ../libpurple/util.c:3264
-#, fuzzy, c-format
+msgstr[0] "%d sekund"
+msgstr[1] "%d sekunder"
+
+#: ../libpurple/util.c:3247
+#, c-format
 msgid "%d day"
 msgid_plural "%d days"
-msgstr[0] "dag"
-msgstr[1] "dager"
-
-#: ../libpurple/util.c:3272
+msgstr[0] "%d dag"
+msgstr[1] "%d dager"
+
+#: ../libpurple/util.c:3255
 #, c-format
 msgid "%s, %d hour"
 msgid_plural "%s, %d hours"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../libpurple/util.c:3278
-#, fuzzy, c-format
+msgstr[0] "%s, %d time"
+msgstr[1] "%s, %d timer"
+
+#: ../libpurple/util.c:3261
+#, c-format
 msgid "%d hour"
 msgid_plural "%d hours"
-msgstr[0] "time"
-msgstr[1] "timer"
-
-#: ../libpurple/util.c:3286
-#, fuzzy, c-format
+msgstr[0] "%d time"
+msgstr[1] "%d timer"
+
+#: ../libpurple/util.c:3269
+#, c-format
 msgid "%s, %d minute"
 msgid_plural "%s, %d minutes"
-msgstr[0] "minutt"
-msgstr[1] "minutter"
-
-#: ../libpurple/util.c:3292
-#, fuzzy, c-format
+msgstr[0] "%s, %d minutt"
+msgstr[1] "%s, %d minutter"
+
+#: ../libpurple/util.c:3275
+#, c-format
 msgid "%d minute"
 msgid_plural "%d minutes"
-msgstr[0] "minutt"
-msgstr[1] "minutter"
-
-#: ../libpurple/util.c:3552
+msgstr[0] "%d minutt"
+msgstr[1] "%d minutter"
+
+#: ../libpurple/util.c:3535
 #, c-format
 msgid "Could not open %s: Redirected too many times"
-msgstr ""
-
-#: ../libpurple/util.c:3589 ../libpurple/util.c:3885
-#, fuzzy, c-format
+msgstr "Kunne ikke åpne %s: Omdirigert for mange ganger"
+
+#: ../libpurple/util.c:3572
+#: ../libpurple/util.c:3868
+#, c-format
 msgid "Unable to connect to %s"
-msgstr "Kan ikke koble til tjener."
-
-#: ../libpurple/util.c:3712
-#, c-format
-msgid ""
-"Unable to allocate enough memory to hold the contents from %s.  The web "
-"server may be trying something malicious."
-msgstr ""
-
-#: ../libpurple/util.c:3747
-#, fuzzy, c-format
+msgstr "Kan ikke koble til %s"
+
+#: ../libpurple/util.c:3695
+#, c-format
+msgid "Unable to allocate enough memory to hold the contents from %s.  The web server may be trying something malicious."
+msgstr "Kunne ikke allokere nok minne til å holde på innholdet fra %s.  Det kan hende web serveren prøver på noe ondskapsfullt."
+
+#: ../libpurple/util.c:3730
+#, c-format
 msgid "Error reading from %s: %s"
-msgstr ""
-"Klarte ikke lese %s:\n"
-"%s\n"
-
-#: ../libpurple/util.c:3778
-#, fuzzy, c-format
+msgstr "Feil ved lesing fra %s: %s"
+
+#: ../libpurple/util.c:3761
+#, c-format
 msgid "Error writing to %s: %s"
-msgstr ""
-"Klarte ikke skrive %s:\n"
-"%s\n"
-
-#: ../libpurple/util.c:3803
-#, fuzzy, c-format
+msgstr "Feil ved skriving til %s: %s"
+
+#: ../libpurple/util.c:3786
+#, c-format
 msgid "Unable to connect to %s: %s"
-msgstr "Kan ikke koble til tjener."
+msgstr "Kan ikke koble til %s: %s"
 
 #: ../pidgin.desktop.in.h:1
 msgid "Internet Messenger"
 msgstr "Lynmeldingsklient"
 
 #: ../pidgin.desktop.in.h:2
-#, fuzzy
 msgid "Pidgin Internet Messenger"
-msgstr "Lynmeldingsklient"
+msgstr "Pidgin Lynmeldingsklient"
 
 #: ../pidgin.desktop.in.h:3
 msgid "Send instant messages over multiple protocols"
 msgstr "Send lynmeldinger over flere protokoller"
 
 #: ../pidgin/eggtrayicon.c:129
-#, fuzzy
 msgid "Orientation"
-msgstr "Organisasjon"
+msgstr "Orientering"
 
 #: ../pidgin/eggtrayicon.c:130
 msgid "The orientation of the tray."
-msgstr ""
+msgstr "Orienteringen av brettet."
 
 #. Build the login options frame.
 #: ../pidgin/gtkaccount.c:407
@@ -14002,24 +13472,20 @@
 msgstr "Innloggingsvalg"
 
 #: ../pidgin/gtkaccount.c:428
-#, fuzzy
 msgid "Pro_tocol:"
-msgstr "Protokoll:"
+msgstr "Pro_tokoll:"
 
 #: ../pidgin/gtkaccount.c:439
-#, fuzzy
 msgid "Screen _name:"
-msgstr "Skjermnavn:"
+msgstr "Skjerm_navn:"
 
 #: ../pidgin/gtkaccount.c:529
-#, fuzzy
 msgid "_Local alias:"
-msgstr "Lokale brukere"
+msgstr "_Lokalt alias:"
 
 #: ../pidgin/gtkaccount.c:533
-#, fuzzy
 msgid "Remember pass_word"
-msgstr "Husk passord"
+msgstr "Husk pass_ord"
 
 #. Build the user options frame.
 #: ../pidgin/gtkaccount.c:591
@@ -14027,25 +13493,23 @@
 msgstr "Brukervalg"
 
 #: ../pidgin/gtkaccount.c:604
-#, fuzzy
 msgid "New _mail notifications"
-msgstr "Varsling om ny e-post"
+msgstr "_Varsling om ny e-post"
 
 #. Buddy icon
 #: ../pidgin/gtkaccount.c:609
 msgid "Use this buddy _icon for this account:"
-msgstr ""
+msgstr "Bruk dette kontakt _ikon for denne kontoen:"
 
 #. Build the protocol options frame.
 #: ../pidgin/gtkaccount.c:731
 #, c-format
 msgid "%s Options"
-msgstr "%s brukervalg"
+msgstr "%s Brukervalg"
 
 #: ../pidgin/gtkaccount.c:936
-#, fuzzy
 msgid "Use GNOME Proxy Settings"
-msgstr "Bruk globale proxyinnstilinger"
+msgstr "Bruk GNOMEs proxyinnstilinger"
 
 #: ../pidgin/gtkaccount.c:937
 msgid "Use Global Proxy Settings"
@@ -14067,8 +13531,8 @@
 msgid "SOCKS 5"
 msgstr "SOCKS 5"
 
-#
-#: ../pidgin/gtkaccount.c:967 ../pidgin/gtkprefs.c:1211
+#: ../pidgin/gtkaccount.c:967
+#: ../pidgin/gtkprefs.c:1213
 msgid "Use Environmental Settings"
 msgstr "Bruk innstillinger fra miljøet"
 
@@ -14090,15 +13554,18 @@
 msgid "Proxy Options"
 msgstr "Proxyinnstillinger"
 
-#: ../pidgin/gtkaccount.c:1044 ../pidgin/gtkprefs.c:1205
+#: ../pidgin/gtkaccount.c:1044
+#: ../pidgin/gtkprefs.c:1207
 msgid "Proxy _type:"
-msgstr "Proxytype:"
-
-#: ../pidgin/gtkaccount.c:1053 ../pidgin/gtkprefs.c:1226
+msgstr "Proxy_type:"
+
+#: ../pidgin/gtkaccount.c:1053
+#: ../pidgin/gtkprefs.c:1228
 msgid "_Host:"
-msgstr "Adresse:"
-
-#: ../pidgin/gtkaccount.c:1057 ../pidgin/gtkprefs.c:1244
+msgstr "_Vert:"
+
+#: ../pidgin/gtkaccount.c:1057
+#: ../pidgin/gtkprefs.c:1246
 msgid "_Port:"
 msgstr "_Port:"
 
@@ -14106,41 +13573,39 @@
 msgid "_Username:"
 msgstr "_Brukernavn:"
 
-#: ../pidgin/gtkaccount.c:1072 ../pidgin/gtkprefs.c:1281
+#: ../pidgin/gtkaccount.c:1072
+#: ../pidgin/gtkprefs.c:1283
 msgid "Pa_ssword:"
-msgstr "Passord:"
+msgstr "Pa_ssord:"
 
 #: ../pidgin/gtkaccount.c:1195
-#, fuzzy
 msgid "Unable to save new account"
-msgstr "Kunne ikke lage ny tilkobling."
+msgstr "Kan ikke lagre ny konto"
 
 #: ../pidgin/gtkaccount.c:1196
 msgid "An account already exists with the specified criteria."
-msgstr ""
+msgstr "En konto eksisterer allerede med de spesifiserte kriteriene."
 
 #: ../pidgin/gtkaccount.c:1473
 msgid "Add Account"
 msgstr "Legg til konto"
 
 #: ../pidgin/gtkaccount.c:1492
-#, fuzzy
 msgid "_Basic"
-msgstr "Tilbake"
+msgstr "_Generell"
 
 #: ../pidgin/gtkaccount.c:1499
 msgid "Create this new account on the server"
-msgstr ""
+msgstr "Opprett denne nye kontoen på tjeneren"
 
 #: ../pidgin/gtkaccount.c:1515
-#, fuzzy
 msgid "_Advanced"
-msgstr "_Avbryt"
-
-#: ../pidgin/gtkaccount.c:1973 ../pidgin/gtkplugin.c:569
-#, fuzzy
+msgstr "_Avansert"
+
+#: ../pidgin/gtkaccount.c:1973
+#: ../pidgin/gtkplugin.c:569
 msgid "Enabled"
-msgstr "Feilet."
+msgstr "Aktivert"
 
 #: ../pidgin/gtkaccount.c:2001
 msgid "Protocol"
@@ -14151,270 +13616,299 @@
 msgid ""
 "<span size='larger' weight='bold'>Welcome to %s!</span>\n"
 "\n"
-"You have no IM accounts configured. To start connecting with %s press the "
-"<b>Add</b> button below and configure your first account. If you want %s to "
-"connect to multiple IM accounts, press <b>Add</b> again to configure them "
-"all.\n"
-"\n"
-"You can come back to this window to add, edit, or remove accounts from "
-"<b>Accounts->Add/Edit</b> in the Buddy List window"
-msgstr ""
-
-#: ../pidgin/gtkblist.c:767
+"You have no IM accounts configured. To start connecting with %s press the <b>Add</b> button below and configure your first account. If you want %s to connect to multiple IM accounts, press <b>Add</b> again to configure them all.\n"
+"\n"
+"You can come back to this window to add, edit, or remove accounts from <b>Accounts->Add/Edit</b> in the Buddy List window"
+msgstr ""
+"<span size='larger' weight='bold'>Velkommen til %s!</span>\n"
+"\n"
+"Du har ikke konfigurert noen Lyndmeldings kontoer. For å starte tilkobling til %s trykk <b>Legg til</b> knappen under og konfigurer kontoen din først. Om du vil at %s skal koble til flere Lynmeldings kontoer, trykk <b>Legg til</b> igjen for å konfigurere dem alle.\n"
+"\n"
+"Du kan komme tilbake til dette vinduet for å legge til, redigere eller fjerne kontoer fra <b>Kontoer->Legg til/Rediger</b> i kontaktliste vinduet"
+
+#: ../pidgin/gtkblist.c:524
+#, 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] "Du har kontakten %d som %s. Vil du flette dem sammen?"
+msgstr[1] "Du har kontaktene %d som %s. Vil du flette dem sammen?"
+
+#: ../pidgin/gtkblist.c:525
+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 "Sammenfletting av disse kontaktene vil føre til at de deler en enkelt oppføring i kontaktlisten og bruker ett enkelt samtalevindu. Du kan separere dem igjen ved å velge Utvid fra kontaktens meny i kontaktlisten"
+
+#: ../pidgin/gtkblist.c:527
+msgid "_Merge"
+msgstr "_Flette"
+
+#: ../pidgin/gtkblist.c:924
 msgid "Join a Chat"
 msgstr "Bli med i en samtalegruppe"
 
-#: ../pidgin/gtkblist.c:788
-msgid ""
-"Please enter the appropriate information about the chat you would like to "
-"join.\n"
-msgstr ""
-"Vennligst skriv inn informasjon om samtalegruppen du ønsker å bli med i.\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/gtkblist.c:945
+msgid "Please enter the appropriate information about the chat you would like to join.\n"
+msgstr "Vennligst skriv inn informasjon om samtalegruppen du ønsker å bli med i.\n"
+
+#: ../pidgin/gtkblist.c:956
+#: ../pidgin/gtkblist.c:6188
+#: ../pidgin/gtkpounce.c:539
 #: ../pidgin/gtkroomlist.c:396
 msgid "_Account:"
-msgstr "Konto:"
-
-#: ../pidgin/gtkblist.c:1088 ../pidgin/gtkprivacy.c:603
+msgstr "_Konto:"
+
+#: ../pidgin/gtkblist.c:1245
+#: ../pidgin/gtkprivacy.c:603
 #: ../pidgin/gtkprivacy.c:617
-#, fuzzy
 msgid "_Block"
-msgstr "Blokker"
-
-#: ../pidgin/gtkblist.c:1088
-#, fuzzy
+msgstr "_Blokker"
+
+#: ../pidgin/gtkblist.c:1245
 msgid "Un_block"
-msgstr "Blokker"
-
-#: ../pidgin/gtkblist.c:1139
+msgstr "_Ta bort blokkering"
+
+#: ../pidgin/gtkblist.c:1288
+msgid "Move to"
+msgstr "Flytt til"
+
+#: ../pidgin/gtkblist.c:1328
 msgid "Get _Info"
-msgstr "_Info"
-
-#: ../pidgin/gtkblist.c:1142 ../pidgin/pidginstock.c:90
+msgstr "Hent _Informasjon"
+
+#: ../pidgin/gtkblist.c:1331
+#: ../pidgin/pidginstock.c:90
 msgid "I_M"
 msgstr "Direkte_melding"
 
-#: ../pidgin/gtkblist.c:1148
-#, fuzzy
-msgid "_Send File"
-msgstr "Send fil"
-
-#: ../pidgin/gtkblist.c:1155
-#, fuzzy
-msgid "Add Buddy _Pounce"
-msgstr "Legg til kompisvarsling"
-
-#: ../pidgin/gtkblist.c:1160 ../pidgin/gtkblist.c:1164
-#: ../pidgin/gtkblist.c:1269 ../pidgin/gtkblist.c:1292
+#: ../pidgin/gtkblist.c:1337
+msgid "_Send File..."
+msgstr "_Send fil..."
+
+#: ../pidgin/gtkblist.c:1344
+msgid "Add Buddy _Pounce..."
+msgstr "Legg til _kontaktvarsling..."
+
+#: ../pidgin/gtkblist.c:1349
+#: ../pidgin/gtkblist.c:1353
+#: ../pidgin/gtkblist.c:1468
+#: ../pidgin/gtkblist.c:1491
 msgid "View _Log"
-msgstr "Vis _logg"
-
-#: ../pidgin/gtkblist.c:1177 ../pidgin/gtkblist.c:1186
-#: ../pidgin/gtkblist.c:1277 ../pidgin/gtkblist.c:1298
+msgstr "Vis _Logg"
+
+#: ../pidgin/gtkblist.c:1359
+#, fuzzy
+msgid "Hide when offline"
+msgstr "Ikke tillatt når avlogget"
+
+#: ../pidgin/gtkblist.c:1359
+#, fuzzy
+msgid "Show when offline"
+msgstr "Ikke tillatt når avlogget"
+
+#: ../pidgin/gtkblist.c:1373
+#: ../pidgin/gtkblist.c:1382
+#: ../pidgin/gtkblist.c:1476
+#: ../pidgin/gtkblist.c:1497
 msgid "_Alias..."
 msgstr "_Alias..."
 
-#: ../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 "Fje_rn"
 
-#: ../pidgin/gtkblist.c:1238
-msgid "Add a _Buddy"
-msgstr "Legg til kompis"
-
-#: ../pidgin/gtkblist.c:1241
-msgid "Add a C_hat"
-msgstr "Legg til samtalegruppe"
-
-#: ../pidgin/gtkblist.c:1244
+#: ../pidgin/gtkblist.c:1434
+msgid "Add _Buddy..."
+msgstr "Legg til _Kontakt..."
+
+#: ../pidgin/gtkblist.c:1437
+msgid "Add C_hat..."
+msgstr "Legg til _Samtale..."
+
+#: ../pidgin/gtkblist.c:1440
 msgid "_Delete Group"
-msgstr "Slett gruppe"
-
-#: ../pidgin/gtkblist.c:1246
+msgstr "_Slett gruppe"
+
+#: ../pidgin/gtkblist.c:1442
 msgid "_Rename"
-msgstr "End_re navn"
+msgstr "_Endre navn"
 
 #. join button
-#: ../pidgin/gtkblist.c:1265 ../pidgin/gtkroomlist.c:307
-#: ../pidgin/gtkroomlist.c:460 ../pidgin/pidginstock.c:88
+#: ../pidgin/gtkblist.c:1462
+#: ../pidgin/gtkroomlist.c:307
+#: ../pidgin/gtkroomlist.c:460
+#: ../pidgin/pidginstock.c:88
 msgid "_Join"
-msgstr "_Bli med i samtalegruppe"
-
-#: ../pidgin/gtkblist.c:1267
+msgstr "_Bli med"
+
+#: ../pidgin/gtkblist.c:1464
 msgid "Auto-Join"
 msgstr "Automatisk pålogging"
 
-#: ../pidgin/gtkblist.c:1305 ../pidgin/gtkblist.c:1329
+#: ../pidgin/gtkblist.c:1466
+#, fuzzy
+msgid "Persistent"
+msgstr "Serbisk"
+
+#: ../pidgin/gtkblist.c:1504
+#: ../pidgin/gtkblist.c:1527
 msgid "_Collapse"
 msgstr "_Lukk"
 
-#: ../pidgin/gtkblist.c:1334
+#: ../pidgin/gtkblist.c:1532
 msgid "_Expand"
 msgstr "_Utvid"
 
-#: ../pidgin/gtkblist.c:1585 ../pidgin/gtkblist.c:1597
-#: ../pidgin/gtkblist.c:4603 ../pidgin/gtkblist.c:4616
-#, fuzzy
+#: ../pidgin/gtkblist.c:1783
+#: ../pidgin/gtkblist.c:1795
+#: ../pidgin/gtkblist.c:4885
+#: ../pidgin/gtkblist.c:4898
 msgid "/Tools/Mute Sounds"
-msgstr "Skru av lyder"
-
-#: ../pidgin/gtkblist.c:2057 ../pidgin/gtkconv.c:4840
+msgstr "/Verktøy/Skru av lyder"
+
+#: ../pidgin/gtkblist.c:2255
+#: ../pidgin/gtkconv.c:4903
 #: ../pidgin/gtkpounce.c:430
-msgid ""
-"You are not currently signed on with an account that can add that buddy."
+msgid "You are not currently signed on with an account that can add that buddy."
 msgstr "Du er ikke pålogget med noen kontoer som kan legge til den kontakten."
 
 #. Buddies menu
-#: ../pidgin/gtkblist.c:2869
+#: ../pidgin/gtkblist.c:3067
 msgid "/_Buddies"
 msgstr "/_Kontakter"
 
-#: ../pidgin/gtkblist.c:2870
+#: ../pidgin/gtkblist.c:3068
 msgid "/Buddies/New Instant _Message..."
 msgstr "/Kontakter/_Ny direktemelding..."
 
-#: ../pidgin/gtkblist.c:2871
+#: ../pidgin/gtkblist.c:3069
 msgid "/Buddies/Join a _Chat..."
 msgstr "/Kontakter/_Bli med i samtalegruppe..."
 
-#: ../pidgin/gtkblist.c:2872
+#: ../pidgin/gtkblist.c:3070
 msgid "/Buddies/Get User _Info..."
 msgstr "/Kontakter/_Hent brukerinfo..."
 
-#: ../pidgin/gtkblist.c:2873
+#: ../pidgin/gtkblist.c:3071
 msgid "/Buddies/View User _Log..."
-msgstr "/Kontakter/Hent bruker_logg..."
-
-#: ../pidgin/gtkblist.c:2875
-#, fuzzy
+msgstr "/Kontakter/Vis bruker_logg..."
+
+#: ../pidgin/gtkblist.c:3073
 msgid "/Buddies/Show"
-msgstr "/Kontakter/L_ogge av"
-
-#: ../pidgin/gtkblist.c:2876
-#, fuzzy
+msgstr "/Kontakter/Vis"
+
+#: ../pidgin/gtkblist.c:3074
 msgid "/Buddies/Show/_Offline Buddies"
-msgstr "/Kontakter/_Vis avloggede kontakter"
-
-#: ../pidgin/gtkblist.c:2877
-#, fuzzy
+msgstr "/Kontakter/Vis/_Avloggede kontakter"
+
+#: ../pidgin/gtkblist.c:3075
 msgid "/Buddies/Show/_Empty Groups"
-msgstr "/Kontakter/Vis _tomme grupper"
-
-#: ../pidgin/gtkblist.c:2878
-#, fuzzy
+msgstr "/Kontakter/Vis/_Tomme grupper"
+
+#: ../pidgin/gtkblist.c:3076
 msgid "/Buddies/Show/Buddy _Details"
-msgstr "/Kontakter/Vis _avloggede kontakter"
-
-#: ../pidgin/gtkblist.c:2879
-#, fuzzy
+msgstr "/Kontakter/Vis/Kontakt_detaljer"
+
+#: ../pidgin/gtkblist.c:3077
 msgid "/Buddies/Show/Idle _Times"
-msgstr "/Kontakter/Vis _avloggede kontakter"
-
-#: ../pidgin/gtkblist.c:2880
-#, fuzzy
+msgstr "/Kontakter/Vis/_Fraværstid"
+
+#: ../pidgin/gtkblist.c:3078
 msgid "/Buddies/Show/_Protocol Icons"
-msgstr "/Kontakter/Vis _tomme grupper"
-
-#: ../pidgin/gtkblist.c:2881
-#, fuzzy
+msgstr "/Kontakter/Vis/_Protokollikoner"
+
+#: ../pidgin/gtkblist.c:3079
 msgid "/Buddies/_Sort Buddies"
-msgstr "/Kontakter/Vis _avloggede kontakter"
-
-#: ../pidgin/gtkblist.c:2883
+msgstr "/Kontakter/_Sorter kontakter"
+
+#: ../pidgin/gtkblist.c:3081
 msgid "/Buddies/_Add Buddy..."
-msgstr "/Kontakter/_Legg til kompis..."
-
-#: ../pidgin/gtkblist.c:2884
+msgstr "/Kontakter/_Legg til kontakt..."
+
+#: ../pidgin/gtkblist.c:3082
 msgid "/Buddies/Add C_hat..."
 msgstr "/Kontakter/Legg til _samtalegruppe..."
 
-#: ../pidgin/gtkblist.c:2885
+#: ../pidgin/gtkblist.c:3083
 msgid "/Buddies/Add _Group..."
 msgstr "/Kontakter/Legg til _gruppe..."
 
-#: ../pidgin/gtkblist.c:2887
+#: ../pidgin/gtkblist.c:3085
 msgid "/Buddies/_Quit"
 msgstr "/Kontakter/_Avslutt"
 
 #. Accounts menu
-#: ../pidgin/gtkblist.c:2890
-#, fuzzy
+#: ../pidgin/gtkblist.c:3088
 msgid "/_Accounts"
-msgstr "Kontoer"
-
-#: ../pidgin/gtkblist.c:2891 ../pidgin/gtkblist.c:6589
-#, fuzzy
-msgid "/Accounts/Add\\/Edit"
-msgstr "Kontoer"
+msgstr "/_Kontoer"
+
+#: ../pidgin/gtkblist.c:3089
+#: ../pidgin/gtkblist.c:6889
+#, fuzzy
+msgid "/Accounts/Manage"
+msgstr "/Kontoer"
 
 #. Tools
-#: ../pidgin/gtkblist.c:2894
+#: ../pidgin/gtkblist.c:3092
 msgid "/_Tools"
 msgstr "/_Verktøy"
 
-#: ../pidgin/gtkblist.c:2895
-#, fuzzy
+#: ../pidgin/gtkblist.c:3093
 msgid "/Tools/Buddy _Pounces"
 msgstr "/Verktøy/_Kompisvarsling"
 
-#: ../pidgin/gtkblist.c:2896
-#, fuzzy
+#: ../pidgin/gtkblist.c:3094
 msgid "/Tools/_Certificates"
-msgstr "/Verktøy/_Innstillinger"
-
-#: ../pidgin/gtkblist.c:2897
-#, fuzzy
+msgstr "/Verktøy/_Sertifikater"
+
+#: ../pidgin/gtkblist.c:3095
 msgid "/Tools/Plu_gins"
-msgstr "/Verktøy/Handlinger for tillegg"
-
-#: ../pidgin/gtkblist.c:2898
+msgstr "/Verktøy/ _Tillegg"
+
+#: ../pidgin/gtkblist.c:3096
 msgid "/Tools/Pr_eferences"
 msgstr "/Verktøy/_Innstillinger"
 
-#: ../pidgin/gtkblist.c:2899
+#: ../pidgin/gtkblist.c:3097
 msgid "/Tools/Pr_ivacy"
 msgstr "/Verktøy/_Sikkerhet"
 
-#: ../pidgin/gtkblist.c:2901
+#: ../pidgin/gtkblist.c:3099
 msgid "/Tools/_File Transfers"
-msgstr "/Verktøy/_Filoverføringer..."
-
-#: ../pidgin/gtkblist.c:2902
+msgstr "/Verktøy/_Filoverføringer"
+
+#: ../pidgin/gtkblist.c:3100
 msgid "/Tools/R_oom List"
-msgstr "/Verktøy/_Romliste"
-
-#: ../pidgin/gtkblist.c:2903
-#, fuzzy
+msgstr "/Verktøy/R_omliste"
+
+#: ../pidgin/gtkblist.c:3101
 msgid "/Tools/System _Log"
-msgstr "/Verktøy/_Vis systemlogg"
-
-#: ../pidgin/gtkblist.c:2905
-#, fuzzy
+msgstr "/Verktøy/System _Logg"
+
+#: ../pidgin/gtkblist.c:3103
 msgid "/Tools/Mute _Sounds"
-msgstr "Skru av lyder"
+msgstr "/Verktøy/_Skru av lyder"
 
 #. Help
-#: ../pidgin/gtkblist.c:2907
+#: ../pidgin/gtkblist.c:3105
 msgid "/_Help"
 msgstr "/_Hjelp"
 
-#: ../pidgin/gtkblist.c:2908
+#: ../pidgin/gtkblist.c:3106
 msgid "/Help/Online _Help"
-msgstr "/Hjelp/Hjelp på _nettet"
-
-#: ../pidgin/gtkblist.c:2909
+msgstr "/Hjelp/Hjelp på _Nettet"
+
+#: ../pidgin/gtkblist.c:3107
 msgid "/Help/_Debug Window"
 msgstr "/Hjelp/_Avlusningsvindu"
 
-#: ../pidgin/gtkblist.c:2911 ../pidgin/gtkblist.c:2913
+#: ../pidgin/gtkblist.c:3109
+#: ../pidgin/gtkblist.c:3111
 msgid "/Help/_About"
 msgstr "/Hjelp/_Om"
 
-#: ../pidgin/gtkblist.c:2942
+#: ../pidgin/gtkblist.c:3140
 #, c-format
 msgid ""
 "\n"
@@ -14423,699 +13917,647 @@
 "\n"
 "<b>Konto:</b> %s"
 
-#: ../pidgin/gtkblist.c:3020
-#, fuzzy
+#: ../pidgin/gtkblist.c:3218
 msgid "Buddy Alias"
-msgstr "Kontaktliste"
-
-#: ../pidgin/gtkblist.c:3049
-#, fuzzy
+msgstr "Kontaktalias"
+
+#: ../pidgin/gtkblist.c:3247
 msgid "Logged In"
-msgstr "Logget ut"
-
-#: ../pidgin/gtkblist.c:3095
-#, fuzzy
+msgstr "Logget inn"
+
+#: ../pidgin/gtkblist.c:3293
 msgid "Last Seen"
-msgstr "Etternavn:"
-
-#: ../pidgin/gtkblist.c:3116
+msgstr "Sist sett"
+
+#: ../pidgin/gtkblist.c:3314
 msgid "Spooky"
-msgstr ""
-
-#: ../pidgin/gtkblist.c:3118
+msgstr "Skummelt"
+
+#: ../pidgin/gtkblist.c:3316
 msgid "Awesome"
-msgstr ""
-
-#: ../pidgin/gtkblist.c:3120
+msgstr "Fantastisk"
+
+#: ../pidgin/gtkblist.c:3318
 msgid "Rockin'"
-msgstr ""
-
-#: ../pidgin/gtkblist.c:3453
-#, fuzzy, c-format
+msgstr "Rocker"
+
+#: ../pidgin/gtkblist.c:3657
+#, c-format
 msgid "Idle %dd %dh %02dm"
-msgstr "Inaktiv (%dt%02dm) "
-
-#: ../pidgin/gtkblist.c:3455
-#, fuzzy, c-format
+msgstr "Inaktiv %dd %dh %02dm"
+
+#: ../pidgin/gtkblist.c:3659
+#, c-format
 msgid "Idle %dh %02dm"
-msgstr "Inaktiv (%dt%02dm) "
-
-#: ../pidgin/gtkblist.c:3457
-#, fuzzy, c-format
+msgstr "Inaktiv %dh %02dm"
+
+#: ../pidgin/gtkblist.c:3661
+#, c-format
 msgid "Idle %dm"
-msgstr "Inaktiv (%dm) "
-
-#: ../pidgin/gtkblist.c:3602
-#, fuzzy
+msgstr "Inaktiv %dm"
+
+#: ../pidgin/gtkblist.c:3806
 msgid "/Buddies/New Instant Message..."
-msgstr "/Kontakter/_Ny direktemelding..."
-
-#: ../pidgin/gtkblist.c:3603 ../pidgin/gtkblist.c:3636
+msgstr "/Kontakter/Ny direktemelding..."
+
+#: ../pidgin/gtkblist.c:3807
+#: ../pidgin/gtkblist.c:3840
 msgid "/Buddies/Join a Chat..."
-msgstr "/Kontakter/_Bli med i samtalegruppe..."
-
-#: ../pidgin/gtkblist.c:3604
-#, fuzzy
+msgstr "/Kontakter/Bli med i samtalegruppe..."
+
+#: ../pidgin/gtkblist.c:3808
 msgid "/Buddies/Get User Info..."
-msgstr "/Kontakter/_Hent brukerinfo..."
-
-#: ../pidgin/gtkblist.c:3605
-#, fuzzy
+msgstr "/Kontakter/Hent brukerinfo..."
+
+#: ../pidgin/gtkblist.c:3809
 msgid "/Buddies/Add Buddy..."
-msgstr "/Kontakter/_Legg til kompis..."
-
-#: ../pidgin/gtkblist.c:3606 ../pidgin/gtkblist.c:3639
-#, fuzzy
+msgstr "/Kontakter/Legg til kontakt..."
+
+#: ../pidgin/gtkblist.c:3810
+#: ../pidgin/gtkblist.c:3843
 msgid "/Buddies/Add Chat..."
-msgstr "/Kontakter/Legg til _samtalegruppe..."
-
-#: ../pidgin/gtkblist.c:3607
-#, fuzzy
+msgstr "/Kontakter/Legg til samtalegruppe..."
+
+#: ../pidgin/gtkblist.c:3811
 msgid "/Buddies/Add Group..."
-msgstr "/Kontakter/Legg til _gruppe..."
-
-#: ../pidgin/gtkblist.c:3642
+msgstr "/Kontakter/Legg til gruppe..."
+
+#: ../pidgin/gtkblist.c:3846
 msgid "/Tools/Privacy"
-msgstr "/Verktøy/Blo_kkeringer"
-
-#: ../pidgin/gtkblist.c:3645
+msgstr "/Verktøy/Blokkeringer"
+
+#: ../pidgin/gtkblist.c:3849
 msgid "/Tools/Room List"
-msgstr "/Verktøy/_Romliste"
-
-#: ../pidgin/gtkblist.c:3742 ../pidgin/gtkdocklet.c:153
-#, fuzzy, c-format
+msgstr "/Verktøy/Romliste"
+
+#: ../pidgin/gtkblist.c:3944
+#: ../pidgin/gtkdocklet.c:153
+#, c-format
 msgid "%d unread message from %s\n"
 msgid_plural "%d unread messages from %s\n"
-msgstr[0] "Melding fra %s"
-msgstr[1] "Melding fra %s"
-
-#: ../pidgin/gtkblist.c:3822
-#, fuzzy
+msgstr[0] "%d ulest beskjed fra %s\n"
+msgstr[1] "%d uleste beskjeder fra %s\n"
+
+#: ../pidgin/gtkblist.c:4104
 msgid "Manually"
-msgstr "Egendefinert"
-
-#: ../pidgin/gtkblist.c:3824
-#, fuzzy
-msgid "Alphabetically"
-msgstr "Alfabetisk"
-
-#: ../pidgin/gtkblist.c:3825
+msgstr "Manuelt"
+
+#: ../pidgin/gtkblist.c:4107
 msgid "By status"
 msgstr "Etter status"
 
-#: ../pidgin/gtkblist.c:3826
+#: ../pidgin/gtkblist.c:4108
 msgid "By log size"
 msgstr "Etter loggstørrelse"
 
-#: ../pidgin/gtkblist.c:4031 ../pidgin/gtkconn.c:179
-#, fuzzy, c-format
+#: ../pidgin/gtkblist.c:4313
+#: ../pidgin/gtkconn.c:180
+#, c-format
 msgid "%s disconnected"
-msgstr "Frakoblet."
-
-#: ../pidgin/gtkblist.c:4067
-#, fuzzy, c-format
+msgstr "%s koblet fra"
+
+#: ../pidgin/gtkblist.c:4349
+#, c-format
 msgid "<span color=\"red\">%s disconnected: %s</span>"
-msgstr ""
-"<span weight=\"bold\" size=\"larger\">%s har blitt koplet fra.</span>\n"
-"\n"
-"%s\n"
-"%s"
-
-#: ../pidgin/gtkblist.c:4219
-#, fuzzy
+msgstr "<span color=\"red\">%s koblet fra: %s</span>"
+
+#: ../pidgin/gtkblist.c:4501
 msgid "<b>Username:</b>"
-msgstr ""
-"\n"
-"<b>Advart:</b>"
-
-#: ../pidgin/gtkblist.c:4226
-#, fuzzy
+msgstr "<b>Brukernavn:</b>"
+
+#: ../pidgin/gtkblist.c:4508
 msgid "<b>Password:</b>"
-msgstr "<b>_Passord:</b>"
-
-#: ../pidgin/gtkblist.c:4237
-#, fuzzy
+msgstr "<b>Passord:</b>"
+
+#: ../pidgin/gtkblist.c:4519
 msgid "_Login"
-msgstr "Innlogging"
-
-#: ../pidgin/gtkblist.c:4320
-#, fuzzy
+msgstr "_Innlogging"
+
+#: ../pidgin/gtkblist.c:4602
 msgid "/Accounts"
-msgstr "Kontoer"
+msgstr "/Kontoer"
 
 #. Translators: Please maintain the use of -> and <- to refer to menu heirarchy
-#: ../pidgin/gtkblist.c:4334
+#: ../pidgin/gtkblist.c:4616
 #, 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 "
-"able to sign on, set your status, and talk to your friends."
-msgstr ""
+"You have no accounts enabled. Enable your IM accounts from the <b>Accounts</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 weight='bold' size='larger'>Velkommen til  %s!</span>\n"
+"\n"
+"Du har ingen konter slått på. Slå på dine Lynmeldings kontoer fra <b>Kontoer</b> vinduet ved <b>Kontoer->Administrere</b>. Når du har slått på kontoene kan du logge inn, sette din status og snakke med dine venner."
 
 #. set the Show Offline Buddies option. must be done
 #. * after the treeview or faceprint gets mad. -Robot101
 #.
-#: ../pidgin/gtkblist.c:4597
-#, fuzzy
+#: ../pidgin/gtkblist.c:4879
 msgid "/Buddies/Show/Offline Buddies"
-msgstr "/Kontakter/Vis _avloggede kontakter"
-
-#: ../pidgin/gtkblist.c:4600
-#, fuzzy
+msgstr "/Kontakter/Vis/Avloggede kontakter"
+
+#: ../pidgin/gtkblist.c:4882
 msgid "/Buddies/Show/Empty Groups"
-msgstr "/Kontakter/Vis tomme grupper"
-
-#: ../pidgin/gtkblist.c:4606
-#, fuzzy
+msgstr "/Kontakter/Vis/Tomme grupper"
+
+#: ../pidgin/gtkblist.c:4888
 msgid "/Buddies/Show/Buddy Details"
-msgstr "/Kontakter/Vis _avloggede kontakter"
-
-#: ../pidgin/gtkblist.c:4609
-#, fuzzy
+msgstr "/Kontakter/Vis/Kontaktdetaljer"
+
+#: ../pidgin/gtkblist.c:4891
 msgid "/Buddies/Show/Idle Times"
-msgstr "/Kontakter/Vis _avloggede kontakter"
-
-#: ../pidgin/gtkblist.c:4612
-#, fuzzy
+msgstr "/Kontakter/Vis/Fraværstider"
+
+#: ../pidgin/gtkblist.c:4894
 msgid "/Buddies/Show/Protocol Icons"
-msgstr "/Kontakter/Vis tomme grupper"
-
-#: ../pidgin/gtkblist.c:5507
-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. "
-"The alias will be displayed in place of the screen name whenever possible.\n"
-msgstr ""
-"Vennligst skriv inn skjermnavnet til den personen som du vil legge til i "
-"kontaktlisten din. I tillegg kan du skrive inn et alias, eller kallenavn, "
-"for kontakten. Aliaset vil bli vist i stedet for skjermnavnet der det er "
-"mulig.\n"
+msgstr "/Kontakter/Vis/Protokoll Ikoner"
+
+#: ../pidgin/gtkblist.c:5796
+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. The alias will be displayed in place of the screen name whenever possible.\n"
+msgstr "Vennligst skriv inn skjermnavnet til den personen som du vil legge til i kontaktlisten din. I tillegg kan du skrive inn et alias, eller kallenavn, for kontakten. Aliaset vil bli vist i stedet for skjermnavnet der det er mulig.\n"
+
+#. Set up stuff for the account box
+#: ../pidgin/gtkblist.c:5819
+msgid "A_ccount:"
+msgstr "K_onto:"
 
 #. End of account box
-#: ../pidgin/gtkblist.c:5542
-#, fuzzy
+#: ../pidgin/gtkblist.c:5831
 msgid "_Screen name:"
-msgstr "_Skjermnavn"
-
-#: ../pidgin/gtkblist.c:5564 ../pidgin/gtkblist.c:5914
-#, fuzzy
+msgstr "_Skjermnavn:"
+
+#: ../pidgin/gtkblist.c:5853
+#: ../pidgin/gtkblist.c:6209
 msgid "A_lias:"
-msgstr "Alias:"
-
-#: ../pidgin/gtkblist.c:5826
+msgstr "A_lias:"
+
+#: ../pidgin/gtkblist.c:6121
 msgid "This protocol does not support chat rooms."
-msgstr "Denne protokollversjonen støtter ikke samtalerom"
-
-#: ../pidgin/gtkblist.c:5842
-msgid ""
-"You are not currently signed on with any protocols that have the ability to "
-"chat."
+msgstr "Denne protokollversjonen støtter ikke samtalerom."
+
+#: ../pidgin/gtkblist.c:6137
+msgid "You are not currently signed on with any protocols that have the ability to chat."
 msgstr "Du er ikke pålogget med noen protokoller som støtter samtalegrupper."
 
-#: ../pidgin/gtkblist.c:5883
-msgid ""
-"Please enter an alias, and the appropriate information about the chat you "
-"would like to add to your buddy list.\n"
-msgstr ""
-"Vennligst skriv inn et aliasnavn og annen informasjon for samtalegruppen.\n"
-
-#: ../pidgin/gtkblist.c:5964
+#: ../pidgin/gtkblist.c:6178
+msgid "Please enter an alias, and the appropriate information about the chat you would like to add to your buddy list.\n"
+msgstr "Vennligst skriv inn et aliasnavn og annen informasjon for samtalegruppen.\n"
+
+#: ../pidgin/gtkblist.c:6237
+msgid "Autojoin when account becomes online."
+msgstr "Autotilknytt når konto er tilkoblet."
+
+#: ../pidgin/gtkblist.c:6238
+msgid "Hide chat when the window is closed."
+msgstr "Skjul samtale når vinduet er lukket."
+
+#: ../pidgin/gtkblist.c:6264
 msgid "Please enter the name of the group to be added."
 msgstr "Vennligst skriv inn navnet på gruppen som skal legges til."
 
-#: ../pidgin/gtkblist.c:6609
+#: ../pidgin/gtkblist.c:6909
 msgid "<PurpleMain>/Accounts/"
-msgstr ""
-
-#: ../pidgin/gtkblist.c:6633
-#, fuzzy
+msgstr "<PurpleMain>/Kontoer/"
+
+#: ../pidgin/gtkblist.c:6933
 msgid "_Edit Account"
-msgstr "Konto:"
-
-#: ../pidgin/gtkblist.c:6646 ../pidgin/gtkconv.c:3073
+msgstr "_Rediger konto"
+
+#: ../pidgin/gtkblist.c:6946
+#: ../pidgin/gtkconv.c:3136
 msgid "No actions available"
 msgstr "Ingen handlinger tilgjengelig"
 
-#: ../pidgin/gtkblist.c:6654
-#, fuzzy
+#: ../pidgin/gtkblist.c:6954
 msgid "_Disable"
-msgstr "Synlig"
-
-#
-#: ../pidgin/gtkblist.c:6666
-#, fuzzy
+msgstr "_Deaktiver"
+
+#: ../pidgin/gtkblist.c:6966
 msgid "Enable Account"
-msgstr "Konto"
-
-#: ../pidgin/gtkblist.c:6672
+msgstr "Aktiver konto"
+
+#: ../pidgin/gtkblist.c:6972
 msgid "<PurpleMain>/Accounts/Enable Account"
-msgstr ""
-
-#: ../pidgin/gtkblist.c:6721
-#, fuzzy
+msgstr "<PurpleMain>/Kontoer/Aktiver konto"
+
+#: ../pidgin/gtkblist.c:7021
 msgid "/Tools"
-msgstr "/_Verktøy"
-
-#: ../pidgin/gtkblist.c:6791
-#, fuzzy
+msgstr "/Verktøy"
+
+#: ../pidgin/gtkblist.c:7091
 msgid "/Buddies/Sort Buddies"
-msgstr "/Kontakter/Vis _avloggede kontakter"
+msgstr "/Kontakter/Sorter kontakter"
 
 #. Widget creation function
 #: ../pidgin/gtkcertmgr.c:530
-#, fuzzy
 msgid "SSL Servers"
-msgstr "Tjener"
-
-#: ../pidgin/gtkconn.c:180
-#, fuzzy, c-format
+msgstr "SSL-tjenere"
+
+#: ../pidgin/gtkconn.c:181
+#, 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 ble avkoblet pga. en feil. %s Kontoen har blitt avstengt. Korriger feilen "
-"og slå på kontoen for å tilkoble."
-
-#: ../pidgin/gtkconv.c:482
-#, fuzzy
+"%s will not attempt to reconnect the account until you correct the error and re-enable the account."
+msgstr ""
+"%s \n"
+"\n"
+"%s vil ikke prøve og koble til kontoen igjen for du har rettet på feilen og slått på kontoen igjen."
+
+#: ../pidgin/gtkconv.c:523
 msgid "Unknown command."
-msgstr "Ukjent kommando:"
-
-#: ../pidgin/gtkconv.c:754 ../pidgin/gtkconv.c:780
-#, fuzzy
+msgstr "Ukjent kommando."
+
+#: ../pidgin/gtkconv.c:795
+#: ../pidgin/gtkconv.c:821
 msgid "That buddy is not on the same protocol as this chat."
-msgstr "Denne vennen er ikke på den samme protokollen som denne samtalegruppa"
-
-#: ../pidgin/gtkconv.c:774
-msgid ""
-"You are not currently signed on with an account that can invite that buddy."
-msgstr ""
-"Du er ikke pålogget pålogget med en konto som kan invitere denne kameraten."
-
-#: ../pidgin/gtkconv.c:827
+msgstr "Denne kontakten er ikke på den samme protokollen som denne samtalegruppa."
+
+#: ../pidgin/gtkconv.c:815
+msgid "You are not currently signed on with an account that can invite that buddy."
+msgstr "Du er ikke pålogget pålogget med en konto som kan invitere denne kontakten."
+
+#: ../pidgin/gtkconv.c:868
 msgid "Invite Buddy Into Chat Room"
-msgstr "Inviter kamerat inn i samtalerom"
+msgstr "Inviter kontakten inn i samtalerom"
 
 #. Put our happy label in it.
-#: ../pidgin/gtkconv.c:857
-msgid ""
-"Please enter the name of the user you wish to invite, along with an optional "
-"invite message."
-msgstr ""
-"Vennligst skriv inn navnet på brukeren som du vil invitere, og en eventuell "
-"invitasjonsbeskjed."
-
-#: ../pidgin/gtkconv.c:878
+#: ../pidgin/gtkconv.c:898
+msgid "Please enter the name of the user you wish to invite, along with an optional invite message."
+msgstr "Vennligst skriv inn navnet på brukeren som du vil invitere, og en eventuell invitasjonsbeskjed."
+
+#: ../pidgin/gtkconv.c:919
 msgid "_Buddy:"
-msgstr "Kontakt:"
-
-#: ../pidgin/gtkconv.c:889 ../pidgin/gtksavedstatuses.c:1194
+msgstr "_Kontakt:"
+
+#: ../pidgin/gtkconv.c:930
+#: ../pidgin/gtksavedstatuses.c:1194
 #: ../pidgin/gtksavedstatuses.c:1528
 msgid "_Message:"
-msgstr "Beskjed:"
-
-#: ../pidgin/gtkconv.c:947 ../pidgin/gtkconv.c:2598 ../pidgin/gtkdebug.c:219
+msgstr "_Beskjed:"
+
+#: ../pidgin/gtkconv.c:988
+#: ../pidgin/gtkconv.c:2657
+#: ../pidgin/gtkdebug.c:219
 #: ../pidgin/gtkft.c:543
 msgid "Unable to open file."
-msgstr "Klarte ikke åpne fil."
-
-#: ../pidgin/gtkconv.c:953
+msgstr "Kunne ikke ikke åpne fil."
+
+#: ../pidgin/gtkconv.c:994
 #, c-format
 msgid "<h1>Conversation with %s</h1>\n"
 msgstr "<h1>Samtale med %s</h1>\n"
 
-#: ../pidgin/gtkconv.c:991
+#: ../pidgin/gtkconv.c:1032
 msgid "Save Conversation"
 msgstr "Lagre samtale"
 
-#: ../pidgin/gtkconv.c:1140 ../pidgin/gtkdebug.c:167 ../pidgin/gtkdebug.c:743
+#: ../pidgin/gtkconv.c:1178
+#: ../pidgin/gtkdebug.c:167
+#: ../pidgin/gtkdebug.c:743
 msgid "Find"
 msgstr "Finn"
 
-#
-#: ../pidgin/gtkconv.c:1166 ../pidgin/gtkdebug.c:195
+#: ../pidgin/gtkconv.c:1204
+#: ../pidgin/gtkdebug.c:195
 msgid "_Search for:"
 msgstr "_Søk etter:"
 
-#: ../pidgin/gtkconv.c:1622
+#: ../pidgin/gtkconv.c:1675
 msgid "Un-Ignore"
 msgstr "Fjern ignorer"
 
-#: ../pidgin/gtkconv.c:1625
+#: ../pidgin/gtkconv.c:1678
 msgid "Ignore"
 msgstr "Ignorer"
 
-#: ../pidgin/gtkconv.c:1645
+#: ../pidgin/gtkconv.c:1698
 #, fuzzy
 msgid "Get Away Message"
 msgstr "Ny fraværsbeskjed"
 
-#: ../pidgin/gtkconv.c:1668
-#, fuzzy
+#: ../pidgin/gtkconv.c:1721
 msgid "Last said"
-msgstr "Etternavn:"
-
-#: ../pidgin/gtkconv.c:2606
+msgstr "Sa sist"
+
+#: ../pidgin/gtkconv.c:2665
 msgid "Unable to save icon file to disk."
 msgstr "Kan ikke lagre ikonfil til disk."
 
-#: ../pidgin/gtkconv.c:2657
+#: ../pidgin/gtkconv.c:2716
 msgid "Save Icon"
 msgstr "Lagre ikon"
 
-#
-#: ../pidgin/gtkconv.c:2709
+#: ../pidgin/gtkconv.c:2768
 msgid "Animate"
 msgstr "Animer"
 
-#: ../pidgin/gtkconv.c:2714
+#: ../pidgin/gtkconv.c:2773
 msgid "Hide Icon"
 msgstr "Skjul ikon"
 
-#: ../pidgin/gtkconv.c:2717
+#: ../pidgin/gtkconv.c:2776
 msgid "Save Icon As..."
 msgstr "Lagre ikon som..."
 
-#: ../pidgin/gtkconv.c:2721
-#, fuzzy
+#: ../pidgin/gtkconv.c:2780
 msgid "Set Custom Icon..."
-msgstr "Egendefinert"
-
-#
-#: ../pidgin/gtkconv.c:2734
-#, fuzzy
+msgstr "Velg eget ikon..."
+
+#: ../pidgin/gtkconv.c:2793
 msgid "Remove Custom Icon"
-msgstr "Fje_rn kontakt"
-
-#: ../pidgin/gtkconv.c:2861
+msgstr "Ta bort eget ikon"
+
+#: ../pidgin/gtkconv.c:2924
 msgid "Show All"
-msgstr ""
+msgstr "Vis alle"
 
 #. Conversation menu
-#: ../pidgin/gtkconv.c:2880
+#: ../pidgin/gtkconv.c:2943
 msgid "/_Conversation"
 msgstr "/_Samtale"
 
-#: ../pidgin/gtkconv.c:2882
+#: ../pidgin/gtkconv.c:2945
 msgid "/Conversation/New Instant _Message..."
-msgstr "/Samtale/Ny direktemelding..."
-
-#: ../pidgin/gtkconv.c:2887
+msgstr "/Samtale/Ny Direkte _Melding..."
+
+#: ../pidgin/gtkconv.c:2950
 msgid "/Conversation/_Find..."
 msgstr "/Samtale/_Finn..."
 
-#
-#: ../pidgin/gtkconv.c:2889
+#: ../pidgin/gtkconv.c:2952
 msgid "/Conversation/View _Log"
-msgstr "/Samtale/_Vis logg..."
-
-#: ../pidgin/gtkconv.c:2890
+msgstr "/Samtale/_Vis logg"
+
+#: ../pidgin/gtkconv.c:2953
 msgid "/Conversation/_Save As..."
 msgstr "/Samtale/_Lagre som..."
 
-#: ../pidgin/gtkconv.c:2892
-#, fuzzy
+#: ../pidgin/gtkconv.c:2955
 msgid "/Conversation/Clea_r Scrollback"
-msgstr "/Samtale/Tøm"
-
-#: ../pidgin/gtkconv.c:2896
+msgstr "/Samtale/Tø_m Tilbakeblikk"
+
+#: ../pidgin/gtkconv.c:2959
 msgid "/Conversation/Se_nd File..."
 msgstr "/Samtale/Se_nd fil..."
 
-#: ../pidgin/gtkconv.c:2897
+#: ../pidgin/gtkconv.c:2960
 msgid "/Conversation/Add Buddy _Pounce..."
-msgstr "/Samtale/Legg til _kompisvarsling"
-
-#: ../pidgin/gtkconv.c:2899
+msgstr "/Samtale/Legg til _kompisvarsling..."
+
+#: ../pidgin/gtkconv.c:2962
 msgid "/Conversation/_Get Info"
 msgstr "/Samtale/_Hent info"
 
-#: ../pidgin/gtkconv.c:2901
+#: ../pidgin/gtkconv.c:2964
 msgid "/Conversation/In_vite..."
-msgstr "/Samtale/_Inviter..."
-
-#: ../pidgin/gtkconv.c:2903
-#, fuzzy
+msgstr "/Samtale/In_viter..."
+
+#: ../pidgin/gtkconv.c:2966
 msgid "/Conversation/M_ore"
-msgstr "/Samtale/L_ukk"
-
-#: ../pidgin/gtkconv.c:2907
-#, fuzzy
+msgstr "/Samtale/M_ere"
+
+#: ../pidgin/gtkconv.c:2970
 msgid "/Conversation/Al_ias..."
-msgstr "/Samtale/Alias..."
-
-#: ../pidgin/gtkconv.c:2909
+msgstr "/Samtale/Al_ias..."
+
+#: ../pidgin/gtkconv.c:2972
 msgid "/Conversation/_Block..."
 msgstr "/Samtale/_Blokker..."
 
-#: ../pidgin/gtkconv.c:2911
-#, fuzzy
+#: ../pidgin/gtkconv.c:2974
 msgid "/Conversation/_Unblock..."
-msgstr "/Samtale/_Blokker..."
-
-#: ../pidgin/gtkconv.c:2913
+msgstr "/Samtale/_Fjern blokkering..."
+
+#: ../pidgin/gtkconv.c:2976
 msgid "/Conversation/_Add..."
 msgstr "/Samtale/_Legg til..."
 
-#: ../pidgin/gtkconv.c:2915
+#: ../pidgin/gtkconv.c:2978
 msgid "/Conversation/_Remove..."
 msgstr "/Samtale/_Fjern..."
 
-#: ../pidgin/gtkconv.c:2920
+#: ../pidgin/gtkconv.c:2983
 msgid "/Conversation/Insert Lin_k..."
-msgstr "/Samtale/Sett inn len_ke..."
-
-#: ../pidgin/gtkconv.c:2922
+msgstr "/Samtale/Sett inn Len_ke..."
+
+#: ../pidgin/gtkconv.c:2985
 msgid "/Conversation/Insert Imag_e..."
-msgstr "/Samtale/Sett inn bild_e..."
-
-#: ../pidgin/gtkconv.c:2928
+msgstr "/Samtale/Sett inn Bild_e..."
+
+#: ../pidgin/gtkconv.c:2991
 msgid "/Conversation/_Close"
 msgstr "/Samtale/L_ukk"
 
 #. Options
-#: ../pidgin/gtkconv.c:2932
+#: ../pidgin/gtkconv.c:2995
 msgid "/_Options"
 msgstr "/_Brukervalg"
 
-#: ../pidgin/gtkconv.c:2933
+#: ../pidgin/gtkconv.c:2996
 msgid "/Options/Enable _Logging"
-msgstr "/Brukervalg/Slå på _logging"
-
-#: ../pidgin/gtkconv.c:2934
+msgstr "/Brukervalg/Slå på _Logging"
+
+#: ../pidgin/gtkconv.c:2997
 msgid "/Options/Enable _Sounds"
-msgstr "/Brukervalg/Slå på l_yder"
-
-#: ../pidgin/gtkconv.c:2936
-#, fuzzy
+msgstr "/Brukervalg/Slå på _Lyder"
+
+#: ../pidgin/gtkconv.c:2999
 msgid "/Options/Show Formatting _Toolbars"
-msgstr "/Brukervalg/Vis _formateringsverktøy"
-
-#: ../pidgin/gtkconv.c:2937
-#, fuzzy
+msgstr "/Brukervalg/Vis Formaterings _Verktøylinje"
+
+#: ../pidgin/gtkconv.c:3000
 msgid "/Options/Show Ti_mestamps"
-msgstr "/Brukervalg/Vis tidsstempler"
-
-#: ../pidgin/gtkconv.c:3061
-#, fuzzy
+msgstr "/Brukervalg/Vis Ti_dsstempler"
+
+#: ../pidgin/gtkconv.c:3124
 msgid "/Conversation/More"
-msgstr "/Samtale/L_ukk"
-
-#: ../pidgin/gtkconv.c:3117
-#, fuzzy
+msgstr "/Samtale/Mere"
+
+#: ../pidgin/gtkconv.c:3180
 msgid "/Options"
-msgstr "/_Brukervalg"
+msgstr "/Brukervalg"
 
 #. The menubar has been deactivated. Make sure the 'More' submenu is regenerated next time
 #. * the 'Conversation' menu pops up.
 #. 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
-#, fuzzy
+#: ../pidgin/gtkconv.c:3215
+#: ../pidgin/gtkconv.c:3247
 msgid "/Conversation"
-msgstr "/_Samtale"
+msgstr "/Samtale"
 
 #
-#: ../pidgin/gtkconv.c:3192
+#: ../pidgin/gtkconv.c:3255
 msgid "/Conversation/View Log"
 msgstr "/Samtale/Vis logg"
 
-#: ../pidgin/gtkconv.c:3198
+#: ../pidgin/gtkconv.c:3261
 msgid "/Conversation/Send File..."
 msgstr "/Samtale/Send fil..."
 
-#: ../pidgin/gtkconv.c:3202
+#: ../pidgin/gtkconv.c:3265
 msgid "/Conversation/Add Buddy Pounce..."
 msgstr "/Samtale/Legg til kompisvarsling..."
 
-#: ../pidgin/gtkconv.c:3208
+#: ../pidgin/gtkconv.c:3271
 msgid "/Conversation/Get Info"
 msgstr "/Samtale/Hent info"
 
-#: ../pidgin/gtkconv.c:3212
+#: ../pidgin/gtkconv.c:3275
 msgid "/Conversation/Invite..."
 msgstr "/Samtale/Inviter..."
 
-#: ../pidgin/gtkconv.c:3218
+#: ../pidgin/gtkconv.c:3281
 msgid "/Conversation/Alias..."
 msgstr "/Samtale/Alias..."
 
-#: ../pidgin/gtkconv.c:3222
+#: ../pidgin/gtkconv.c:3285
 msgid "/Conversation/Block..."
 msgstr "/Samtale/Blokker..."
 
-#: ../pidgin/gtkconv.c:3226
-#, fuzzy
+#: ../pidgin/gtkconv.c:3289
 msgid "/Conversation/Unblock..."
-msgstr "/Samtale/Blokker..."
-
-#: ../pidgin/gtkconv.c:3230
+msgstr "/Samtale/Fjern blokkering..."
+
+#: ../pidgin/gtkconv.c:3293
 msgid "/Conversation/Add..."
 msgstr "/Samtale/Legg til..."
 
-#: ../pidgin/gtkconv.c:3234
+#: ../pidgin/gtkconv.c:3297
 msgid "/Conversation/Remove..."
 msgstr "/Samtale/Fjern..."
 
-#: ../pidgin/gtkconv.c:3240
+#: ../pidgin/gtkconv.c:3303
 msgid "/Conversation/Insert Link..."
-msgstr "/Samtale/Sett inn lenke"
-
-#: ../pidgin/gtkconv.c:3244
+msgstr "/Samtale/Sett inn lenke..."
+
+#: ../pidgin/gtkconv.c:3307
 msgid "/Conversation/Insert Image..."
 msgstr "/Samtale/Sett inn bilde..."
 
-#: ../pidgin/gtkconv.c:3250
+#: ../pidgin/gtkconv.c:3313
 msgid "/Options/Enable Logging"
 msgstr "/Brukervalg/Slå på logging"
 
-#: ../pidgin/gtkconv.c:3253
+#: ../pidgin/gtkconv.c:3316
 msgid "/Options/Enable Sounds"
 msgstr "/Brukervalg/Slå på lyder"
 
-#: ../pidgin/gtkconv.c:3266
-#, fuzzy
+#: ../pidgin/gtkconv.c:3329
 msgid "/Options/Show Formatting Toolbars"
 msgstr "/Brukervalg/Vis formateringsverktøy"
 
-#: ../pidgin/gtkconv.c:3269
+#: ../pidgin/gtkconv.c:3332
 msgid "/Options/Show Timestamps"
 msgstr "/Brukervalg/Vis tidsstempler"
 
-#: ../pidgin/gtkconv.c:3346 ../pidgin/gtkconv.c:3388
+#: ../pidgin/gtkconv.c:3409
+#: ../pidgin/gtkconv.c:3451
 msgid "User is typing..."
 msgstr "Brukeren skriver en melding..."
 
-#: ../pidgin/gtkconv.c:3391
-#, fuzzy
+#: ../pidgin/gtkconv.c:3454
 msgid "User has typed something and stopped"
-msgstr "Brukeren har skrevet noe og tatt pause"
+msgstr "Brukeren har skrevet noe og pauset"
 
 #. Build the Send To menu
-#: ../pidgin/gtkconv.c:3574 ../pidgin/gtkconv.c:8022
-#, fuzzy
-msgid "_Send To"
-msgstr "Send som"
-
-#: ../pidgin/gtkconv.c:4286
-#, fuzzy
+#: ../pidgin/gtkconv.c:3637
+#: ../pidgin/gtkconv.c:8103
+msgid "S_end To"
+msgstr "S_end til"
+
+#: ../pidgin/gtkconv.c:4349
 msgid "_Send"
-msgstr "Send"
+msgstr "_Send"
 
 #. Setup the label telling how many people are in the room.
-#: ../pidgin/gtkconv.c:4390
+#: ../pidgin/gtkconv.c:4453
 msgid "0 people in room"
 msgstr "0 brukere i rommet"
 
-#: ../pidgin/gtkconv.c:5759 ../pidgin/gtkconv.c:5880
+#: ../pidgin/gtkconv.c:5823
+#: ../pidgin/gtkconv.c:5944
 #, c-format
 msgid "%d person in room"
 msgid_plural "%d people in room"
-msgstr[0] "%d person i rommet"
+msgstr[0] "%d personer i rommet"
 msgstr[1] "%d personer i rommet"
 
-#: ../pidgin/gtkconv.c:6486 ../pidgin/gtkstatusbox.c:660
-#, fuzzy
+#: ../pidgin/gtkconv.c:6550
+#: ../pidgin/gtkstatusbox.c:660
 msgid "Typing"
-msgstr "Ping"
-
-#: ../pidgin/gtkconv.c:6490
-#, fuzzy
+msgstr "Skriver"
+
+#: ../pidgin/gtkconv.c:6554
 msgid "Stopped Typing"
-msgstr "Ping"
-
-#: ../pidgin/gtkconv.c:6493
+msgstr "Stoppet å skrive"
+
+#: ../pidgin/gtkconv.c:6557
 #, fuzzy
 msgid "Nick Said"
 msgstr "Kallenavn"
 
-#: ../pidgin/gtkconv.c:6496 ../pidgin/gtkdocklet.c:492
-#, fuzzy
+#: ../pidgin/gtkconv.c:6560
+#: ../pidgin/gtkdocklet.c:492
 msgid "Unread Messages"
-msgstr "Send beskjed"
-
-#: ../pidgin/gtkconv.c:6499
-#, fuzzy
+msgstr "Uleste beskjeder"
+
+#: ../pidgin/gtkconv.c:6563
 msgid "New Event"
-msgstr "Hendelse"
-
-#: ../pidgin/gtkconv.c:7572
-#, fuzzy
+msgstr "Ny hendelse"
+
+#: ../pidgin/gtkconv.c:7654
 msgid "clear: Clears all conversation scrollbacks."
-msgstr "%s har lukket samtalevinduet."
-
-#: ../pidgin/gtkconv.c:7736
-#, fuzzy
+msgstr "clear: Renser alle samtaler i tilbakeblikk."
+
+#: ../pidgin/gtkconv.c:7817
 msgid "Confirm close"
-msgstr "Bekrefte konto"
-
-#: ../pidgin/gtkconv.c:7768
-#, fuzzy
+msgstr "Bekrefte lukking"
+
+#: ../pidgin/gtkconv.c:7849
 msgid "You have unread messages. Are you sure you want to close the window?"
-msgstr "Er du sikker på at du vil slette %s?"
-
-#: ../pidgin/gtkconv.c:8355
+msgstr "Du har uleste beskjeder. Er du sikker på at du vil lukke vinduet?"
+
+#: ../pidgin/gtkconv.c:8436
 msgid "Close other tabs"
-msgstr ""
-
-#: ../pidgin/gtkconv.c:8361
+msgstr "Lukk andre faner"
+
+#: ../pidgin/gtkconv.c:8442
 msgid "Close all tabs"
-msgstr ""
-
-#: ../pidgin/gtkconv.c:8369
+msgstr "Lukk alle faner"
+
+#: ../pidgin/gtkconv.c:8450
 msgid "Detach this tab"
-msgstr ""
-
-#: ../pidgin/gtkconv.c:8375
+msgstr "Koble fra denne fanen"
+
+#: ../pidgin/gtkconv.c:8456
 msgid "Close this tab"
-msgstr ""
-
-#: ../pidgin/gtkconv.c:8875
+msgstr "Lukk denne fanen"
+
+#: ../pidgin/gtkconv.c:8951
 msgid "Close conversation"
 msgstr "Lukk samtalen"
 
-#: ../pidgin/gtkconv.c:9477
+#: ../pidgin/gtkconv.c:9553
 msgid "Last created window"
-msgstr "Sist lagde vindu"
-
-#: ../pidgin/gtkconv.c:9479
+msgstr "Sist opprettede vindu"
+
+#: ../pidgin/gtkconv.c:9555
 msgid "Separate IM and Chat windows"
-msgstr "Skill direktemeldings- og gruppesamtalevinduer."
-
-#: ../pidgin/gtkconv.c:9481 ../pidgin/gtkprefs.c:1415
+msgstr "Skill direktemeldings- og gruppesamtalevinduer"
+
+#: ../pidgin/gtkconv.c:9557
+#: ../pidgin/gtkprefs.c:1417
 msgid "New window"
 msgstr "Nytt vindu"
 
-#: ../pidgin/gtkconv.c:9483
+#: ../pidgin/gtkconv.c:9559
 msgid "By group"
 msgstr "Etter gruppe"
 
-#: ../pidgin/gtkconv.c:9485
+#: ../pidgin/gtkconv.c:9561
 msgid "By account"
 msgstr "Etter konto"
 
@@ -15124,9 +14566,8 @@
 msgstr "Lagre avlusningslogg"
 
 #: ../pidgin/gtkdebug.c:582
-#, fuzzy
 msgid "Invert"
-msgstr "Sett _inn"
+msgstr "Inverter"
 
 #: ../pidgin/gtkdebug.c:585
 msgid "Highlight matches"
@@ -15134,70 +14575,74 @@
 
 #: ../pidgin/gtkdebug.c:652
 msgid "_Icon Only"
-msgstr ""
+msgstr "Bare _Ikon"
 
 #: ../pidgin/gtkdebug.c:653
 msgid "_Text Only"
-msgstr ""
+msgstr "Bare _Tekst"
 
 #: ../pidgin/gtkdebug.c:654
 msgid "_Both Icon & Text"
-msgstr ""
+msgstr "_Både Ikon og Tekst"
 
 #: ../pidgin/gtkdebug.c:775
-#, fuzzy
 msgid "Filter"
-msgstr "Feilet."
+msgstr "Filter"
 
 #: ../pidgin/gtkdebug.c:794
-#, fuzzy
 msgid "Right click for more options."
-msgstr "Vis flere valg"
+msgstr "Høyreklikk for flere valg."
 
 #: ../pidgin/gtkdebug.c:824
 msgid "Level "
-msgstr ""
-
-#: ../pidgin/gtkdebug.c:825 ../pidgin/gtkdebug.c:831
+msgstr "Nivå"
+
+#: ../pidgin/gtkdebug.c:825
+#: ../pidgin/gtkdebug.c:831
 msgid "Select the debug filter level."
-msgstr ""
+msgstr "Velg nivå for debug."
 
 #: ../pidgin/gtkdebug.c:833
-#, fuzzy
 msgid "All"
-msgstr "Tillat"
+msgstr "Alle"
 
 #: ../pidgin/gtkdebug.c:834
 msgid "Misc"
-msgstr ""
+msgstr "Diverse"
 
 #: ../pidgin/gtkdebug.c:836
-#, fuzzy
 msgid "Warning"
-msgstr "Advar"
+msgstr "Advarsel"
 
 #: ../pidgin/gtkdebug.c:837
-#, fuzzy
 msgid "Error "
 msgstr "Feil"
 
 #: ../pidgin/gtkdebug.c:838
-#, fuzzy
 msgid "Fatal Error"
-msgstr "Intern feil"
-
-#: ../pidgin/gtkdialogs.c:72 ../pidgin/gtkdialogs.c:117
+msgstr "Alvorlig feil"
+
+#: ../pidgin/gtkdialogs.c:72
+#: ../pidgin/gtkdialogs.c:117
 msgid "lead developer"
 msgstr "hovedutvikler"
 
-#: ../pidgin/gtkdialogs.c:73 ../pidgin/gtkdialogs.c:74
-#: ../pidgin/gtkdialogs.c:75 ../pidgin/gtkdialogs.c:76
-#: ../pidgin/gtkdialogs.c:77 ../pidgin/gtkdialogs.c:78
-#: ../pidgin/gtkdialogs.c:79 ../pidgin/gtkdialogs.c:80
-#: ../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:73
+#: ../pidgin/gtkdialogs.c:74
+#: ../pidgin/gtkdialogs.c:75
+#: ../pidgin/gtkdialogs.c:76
+#: ../pidgin/gtkdialogs.c:77
+#: ../pidgin/gtkdialogs.c:78
+#: ../pidgin/gtkdialogs.c:79
+#: ../pidgin/gtkdialogs.c:80
+#: ../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
 msgid "developer"
 msgstr "utvikler"
@@ -15207,110 +14652,111 @@
 msgid "support"
 msgstr "støtte"
 
-#
 #: ../pidgin/gtkdialogs.c:88
-#, fuzzy
 msgid "support/QA"
-msgstr "støtte"
-
-#: ../pidgin/gtkdialogs.c:90 ../pidgin/gtkdialogs.c:112
+msgstr "støtte/QA"
+
+#: ../pidgin/gtkdialogs.c:90
+#: ../pidgin/gtkdialogs.c:112
 msgid "developer & webmaster"
 msgstr "utvikler og vevansvarlig"
 
 #: ../pidgin/gtkdialogs.c:99
 msgid "Senior Contributor/QA"
-msgstr ""
+msgstr "Senior Contributor/QA"
 
 #: ../pidgin/gtkdialogs.c:108
 msgid "win32 port"
-msgstr "windows-versjon"
-
-#
-#: ../pidgin/gtkdialogs.c:109 ../pidgin/gtkdialogs.c:110
+msgstr "win32 portering"
+
+#: ../pidgin/gtkdialogs.c:109
+#: ../pidgin/gtkdialogs.c:110
 msgid "maintainer"
 msgstr "ansvarlig"
 
 #: ../pidgin/gtkdialogs.c:111
-#, fuzzy
 msgid "libfaim maintainer"
-msgstr "tidligere libfaim-ansvarlig"
+msgstr "libfaim-ansvarlig"
 
 #. If "lazy bum" translates literally into a serious insult, use something else or omit it.
 #: ../pidgin/gtkdialogs.c:114
 msgid "hacker and designated driver [lazy bum]"
-msgstr "hacker og sjåfør (avslappet fyr)"
+msgstr "hacker og sjåfør [avslappet fyr]"
 
 #: ../pidgin/gtkdialogs.c:115
-#, fuzzy
 msgid "XMPP developer"
-msgstr "utvikler"
-
-#
+msgstr "XMPP-utvikler"
+
 #: ../pidgin/gtkdialogs.c:116
 msgid "original author"
 msgstr "opprinnelig laget av"
 
 #: ../pidgin/gtkdialogs.c:133
 msgid "Afrikaans"
-msgstr ""
-
-#
-#: ../pidgin/gtkdialogs.c:134 ../pidgin/gtkdialogs.c:226
-#, fuzzy
+msgstr "Afrikaans"
+
+#: ../pidgin/gtkdialogs.c:134
 msgid "Arabic"
-msgstr "Amharisk"
+msgstr "Arabisk"
 
 #: ../pidgin/gtkdialogs.c:135
 msgid "Belarusian Latin"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:136 ../pidgin/gtkdialogs.c:137
-#: ../pidgin/gtkdialogs.c:227
+msgstr "Belarusian Latin"
+
+#: ../pidgin/gtkdialogs.c:136
+#: ../pidgin/gtkdialogs.c:137
+#: ../pidgin/gtkdialogs.c:224
 msgid "Bulgarian"
 msgstr "Bulgarsk"
 
-#: ../pidgin/gtkdialogs.c:138 ../pidgin/gtkdialogs.c:139
-#: ../pidgin/gtkdialogs.c:140 ../pidgin/gtkdialogs.c:141
+#: ../pidgin/gtkdialogs.c:138
+#: ../pidgin/gtkdialogs.c:139
+#: ../pidgin/gtkdialogs.c:140
+#: ../pidgin/gtkdialogs.c:141
 msgid "Bengali"
-msgstr ""
-
-#
+msgstr "Bengali"
+
 #: ../pidgin/gtkdialogs.c:142
-#, fuzzy
 msgid "Bosnian"
-msgstr "Estisk"
-
-#: ../pidgin/gtkdialogs.c:143 ../pidgin/gtkdialogs.c:228
-#: ../pidgin/gtkdialogs.c:229
+msgstr "Bosnisk"
+
+#: ../pidgin/gtkdialogs.c:143
+#: ../pidgin/gtkdialogs.c:225
+#: ../pidgin/gtkdialogs.c:226
 msgid "Catalan"
 msgstr "Katalansk"
 
-#: ../pidgin/gtkdialogs.c:144 ../pidgin/gtkdialogs.c:145
+#: ../pidgin/gtkdialogs.c:144
+#: ../pidgin/gtkdialogs.c:145
 msgid "Valencian-Catalan"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:146 ../pidgin/gtkdialogs.c:230
+msgstr "Valencian-Catalan"
+
+#: ../pidgin/gtkdialogs.c:146
+#: ../pidgin/gtkdialogs.c:227
 msgid "Czech"
 msgstr "Tsjekkisk"
 
-#
-#: ../pidgin/gtkdialogs.c:147 ../pidgin/gtkdialogs.c:148
+#: ../pidgin/gtkdialogs.c:147
+#: ../pidgin/gtkdialogs.c:148
 msgid "Danish"
 msgstr "Dansk"
 
-#: ../pidgin/gtkdialogs.c:149 ../pidgin/gtkdialogs.c:150
-#: ../pidgin/gtkdialogs.c:231
+#: ../pidgin/gtkdialogs.c:149
+#: ../pidgin/gtkdialogs.c:150
+#: ../pidgin/gtkdialogs.c:228
 msgid "German"
 msgstr "Tysk"
 
-#: ../pidgin/gtkdialogs.c:151 ../pidgin/gtkdialogs.c:152
+#: ../pidgin/gtkdialogs.c:151
+#: ../pidgin/gtkdialogs.c:152
 #: ../pidgin/gtkdialogs.c:153
 msgid "Dzongkha"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:154 ../pidgin/gtkdialogs.c:155
+msgstr "Dzongkha"
+
+#: ../pidgin/gtkdialogs.c:154
+#: ../pidgin/gtkdialogs.c:155
 msgid "Greek"
-msgstr ""
+msgstr "Gresk"
 
 #: ../pidgin/gtkdialogs.c:156
 msgid "Australian English"
@@ -15326,58 +14772,63 @@
 
 #: ../pidgin/gtkdialogs.c:159
 msgid "Esperanto"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:160 ../pidgin/gtkdialogs.c:232
-#: ../pidgin/gtkdialogs.c:233 ../pidgin/gtkdialogs.c:234
-#: ../pidgin/gtkdialogs.c:235
+msgstr "Esperanto"
+
+#: ../pidgin/gtkdialogs.c:160
+#: ../pidgin/gtkdialogs.c:229
+#: ../pidgin/gtkdialogs.c:230
+#: ../pidgin/gtkdialogs.c:231
+#: ../pidgin/gtkdialogs.c:232
 msgid "Spanish"
 msgstr "Spansk"
 
-#
 #: ../pidgin/gtkdialogs.c:161
-#, fuzzy
 msgid "Estonian"
 msgstr "Estisk"
 
-#: ../pidgin/gtkdialogs.c:162 ../pidgin/gtkdialogs.c:163
+#: ../pidgin/gtkdialogs.c:162
+#: ../pidgin/gtkdialogs.c:163
 msgid "Euskera(Basque)"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:164 ../pidgin/gtkdialogs.c:165
+msgstr "Euskera(Basque)"
+
+#: ../pidgin/gtkdialogs.c:164
+#: ../pidgin/gtkdialogs.c:165
 #: ../pidgin/gtkdialogs.c:166
 #, fuzzy
 msgid "Persian"
 msgstr "Serbisk"
 
-#
-#: ../pidgin/gtkdialogs.c:167 ../pidgin/gtkdialogs.c:236
-#: ../pidgin/gtkdialogs.c:237
+#: ../pidgin/gtkdialogs.c:167
+#: ../pidgin/gtkdialogs.c:233
+#: ../pidgin/gtkdialogs.c:234
 msgid "Finnish"
 msgstr "Finsk"
 
-#: ../pidgin/gtkdialogs.c:168 ../pidgin/gtkdialogs.c:238
-#: ../pidgin/gtkdialogs.c:239 ../pidgin/gtkdialogs.c:240
-#: ../pidgin/gtkdialogs.c:241
+#: ../pidgin/gtkdialogs.c:168
+#: ../pidgin/gtkdialogs.c:235
+#: ../pidgin/gtkdialogs.c:236
+#: ../pidgin/gtkdialogs.c:237
+#: ../pidgin/gtkdialogs.c:238
 msgid "French"
 msgstr "Fransk"
 
-#
-#: ../pidgin/gtkdialogs.c:169 ../pidgin/gtkdialogs.c:170
-#: ../pidgin/gtkdialogs.c:242
-#, fuzzy
+#: ../pidgin/gtkdialogs.c:169
+#: ../pidgin/gtkdialogs.c:170
+#: ../pidgin/gtkdialogs.c:239
 msgid "Galician"
-msgstr "Italiensk"
-
-#: ../pidgin/gtkdialogs.c:171 ../pidgin/gtkdialogs.c:172
+msgstr "Galisisk"
+
+#: ../pidgin/gtkdialogs.c:171
+#: ../pidgin/gtkdialogs.c:172
 msgid "Gujarati"
-msgstr ""
+msgstr "Gujarati"
 
 #: ../pidgin/gtkdialogs.c:172
 msgid "Gujarati Language Team"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:173 ../pidgin/gtkdialogs.c:243
+msgstr "Gujarati Language Team"
+
+#: ../pidgin/gtkdialogs.c:173
+#: ../pidgin/gtkdialogs.c:240
 msgid "Hebrew"
 msgstr "Hebraisk"
 
@@ -15385,29 +14836,31 @@
 msgid "Hindi"
 msgstr "Hindi"
 
-#: ../pidgin/gtkdialogs.c:175 ../pidgin/gtkdialogs.c:244
+#: ../pidgin/gtkdialogs.c:175
+#: ../pidgin/gtkdialogs.c:241
 msgid "Hungarian"
 msgstr "Ungarsk"
 
 #: ../pidgin/gtkdialogs.c:176
-#, fuzzy
 msgid "Indonesian"
-msgstr "Makedons"
-
-#
-#: ../pidgin/gtkdialogs.c:177 ../pidgin/gtkdialogs.c:245
+msgstr "Indonesisk"
+
+#: ../pidgin/gtkdialogs.c:177
+#: ../pidgin/gtkdialogs.c:242
 msgid "Italian"
 msgstr "Italiensk"
 
-#: ../pidgin/gtkdialogs.c:178 ../pidgin/gtkdialogs.c:246
-#: ../pidgin/gtkdialogs.c:247 ../pidgin/gtkdialogs.c:248
+#: ../pidgin/gtkdialogs.c:178
+#: ../pidgin/gtkdialogs.c:243
+#: ../pidgin/gtkdialogs.c:244
+#: ../pidgin/gtkdialogs.c:245
 msgid "Japanese"
 msgstr "Japansk"
 
-#: ../pidgin/gtkdialogs.c:179 ../pidgin/gtkdialogs.c:249
-#, fuzzy
+#: ../pidgin/gtkdialogs.c:179
+#: ../pidgin/gtkdialogs.c:246
 msgid "Georgian"
-msgstr "Tysk"
+msgstr "Georgisk"
 
 #: ../pidgin/gtkdialogs.c:179
 #, fuzzy
@@ -15415,378 +14868,328 @@
 msgstr "Aktive oversettere"
 
 #: ../pidgin/gtkdialogs.c:180
-#, fuzzy
 msgid "Kannada"
-msgstr "Bannlyst"
+msgstr "Kannada"
 
 #: ../pidgin/gtkdialogs.c:180
 msgid "Kannada Translation team"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:181 ../pidgin/gtkdialogs.c:250
-#: ../pidgin/gtkdialogs.c:251
+msgstr "Kannada Translation team"
+
+#: ../pidgin/gtkdialogs.c:181
+#: ../pidgin/gtkdialogs.c:247
+#: ../pidgin/gtkdialogs.c:248
 msgid "Korean"
 msgstr "Koreansk"
 
-#: ../pidgin/gtkdialogs.c:182 ../pidgin/gtkdialogs.c:183
+#: ../pidgin/gtkdialogs.c:182
+#: ../pidgin/gtkdialogs.c:183
 #: ../pidgin/gtkdialogs.c:184
-#, fuzzy
 msgid "Kurdish"
-msgstr "Tyrkisk"
+msgstr "Kurdisk"
 
 #: ../pidgin/gtkdialogs.c:185
-msgid "Lao"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:186 ../pidgin/gtkdialogs.c:252
-#: ../pidgin/gtkdialogs.c:253
+#: ../pidgin/gtkdialogs.c:249
+#: ../pidgin/gtkdialogs.c:250
 msgid "Lithuanian"
 msgstr "Litauisk"
 
-#: ../pidgin/gtkdialogs.c:187 ../pidgin/gtkdialogs.c:188
-#: ../pidgin/gtkdialogs.c:189 ../pidgin/gtkdialogs.c:254
+#: ../pidgin/gtkdialogs.c:186
+#: ../pidgin/gtkdialogs.c:187
+#: ../pidgin/gtkdialogs.c:251
 msgid "Macedonian"
 msgstr "Makedons"
 
-#: ../pidgin/gtkdialogs.c:190 ../pidgin/gtkdialogs.c:255
-#: ../pidgin/gtkdialogs.c:256
-#, fuzzy
+#: ../pidgin/gtkdialogs.c:188
+#: ../pidgin/gtkdialogs.c:252
 msgid "Bokmål Norwegian"
-msgstr "Norsk"
-
-#: ../pidgin/gtkdialogs.c:191
+msgstr "Norsk Bokmål"
+
+#: ../pidgin/gtkdialogs.c:189
 msgid "Nepali"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:192
+msgstr "Nepalsk"
+
+#: ../pidgin/gtkdialogs.c:190
 #, fuzzy
 msgid "Dutch, Flemish"
 msgstr "Nederlansk, flamsk"
 
-#: ../pidgin/gtkdialogs.c:193
-#, fuzzy
+#: ../pidgin/gtkdialogs.c:191
 msgid "Norwegian Nynorsk"
-msgstr "Norsk"
-
-#
-#: ../pidgin/gtkdialogs.c:194 ../pidgin/gtkdialogs.c:195
-#: ../pidgin/gtkdialogs.c:196 ../pidgin/gtkdialogs.c:257
+msgstr "Norsk Nynorsk"
+
+#: ../pidgin/gtkdialogs.c:192
+#: ../pidgin/gtkdialogs.c:193
+#: ../pidgin/gtkdialogs.c:194
+#: ../pidgin/gtkdialogs.c:253
 msgid "Polish"
 msgstr "Polsk"
 
-#: ../pidgin/gtkdialogs.c:197
+#: ../pidgin/gtkdialogs.c:195
 msgid "Portuguese"
 msgstr "Portugisisk"
 
-#: ../pidgin/gtkdialogs.c:198
+#: ../pidgin/gtkdialogs.c:196
 msgid "Portuguese-Brazil"
 msgstr "Portugisisk (Brasil)"
 
+#: ../pidgin/gtkdialogs.c:197
+msgid "Pashto"
+msgstr "Pashto"
+
+#: ../pidgin/gtkdialogs.c:198
+msgid "Romanian"
+msgstr "Rumensk"
+
 #: ../pidgin/gtkdialogs.c:199
-#, fuzzy
-msgid "Pashto"
-msgstr "Bilde"
-
-#
-#: ../pidgin/gtkdialogs.c:200
-msgid "Romanian"
-msgstr "Rumensk"
-
-#: ../pidgin/gtkdialogs.c:201 ../pidgin/gtkdialogs.c:258
-#: ../pidgin/gtkdialogs.c:259
+#: ../pidgin/gtkdialogs.c:254
+#: ../pidgin/gtkdialogs.c:255
 msgid "Russian"
 msgstr "Russisk"
 
-#: ../pidgin/gtkdialogs.c:202 ../pidgin/gtkdialogs.c:203
-#: ../pidgin/gtkdialogs.c:260 ../pidgin/gtkdialogs.c:261
-#: ../pidgin/gtkdialogs.c:262
+#: ../pidgin/gtkdialogs.c:200
+#: ../pidgin/gtkdialogs.c:201
+#: ../pidgin/gtkdialogs.c:256
+#: ../pidgin/gtkdialogs.c:257
+#: ../pidgin/gtkdialogs.c:258
 msgid "Slovak"
 msgstr "Slovakisk"
 
-#: ../pidgin/gtkdialogs.c:204 ../pidgin/gtkdialogs.c:263
+#: ../pidgin/gtkdialogs.c:202
+#: ../pidgin/gtkdialogs.c:259
 msgid "Slovenian"
 msgstr "Slovensk"
 
-#
-#: ../pidgin/gtkdialogs.c:205
+#: ../pidgin/gtkdialogs.c:203
 msgid "Albanian"
 msgstr "Albansk"
 
-#: ../pidgin/gtkdialogs.c:206 ../pidgin/gtkdialogs.c:207
-#: ../pidgin/gtkdialogs.c:264 ../pidgin/gtkdialogs.c:265
+#: ../pidgin/gtkdialogs.c:204
+#: ../pidgin/gtkdialogs.c:205
+#: ../pidgin/gtkdialogs.c:260
+#: ../pidgin/gtkdialogs.c:261
 msgid "Serbian"
 msgstr "Serbisk"
 
-#: ../pidgin/gtkdialogs.c:208 ../pidgin/gtkdialogs.c:266
-#: ../pidgin/gtkdialogs.c:267
+#: ../pidgin/gtkdialogs.c:206
+#: ../pidgin/gtkdialogs.c:262
+#: ../pidgin/gtkdialogs.c:263
 msgid "Swedish"
 msgstr "Svensk"
 
+#: ../pidgin/gtkdialogs.c:207
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../pidgin/gtkdialogs.c:208
+msgid "Telugu"
+msgstr "Dravidisk"
+
 #: ../pidgin/gtkdialogs.c:209
-#, fuzzy
-msgid "Tamil"
-msgstr "Terminal"
+msgid "Thai"
+msgstr "Thai"
 
 #: ../pidgin/gtkdialogs.c:210
-msgid "Telugu"
-msgstr "Dravidisk"
+#: ../pidgin/gtkdialogs.c:264
+msgid "Turkish"
+msgstr "Tyrkisk"
 
 #: ../pidgin/gtkdialogs.c:211
-msgid "Thai"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:212 ../pidgin/gtkdialogs.c:268
-msgid "Turkish"
-msgstr "Tyrkisk"
-
-#: ../pidgin/gtkdialogs.c:213
 msgid "Vietnamese"
 msgstr "Vietnamesisk"
 
+#: ../pidgin/gtkdialogs.c:211
+#, fuzzy
+msgid "T.M.Thanh and the Gnome-Vi Team"
+msgstr "T.M.Thanh and the Gnome-Vi Team"
+
+#: ../pidgin/gtkdialogs.c:212
+#: ../pidgin/gtkdialogs.c:265
+msgid "Simplified Chinese"
+msgstr "Forenklet kinesisk"
+
 #: ../pidgin/gtkdialogs.c:213
-msgid "T.M.Thanh and the Gnome-Vi Team"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:214 ../pidgin/gtkdialogs.c:269
-msgid "Simplified Chinese"
-msgstr "Forenklet kinesisk"
-
-#: ../pidgin/gtkdialogs.c:215 ../pidgin/gtkdialogs.c:216
+#: ../pidgin/gtkdialogs.c:214
+#: ../pidgin/gtkdialogs.c:215
+msgid "Hong Kong Chinese"
+msgstr "Hong Kong Kinesisk"
+
+#: ../pidgin/gtkdialogs.c:216
 #: ../pidgin/gtkdialogs.c:217
-msgid "Hong Kong Chinese"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:218 ../pidgin/gtkdialogs.c:219
-#: ../pidgin/gtkdialogs.c:270
+#: ../pidgin/gtkdialogs.c:266
 msgid "Traditional Chinese"
-msgstr "Tradisjonell kinesisk"
+msgstr "Tradisjonell Kinesisk"
 
 #
-#: ../pidgin/gtkdialogs.c:225
+#: ../pidgin/gtkdialogs.c:223
 msgid "Amharic"
 msgstr "Amharisk"
 
-#: ../pidgin/gtkdialogs.c:357
-#, fuzzy, c-format
+#: ../pidgin/gtkdialogs.c:353
+#, c-format
 msgid "About %s"
-msgstr "Om Gaim"
-
-#: ../pidgin/gtkdialogs.c:400
-#, c-format
-msgid ""
-"%s is a graphical modular messaging client based on libpurple which is "
-"capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, "
-"Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, MySpaceIM, Gadu-Gadu, and "
-"QQ all at once.  It is written using GTK+.<BR><BR>You may modify and "
-"redistribute the program under the terms of the GPL (version 2 or later).  A "
-"copy of the GPL is contained in the 'COPYING' file distributed with %s.  %s "
-"is copyrighted by its contributors.  See the 'COPYRIGHT' file for the "
-"complete list of contributors.  We provide no warranty for this program."
-"<BR><BR>"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:418
-#, fuzzy, c-format
+msgstr "Om %s"
+
+#: ../pidgin/gtkdialogs.c:396
+#, c-format
+msgid "%s is a graphical modular messaging client based on libpurple which is capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, MySpaceIM, Gadu-Gadu, and QQ all at once.  It is written using GTK+.<BR><BR>You may modify and redistribute the program under the terms of the GPL (version 2 or later).  A copy of the GPL is contained in the 'COPYING' file distributed with %s.  %s is copyrighted by its contributors.  See the 'COPYRIGHT' file for the complete list of contributors.  We provide no warranty for this program.<BR><BR>"
+msgstr "%s er en modulær grafisk samtaleklient basert på libpurple som kan koble til AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC,SIP/SIMPLE, Novell GroupWise, Lotus Sametime, Bonjour, Zephyr,MySpaceIM, Gadu-Gadu, og QQ samtidig.  Den er skrevet ved bruk av GTK+.<BR><BR>Du kan modifisere og redistribuere programmet under GPL (versjon 2 eller senere) En kopi av GPL er plassert i COPYING filen distribuert med %s.  %s er kopibeskyttet av utgiverne.  Se COPYRIGHT filen for en komplett liste av utgivere.  Vi gir ingen garanti for dette programmet.<BR><BR>"
+
+#: ../pidgin/gtkdialogs.c:414
 msgid "<FONT SIZE=\"4\">IRC:</FONT> #pidgin on irc.freenode.net<BR><BR>"
-msgstr "<FONT SIZE=\"4\">IRC:</FONT> #gaim på irc.freenode.net<BR><BR>"
-
-#: ../pidgin/gtkdialogs.c:423
-#, fuzzy
+msgstr "<FONT SIZE=\"4\">IRC:</FONT> #pidgin på irc.freenode.net<BR><BR>"
+
+#: ../pidgin/gtkdialogs.c:419
 msgid "Current Developers"
-msgstr "tidligere utviklere"
-
-#: ../pidgin/gtkdialogs.c:438
+msgstr "Tidligere utviklere"
+
+#: ../pidgin/gtkdialogs.c:434
 msgid "Crazy Patch Writers"
-msgstr "folk som har bidratt med rettelser"
-
-#: ../pidgin/gtkdialogs.c:453
+msgstr "Folk som har bidratt med rettelser"
+
+#: ../pidgin/gtkdialogs.c:449
 msgid "Retired Developers"
 msgstr "tidligere utviklere"
 
-#: ../pidgin/gtkdialogs.c:468
-#, fuzzy
+#: ../pidgin/gtkdialogs.c:464
 msgid "Retired Crazy Patch Writers"
-msgstr "folk som har bidratt med rettelser"
-
-#: ../pidgin/gtkdialogs.c:483
+msgstr "\"Pensjonerte\" folk som har bidratt med rettelser"
+
+#: ../pidgin/gtkdialogs.c:479
 msgid "Artists"
-msgstr ""
-
-#: ../pidgin/gtkdialogs.c:498
+msgstr "Artister"
+
+#: ../pidgin/gtkdialogs.c:494
 msgid "Current Translators"
 msgstr "Aktive oversettere"
 
-#: ../pidgin/gtkdialogs.c:518
+#: ../pidgin/gtkdialogs.c:514
 msgid "Past Translators"
 msgstr "Tidligere oversettere"
 
-#: ../pidgin/gtkdialogs.c:536
-#, fuzzy
+#: ../pidgin/gtkdialogs.c:532
 msgid "Debugging Information"
-msgstr "Brukerinformasjon"
-
-#: ../pidgin/gtkdialogs.c:906
+msgstr "Debuggings Informasjon"
+
+#: ../pidgin/gtkdialogs.c:902
 msgid "Get User Info"
 msgstr "Hent brukerinfo"
 
-#: ../pidgin/gtkdialogs.c:908
-#, fuzzy
-msgid ""
-"Please enter the screen name or alias of the person whose info you would "
-"like to view."
-msgstr ""
-"Vennligst skriv inn skjermnavnet til den personen du vil se informasjon om."
-
-#: ../pidgin/gtkdialogs.c:998
-#, fuzzy
+#: ../pidgin/gtkdialogs.c:904
+msgid "Please enter the screen name or alias of the person whose info you would like to view."
+msgstr "Vennligst skriv inn skjermnavnet eller aliaset til den personen du vil se informasjon om."
+
+#: ../pidgin/gtkdialogs.c:994
 msgid "View User Log"
-msgstr "Hent brukerlogg"
-
-#: ../pidgin/gtkdialogs.c:1000
-#, fuzzy
-msgid ""
-"Please enter the screen name or alias of the person whose log you would like "
-"to view."
-msgstr ""
-"Vennligst skriv inn skjermnavnet til den personen du vil se loggen til."
-
-#
-#: ../pidgin/gtkdialogs.c:1020
+msgstr "Se på brukerlogg"
+
+#: ../pidgin/gtkdialogs.c:996
+msgid "Please enter the screen name or alias of the person whose log you would like to view."
+msgstr "Vennligst skriv inn skjermnavnet eller aliaset til den personen du vil se loggen til."
+
+#: ../pidgin/gtkdialogs.c:1016
 msgid "Alias Contact"
 msgstr "Kontaktalias"
 
-#
-#: ../pidgin/gtkdialogs.c:1021
+#: ../pidgin/gtkdialogs.c:1017
 msgid "Enter an alias for this contact."
-msgstr "Vennligst skriv inn aliasnavn for denne kontakten."
-
-#: ../pidgin/gtkdialogs.c:1043
+msgstr "Vennligst skriv inn et alias for denne kontakten."
+
+#: ../pidgin/gtkdialogs.c:1039
 #, c-format
 msgid "Enter an alias for %s."
 msgstr "Oppgi et alias for %s."
 
-#: ../pidgin/gtkdialogs.c:1045
+#: ../pidgin/gtkdialogs.c:1041
 msgid "Alias Buddy"
 msgstr "Alias for kontakt"
 
-#: ../pidgin/gtkdialogs.c:1066
+#: ../pidgin/gtkdialogs.c:1062
 msgid "Alias Chat"
 msgstr "Samtalealias"
 
-#: ../pidgin/gtkdialogs.c:1067
+#: ../pidgin/gtkdialogs.c:1063
 msgid "Enter an alias for this chat."
 msgstr "Vennligst skriv inn aliasnavn for denne samtalegruppa."
 
-#: ../pidgin/gtkdialogs.c:1106
+#: ../pidgin/gtkdialogs.c:1102
 #, fuzzy, c-format
-msgid ""
-"You are about to remove the contact containing %s and %d other buddy from "
-"your buddy list.  Do you want to continue?"
-msgid_plural ""
-"You are about to remove the contact containing %s and %d other buddies from "
-"your buddy list.  Do you want to continue?"
-msgstr[0] ""
-"Er du sikker på at du vil fjerne kontakten som inneholder %s og %d andre "
-"kontakter fra kontaktlisten din?"
-msgstr[1] ""
-"Er du sikker på at du vil fjerne kontakten som inneholder %s og %d andre "
-"kontakter fra kontaktlisten din?"
-
-#
-#: ../pidgin/gtkdialogs.c:1114
+msgid "You are about to remove the contact containing %s and %d other buddy from your buddy list.  Do you want to continue?"
+msgid_plural "You are about to remove the contact containing %s and %d other buddies from your buddy list.  Do you want to continue?"
+msgstr[0] "Er du sikker på at du vil fjerne kontakten som inneholder %s og %d andre kontakter fra kontaktlisten din?"
+msgstr[1] "Er du sikker på at du vil fjerne kontakten som inneholder %s og %d andre kontakter fra kontaktlisten din?"
+
+#: ../pidgin/gtkdialogs.c:1110
 msgid "Remove Contact"
-msgstr "Fje_rn kontakt"
-
-#
-#: ../pidgin/gtkdialogs.c:1117
-#, fuzzy
+msgstr "Fjern kontakt"
+
+#: ../pidgin/gtkdialogs.c:1113
 msgid "_Remove Contact"
-msgstr "Fje_rn kontakt"
-
-#: ../pidgin/gtkdialogs.c:1148
+msgstr "_Fjern Kontakt"
+
+#: ../pidgin/gtkdialogs.c:1144
 #, fuzzy, c-format
-msgid ""
-"You are about to merge the group called %s into the group called %s. Do you "
-"want to continue?"
-msgstr ""
-"Er du sikker på at du vil fjerne gruppen %s med alle medlemmer fra "
-"kontaktlisten din?"
-
-#: ../pidgin/gtkdialogs.c:1155
-#, fuzzy
+msgid "You are about to merge the group called %s into the group called %s. Do you want to continue?"
+msgstr "Er du sikker på at du vil fjerne gruppen %s med alle medlemmer fra kontaktlisten din?"
+
+#: ../pidgin/gtkdialogs.c:1151
 msgid "Merge Groups"
-msgstr "Fjern gruppe"
-
-#: ../pidgin/gtkdialogs.c:1158
-#, fuzzy
+msgstr "Flett Sammen Grupper"
+
+#: ../pidgin/gtkdialogs.c:1154
 msgid "_Merge Groups"
-msgstr "Slett gruppe"
-
-#: ../pidgin/gtkdialogs.c:1208
-#, c-format
-msgid ""
-"You are about to remove the group %s and all its members from your buddy "
-"list.  Do you want to continue?"
-msgstr ""
-"Er du sikker på at du vil fjerne gruppen %s med alle medlemmer fra "
-"kontaktlisten din?"
-
-#: ../pidgin/gtkdialogs.c:1211
+msgstr "_Flett Sammen Grupper"
+
+#: ../pidgin/gtkdialogs.c:1204
+#, c-format
+msgid "You are about to remove the group %s and all its members from your buddy list.  Do you want to continue?"
+msgstr "Er du sikker på at du vil fjerne gruppen %s med alle medlemmer fra kontaktlisten din?"
+
+#: ../pidgin/gtkdialogs.c:1207
 msgid "Remove Group"
 msgstr "Fjern gruppe"
 
-#: ../pidgin/gtkdialogs.c:1214
-#, fuzzy
+#: ../pidgin/gtkdialogs.c:1210
 msgid "_Remove Group"
-msgstr "Fjern gruppe"
-
-#: ../pidgin/gtkdialogs.c:1247
-#, c-format
-msgid ""
-"You are about to remove %s from your buddy list.  Do you want to continue?"
+msgstr "_Fjern Gruppe"
+
+#: ../pidgin/gtkdialogs.c:1243
+#, c-format
+msgid "You are about to remove %s from your buddy list.  Do you want to continue?"
 msgstr "Er du sikker på at du vil fjerne %s fra kontaktlisten din?"
 
-#: ../pidgin/gtkdialogs.c:1250
+#: ../pidgin/gtkdialogs.c:1246
 msgid "Remove Buddy"
 msgstr "Fjern kontakt"
 
-#: ../pidgin/gtkdialogs.c:1253
+#: ../pidgin/gtkdialogs.c:1249
 msgid "_Remove Buddy"
-msgstr "Fje_rn kontakt"
-
-#: ../pidgin/gtkdialogs.c:1274
-#, c-format
-msgid ""
-"You are about to remove the chat %s from your buddy list.  Do you want to "
-"continue?"
-msgstr ""
-"Er du sikker på at du vil fjerne samtalegruppen %s fra kontaktlisten din?"
-
-#: ../pidgin/gtkdialogs.c:1277
+msgstr "_Fjern Kontakt"
+
+#: ../pidgin/gtkdialogs.c:1270
+#, c-format
+msgid "You are about to remove the chat %s from your buddy list.  Do you want to continue?"
+msgstr "Er du sikker på at du vil fjerne samtalegruppen %s fra kontaktlisten din?"
+
+#: ../pidgin/gtkdialogs.c:1273
 msgid "Remove Chat"
 msgstr "Fjern samtalegruppe"
 
-#: ../pidgin/gtkdialogs.c:1280
-#, fuzzy
+#: ../pidgin/gtkdialogs.c:1276
 msgid "_Remove Chat"
-msgstr "Fjern samtalegruppe"
+msgstr "_Fjern samtalegruppe"
 
 #: ../pidgin/gtkdocklet.c:150
-#, fuzzy
 msgid "Right-click for more unread messages...\n"
-msgstr "Vis flere valg"
+msgstr "Høyreklikk for flere uleste beskjeder...\n"
 
 #: ../pidgin/gtkdocklet.c:435
-#, fuzzy
 msgid "Change Status"
-msgstr "Endre adresse til:"
+msgstr "Endre status"
 
 #: ../pidgin/gtkdocklet.c:487
-#, fuzzy
 msgid "Show Buddy List"
-msgstr "Kontaktliste"
-
-#
+msgstr "Vis kontaktliste"
+
 #: ../pidgin/gtkdocklet.c:513
 msgid "New Message..."
 msgstr "Ny melding..."
@@ -15795,24 +15198,22 @@
 msgid "Mute Sounds"
 msgstr "Skru av lyder"
 
-#
 #: ../pidgin/gtkdocklet.c:535
 #, fuzzy
-msgid "Blink on new message"
-msgstr "Ny melding..."
+msgid "Blink on New Message"
+msgstr "Blink ved nye beskjeder"
 
 #: ../pidgin/gtkdocklet.c:542
 msgid "Quit"
 msgstr "Avslutt"
 
 #: ../pidgin/gtkft.c:154
-#, fuzzy
 msgid "Not started"
-msgstr "Ikke støttet"
+msgstr "Ikke startet"
 
 #: ../pidgin/gtkft.c:274
 msgid "<b>Receiving As:</b>"
-msgstr "<b>Mottar som:</b>"
+msgstr "<b>Mottas som:</b>"
 
 #: ../pidgin/gtkft.c:276
 msgid "<b>Receiving From:</b>"
@@ -15828,35 +15229,34 @@
 
 #: ../pidgin/gtkft.c:498
 msgid "There is no application configured to open this type of file."
-msgstr "Ingen applikasjon er assosiert med denne filtypen"
+msgstr "Ingen applikasjon er assosiert med denne filtypen."
 
 #: ../pidgin/gtkft.c:503
 msgid "An error occurred while opening the file."
-msgstr "En feil oppsto under åpningen av filen"
+msgstr "En feil oppsto under åpningen av filen."
 
 #: ../pidgin/gtkft.c:540
-#, fuzzy, c-format
+#, c-format
 msgid "Error launching %s: %s"
-msgstr "Feil under starting av kommando: <b>%s</b>:%s"
+msgstr "Feil under start av %s: %s"
 
 #: ../pidgin/gtkft.c:549
-#, fuzzy, c-format
+#, c-format
 msgid "Error running %s"
-msgstr "Klarte ikke bli med i gruppesamtale %s"
+msgstr "Feil ved kjøring av %s"
 
 #: ../pidgin/gtkft.c:550
 #, c-format
 msgid "Process returned error code %d"
-msgstr ""
+msgstr "Prosessen returnerte feilkode %d"
 
 #: ../pidgin/gtkft.c:697
 msgid "Filename:"
 msgstr "Filnavn:"
 
 #: ../pidgin/gtkft.c:698
-#, fuzzy
 msgid "Local File:"
-msgstr "Lokale brukere"
+msgstr "Lokal fil:"
 
 #: ../pidgin/gtkft.c:700
 msgid "Speed:"
@@ -15872,21 +15272,20 @@
 
 #: ../pidgin/gtkft.c:784
 msgid "Close this window when all transfers _finish"
-msgstr ""
+msgstr "Lukk dette vinduet når alle overføringene er _fullført"
 
 #: ../pidgin/gtkft.c:794
-#, fuzzy
 msgid "C_lear finished transfers"
-msgstr "Fjern fullførte overføringer"
+msgstr "F_jern fullførte overføringer"
 
 #. "Download Details" arrow
 #: ../pidgin/gtkft.c:803
-#, fuzzy
 msgid "File transfer _details"
-msgstr "Skjul overføringsdetaljer"
+msgstr "Skjul overførings_detaljer"
 
 #. Pause button
-#: ../pidgin/gtkft.c:833 ../pidgin/pidginstock.c:95
+#: ../pidgin/gtkft.c:833
+#: ../pidgin/pidginstock.c:95
 msgid "_Pause"
 msgstr "_Pause"
 
@@ -15896,12 +15295,11 @@
 msgstr "_Fortsett"
 
 #: ../pidgin/gtkimhtml.c:816
-#, fuzzy
 msgid "Paste as Plain _Text"
-msgstr "Li_m inn som tekst"
-
-#: ../pidgin/gtkimhtml.c:833 ../pidgin/gtkimhtmltoolbar.c:1194
-#, fuzzy
+msgstr "Lim inn som Ren _Tekst"
+
+#: ../pidgin/gtkimhtml.c:833
+#: ../pidgin/gtkimhtmltoolbar.c:1195
 msgid "_Reset formatting"
 msgstr "_Fjern formatering"
 
@@ -15911,7 +15309,7 @@
 
 #: ../pidgin/gtkimhtml.c:1374
 msgid "Color to draw hyperlinks."
-msgstr "Farge på lenker"
+msgstr "Fargen som lenker skal ha."
 
 #: ../pidgin/gtkimhtml.c:1377
 #, fuzzy
@@ -15919,22 +15317,20 @@
 msgstr "Farge på lenke"
 
 #: ../pidgin/gtkimhtml.c:1378
-#, fuzzy
 msgid "Color to draw hyperlinks when mouse is over them."
-msgstr "Farge på lenker"
-
-#
+msgstr "Farge på lenker."
+
 #: ../pidgin/gtkimhtml.c:1598
 msgid "_Copy E-Mail Address"
-msgstr "Kopier e-postadresse"
+msgstr "_Kopier e-postadresse"
 
 #: ../pidgin/gtkimhtml.c:1610
 msgid "_Open Link in Browser"
-msgstr "Åpne i nettleser"
+msgstr "_Åpne lenke i nettleser"
 
 #: ../pidgin/gtkimhtml.c:1620
 msgid "_Copy Link Location"
-msgstr "Kopier snarvei"
+msgstr "_Kopier lenkemål"
 
 #: ../pidgin/gtkimhtml.c:3369
 msgid ""
@@ -15957,32 +15353,35 @@
 "Går tilbake til PNG."
 
 #: ../pidgin/gtkimhtml.c:3401
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "<span size='larger' weight='bold'>Error saving image</span>\n"
 "\n"
 "%s"
 msgstr ""
-"<span weight=\"bold\" size=\"larger\">Du har e-post!</span>\n"
+"<span size='larger' weight='bold'>Feil ved lagring av bilde</span>\n"
 "\n"
 "%s"
 
 #: ../pidgin/gtkimhtml.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Error saving image\n"
 "\n"
 "%s"
-msgstr "Feil under lagring av bilde: %s"
-
-#: ../pidgin/gtkimhtml.c:3482 ../pidgin/gtkimhtml.c:3494
+msgstr ""
+"Feil ved lagring av bilde\n"
+"\n"
+"%s"
+
+#: ../pidgin/gtkimhtml.c:3482
+#: ../pidgin/gtkimhtml.c:3494
 msgid "Save Image"
 msgstr "Lagre bilde"
 
 #: ../pidgin/gtkimhtml.c:3522
-#, c-format
 msgid "_Save Image..."
-msgstr "Lagre bilde..."
+msgstr "_Lagre bilde..."
 
 #: ../pidgin/gtkimhtmltoolbar.c:163
 msgid "Select Font"
@@ -16001,29 +15400,24 @@
 msgstr "_URL"
 
 #: ../pidgin/gtkimhtmltoolbar.c:418
-#, fuzzy
 msgid "_Description"
-msgstr "Beskrivelse"
+msgstr "_Beskrivelse"
 
 #: ../pidgin/gtkimhtmltoolbar.c:421
-msgid ""
-"Please enter the URL and description of the link that you want to insert. "
-"The description is optional."
-msgstr ""
-"Vennligst skriv inn URL og beskrivelse av lenka du vil sette inn. "
-"Beskrivelsesfeltet er valgfritt."
+msgid "Please enter the URL and description of the link that you want to insert. The description is optional."
+msgstr "Vennligst skriv inn URL og beskrivelse av lenka du vil sette inn. Beskrivelsesfeltet er valgfritt."
 
 #: ../pidgin/gtkimhtmltoolbar.c:425
 msgid "Please enter the URL of the link that you want to insert."
-msgstr ""
-"Vennligst skriv inn URL og beskrivelse av lenka du vil sette inn. "
-"Beskrivelsesfeltet er valgfritt."
-
-#: ../pidgin/gtkimhtmltoolbar.c:430 ../pidgin/gtkimhtmltoolbar.c:1102
+msgstr "Vennligst skriv inn URL og beskrivelse av lenka du vil sette inn. Beskrivelsesfeltet er valgfritt."
+
+#: ../pidgin/gtkimhtmltoolbar.c:430
+#: ../pidgin/gtkimhtmltoolbar.c:1102
 msgid "Insert Link"
 msgstr "Sett inn lenke"
 
-#: ../pidgin/gtkimhtmltoolbar.c:434 ../pidgin/gtkimhtmltoolbar.c:1262
+#: ../pidgin/gtkimhtmltoolbar.c:434
+#: ../pidgin/gtkimhtmltoolbar.c:1263
 msgid "_Insert"
 msgstr "Sett _inn"
 
@@ -16032,23 +15426,24 @@
 msgid "Failed to store image: %s\n"
 msgstr "Klarte ikke å lagre bilde: %s\n"
 
-#: ../pidgin/gtkimhtmltoolbar.c:540 ../pidgin/gtkimhtmltoolbar.c:550
+#: ../pidgin/gtkimhtmltoolbar.c:540
+#: ../pidgin/gtkimhtmltoolbar.c:550
 msgid "Insert Image"
 msgstr "Sett inn bilde"
 
 #: ../pidgin/gtkimhtmltoolbar.c:761
 msgid "This theme has no available smileys."
-msgstr "Dette temaet har ingen tilgjengelige smileys (fjesinger)."
+msgstr "Dette temaet har ingen tilgjengelige smileys."
 
 #. show everything
 #: ../pidgin/gtkimhtmltoolbar.c:778
 msgid "Smile!"
 msgstr "Smil!"
 
-#: ../pidgin/gtkimhtmltoolbar.c:846 ../pidgin/gtkimhtmltoolbar.c:1219
-#, fuzzy
+#: ../pidgin/gtkimhtmltoolbar.c:846
+#: ../pidgin/gtkimhtmltoolbar.c:1220
 msgid "_Font"
-msgstr "Konto:"
+msgstr "_Font"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1054
 #, fuzzy
@@ -16057,44 +15452,44 @@
 
 #: ../pidgin/gtkimhtmltoolbar.c:1054
 msgid "Ungroup Items"
-msgstr ""
-
-#: ../pidgin/gtkimhtmltoolbar.c:1088 ../pidgin/plugins/convcolors.c:287
+msgstr "Av-grupper Posteringer"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1088
+#: ../pidgin/plugins/convcolors.c:287
 msgid "Bold"
 msgstr "Fet"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1089 ../pidgin/plugins/convcolors.c:294
+#: ../pidgin/gtkimhtmltoolbar.c:1089
+#: ../pidgin/plugins/convcolors.c:294
 msgid "Italic"
 msgstr "Kursiv"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1090 ../pidgin/plugins/convcolors.c:301
+#: ../pidgin/gtkimhtmltoolbar.c:1090
+#: ../pidgin/plugins/convcolors.c:301
 msgid "Underline"
 msgstr "Understrek"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1091
 msgid "Strikethrough"
-msgstr ""
+msgstr "Gjennomstrek"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1093
-#, fuzzy
 msgid "Increase Font Size"
-msgstr "Ignorer skriftstørrelser"
+msgstr "Øk skriftstørrelse"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1094
 msgid "Decrease Font Size"
-msgstr ""
+msgstr "Minsk skriftstørrelse"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1096
 msgid "Font Face"
 msgstr "Skrifttype"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1097
-#, fuzzy
 msgid "Background Color"
 msgstr "Bakgrunnsfarge"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1098
-#, fuzzy
 msgid "Foreground Color"
 msgstr "Forgrunnsfarge"
 
@@ -16109,143 +15504,109 @@
 msgstr "Sett inn bilde"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1104
-#, fuzzy
 msgid "Insert Smiley"
 msgstr "Sett inn smilefjes"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1179
-#, fuzzy
+#: ../pidgin/gtkimhtmltoolbar.c:1180
 msgid "<b>_Bold</b>"
-msgstr "<b>_Passord:</b>"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1180
-#, fuzzy
-msgid "<i>_Italic</i>"
-msgstr " <i>(irc-operatør)</i>"
+msgstr "<b>_Uthev</b>"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1181
-#, fuzzy
-msgid "<u>_Underline</u>"
-msgstr "Understrek"
+msgid "<i>_Italic</i>"
+msgstr "<i>_Kursiv</i>"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1182
-msgid "<span strikethrough='true'>Strikethrough</span>"
-msgstr ""
+msgid "<u>_Underline</u>"
+msgstr "<u>_Understrek</u>"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1183
-#, fuzzy
+msgid "<span strikethrough='true'>Strikethrough</span>"
+msgstr "<span strikethrough='true'>Gjennomstrek</span>"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1184
 msgid "<span size='larger'>_Larger</span>"
-msgstr "<span weight=\"bold\" size=\"larger\">Gaim v%s</span>"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1185
-#, fuzzy
+msgstr "<span size='larger'>_Større</span>"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1186
 msgid "_Normal"
-msgstr "Normal"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1187
+msgstr "_Normal"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1188
 msgid "<span size='smaller'>_Smaller</span>"
-msgstr ""
+msgstr "<span size='smaller'>_Mindre</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
-#, fuzzy
+#: ../pidgin/gtkimhtmltoolbar.c:1192
 msgid "_Font face"
-msgstr "Skrifttype"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1192
-#, fuzzy
-msgid "Foreground _color"
-msgstr "Forgrunnsfarge"
+msgstr "_Skrifttype"
 
 #: ../pidgin/gtkimhtmltoolbar.c:1193
-#, fuzzy
+msgid "Foreground _color"
+msgstr "Forgrunns_farge"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1194
 msgid "Bac_kground color"
-msgstr "Bakgrunnsfarge"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1270
-#, fuzzy
-msgid "_Smiley"
-msgstr "Smil!"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1276
-#, fuzzy
+msgstr "Ba_kgrunnsfarge"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1271
 msgid "_Image"
-msgstr "Lagre bilde"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1282
-#, fuzzy
+msgstr "_Bilde"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1277
 msgid "_Link"
-msgstr "_Bli med i samtalegruppe"
-
-#: ../pidgin/gtkimhtmltoolbar.c:1288
+msgstr "_Lenke"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1283
 msgid "_Horizontal rule"
-msgstr ""
+msgstr "_Horizontal rule"
+
+#: ../pidgin/gtkimhtmltoolbar.c:1305
+msgid "_Smile!"
+msgstr "_Smil!"
 
 #: ../pidgin/gtklog.c:293
 #, c-format
-msgid ""
-"Are you sure you want to permanently delete the log of the conversation with "
-"%s which started at %s?"
-msgstr ""
+msgid "Are you sure you want to permanently delete the log of the conversation with %s which started at %s?"
+msgstr "Er du sikker på at du vil fjerne loggen permanent fra samtalen med %s som startet på %s?"
 
 #: ../pidgin/gtklog.c:304
 #, c-format
-msgid ""
-"Are you sure you want to permanently delete the log of the conversation in %"
-"s which started at %s?"
-msgstr ""
+msgid "Are you sure you want to permanently delete the log of the conversation in %s which started at %s?"
+msgstr "Er du sikker på at du vil fjerne loggen permanent fra samtalen med %s som startet på %s?"
 
 #: ../pidgin/gtklog.c:309
 #, fuzzy, c-format
-msgid ""
-"Are you sure you want to permanently delete the system log which started at %"
-"s?"
+msgid "Are you sure you want to permanently delete the system log which started at %s?"
 msgstr "Er du sikker på at du vil slette \"%s\"?"
 
 #: ../pidgin/gtklog.c:453
-#, fuzzy, c-format
+#, c-format
 msgid "<span size='larger' weight='bold'>Conversation in %s on %s</span>"
-msgstr ""
-"<span weight=\"bold\" size=\"larger\">Du har e-post!</span>\n"
-"\n"
-"%s"
+msgstr "<span size='larger' weight='bold'>Samtale i %s på %s</span>"
 
 #: ../pidgin/gtklog.c:456
-#, fuzzy, c-format
+#, c-format
 msgid "<span size='larger' weight='bold'>Conversation with %s on %s</span>"
-msgstr ""
-"<span weight=\"bold\" size=\"larger\">Du har e-post!</span>\n"
-"\n"
-"%s"
+msgstr "<span size='larger' weight='bold'>Samtale med %s på %s</span>"
 
 #: ../pidgin/gtklog.c:503
 msgid "%B %Y"
-msgstr ""
+msgstr "%B %Y"
 
 #: ../pidgin/gtklog.c:550
-msgid ""
-"System events will only be logged if the \"Log all status changes to system "
-"log\" preference is enabled."
-msgstr ""
-"System hendelser vil bare bli logget om \"Logg alle status forandringer til "
-"system logg\" har blitt slått på."
+msgid "System events will only be logged if the \"Log all status changes to system log\" preference is enabled."
+msgstr "System hendelser vil bare bli logget om \"Logg alle status forandringer til system logg\" har blitt slått på."
 
 #: ../pidgin/gtklog.c:554
-msgid ""
-"Instant messages will only be logged if the \"Log all instant messages\" "
-"preference is enabled."
-msgstr ""
-"Direktemeldinger vil bare bli logget om \"Logg alle direktemeldinger\" har "
-"blitt slått på."
+msgid "Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."
+msgstr "Direktemeldinger vil bare bli logget om \"Logg alle direktemeldinger\" har blitt slått på."
 
 #: ../pidgin/gtklog.c:557
 #, fuzzy
-msgid ""
-"Chats will only be logged if the \"Log all chats\" preference is enabled."
-msgstr ""
-"Samtaler vil bare bli logget om \"Logg alle samtaler\" har blitt slått på."
+msgid "Chats will only be logged if the \"Log all chats\" preference is enabled."
+msgstr "Samtaler vil bare bli logget om \"Logg alle samtaler\" har blitt slått på."
 
 #: ../pidgin/gtklog.c:561
 msgid "No logs were found"
@@ -16254,19 +15615,19 @@
 #. Steal the "HELP" response and use it to trigger browsing to the logs folder
 #: ../pidgin/gtklog.c:576
 msgid "_Browse logs folder"
-msgstr ""
+msgstr "_Let gjennom loggmappe"
 
 #: ../pidgin/gtklog.c:640
-#, fuzzy
 msgid "Total log size:"
-msgstr "Etter loggstørrelse"
+msgstr "Etter loggstørrelse:"
 
 #: ../pidgin/gtklog.c:709
-#, fuzzy, c-format
+#, c-format
 msgid "Conversations in %s"
-msgstr "Samtaler med %s"
-
-#: ../pidgin/gtklog.c:717 ../pidgin/gtklog.c:779
+msgstr "Samtaler i %s"
+
+#: ../pidgin/gtklog.c:717
+#: ../pidgin/gtklog.c:779
 #, c-format
 msgid "Conversations with %s"
 msgstr "Samtaler med %s"
@@ -16276,9 +15637,9 @@
 msgstr "Systemlogg"
 
 #: ../pidgin/gtkmain.c:386
-#, fuzzy, c-format
+#, c-format
 msgid "%s %s. Try `%s -h' for more information.\n"
-msgstr "Gaim %s. Prøv '%s -h' for mer informasjon.\n"
+msgstr "%s %s. Prøv '%s -h' for mer informasjon.\n"
 
 #: ../pidgin/gtkmain.c:388
 #, c-format
@@ -16293,13 +15654,26 @@
 "  -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 ""
-
-#: ../pidgin/gtkmain.c:512
-#, c-format
-msgid ""
-"%s has segfaulted and attempted to dump a core file.\n"
+"%s %s\n"
+"Bruk: %s [VALG]...\n"
+"\n"
+"  -c, --config=DIR    Bruk DIR for konfigurasjons filer\n"
+"  -d, --debug         skriv debugging beskjeder til stdout\n"
+"  -h, --help          Vis denne hjelpen og avslutt\n"
+"  -m, --multiple      do not ensure single instance\n"
+"  -n, --nologin       Ikke logg inn automatisk\n"
+"  -l, --login[=NAVN]  Logg inn automatisk (optional argument NAME specifies\n"
+"                      account(s) to use, separated by commas)\n"
+"  --display=DISPLAY   X display for bruk\n"
+"  -v, --version       Vis den nårværende versjon og avslutt\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"
@@ -16317,88 +15691,97 @@
 "on other protocols is at\n"
 "%swiki/DeveloperPages\n"
 msgstr ""
+"%s %s har segfaultet og forsøkt å dumpe en kjerne fil.\n"
+"Dette er en bug i programvaren og har skjedd\n"
+"uten at det er din feil.\n"
+"\n"
+"Om du kan gjenskape krasjen, vennligst kontakt utviklerne\n"
+"ved å rapportere en bug på:\n"
+"%ssimpleticket/\n"
+"\n"
+"Vennligst forsikre deg om at du spesifiserer hva du gjorde\n"
+"og post backtrace'en fra kjerne fila.  Om du ikke vet\n"
+"hvordan du lager en backtrace, vennligst les instuksjonene på\n"
+"%swiki/GetABacktrace\n"
+"\n"
+"Om du trenger videre hjelp, vennligst IM enten SeanEgn eller \n"
+"LSchiere (via AIM).  Kontakt informasjon for Sean og Luke \n"
+"på andre protokoller er på\n"
+"%swiki/DeveloperPages\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
-#: ../pidgin/gtkmain.c:699 ../pidgin/pidgin.h:51
-#, fuzzy
+#: ../pidgin/gtkmain.c:706
+#: ../pidgin/pidgin.h:51
 msgid "Pidgin"
-msgstr "Paging"
+msgstr "Pidgin"
 
 #: ../pidgin/gtknotify.c:349
-#, fuzzy
 msgid "Open All Messages"
-msgstr "Send beskjed"
+msgstr "Åpne alle beskjeder"
 
 #: ../pidgin/gtknotify.c:402
-#, fuzzy
 msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>"
-msgstr ""
-"<span weight=\"bold\" size=\"larger\">Du har e-post!</span>\n"
-"\n"
-"%s"
-
-#: ../pidgin/gtknotify.c:540
+msgstr "<span weight=\"bold\" size=\"larger\">Du har fått e-post!</span>"
+
+#: ../pidgin/gtknotify.c:537
 #, c-format
 msgid "%s has %d new message."
 msgid_plural "%s has %d new messages."
 msgstr[0] "%s har %d ny beskjed."
 msgstr[1] "%s har %d nye beskjeder."
 
-#: ../pidgin/gtknotify.c:564
-#, c-format
-msgid "<b>You have %d new e-mail.</b>"
-msgid_plural "<b>You have %d new e-mails.</b>"
-msgstr[0] ""
-msgstr[1] ""
+#: ../pidgin/gtknotify.c:562
+#, c-format
+msgid "<b>%d new e-mail.</b>"
+msgid_plural "<b>%d new e-mails.</b>"
+msgstr[0] "<b>%d ny e-post.</b>"
+msgstr[1] "<b>%d nye e-poster.</b>"
 
 #: ../pidgin/gtknotify.c:989
 #, fuzzy, c-format
 msgid "The browser command \"%s\" is invalid."
 msgstr "Nettleserkommandoen <b>%s</b> er ugyldig."
 
-#: ../pidgin/gtknotify.c:991 ../pidgin/gtknotify.c:1003
-#: ../pidgin/gtknotify.c:1016 ../pidgin/gtknotify.c:1144
+#: ../pidgin/gtknotify.c:991
+#: ../pidgin/gtknotify.c:1003
+#: ../pidgin/gtknotify.c:1016
+#: ../pidgin/gtknotify.c:1144
 msgid "Unable to open URL"
 msgstr "Kunne ikke åpne URL"
 
-#: ../pidgin/gtknotify.c:1001 ../pidgin/gtknotify.c:1014
+#: ../pidgin/gtknotify.c:1001
+#: ../pidgin/gtknotify.c:1014
 #, fuzzy, c-format
 msgid "Error launching \"%s\": %s"
 msgstr "Feil under starting av kommando: <b>%s</b>:%s"
 
 #: ../pidgin/gtknotify.c:1145
-msgid ""
-"The 'Manual' browser command has been chosen, but no command has been set."
-msgstr ""
-"Klarte ikke å starte en nettleser fordi 'Manuell' nettleserkommando er "
-"valgt, men ingen kommando for denne har blitt satt."
+msgid "The 'Manual' browser command has been chosen, but no command has been set."
+msgstr "Klarte ikke å starte en nettleser fordi 'Manuell' nettleserkommando er valgt, men ingen kommando for denne har blitt satt."
 
 #: ../pidgin/gtkplugin.c:265
 msgid "The following plugins will be unloaded."
-msgstr ""
+msgstr "Følgende tillegg kunne ikke losses."
 
 #: ../pidgin/gtkplugin.c:284
 msgid "Multiple plugins will be unloaded."
-msgstr ""
+msgstr "Flere tillegg vil ble losset."
 
 #: ../pidgin/gtkplugin.c:288
-#, fuzzy
 msgid "Unload Plugins"
-msgstr "Tillegg"
+msgstr "Losse Tillegg"
 
 #: ../pidgin/gtkplugin.c:400
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s%s<span weight=\"bold\">Written by:</span>\t%s\n"
 "<span weight=\"bold\">Website:</span>\t\t%s\n"
 "<span weight=\"bold\">Filename:</span>\t\t%s"
 msgstr ""
-"<span size=\"larger\">%s %s</span>\n"
-"\n"
-"<span weight=\"bold\">Skrevet av:</span>\t%s\n"
-"<span weight=\"bold\">Webside:</span>\t\t%s\n"
-"<span weight=\"bold\">Filnavn:</span>\t%s"
+"%s%s<span weight=\"bold\">Skrevet av:</span>\t%s\n"
+"<span weight=\"bold\">Hjemmeside:</span>\t\t%s\n"
+"<span weight=\"bold\">Filnavn:</span>\t\t%s"
 
 #: ../pidgin/gtkplugin.c:410
 #, c-format
@@ -16407,6 +15790,9 @@
 "<span foreground=\"#ff0000\" weight=\"bold\">Error: %s\n"
 "Check the plugin website for an update.</span>"
 msgstr ""
+"%s\n"
+"<span foreground=\"#ff0000\" weight=\"bold\"> Feil: %s\n"
+"Sjekk tilleggets webside for en oppdatering.</span>"
 
 #: ../pidgin/gtkplugin.c:536
 #, fuzzy
@@ -16415,7 +15801,7 @@
 
 #: ../pidgin/gtkplugin.c:599
 msgid "<b>Plugin Details</b>"
-msgstr ""
+msgstr "<b>Tillegget Detaljer</b>"
 
 #: ../pidgin/gtkpounce.c:157
 msgid "Select a file"
@@ -16423,106 +15809,93 @@
 
 #. Create the "Pounce on Whom" frame.
 #: ../pidgin/gtkpounce.c:532
-#, fuzzy
 msgid "Pounce on Whom"
-msgstr "Varsling for"
+msgstr "Varsling for hvem"
 
 #: ../pidgin/gtkpounce.c:559
 msgid "_Buddy name:"
-msgstr "Kontaktnavn:"
+msgstr "_Kontaktnavn:"
 
 #: ../pidgin/gtkpounce.c:593
-#, fuzzy
 msgid "Si_gns on"
-msgstr "Pålo_gging"
+msgstr "Lo_gger på"
 
 #: ../pidgin/gtkpounce.c:595
-#, fuzzy
 msgid "Signs o_ff"
-msgstr "Logg _av"
+msgstr "Logger _av"
 
 #: ../pidgin/gtkpounce.c:597
-#, fuzzy
 msgid "Goes a_way"
-msgstr "Kontakt forsvinner"
+msgstr "Går _vekk"
 
 #: ../pidgin/gtkpounce.c:599
-#, fuzzy
 msgid "Ret_urns from away"
-msgstr "_Returnere fra fravær"
+msgstr "_Returnerer fra fravær"
 
 #: ../pidgin/gtkpounce.c:601
-#, fuzzy
 msgid "Becomes _idle"
-msgstr "%s har blitt inaktiv"
+msgstr "Blir _inaktiv"
 
 #: ../pidgin/gtkpounce.c:603
-#, fuzzy
 msgid "Is no longer i_dle"
-msgstr "%s er ikke lenger inaktiv"
+msgstr "Er ikke lenger i_naktiv"
 
 #: ../pidgin/gtkpounce.c:605
-#, fuzzy
 msgid "Starts _typing"
-msgstr "Venn s_tarter å skrive"
+msgstr "Starte_r å skrive"
 
 #: ../pidgin/gtkpounce.c:607
 msgid "P_auses while typing"
-msgstr ""
+msgstr "P_auser under skriving"
 
 #: ../pidgin/gtkpounce.c:609
-#, fuzzy
 msgid "Stops t_yping"
-msgstr "Venn slutter å skrive til deg"
+msgstr "Stoppe_r å skrive"
 
 #: ../pidgin/gtkpounce.c:611
-#, fuzzy
 msgid "Sends a _message"
-msgstr "Send _beskjed"
+msgstr "Sender en _beskjed"
 
 #: ../pidgin/gtkpounce.c:654
-#, fuzzy
 msgid "Ope_n an IM window"
-msgstr "Åpne vindu for direktem_elding"
+msgstr "Åpn_e vindu for direktemelding"
 
 #: ../pidgin/gtkpounce.c:656
-#, fuzzy
 msgid "_Pop up a notification"
-msgstr "Varslingsvindu spretter o_pp"
+msgstr "_Varslingsvindu spretter opp"
 
 #: ../pidgin/gtkpounce.c:658
 msgid "Send a _message"
-msgstr "Send _beskjed"
+msgstr "Send en _beskjed"
 
 #: ../pidgin/gtkpounce.c:660
 msgid "E_xecute a command"
-msgstr "Kjør en kommando"
+msgstr "K_jør en kommando"
 
 #: ../pidgin/gtkpounce.c:662
 msgid "P_lay a sound"
-msgstr "Spill av en lyd"
+msgstr "S_pill av en lyd"
 
 #: ../pidgin/gtkpounce.c:668
-#, fuzzy
 msgid "Brows_e..."
-msgstr "_Bla gjennom..."
+msgstr "Bla g_jennom..."
 
 #: ../pidgin/gtkpounce.c:670
-#, fuzzy
 msgid "Br_owse..."
-msgstr "_Bla gjennom..."
+msgstr "Bl_a gjennom..."
 
 #: ../pidgin/gtkpounce.c:671
 msgid "Pre_view"
-msgstr "Forhånds_visning"
+msgstr "For_hånds visning"
 
 #: ../pidgin/gtkpounce.c:798
 msgid "P_ounce only when my status is not Available"
-msgstr ""
+msgstr "P_ounce kun når min status er ikke Tilgjengelig"
 
 #: ../pidgin/gtkpounce.c:803
+#, fuzzy
 msgid "_Recurring"
-msgstr ""
+msgstr "Gjentar"
 
 #: ../pidgin/gtkpounce.c:1246
 #, fuzzy
@@ -16531,25 +15904,20 @@
 
 #: ../pidgin/gtkprefs.c:386
 #: ../pidgin/pixmaps/emotes/default/24/default.theme.in.h:1
-#, fuzzy
 msgid "Default"
-msgstr "Gnome-standard"
+msgstr "Forvalgt"
 
 #: ../pidgin/gtkprefs.c:517
 msgid "Smiley theme failed to unpack."
-msgstr ""
+msgstr "Smiley tema feilet å pakke ut."
 
 #: ../pidgin/gtkprefs.c:644
 msgid "Install Theme"
-msgstr ""
+msgstr "Installer tema"
 
 #: ../pidgin/gtkprefs.c:697
-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."
-msgstr ""
-"Velg smilefjes-temaet du vil bruke fra listen nedenfor. Nye temaer kan "
-"installeres ved å dra og slippe dem over temalisten."
+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."
+msgstr "Velg smilefjes-temaet du vil bruke fra listen nedenfor. Nye temaer kan installeres ved å dra og slippe dem over temalisten."
 
 #: ../pidgin/gtkprefs.c:732
 msgid "Icon"
@@ -16560,33 +15928,30 @@
 msgstr "System-trayikon"
 
 #: ../pidgin/gtkprefs.c:895
-#, fuzzy
 msgid "_Show system tray icon:"
-msgstr "System-trayikon"
+msgstr "_Vis system tray ikon:"
 
 #: ../pidgin/gtkprefs.c:899
-#, fuzzy
 msgid "On unread messages"
-msgstr "Send _beskjed"
+msgstr "Ved uleste beskjeder"
 
 #: ../pidgin/gtkprefs.c:904
-#, fuzzy
 msgid "Conversation Window Hiding"
-msgstr "Samtalevinduer for direktemeldinger"
+msgstr "Samtalevinduer Vindu Skjuling"
 
 #: ../pidgin/gtkprefs.c:905
-#, fuzzy
 msgid "_Hide new IM conversations:"
-msgstr "Lukk samtalen"
-
-#: ../pidgin/gtkprefs.c:908 ../pidgin/gtkprefs.c:1944
+msgstr "_Gjem nye direktemeldingssamtaler:"
+
+#: ../pidgin/gtkprefs.c:908
+#: ../pidgin/gtkprefs.c:1946
 msgid "When away"
 msgstr "Når fraværende"
 
 #. All the tab options!
 #: ../pidgin/gtkprefs.c:916
 msgid "Tabs"
-msgstr ""
+msgstr "Faner"
 
 #: ../pidgin/gtkprefs.c:918
 msgid "Show IMs and chats in _tabbed windows"
@@ -16597,9 +15962,8 @@
 msgstr "Vis _lukkeknapp på faner"
 
 #: ../pidgin/gtkprefs.c:935
-#, fuzzy
 msgid "_Placement:"
-msgstr "ExtPlacement"
+msgstr "_Plassering:"
 
 #: ../pidgin/gtkprefs.c:937
 msgid "Top"
@@ -16618,204 +15982,193 @@
 msgstr "Høyre"
 
 #: ../pidgin/gtkprefs.c:942
+#, fuzzy
 msgid "Left Vertical"
-msgstr ""
+msgstr "Venstre vertikal"
 
 #: ../pidgin/gtkprefs.c:943
+#, fuzzy
 msgid "Right Vertical"
-msgstr ""
+msgstr "Høyre vertikal"
 
 #: ../pidgin/gtkprefs.c:950
-#, fuzzy
 msgid "N_ew conversations:"
-msgstr "Lukk samtalen"
+msgstr "N_ye samtaler:"
 
 #: ../pidgin/gtkprefs.c:995
-#, fuzzy
 msgid "Show _formatting on incoming messages"
-msgstr "Vis formateringsverktøylinje"
-
-#: ../pidgin/gtkprefs.c:998
-#, fuzzy
-msgid "Show _detailed information"
-msgstr "Profilinformasjon"
+msgstr "Vis _formateringsverktøy på innkommende beskjeder"
+
+#: ../pidgin/gtkprefs.c:997
+msgid "Close IMs immediately when the tab is closed"
+msgstr "Lukk direktemeldinger straks når fanen er lukket"
 
 #: ../pidgin/gtkprefs.c:1000
+msgid "Show _detailed information"
+msgstr "Vis _detaljert informasjon"
+
+#: ../pidgin/gtkprefs.c:1002
 msgid "Enable buddy ic_on animation"
 msgstr "Slå på _animasjoner i kontaktikoner"
 
-#: ../pidgin/gtkprefs.c:1007
+#: ../pidgin/gtkprefs.c:1009
 msgid "_Notify buddies that you are typing to them"
-msgstr "Varsle kontakter når skriver til dem"
-
-#: ../pidgin/gtkprefs.c:1010
-#, fuzzy
+msgstr "_Varsle kontakter når skriver til dem"
+
+#: ../pidgin/gtkprefs.c:1012
 msgid "Highlight _misspelled words"
-msgstr "Marker stavefeil"
-
-#: ../pidgin/gtkprefs.c:1014
+msgstr "Marker _feilstavede ord"
+
+#: ../pidgin/gtkprefs.c:1016
 msgid "Use smooth-scrolling"
-msgstr ""
-
-#: ../pidgin/gtkprefs.c:1017
-#, fuzzy
-msgid "F_lash window when IMs are received"
-msgstr "_Blink vinduet når nye beskjeder mottas"
+msgstr "Bruk behagelig scrolling"
 
 #: ../pidgin/gtkprefs.c:1019
-#, fuzzy
+msgid "F_lash window when IMs are received"
+msgstr "B_link vinduet når nye direktemeldinger mottas"
+
+#: ../pidgin/gtkprefs.c:1021
 msgid "Minimi_ze new conversation windows"
-msgstr "Samtalevinduer for direktemeldinger"
-
-#: ../pidgin/gtkprefs.c:1023
-#, fuzzy
-msgid "Font"
-msgstr "Skrifttype"
+msgstr "Mini_mer nye samtalevinduer"
 
 #: ../pidgin/gtkprefs.c:1025
-msgid "Use document font from _theme"
-msgstr ""
+msgid "Font"
+msgstr "Skrifttype"
 
 #: ../pidgin/gtkprefs.c:1027
-msgid "Use font from _theme"
-msgstr ""
+msgid "Use document font from _theme"
+msgstr "Bruk dokument font fra _tema"
 
 #: ../pidgin/gtkprefs.c:1029
-#, fuzzy
+msgid "Use font from _theme"
+msgstr "Bruk font fra _tema"
+
+#: ../pidgin/gtkprefs.c:1031
 msgid "Conversation _font:"
-msgstr "Samtaler"
-
-#: ../pidgin/gtkprefs.c:1043
+msgstr "Samtle _font:"
+
+#: ../pidgin/gtkprefs.c:1045
 msgid "Default Formatting"
 msgstr "Standardformatering"
 
-#: ../pidgin/gtkprefs.c:1062
-#, fuzzy
-msgid ""
-"This is how your outgoing message text will appear when you use protocols "
-"that support formatting."
-msgstr ""
-"Slik vil dine utgående meldinger se ut når du bruker protokoller som støtter "
-"formatering :)"
-
-#: ../pidgin/gtkprefs.c:1128
-#, fuzzy
+#: ../pidgin/gtkprefs.c:1064
+msgid "This is how your outgoing message text will appear when you use protocols that support formatting."
+msgstr "Slik vil dine utgående meldinger se ut når du bruker protokoller som støtter formatering."
+
+#: ../pidgin/gtkprefs.c:1130
 msgid "ST_UN server:"
-msgstr "_Tjener:"
-
-#: ../pidgin/gtkprefs.c:1140
+msgstr "ST_UN-tjener:"
+
+#: ../pidgin/gtkprefs.c:1142
 msgid "<span style=\"italic\">Example: stunserver.org</span>"
-msgstr ""
-
-#: ../pidgin/gtkprefs.c:1144
-#, fuzzy
+msgstr "<span style=\"italic\">Eksempel: stunserver.org</span>"
+
+#: ../pidgin/gtkprefs.c:1146
 msgid "_Autodetect IP address"
 msgstr "Finn IP-adresse _automatisk"
 
-#: ../pidgin/gtkprefs.c:1153
+#: ../pidgin/gtkprefs.c:1155
 msgid "Public _IP:"
-msgstr "Offentlig _IP (ved NAT):"
-
-#: ../pidgin/gtkprefs.c:1182
+msgstr "Offentlig _IP:"
+
+#: ../pidgin/gtkprefs.c:1184
 msgid "Ports"
 msgstr "Porter"
 
-#: ../pidgin/gtkprefs.c:1185
+#: ../pidgin/gtkprefs.c:1187
 msgid "_Manually specify range of ports to listen on"
 msgstr "_Manuellt spesifiser et intervall av porter å lytte på"
 
-#: ../pidgin/gtkprefs.c:1188
-#, fuzzy
+#: ../pidgin/gtkprefs.c:1190
 msgid "_Start port:"
 msgstr "_Startport:"
 
-#: ../pidgin/gtkprefs.c:1195
-#, fuzzy
+#: ../pidgin/gtkprefs.c:1197
 msgid "_End port:"
 msgstr "_Sluttport:"
 
-#: ../pidgin/gtkprefs.c:1203
+#: ../pidgin/gtkprefs.c:1205
 msgid "Proxy Server"
 msgstr "Proxytjener"
 
-#: ../pidgin/gtkprefs.c:1207
+#: ../pidgin/gtkprefs.c:1209
 msgid "No proxy"
 msgstr "Ingen proxy"
 
-#: ../pidgin/gtkprefs.c:1263
+#: ../pidgin/gtkprefs.c:1265
 msgid "_User:"
 msgstr "_Bruker:"
 
-#: ../pidgin/gtkprefs.c:1328
+#: ../pidgin/gtkprefs.c:1330
 msgid "Seamonkey"
-msgstr ""
-
-#: ../pidgin/gtkprefs.c:1329
+msgstr "Seamonkey"
+
+#: ../pidgin/gtkprefs.c:1331
 msgid "Opera"
 msgstr "Opera"
 
-#: ../pidgin/gtkprefs.c:1330
+#: ../pidgin/gtkprefs.c:1332
 msgid "Netscape"
 msgstr "Netscape"
 
-#: ../pidgin/gtkprefs.c:1331
+#: ../pidgin/gtkprefs.c:1333
 msgid "Mozilla"
 msgstr "Mozilla"
 
-#: ../pidgin/gtkprefs.c:1332
+#: ../pidgin/gtkprefs.c:1334
 msgid "Konqueror"
 msgstr "Konqueror"
 
-#: ../pidgin/gtkprefs.c:1333
+#: ../pidgin/gtkprefs.c:1335
 #, fuzzy
 msgid "GNOME Default"
 msgstr "Gnome-standard"
 
-#: ../pidgin/gtkprefs.c:1334
+#: ../pidgin/gtkprefs.c:1336
 msgid "Galeon"
 msgstr "Galeon"
 
-#: ../pidgin/gtkprefs.c:1335
+#: ../pidgin/gtkprefs.c:1337
 msgid "Firefox"
 msgstr "Firefox"
 
-#: ../pidgin/gtkprefs.c:1336
+#: ../pidgin/gtkprefs.c:1338
 msgid "Firebird"
 msgstr "Firebird"
 
-#: ../pidgin/gtkprefs.c:1337
+#: ../pidgin/gtkprefs.c:1339
 msgid "Epiphany"
 msgstr "Epiphany"
 
-#: ../pidgin/gtkprefs.c:1346
+#: ../pidgin/gtkprefs.c:1348
 msgid "Manual"
 msgstr "Egendefinert"
 
-#: ../pidgin/gtkprefs.c:1399
+#: ../pidgin/gtkprefs.c:1401
 msgid "Browser Selection"
 msgstr "Valg av nettleser"
 
-#: ../pidgin/gtkprefs.c:1403
+#: ../pidgin/gtkprefs.c:1405
 msgid "_Browser:"
 msgstr "_Nettleser:"
 
-#: ../pidgin/gtkprefs.c:1411
+#: ../pidgin/gtkprefs.c:1413
 msgid "_Open link in:"
 msgstr "_Åpne lenke i:"
 
-#: ../pidgin/gtkprefs.c:1413
+#: ../pidgin/gtkprefs.c:1415
 msgid "Browser default"
 msgstr "Standard for nettleser"
 
-#: ../pidgin/gtkprefs.c:1414
+#: ../pidgin/gtkprefs.c:1416
 msgid "Existing window"
 msgstr "Eksisterende vindu"
 
-#: ../pidgin/gtkprefs.c:1416
+#: ../pidgin/gtkprefs.c:1418
 msgid "New tab"
-msgstr "Ny tab"
-
-#: ../pidgin/gtkprefs.c:1430
+msgstr "Ny fane"
+
+#: ../pidgin/gtkprefs.c:1432
 #, c-format
 msgid ""
 "_Manual:\n"
@@ -16824,72 +16177,64 @@
 "_Egendefinert:\n"
 "(%s for URL)"
 
-#: ../pidgin/gtkprefs.c:1470
-#, fuzzy
+#: ../pidgin/gtkprefs.c:1472
 msgid "Log _format:"
 msgstr "Logg_format:"
 
-#: ../pidgin/gtkprefs.c:1475
-#, fuzzy
-msgid "Log all _instant messages"
-msgstr "Logg alle direktemeldinger"
-
 #: ../pidgin/gtkprefs.c:1477
-msgid "Log all c_hats"
-msgstr "Logg alle samtaler"
+msgid "Log all _instant messages"
+msgstr "Logg alle d_irektemeldinger"
 
 #: ../pidgin/gtkprefs.c:1479
+msgid "Log all c_hats"
+msgstr "Logg alle s_amtaler"
+
+#: ../pidgin/gtkprefs.c:1481
 msgid "Log all _status changes to system log"
-msgstr "Logg alle status endinger til systemlogg"
-
-#: ../pidgin/gtkprefs.c:1625
+msgstr "Logg alle _status endinger til systemlogg"
+
+#: ../pidgin/gtkprefs.c:1627
 msgid "Sound Selection"
 msgstr "Lydvalg"
 
-#: ../pidgin/gtkprefs.c:1635
-#, fuzzy, c-format
-msgid "Quietest"
-msgstr "Avslutt"
-
 #: ../pidgin/gtkprefs.c:1637
-#, fuzzy, c-format
-msgid "Quieter"
-msgstr "Avslutt"
+msgid "Quietest"
+msgstr "Stillest"
 
 #: ../pidgin/gtkprefs.c:1639
-#, fuzzy, c-format
+msgid "Quieter"
+msgstr "Stillere"
+
+#: ../pidgin/gtkprefs.c:1641
 msgid "Quiet"
-msgstr "Avslutt"
-
-#: ../pidgin/gtkprefs.c:1643
-#, fuzzy, c-format
-msgid "Loud"
-msgstr "Last"
+msgstr "Stille"
 
 #: ../pidgin/gtkprefs.c:1645
-#, fuzzy, c-format
-msgid "Louder"
-msgstr "time"
+msgid "Loud"
+msgstr "Høy"
 
 #: ../pidgin/gtkprefs.c:1647
-#, fuzzy, c-format
+msgid "Louder"
+msgstr "Høyere"
+
+#: ../pidgin/gtkprefs.c:1649
 msgid "Loudest"
-msgstr "Lyder"
-
-#: ../pidgin/gtkprefs.c:1713
+msgstr "Høyest"
+
+#: ../pidgin/gtkprefs.c:1715
 msgid "_Method:"
 msgstr "_Metode:"
 
-#: ../pidgin/gtkprefs.c:1715
+#: ../pidgin/gtkprefs.c:1717
 msgid "Console beep"
 msgstr "Konsollpip"
 
-#: ../pidgin/gtkprefs.c:1722
+#: ../pidgin/gtkprefs.c:1724
 #, fuzzy
 msgid "No sounds"
 msgstr "Lyder"
 
-#: ../pidgin/gtkprefs.c:1730
+#: ../pidgin/gtkprefs.c:1732
 #, c-format
 msgid ""
 "Sound c_ommand:\n"
@@ -16898,91 +16243,84 @@
 "_Program for lydavspilling\n"
 "(%s for filnavn)"
 
-#
-#: ../pidgin/gtkprefs.c:1757
+#: ../pidgin/gtkprefs.c:1759
 msgid "Sounds when conversation has _focus"
 msgstr "Lyder når samtalevinduet har _fokus"
 
-#: ../pidgin/gtkprefs.c:1759
-#, fuzzy
+#: ../pidgin/gtkprefs.c:1761
 msgid "Enable sounds:"
-msgstr "Feilet."
-
-#: ../pidgin/gtkprefs.c:1770
+msgstr "Aktiver lyder:"
+
+#: ../pidgin/gtkprefs.c:1772
 msgid "Volume:"
-msgstr ""
-
-#: ../pidgin/gtkprefs.c:1850
+msgstr "Volum:"
+
+#: ../pidgin/gtkprefs.c:1852
 msgid "Play"
 msgstr "Spill av"
 
-#: ../pidgin/gtkprefs.c:1927
-#, fuzzy
+#: ../pidgin/gtkprefs.c:1929
 msgid "_Report idle time:"
-msgstr "Vis inaktiv tid"
-
-#: ../pidgin/gtkprefs.c:1932
+msgstr "_Vis inaktiv tid:"
+
+#: ../pidgin/gtkprefs.c:1934
 msgid "Based on keyboard or mouse use"
-msgstr ""
-
-#: ../pidgin/gtkprefs.c:1941
+msgstr "Basert på tastatur eller mus bruk"
+
+#: ../pidgin/gtkprefs.c:1943
 msgid "_Auto-reply:"
-msgstr "_Automatisk svar"
-
-#: ../pidgin/gtkprefs.c:1945
-#, fuzzy
+msgstr "_Automatisk svar:"
+
+#: ../pidgin/gtkprefs.c:1947
 msgid "When both away and idle"
-msgstr "Når fraværende og inaktiv"
+msgstr "Når både fraværende og inaktiv"
 
 #. Auto-away stuff
-#: ../pidgin/gtkprefs.c:1951
+#: ../pidgin/gtkprefs.c:1953
 msgid "Auto-away"
 msgstr "Automatisk fraværsmarkering"
 
-#: ../pidgin/gtkprefs.c:1953
-#, fuzzy
+#: ../pidgin/gtkprefs.c:1955
 msgid "Change status when _idle"
-msgstr "Sett som borte når inaktiv"
-
-#: ../pidgin/gtkprefs.c:1957
+msgstr "Endre status hvis _inaktiv"
+
+#: ../pidgin/gtkprefs.c:1959
 #, fuzzy
 msgid "_Minutes before becoming idle:"
 msgstr "Antall minutter før fraværsmarkert:"
 
-#: ../pidgin/gtkprefs.c:1965
-#, fuzzy
+#: ../pidgin/gtkprefs.c:1967
 msgid "Change _status to:"
-msgstr "Endre adresse til:"
+msgstr "Endre _status til:"
 
 #. Signon status stuff
-#: ../pidgin/gtkprefs.c:1986
+#: ../pidgin/gtkprefs.c:1988
 msgid "Status at Startup"
-msgstr ""
-
-#: ../pidgin/gtkprefs.c:1988
+msgstr "Status ved oppstart"
+
+#: ../pidgin/gtkprefs.c:1990
 msgid "Use status from last _exit at startup"
-msgstr ""
-
-#: ../pidgin/gtkprefs.c:1994
+msgstr "Bruk status fra siste _avslutt ved oppstart"
+
+#: ../pidgin/gtkprefs.c:1996
 msgid "Status to a_pply at startup:"
-msgstr ""
-
-#: ../pidgin/gtkprefs.c:2032
+msgstr "L_egg til status ved oppstart:"
+
+#: ../pidgin/gtkprefs.c:2034
 msgid "Interface"
 msgstr "Grensesnitt"
 
-#: ../pidgin/gtkprefs.c:2034
+#: ../pidgin/gtkprefs.c:2036
 msgid "Smiley Themes"
 msgstr "Smilefjes-tema"
 
-#: ../pidgin/gtkprefs.c:2041
+#: ../pidgin/gtkprefs.c:2043
 msgid "Browser"
 msgstr "Nettleser"
 
-#: ../pidgin/gtkprefs.c:2045
-#, fuzzy
+#: ../pidgin/gtkprefs.c:2047
 msgid "Status / Idle"
-msgstr "Borte / inaktiv"
+msgstr "Status / inaktiv"
 
 #: ../pidgin/gtkprivacy.c:80
 msgid "Allow all users to contact me"
@@ -17017,7 +16355,8 @@
 msgid "Set privacy for:"
 msgstr "Sett sikkerhet for:"
 
-#: ../pidgin/gtkprivacy.c:557 ../pidgin/gtkprivacy.c:574
+#: ../pidgin/gtkprivacy.c:557
+#: ../pidgin/gtkprivacy.c:574
 msgid "Permit User"
 msgstr "Tillat bruker"
 
@@ -17027,13 +16366,12 @@
 
 #: ../pidgin/gtkprivacy.c:559
 msgid "Please enter the name of the user you wish to be able to contact you."
-msgstr ""
-"Vennligst skriv inn navnet på brukeren som du vil skal kunne kontakte deg."
-
-#: ../pidgin/gtkprivacy.c:562 ../pidgin/gtkprivacy.c:578
-#, fuzzy
+msgstr "Vennligst skriv inn navnet på brukeren som du vil skal kunne kontakte deg."
+
+#: ../pidgin/gtkprivacy.c:562
+#: ../pidgin/gtkprivacy.c:578
 msgid "_Permit"
-msgstr "Tillat"
+msgstr "_Tillat"
 
 #: ../pidgin/gtkprivacy.c:568
 #, c-format
@@ -17045,7 +16383,8 @@
 msgid "Are you sure you wish to allow %s to contact you?"
 msgstr "Er du sikker på at du vil at %s skal kunne kontakte deg?"
 
-#: ../pidgin/gtkprivacy.c:599 ../pidgin/gtkprivacy.c:613
+#: ../pidgin/gtkprivacy.c:599
+#: ../pidgin/gtkprivacy.c:613
 msgid "Block User"
 msgstr "Blokker bruker"
 
@@ -17073,7 +16412,7 @@
 
 #: ../pidgin/gtkrequest.c:1507
 msgid "That file already exists"
-msgstr "Filen eksisterer allerede."
+msgstr "Filen eksisterer allerede"
 
 #: ../pidgin/gtkrequest.c:1508
 msgid "Would you like to overwrite it?"
@@ -17081,16 +16420,16 @@
 
 #: ../pidgin/gtkrequest.c:1511
 msgid "Overwrite"
-msgstr ""
+msgstr "Overskriv"
 
 #: ../pidgin/gtkrequest.c:1512
 msgid "Choose New Name"
-msgstr ""
-
-#: ../pidgin/gtkrequest.c:1650 ../pidgin/gtkrequest.c:1664
-#, fuzzy
+msgstr "Velg Nytt Navn"
+
+#: ../pidgin/gtkrequest.c:1650
+#: ../pidgin/gtkrequest.c:1664
 msgid "Select Folder..."
-msgstr "Velg tekstfarge"
+msgstr "Velg mappe..."
 
 #. Create the window.
 #: ../pidgin/gtkroomlist.c:375
@@ -17104,9 +16443,8 @@
 
 #. add button
 #: ../pidgin/gtkroomlist.c:451
-#, fuzzy
 msgid "_Add Chat"
-msgstr "Legg til samtale"
+msgstr "_Legg til samtale"
 
 #: ../pidgin/gtksavedstatuses.c:337
 #, fuzzy
@@ -17114,29 +16452,27 @@
 msgstr "Er du sikker på at du vil slette %s?"
 
 #. Use button
-#: ../pidgin/gtksavedstatuses.c:620 ../pidgin/gtksavedstatuses.c:1266
-#, fuzzy
+#: ../pidgin/gtksavedstatuses.c:620
+#: ../pidgin/gtksavedstatuses.c:1266
 msgid "_Use"
-msgstr "Bruk"
+msgstr "_Bruk"
 
 #: ../pidgin/gtksavedstatuses.c:780
 msgid "Title already in use.  You must choose a unique title."
 msgstr "Tittel allerede i bruk. Du må velge en unik tittel."
 
 #: ../pidgin/gtksavedstatuses.c:970
-#, fuzzy
 msgid "Different"
-msgstr "Avdeling"
+msgstr "Forskjellig"
 
 #: ../pidgin/gtksavedstatuses.c:1159
-#, fuzzy
 msgid "_Title:"
-msgstr "Tittel"
-
-#: ../pidgin/gtksavedstatuses.c:1178 ../pidgin/gtksavedstatuses.c:1497
-#, fuzzy
+msgstr "_Tittel:"
+
+#: ../pidgin/gtksavedstatuses.c:1178
+#: ../pidgin/gtksavedstatuses.c:1497
 msgid "_Status:"
-msgstr "Status:"
+msgstr "_Status:"
 
 #. Different status message expander
 #: ../pidgin/gtksavedstatuses.c:1210
@@ -17149,9 +16485,9 @@
 msgstr "Lagre & bruk"
 
 #: ../pidgin/gtksavedstatuses.c:1480
-#, fuzzy, c-format
+#, c-format
 msgid "Status for %s"
-msgstr "Status: %s"
+msgstr "Status for %s"
 
 #: ../pidgin/gtkstatusbox.c:664
 #, fuzzy
@@ -17160,80 +16496,68 @@
 
 #: ../pidgin/gtkutils.c:632
 msgid "Google Talk"
-msgstr ""
-
-#: ../pidgin/gtkutils.c:1399 ../pidgin/gtkutils.c:1422
-#, fuzzy, c-format
+msgstr "Google Talk"
+
+#: ../pidgin/gtkutils.c:1399
+#: ../pidgin/gtkutils.c:1422
+#, c-format
 msgid "The following error has occurred loading %s: %s"
-msgstr "En ukjent påloggingsfeil har inntruffet: %s."
-
-#: ../pidgin/gtkutils.c:1402 ../pidgin/gtkutils.c:1424
+msgstr "Følgende feil har oppstått ved lasting av %s: %s"
+
+#: ../pidgin/gtkutils.c:1402
+#: ../pidgin/gtkutils.c:1424
 #, fuzzy
 msgid "Failed to load image"
 msgstr "Klarte ikke å lagre bilde: %s\n"
 
 #: ../pidgin/gtkutils.c:1498
-#, fuzzy, c-format
+#, c-format
 msgid "Cannot send folder %s."
-msgstr "Kan ikke sende fil"
+msgstr "Kan ikke sende mappe %s."
 
 #: ../pidgin/gtkutils.c:1499
-#, fuzzy, c-format
-msgid ""
-"%s cannot transfer a folder. You will need to send the files within "
-"individually."
-msgstr "Gaim kan ikke overføre en mappe. Du må sende filene inni hver for seg"
-
-#: ../pidgin/gtkutils.c:1531 ../pidgin/gtkutils.c:1543
+#, c-format
+msgid "%s cannot transfer a folder. You will need to send the files within individually."
+msgstr "%s kan ikke overføre en mappe. Du må sende filene inni hver for seg."
+
+#: ../pidgin/gtkutils.c:1531
+#: ../pidgin/gtkutils.c:1543
 #: ../pidgin/gtkutils.c:1550
 #, fuzzy
 msgid "You have dragged an image"
 msgstr "Du har tastet inn et ugyldig brukernavn"
 
 #: ../pidgin/gtkutils.c:1532
-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."
-msgstr ""
-"Du kan sende dette bildet som filoverføring, sett det inn i denne bekjeden "
-"eller bruk det som kompis ikon for denne brukeren."
-
-#: ../pidgin/gtkutils.c:1538 ../pidgin/gtkutils.c:1558
-#, fuzzy
+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."
+msgstr "Du kan sende dette bildet som filoverføring, sett det inn i denne bekjeden eller bruk det som kontaktikon for denne brukeren."
+
+#: ../pidgin/gtkutils.c:1538
+#: ../pidgin/gtkutils.c:1558
 msgid "Set as buddy icon"
-msgstr "Vis kontaktikoner"
-
-#: ../pidgin/gtkutils.c:1539 ../pidgin/gtkutils.c:1559
-#, fuzzy
+msgstr "Sett som kontaktikon"
+
+#: ../pidgin/gtkutils.c:1539
+#: ../pidgin/gtkutils.c:1559
 msgid "Send image file"
-msgstr "Send beskjed"
-
-#: ../pidgin/gtkutils.c:1540 ../pidgin/gtkutils.c:1559
+msgstr "Send bildefil"
+
+#: ../pidgin/gtkutils.c:1540
+#: ../pidgin/gtkutils.c:1559
 #, fuzzy
 msgid "Insert in message"
 msgstr "Sett inn bilde"
 
 #: ../pidgin/gtkutils.c:1544
-#, fuzzy
 msgid "Would you like to set it as the buddy icon for this user?"
-msgstr "Ønsker du å bli med i samtalen?"
+msgstr "Vil du sette dette som kontaktikon for denne brukeren?"
 
 #: ../pidgin/gtkutils.c:1551
-#, fuzzy
-msgid ""
-"You can send this image as a file transfer, or use it as the buddy icon for "
-"this user."
-msgstr ""
-"Du kan sende dette bildet som filoverføring, sett det inn i denne bekjeden "
-"eller bruk det som kompis ikon for denne brukeren."
+msgid "You can send this image as a file transfer, or use it as the buddy icon for this user."
+msgstr "Du kan sende dette bildet som filoverføring, sett det inn i denne bekjeden eller bruk det som kontaktikon for denne brukeren."
 
 #: ../pidgin/gtkutils.c:1552
-msgid ""
-"You can insert this image into this message, or use it as the buddy icon for "
-"this user"
-msgstr ""
-"Du kan sette inn dette bildet i beskjed eller bruke det som kompis ikon for "
-"denne brukeren"
+msgid "You can insert this image into this message, or use it as the buddy icon for this user"
+msgstr "Du kan sette inn dette bildet i beskjed eller bruke det som kontaktikon for denne brukeren"
 
 #. I don't know if we really want to do anything here.  Most of the desktop item types are crap like
 #. * "MIME Type" (I have no clue how that would be a desktop item) and "Comment"... nothing we can really
@@ -17246,10 +16570,9 @@
 msgstr "Kan ikke sende fil"
 
 #: ../pidgin/gtkutils.c:1610
-msgid ""
-"You dragged a desktop launcher. Most likely you wanted to send whatever this "
-"launcher points to instead of this launcher itself."
-msgstr ""
+#, fuzzy
+msgid "You dragged a desktop launcher. Most likely you wanted to send whatever this launcher points to instead of this launcher itself."
+msgstr "Du dro en skrivebords starter. Sannsynligvis ville du sende det som starteren peker til og ikke starteren selv."
 
 #: ../pidgin/gtkutils.c:2345
 #, c-format
@@ -17265,52 +16588,46 @@
 #: ../pidgin/gtkutils.c:2641
 #, c-format
 msgid "The file '%s' is too large for %s.  Please try a smaller image.\n"
-msgstr ""
+msgstr "Filen '%s' er for stor for %s.  Vennligst prøv et mindre bilde.\n"
 
 #: ../pidgin/gtkutils.c:2643
-#, fuzzy
 msgid "Icon Error"
-msgstr "Ukjent feil"
+msgstr "Ikon Feil"
 
 #: ../pidgin/gtkutils.c:2644
-#, fuzzy
 msgid "Could not set icon"
-msgstr "Kunne ikke sende"
+msgstr "Kunne ikke sette ikon"
 
 #: ../pidgin/gtkutils.c:2744
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to open file '%s': %s"
-msgstr "Klarte ikke å lagre bilde: %s\n"
+msgstr "Klarte ikke å åpne fil '%s': %s"
 
 #: ../pidgin/gtkutils.c:2793
 #, c-format
-msgid ""
-"Failed to load image '%s': reason not known, probably a corrupt image file"
-msgstr ""
-
-#: ../pidgin/gtkwhiteboard.c:754 ../pidgin/gtkwhiteboard.c:773
-#, fuzzy
+msgid "Failed to load image '%s': reason not known, probably a corrupt image file"
+msgstr "Feilet å laste bilde '%s': grunn ukjent, sannsynligvis en korrupt bilde fil"
+
+#: ../pidgin/gtkwhiteboard.c:754
+#: ../pidgin/gtkwhiteboard.c:773
 msgid "Save File"
-msgstr "Lagre fil..."
+msgstr "Lagre fil"
 
 #: ../pidgin/gtkwhiteboard.c:861
-#, fuzzy
 msgid "Select color"
-msgstr "Velg tekstfarge"
+msgstr "Velg farge"
 
 #: ../pidgin/pidginstock.c:87
 msgid "_Alias"
 msgstr "_Alias"
 
 #: ../pidgin/pidginstock.c:89
-#, fuzzy
 msgid "Close _tabs"
-msgstr "L_ukk"
+msgstr "Lukk _faner"
 
 #: ../pidgin/pidginstock.c:91
-#, fuzzy
 msgid "_Get Info"
-msgstr "Hent informasjon"
+msgstr "_Hent informasjon"
 
 #: ../pidgin/pidginstock.c:92
 msgid "_Invite"
@@ -17322,34 +16639,33 @@
 
 #: ../pidgin/pidginstock.c:94
 msgid "_Open Mail"
-msgstr "Åpne _e-post"
+msgstr "_Åpne e-post"
 
 #: ../pidgin/pixmaps/emotes/default/24/default.theme.in.h:2
 msgid "Pidgin smileys"
-msgstr ""
+msgstr "Pidgin smileys"
 
 #: ../pidgin/pixmaps/emotes/none/none.theme.in.h:1
 msgid "Penguin Pimps"
-msgstr ""
+msgstr "Penguin Pimps"
 
 #: ../pidgin/pixmaps/emotes/none/none.theme.in.h:2
 msgid "Selecting this disables graphical emoticons."
-msgstr ""
+msgstr "Valg av dette fjerner bruk av grafiske animasjons ikoner."
 
 #: ../pidgin/pixmaps/emotes/none/none.theme.in.h:3
-#, fuzzy
 msgid "none"
-msgstr "Alle"
+msgstr "ingen"
 
 #: ../pidgin/plugins/cap/cap.c:450
 #, fuzzy
 msgid "Display Statistics"
 msgstr "Vis advarsler om tidsavbrudd"
 
-#: ../pidgin/plugins/cap/cap.c:462 ../pidgin/plugins/cap/cap.c:465
-#, fuzzy
+#: ../pidgin/plugins/cap/cap.c:462
+#: ../pidgin/plugins/cap/cap.c:465
 msgid "Response Probability:"
-msgstr "Svaret gikk tapt"
+msgstr "Svaret gikk tapt:"
 
 #: ../pidgin/plugins/cap/cap.c:811
 #, fuzzy
@@ -17359,23 +16675,24 @@
 #. msg_difference spinner
 #: ../pidgin/plugins/cap/cap.c:814
 msgid "Maximum response timeout:"
-msgstr ""
-
-#: ../pidgin/plugins/cap/cap.c:817 ../pidgin/plugins/cap/cap.c:824
-#: ../pidgin/plugins/cap/cap.c:831 ../pidgin/plugins/timestamp.c:150
-#, fuzzy
+msgstr "Maximum response timeout:"
+
+#: ../pidgin/plugins/cap/cap.c:817
+#: ../pidgin/plugins/cap/cap.c:824
+#: ../pidgin/plugins/cap/cap.c:831
+#: ../pidgin/plugins/timestamp.c:150
 msgid "minutes"
 msgstr "minutter"
 
 #. last_seen spinner
 #: ../pidgin/plugins/cap/cap.c:821
 msgid "Maximum last-seen difference:"
-msgstr ""
+msgstr "Maximum sist-sett differanse:"
 
 #. threshold spinner
 #: ../pidgin/plugins/cap/cap.c:828
 msgid "Threshold:"
-msgstr ""
+msgstr "Terskel:"
 
 #. *< type
 #. *< ui_requirement
@@ -17385,60 +16702,51 @@
 #. *< id
 #: ../pidgin/plugins/cap/cap.c:936
 msgid "Contact Availability Prediction"
-msgstr ""
+msgstr "Forutsigelse av Kontaktens Tilgjengelighet"
 
 #. *< name
 #. *< version
 #: ../pidgin/plugins/cap/cap.c:938
 msgid "Contact Availability Prediction plugin."
-msgstr ""
+msgstr "Forutsigelse av Kontaktens Tilgjengelighet tillegg."
 
 #. *  summary
 #: ../pidgin/plugins/cap/cap.c:939
-msgid ""
-"The contact availability plugin (cap) is used to display statistical "
-"information about buddies in a users contact list."
-msgstr ""
+msgid "The contact availability plugin (cap) is used to display statistical information about buddies in a users contact list."
+msgstr "Forutsigelse av Kontaktens Tilgjengelighet tillegg (cap) er brukt for å vise statistisk informasjon om kontakter i en brukers kontaktliste."
 
 #: ../pidgin/plugins/contact_priority.c:61
-#, fuzzy
 msgid "Buddy is idle"
-msgstr "Kontakt er inaktiv:"
+msgstr "Kontakt er inaktiv"
 
 #: ../pidgin/plugins/contact_priority.c:62
-#, fuzzy
 msgid "Buddy is away"
-msgstr "Kontakt er borte:"
+msgstr "Kontakt er borte"
 
 #: ../pidgin/plugins/contact_priority.c:63
-#, fuzzy
 msgid "Buddy is \"extended\" away"
-msgstr "Kontakt er borte:"
+msgstr "Kontakt er \"forlenget\" borte"
 
 #. Not used yet.
 #: ../pidgin/plugins/contact_priority.c:66
-#, fuzzy
 msgid "Buddy is mobile"
-msgstr "Kontakt er inaktiv:"
+msgstr "Kontakt er mobil"
 
 #: ../pidgin/plugins/contact_priority.c:68
-#, fuzzy
 msgid "Buddy is offline"
-msgstr "Kontakt er avlogget:"
+msgstr "Kontakt er avlogget"
 
 #: ../pidgin/plugins/contact_priority.c:90
 msgid "Point values to use when..."
 msgstr "Verdier for bruk når..."
 
 #: ../pidgin/plugins/contact_priority.c:118
-msgid ""
-"The buddy with the <i>largest score</i> is the buddy who will have priority "
-"in the contact.\n"
-msgstr ""
+msgid "The buddy with the <i>largest score</i> is the buddy who will have priority in the contact.\n"
+msgstr "Kontakten med den <i>største score</i> er kontakten som vil ha prioritet i kontakten.\n"
 
 #: ../pidgin/plugins/contact_priority.c:125
 msgid "Use last buddy when scores are equal"
-msgstr ""
+msgstr "Bruk den siste kontakten når resultatene er lik"
 
 #: ../pidgin/plugins/contact_priority.c:130
 #, fuzzy
@@ -17459,26 +16767,21 @@
 #. *< version
 #. *< summary
 #: ../pidgin/plugins/contact_priority.c:190
-msgid ""
-"Allows for controlling the values associated with different buddy states."
-msgstr ""
-"Lar deg kontrollere verdiene for de ulike tilstandene kontakter kan være i."
+msgid "Allows for controlling the values associated with different buddy states."
+msgstr "Lar deg kontrollere verdiene for de ulike tilstandene kontakter kan være i."
 
 #. *< description
 #: ../pidgin/plugins/contact_priority.c:192
-msgid ""
-"Allows for changing the point values of idle/away/offline states for buddies "
-"in contact priority computations."
-msgstr ""
-"Lar deg endre vektingen for inaktiv/borte/avlogget for kontakter i "
-"kontaktprioritetsutregninger."
+msgid "Allows for changing the point values of idle/away/offline states for buddies in contact priority computations."
+msgstr "Lar deg endre vektingen for inaktiv/borte/avlogget for kontakter i kontaktprioritetsutregninger."
 
 #: ../pidgin/plugins/convcolors.c:23
 #, fuzzy
 msgid "Conversation Colors"
 msgstr "/Samtale/L_ukk"
 
-#: ../pidgin/plugins/convcolors.c:25 ../pidgin/plugins/convcolors.c:26
+#: ../pidgin/plugins/convcolors.c:25
+#: ../pidgin/plugins/convcolors.c:26
 #, fuzzy
 msgid "Customize colors in the conversation window"
 msgstr "Samtalevinduer for direktemeldinger"
@@ -17499,19 +16802,18 @@
 msgstr "Send beskjed"
 
 #: ../pidgin/plugins/convcolors.c:85
-#, fuzzy
 msgid "Sent Messages"
-msgstr "Send beskjed"
+msgstr "Sendte beskjeder"
 
 #: ../pidgin/plugins/convcolors.c:86
-#, fuzzy
 msgid "Received Messages"
-msgstr "Send beskjed"
-
-#: ../pidgin/plugins/convcolors.c:210 ../pidgin/plugins/pidginrc.c:251
-#, fuzzy, c-format
+msgstr "Mottatte beskjeder"
+
+#: ../pidgin/plugins/convcolors.c:210
+#: ../pidgin/plugins/pidginrc.c:245
+#, c-format
 msgid "Select Color for %s"
-msgstr "Velg tekstfarge"
+msgstr "Velg farge for %s"
 
 #: ../pidgin/plugins/convcolors.c:310
 #, fuzzy
@@ -17519,13 +16821,12 @@
 msgstr "Ignorer farger"
 
 #: ../pidgin/plugins/convcolors.c:311
-#, fuzzy
 msgid "Apply in Chats"
-msgstr "Samtalealias"
+msgstr "Legg til i Samtaler"
 
 #: ../pidgin/plugins/convcolors.c:312
 msgid "Apply in IMs"
-msgstr ""
+msgstr "Legg til i Direktemeldinger"
 
 #: ../pidgin/plugins/extplacement.c:80
 msgid "By conversation count"
@@ -17537,10 +16838,8 @@
 
 #. Translators: "New conversations" should match the text in the preferences dialog and "By conversation count" should be the same text used above
 #: ../pidgin/plugins/extplacement.c:105
-msgid ""
-"Note: The preference for \"New conversations\" must be set to \"By "
-"conversation count\"."
-msgstr ""
+msgid "Note: The preference for \"New conversations\" must be set to \"By conversation count\"."
+msgstr "NB: Preferansene for \"Nye samtaler\" må være satt til \"By conversation count\"."
 
 #: ../pidgin/plugins/extplacement.c:111
 msgid "Number of conversations per window"
@@ -17548,9 +16847,7 @@
 
 #: ../pidgin/plugins/extplacement.c:117
 msgid "Separate IM and Chat windows when placing by number"
-msgstr ""
-"Separere direktemeldings- og chattevinduer når programet plasserer etter "
-"nummer"
+msgstr "Separere direktemeldings- og chattevinduer når programet plasserer etter nummer"
 
 #. *< type
 #. *< ui_requirement
@@ -17566,17 +16863,13 @@
 #. *< version
 #: ../pidgin/plugins/extplacement.c:148
 msgid "Extra conversation placement options."
-msgstr "Flere plasseringsmuligheter for samtaler"
+msgstr "Flere plasseringsmuligheter for samtaler."
 
 #. *< summary
 #. *  description
 #: ../pidgin/plugins/extplacement.c:150
-msgid ""
-"Restrict the number of conversations per windows, optionally separating IMs "
-"and Chats"
-msgstr ""
-"Begrens det maksimale antallet samtaler per vindu, og eventuelt separering "
-"av direktemeldinger og chat"
+msgid "Restrict the number of conversations per windows, optionally separating IMs and Chats"
+msgstr "Begrens det maksimale antallet samtaler per vindu, og eventuelt separering av direktemeldinger og chat"
 
 #. Configuration frame
 #: ../pidgin/plugins/gestures/gestures.c:235
@@ -17638,9 +16931,7 @@
 #. Add the label.
 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:457
 msgid "Select a person from your address book below, or add a new person."
-msgstr ""
-"Velg en person fra adresseboken som er vist under, eller legg til en ny "
-"person"
+msgstr "Velg en person fra adresseboken som er vist under, eller legg til en ny person."
 
 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:551
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:301
@@ -17661,18 +16952,13 @@
 
 #. Add the label.
 #: ../pidgin/plugins/gevolution/assoc-buddy.c:343
-msgid ""
-"Select a person from your address book to add this buddy to, or create a new "
-"person."
-msgstr ""
-"Velg en person fra adresseboka for å legge til denne kontakten, eller lag en "
-"ny kontakt."
+msgid "Select a person from your address book to add this buddy to, or create a new person."
+msgstr "Velg en person fra adresseboka for å legge til denne kontakten, eller lag en ny kontakt."
 
 #. Add the expander
 #: ../pidgin/plugins/gevolution/assoc-buddy.c:431
-#, fuzzy
 msgid "User _details"
-msgstr "Skjul brukerdetaljer"
+msgstr "_Brukerdetaljer"
 
 #. "Associate Buddy" button
 #: ../pidgin/plugins/gevolution/assoc-buddy.c:484
@@ -17681,24 +16967,22 @@
 
 #: ../pidgin/plugins/gevolution/gevolution.c:240
 #: ../pidgin/plugins/gevolution/gevolution.c:246
-#, fuzzy
 msgid "Unable to send e-mail"
-msgstr "Kunne ikke sende e-post"
+msgstr "Klarte ikke å sende e-post"
 
 #: ../pidgin/plugins/gevolution/gevolution.c:241
 msgid "The evolution executable was not found in the PATH."
-msgstr "Den kjørbare filen til Evolution ble ikke funnet i banen"
+msgstr "Den kjørbare filen til Evolution ble ikke funnet i banen."
 
 #: ../pidgin/plugins/gevolution/gevolution.c:247
 msgid "An e-mail address was not found for this buddy."
-msgstr ""
+msgstr "En e-post adresse ble ikke funnet for denne kontakten."
 
 #: ../pidgin/plugins/gevolution/gevolution.c:273
 msgid "Add to Address Book"
 msgstr "Legg til i adresseboka"
 
 #: ../pidgin/plugins/gevolution/gevolution.c:285
-#, fuzzy
 msgid "Send E-Mail"
 msgstr "Send E-post"
 
@@ -17729,9 +17013,8 @@
 #. *  description
 #: ../pidgin/plugins/gevolution/gevolution.c:530
 #: ../pidgin/plugins/gevolution/gevolution.c:532
-#, fuzzy
 msgid "Provides integration with Evolution."
-msgstr "Tilbyr integrasjon med Ximian Evolution"
+msgstr "Tilbyr integrasjon med Evolution."
 
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:262
 msgid "Please enter the person's information below."
@@ -17739,9 +17022,7 @@
 
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:266
 msgid "Please enter the buddy's screen name and account type below."
-msgstr ""
-"Venligst tast inn kontaktens brukernavn og hvilken protokoll kontakten "
-"finnes på under."
+msgstr "Venligst tast inn kontaktens brukernavn og hvilken protokoll kontakten finnes på under."
 
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:286
 msgid "Account type:"
@@ -17750,7 +17031,7 @@
 #. Optional Information section
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:309
 msgid "Optional information:"
-msgstr "Tilleggsinformasjon"
+msgstr "Tilleggsinformasjon:"
 
 #: ../pidgin/plugins/gevolution/new_person_dialog.c:344
 msgid "First name:"
@@ -17793,7 +17074,7 @@
 "\n"
 "<b>Inaktiv:</b>"
 
-#: ../pidgin/plugins/history.c:188
+#: ../pidgin/plugins/history.c:192
 msgid "History"
 msgstr "Historikk"
 
@@ -17811,7 +17092,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../pidgin/plugins/iconaway.c:85 ../pidgin/plugins/iconaway.c:87
+#: ../pidgin/plugins/iconaway.c:85
+#: ../pidgin/plugins/iconaway.c:87
 msgid "Iconifies the buddy list and your conversations when you go away."
 msgstr "Minimer kontaktlisten og samtalene når du er markert som borte."
 
@@ -17825,40 +17107,40 @@
 
 #: ../pidgin/plugins/mailchk.c:163
 msgid "Adds a small box to the buddy list that shows if you have new mail."
-msgstr ""
-"Legger til en liten boks i kontaktlista som viser om du har fått e-post."
+msgstr "Legger til en liten boks i kontaktlista som viser om du har fått e-post."
 
 #: ../pidgin/plugins/markerline.c:23
 #, fuzzy
 msgid "Markerline"
 msgstr "Understrek"
 
-#: ../pidgin/plugins/markerline.c:25 ../pidgin/plugins/markerline.c:26
+#: ../pidgin/plugins/markerline.c:25
+#: ../pidgin/plugins/markerline.c:26
 msgid "Draw a line to indicate new messages in a conversation."
-msgstr ""
+msgstr "Tegn en linje for å indikere nye beskjeder for denne samtalen."
 
 #: ../pidgin/plugins/markerline.c:246
 msgid "Draw Markerline in "
-msgstr ""
-
-#: ../pidgin/plugins/markerline.c:250 ../pidgin/plugins/notify.c:682
+msgstr "Tegn Understrek i "
+
+#: ../pidgin/plugins/markerline.c:250
+#: ../pidgin/plugins/notify.c:682
 msgid "_IM windows"
 msgstr "Vinduer for direktemeldinger"
 
 #
-#: ../pidgin/plugins/markerline.c:254 ../pidgin/plugins/notify.c:689
+#: ../pidgin/plugins/markerline.c:254
+#: ../pidgin/plugins/notify.c:689
 msgid "C_hat windows"
 msgstr "_Samtalevinduer"
 
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:44
-msgid ""
-"A music messaging session has been requested. Please click the MM icon to "
-"accept."
-msgstr ""
+msgid "A music messaging session has been requested. Please click the MM icon to accept."
+msgstr "En musikk samtale økt har blitt forespurt. Vennligst klikk på MM ikonet for å akseptere."
 
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:45
 msgid "Music messaging session confirmed."
-msgstr ""
+msgstr "Musikk samtale økt bekreftet."
 
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:430
 #, fuzzy
@@ -17867,7 +17149,7 @@
 
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:431
 msgid "There was a conflict in running the command:"
-msgstr ""
+msgstr "Det oppsto en konflikt ved kjøring av kommando:"
 
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:539
 #, fuzzy
@@ -17875,9 +17157,8 @@
 msgstr "Klarte ikke bli med i gruppesamtale %s"
 
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:540
-#, fuzzy
 msgid "The following error has occurred:"
-msgstr "En ukjent påloggingsfeil har inntruffet: %s."
+msgstr "Følgende feil har oppstått:"
 
 #. Configuration frame
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:639
@@ -17887,11 +17168,11 @@
 
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:643
 msgid "Score Editor Path"
-msgstr ""
+msgstr "Resultat Redigerings Bane"
 
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:644
 msgid "_Apply"
-msgstr "Bruk"
+msgstr "_Bruk"
 
 #. *< type
 #. *< ui_requirement
@@ -17903,14 +17184,12 @@
 #. *< version
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:685
 msgid "Music Messaging Plugin for collaborative composition."
-msgstr ""
+msgstr "Musikk Samtale Tillegg for samarbeids komposisjon."
 
 #. *  summary
 #: ../pidgin/plugins/musicmessaging/musicmessaging.c:687
-msgid ""
-"The Music Messaging Plugin allows a number of users to simultaneously work "
-"on a piece of music by editting a common score in real-time."
-msgstr ""
+msgid "The Music Messaging Plugin allows a number of users to simultaneously work on a piece of music by editting a common score in real-time."
+msgstr "Musikk Samtale Tillegg tillater flere brukere å arbeide på et stykke musikk samtidig ved å redigere et felles resultat i samtid."
 
 #. ---------- "Notify For" ----------
 #: ../pidgin/plugins/notify.c:678
@@ -17919,7 +17198,7 @@
 
 #: ../pidgin/plugins/notify.c:697
 msgid "\t_Only when someone says your screen name"
-msgstr ""
+msgstr "\t_Kun når noen sier skjermnavnet ditt"
 
 #
 #: ../pidgin/plugins/notify.c:707
@@ -18004,7 +17283,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../pidgin/plugins/notify.c:910 ../pidgin/plugins/notify.c:912
+#: ../pidgin/plugins/notify.c:910
+#: ../pidgin/plugins/notify.c:912
 msgid "Provides a variety of ways of notifying you of unread messages."
 msgstr "Lar deg bli varslet om uleste meldinger på flere vis."
 
@@ -18015,9 +17295,8 @@
 #. *< priority
 #. *< id
 #: ../pidgin/plugins/pidgininc.c:91
-#, fuzzy
 msgid "Pidgin Demonstration Plugin"
-msgstr "Gaim eksempeltillegg"
+msgstr "Pidgin Demonstrasjons Tillegg"
 
 #. *< name
 #. *< version
@@ -18054,54 +17333,41 @@
 
 #: ../pidgin/plugins/pidginrc.c:54
 msgid "GtkTreeView Horizontal Separation"
-msgstr ""
-
-#: ../pidgin/plugins/pidginrc.c:73
+msgstr "GtkTreeView Horizontal Separation"
+
+#: ../pidgin/plugins/pidginrc.c:69
 #, fuzzy
 msgid "Conversation Entry"
 msgstr "Samtaler"
 
-#: ../pidgin/plugins/pidginrc.c:74
-#, fuzzy
-msgid "Conversation History"
-msgstr "Samtaler Historie"
-
-#: ../pidgin/plugins/pidginrc.c:75
-#, fuzzy
-msgid "Log Viewer"
-msgstr "Log Viser"
-
-#: ../pidgin/plugins/pidginrc.c:76
+#: ../pidgin/plugins/pidginrc.c:70
 #, fuzzy
 msgid "Request Dialog"
 msgstr "Anmodnings Dialog"
 
-#: ../pidgin/plugins/pidginrc.c:77
+#: ../pidgin/plugins/pidginrc.c:71
 #, fuzzy
 msgid "Notify Dialog"
 msgstr "Bruk varsling for"
 
-#: ../pidgin/plugins/pidginrc.c:253
-#, fuzzy
+#: ../pidgin/plugins/pidginrc.c:247
 msgid "Select Color"
-msgstr "Velg tekstfarge"
-
-#: ../pidgin/plugins/pidginrc.c:300
-#, fuzzy, c-format
+msgstr "Velg Farge"
+
+#: ../pidgin/plugins/pidginrc.c:294
 msgid "Select Interface Font"
-msgstr "Velg skrifttype"
-
-#: ../pidgin/plugins/pidginrc.c:303
-#, fuzzy, c-format
+msgstr "Velg Grensesnitt Font"
+
+#: ../pidgin/plugins/pidginrc.c:297
+#, c-format
 msgid "Select Font for %s"
-msgstr "Velg skrifttype"
-
-#: ../pidgin/plugins/pidginrc.c:371
-#, fuzzy
+msgstr "Velg Font for %s"
+
+#: ../pidgin/plugins/pidginrc.c:365
 msgid "GTK+ Interface Font"
-msgstr "Valg for grensesnitt"
-
-#: ../pidgin/plugins/pidginrc.c:391
+msgstr "GTK+ Grensesnitt Font"
+
+#: ../pidgin/plugins/pidginrc.c:385
 msgid "GTK+ Text Shortcut Theme"
 msgstr "GTK+ Tekst Tema Snarvei"
 
@@ -18125,42 +17391,39 @@
 #. widget_bool_widgets[i]);
 #. }
 #.
-#: ../pidgin/plugins/pidginrc.c:428
-#, fuzzy
+#: ../pidgin/plugins/pidginrc.c:422
 msgid "Interface colors"
-msgstr "Ignorer farger"
-
-#: ../pidgin/plugins/pidginrc.c:452
+msgstr "Grensesnitt farger"
+
+#: ../pidgin/plugins/pidginrc.c:446
 msgid "Widget Sizes"
-msgstr ""
-
-#: ../pidgin/plugins/pidginrc.c:473
-#, fuzzy
+msgstr "Widget Sizes"
+
+#: ../pidgin/plugins/pidginrc.c:467
 msgid "Fonts"
-msgstr "Kontoer"
-
-#: ../pidgin/plugins/pidginrc.c:497
-#, fuzzy
+msgstr "Fonter"
+
+#: ../pidgin/plugins/pidginrc.c:491
 msgid "Gtkrc File Tools"
-msgstr "Styre Gaim fra kontrollfil"
-
-#: ../pidgin/plugins/pidginrc.c:502
+msgstr "Gtkrc Fil Verktøy"
+
+#: ../pidgin/plugins/pidginrc.c:496
 #, c-format
 msgid "Write settings to %s%sgtkrc-2.0"
-msgstr ""
-
-#: ../pidgin/plugins/pidginrc.c:511
+msgstr "Skriv instillinger til %s%sgtkrc-2.0"
+
+#: ../pidgin/plugins/pidginrc.c:505
 msgid "Re-read gtkrc files"
-msgstr ""
-
-#: ../pidgin/plugins/pidginrc.c:544
-#, fuzzy
+msgstr "Les gtkrc filer på nytt"
+
+#: ../pidgin/plugins/pidginrc.c:538
 msgid "Pidgin GTK+ Theme Control"
-msgstr "Gaim GTK+ Tema Kontroll"
-
-#: ../pidgin/plugins/pidginrc.c:546 ../pidgin/plugins/pidginrc.c:547
+msgstr "Pidgin GTK+ Tema Kontroll"
+
+#: ../pidgin/plugins/pidginrc.c:540
+#: ../pidgin/plugins/pidginrc.c:541
 msgid "Provides access to commonly used gtkrc settings."
-msgstr "Gir tilgang til vanlig brukte gtkrc innstillinger"
+msgstr "Gir tilgang til vanlig brukte gtkrc innstillinger."
 
 #: ../pidgin/plugins/raw.c:175
 msgid "Raw"
@@ -18172,30 +17435,23 @@
 
 #: ../pidgin/plugins/raw.c:178
 #, fuzzy
-msgid ""
-"Lets you send raw input to text-based protocols (XMPP, MSN, IRC, TOC). Hit "
-"'Enter' in the entry box to send. Watch the debug window."
-msgstr ""
-"Lar deg sende direktekommandoer til tekstbaserte protokoller (Jabber, MSN, "
-"IRC, TOC). Trykk 'Enter' for å sende, og sjekk avlusningsvinduet."
+msgid "Lets you send raw input to text-based protocols (XMPP, MSN, IRC, TOC). Hit 'Enter' in the entry box to send. Watch the debug window."
+msgstr "Lar deg sende direktekommandoer til tekstbaserte protokoller (Jabber, MSN, IRC, TOC). Trykk 'Enter' for å sende, og sjekk avlusningsvinduet."
 
 #: ../pidgin/plugins/relnot.c:71
-#, fuzzy, c-format
-msgid ""
-"You are using %s version %s.  The current version is %s.  You can get it "
-"from <a href=\"%s\">%s</a><hr>"
-msgstr "Du bruker Gaim versjon %s. Den nåværende versjonen er %s.<hr>"
+#, c-format
+msgid "You are using %s version %s.  The current version is %s.  You can get it from <a href=\"%s\">%s</a><hr>"
+msgstr "Du bruker %s versjon %s. Den nåværende versjonen er %s.  Du kan hente den fra <a href=\"%s\">%s</a><hr>"
 
 #: ../pidgin/plugins/relnot.c:79
-#, fuzzy, c-format
+#, c-format
 msgid "<b>ChangeLog:</b><br>%s"
-msgstr ""
-"<b> Endringslogg: </b>\n"
-"%s<br><br>"
-
-#: ../pidgin/plugins/relnot.c:84 ../pidgin/plugins/relnot.c:85
+msgstr "<b>Endringslogg:</b><br>%s"
+
+#: ../pidgin/plugins/relnot.c:84
+#: ../pidgin/plugins/relnot.c:85
 msgid "New Version Available"
-msgstr "Ny versjon tilgjengelig"
+msgstr "Ny Versjon Tilgjengelig"
 
 #. *< type
 #. *< ui_requirement
@@ -18212,15 +17468,12 @@
 #. *  summary
 #: ../pidgin/plugins/relnot.c:146
 msgid "Checks periodically for new releases."
-msgstr "Sjekker periodisk for nye utgaver"
+msgstr "Sjekker periodisk for nye utgaver."
 
 #. *  description
 #: ../pidgin/plugins/relnot.c:148
-msgid ""
-"Checks periodically for new releases and notifies the user with the "
-"ChangeLog."
-msgstr ""
-"Sjekker periodisk for nye versjoner, og gir endringslista til brukeren."
+msgid "Checks periodically for new releases and notifies the user with the ChangeLog."
+msgstr "Sjekker periodisk for nye versjoner, og gir endringslista til brukeren."
 
 #: ../pidgin/plugins/spellchk.c:1962
 msgid "Duplicate Correction"
@@ -18228,7 +17481,7 @@
 
 #: ../pidgin/plugins/spellchk.c:1963
 msgid "The specified word already exists in the correction list."
-msgstr "Ordet finnes allerede i korrigerings listen"
+msgstr "Ordet finnes allerede i korrigerings listen."
 
 #: ../pidgin/plugins/spellchk.c:2177
 msgid "Text Replacements"
@@ -18236,11 +17489,11 @@
 
 #: ../pidgin/plugins/spellchk.c:2200
 msgid "You type"
-msgstr "Når du skriver"
+msgstr "Du skriver"
 
 #: ../pidgin/plugins/spellchk.c:2214
 msgid "You send"
-msgstr "Erstatt det til"
+msgstr "Du sender"
 
 #: ../pidgin/plugins/spellchk.c:2228
 msgid "Whole words only"
@@ -18248,7 +17501,7 @@
 
 #: ../pidgin/plugins/spellchk.c:2240
 msgid "Case sensitive"
-msgstr ""
+msgstr "Case sensitive"
 
 #: ../pidgin/plugins/spellchk.c:2266
 msgid "Add a new text replacement"
@@ -18256,20 +17509,20 @@
 
 #: ../pidgin/plugins/spellchk.c:2282
 msgid "You _type:"
-msgstr "Når du skriver:"
+msgstr "Du _skriver:"
 
 #: ../pidgin/plugins/spellchk.c:2299
 msgid "You _send:"
-msgstr "Erstatt det til: "
+msgstr "Du _sender:"
 
 #. Created here so it can be passed to whole_words_button_toggled.
 #: ../pidgin/plugins/spellchk.c:2311
 msgid "_Exact case match (uncheck for automatic case handling)"
-msgstr ""
+msgstr "_Eksakt case match (huk av for automatisk case handling)"
 
 #: ../pidgin/plugins/spellchk.c:2313
 msgid "Only replace _whole words"
-msgstr "Erstatt kun hele ord"
+msgstr "Erstatt kun _hele ord"
 
 #: ../pidgin/plugins/spellchk.c:2338
 #, fuzzy
@@ -18278,13 +17531,14 @@
 
 #: ../pidgin/plugins/spellchk.c:2339
 msgid "Enable replacement of last word on send"
-msgstr ""
+msgstr "Slå på utskiftning av siste ord på send"
 
 #: ../pidgin/plugins/spellchk.c:2370
 msgid "Text replacement"
 msgstr "Teksterstatter"
 
-#: ../pidgin/plugins/spellchk.c:2372 ../pidgin/plugins/spellchk.c:2373
+#: ../pidgin/plugins/spellchk.c:2372
+#: ../pidgin/plugins/spellchk.c:2373
 msgid "Replaces text in outgoing messages according to user-defined rules."
 msgstr "Erstatter tekst i utgående beskjeder etter regler som du bestemmer."
 
@@ -18294,7 +17548,8 @@
 #. *< 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:354
 msgid "Buddy Ticker"
 msgstr "Rullende kontaktliste"
 
@@ -18302,14 +17557,14 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../pidgin/plugins/ticker/ticker.c:357 ../pidgin/plugins/ticker/ticker.c:359
+#: ../pidgin/plugins/ticker/ticker.c:357
+#: ../pidgin/plugins/ticker/ticker.c:359
 msgid "A horizontal scrolling version of the buddy list."
 msgstr "En horisontalt rullende versjon av kontaktlisten."
 
 #: ../pidgin/plugins/timestamp.c:137
-#, fuzzy
 msgid "Display Timestamps Every"
-msgstr "iChat tidsstempel"
+msgstr "Vis Tidsstempel Hver"
 
 #. *< type
 #. *< ui_requirement
@@ -18325,9 +17580,8 @@
 #. *< version
 #. *  summary
 #: ../pidgin/plugins/timestamp.c:205
-#, fuzzy
 msgid "Display iChat-style timestamps"
-msgstr "iChat tidsstempel"
+msgstr "Vis tidsstempel i iChat stil"
 
 #. *  description
 #: ../pidgin/plugins/timestamp.c:207
@@ -18337,22 +17591,19 @@
 
 #: ../pidgin/plugins/timestamp_format.c:23
 msgid "Timestamp Format Options"
-msgstr ""
+msgstr "Innstillinger for Tidsstempel Format"
 
 #: ../pidgin/plugins/timestamp_format.c:26
-#, c-format
 msgid "_Force 24-hour time format"
-msgstr ""
+msgstr "_Tving 24-timers format"
 
 #: ../pidgin/plugins/timestamp_format.c:33
-#, fuzzy
 msgid "Show dates in..."
-msgstr "Vis flere valg"
+msgstr "Vis datoer i..."
 
 #: ../pidgin/plugins/timestamp_format.c:38
-#, fuzzy
 msgid "Co_nversations:"
-msgstr "Samtaler"
+msgstr "Sa_mtaler:"
 
 #: ../pidgin/plugins/timestamp_format.c:40
 #: ../pidgin/plugins/timestamp_format.c:49
@@ -18363,12 +17614,11 @@
 #: ../pidgin/plugins/timestamp_format.c:41
 #: ../pidgin/plugins/timestamp_format.c:50
 msgid "For delayed messages and in chats"
-msgstr ""
+msgstr "For forsinkede beskjeder og i samtaler"
 
 #: ../pidgin/plugins/timestamp_format.c:47
-#, fuzzy
 msgid "_Message Logs:"
-msgstr "Beskjedlogging"
+msgstr "_Beskjed logging:"
 
 #. *< type
 #. *< ui_requirement
@@ -18378,21 +17628,19 @@
 #. *< id
 #: ../pidgin/plugins/timestamp_format.c:151
 msgid "Message Timestamp Formats"
-msgstr ""
+msgstr "Beskjeds Tidsstempel Formater"
 
 #. *< name
 #. *< version
 #. *  summary
 #: ../pidgin/plugins/timestamp_format.c:154
 msgid "Customizes the message timestamp formats."
-msgstr ""
+msgstr "Lager egne tidsstempel formater for beskjeder."
 
 #. *  description
 #: ../pidgin/plugins/timestamp_format.c:156
-msgid ""
-"This plugin allows the user to customize conversation and logging message "
-"timestamp formats."
-msgstr ""
+msgid "This plugin allows the user to customize conversation and logging message timestamp formats."
+msgstr "Dette tillegget tillater brukeren å lage egne samtale og loggings tidsstempler."
 
 #: ../pidgin/plugins/win32/transparency/win2ktrans.c:175
 #: ../pidgin/plugins/win32/transparency/win2ktrans.c:598
@@ -18460,13 +17708,11 @@
 #: ../pidgin/plugins/win32/transparency/win2ktrans.c:698
 #, fuzzy
 msgid ""
-"This plugin enables variable alpha transparency on conversation windows and "
-"the buddy list.\n"
+"This plugin enables variable alpha transparency on conversation windows and the buddy list.\n"
 "\n"
 "* Note: This plugin requires Win2000 or greater."
 msgstr ""
-"Dette tillegget gjør at samtalevinduene og kontaktlisten blir delvis "
-"gjennomsiktige.\n"
+"Dette tillegget gjør at samtalevinduene og kontaktlisten blir delvis gjennomsiktige.\n"
 "\n"
 "* Merk: du må ha Windows 2000 eller Windows XP for at denne skal virke."
 
@@ -18480,9 +17726,9 @@
 msgstr "Oppstart"
 
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:312
-#, fuzzy, c-format
+#, c-format
 msgid "_Start %s on Windows startup"
-msgstr "Start Gaim når Windows starter"
+msgstr "_Start %s når Windows starter"
 
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:327
 msgid "_Dockable Buddy List"
@@ -18490,14 +17736,14 @@
 
 #. Blist On Top
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:331
-#, fuzzy
 msgid "_Keep Buddy List window on top:"
-msgstr "Hold kontaktlistevinduet øverst"
+msgstr "_Hold kontaktlistevinduet øverst:"
 
 #. XXX: Did this ever work?
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:336
+#, fuzzy
 msgid "Only when docked"
-msgstr ""
+msgstr "Only when docked"
 
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:341
 #, fuzzy
@@ -18510,21 +17756,16 @@
 msgstr "Innloggingsvalg"
 
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:373
-#, fuzzy
 msgid "Options specific to Pidgin for Windows."
-msgstr "Innstillinger som er spesifikke for Windows Gaim."
+msgstr "Innstillinger som er spesifikke for Windows Pidgin."
 
 #: ../pidgin/plugins/win32/winprefs/winprefs.c:374
-#, fuzzy
-msgid ""
-"Provides options specific to Pidgin for Windows , such as buddy list docking."
-msgstr ""
-"Gir spesifikke innstillinger for Windows Gaim, slik som kontaktliste docking "
-"og samtale blinking."
+msgid "Provides options specific to Pidgin for Windows , such as buddy list docking."
+msgstr "Gir spesifikke innstillinger for Windows Pidgin, slik som kontaktliste docking og samtale blinking."
 
 #: ../pidgin/plugins/xmppconsole.c:667
 msgid "<font color='#777777'>Logged out.</font>"
-msgstr ""
+msgstr "<font color='#777777'>Logget ut.</font>"
 
 #. *< type
 #. *< ui_requirement
@@ -18532,1705 +17773,41 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/xmppconsole.c:746 ../pidgin/plugins/xmppconsole.c:841
+#: ../pidgin/plugins/xmppconsole.c:746
+#: ../pidgin/plugins/xmppconsole.c:841
 #: ../pidgin/plugins/xmppconsole.c:860
 msgid "XMPP Console"
-msgstr ""
+msgstr "XMPP Konsoll"
 
 #: ../pidgin/plugins/xmppconsole.c:753
-#, fuzzy
 msgid "Account: "
 msgstr "Konto:"
 
 #: ../pidgin/plugins/xmppconsole.c:780
 msgid "<font color='#777777'>Not connected to XMPP</font>"
-msgstr ""
+msgstr "<font color='#777777'>Ikke koblet til XMPP</font>"
 
 #: ../pidgin/plugins/xmppconsole.c:790
 msgid "Insert an <iq/> stanza."
-msgstr ""
+msgstr "Sett inn et <iq/> vers."
 
 #: ../pidgin/plugins/xmppconsole.c:799
 msgid "Insert a <presence/> stanza."
-msgstr ""
+msgstr "Sett inn et <presence/> vers."
 
 #: ../pidgin/plugins/xmppconsole.c:808
-#, fuzzy
 msgid "Insert a <message/> stanza."
-msgstr "Sett inn bilde"
+msgstr "Sett inn et <message/> vers."
 
 #. *< name
 #. *< version
 #. *  summary
 #: ../pidgin/plugins/xmppconsole.c:863
 msgid "Send and receive raw XMPP stanzas."
-msgstr ""
+msgstr "Send og motta direkte XMPP vers."
 
 #. *  description
 #: ../pidgin/plugins/xmppconsole.c:865
 msgid "This plugin is useful for debbuging XMPP servers or clients."
-msgstr ""
-
-#, fuzzy
-#~ msgid "Offline buddies"
-#~ msgstr "Dimme ned inaktive kontakter"
-
-#, fuzzy
-#~ msgid "Sort"
-#~ msgstr "Port"
-
-#, fuzzy
-#~ msgid "By Status"
-#~ msgstr "Etter status"
-
-#, fuzzy
-#~ msgid "By Log Size"
-#~ msgstr "Etter loggstørrelse"
-
-#, fuzzy
-#~ msgid "Unable to connect to contact server"
-#~ msgstr "Kan ikke koble til tjener."
-
-#, fuzzy
-#~ msgid "Unable to retrieve MSN Address Book"
-#~ msgstr "Kunne ikke hente kontaktliste"
-
-#, fuzzy
-#~ msgid "Current media"
-#~ msgstr "Pålogget på"
-
-#, fuzzy
-#~ msgid "Windows Live Messenger Protocol Plugin"
-#~ msgstr "Novel GroupWise Messenger protolltillegg"
-
-#, fuzzy
-#~ msgid "Windows Live ID authentication Failed"
-#~ msgstr "Normal autentisering feilet"
-
-#, fuzzy
-#~ msgid "%s just sent you a Nudge!"
-#~ msgstr "%s ønsker å sende deg en fil."
-
-#, fuzzy
-#~ msgid "Unknown error (%d)"
-#~ msgstr "Ukjent feil"
-
-#, fuzzy
-#~ msgid "Unable to connect to OIM server"
-#~ msgstr "Kan ikke koble til tjener."
-
-#, fuzzy
-#~ msgid "%s (%s) changed status from %s to %s"
-#~ msgstr "%s har endret kanaltema til: %s"
-
-#, fuzzy
-#~ msgid "%s (%s) is now %s"
-#~ msgstr "%s heter nå %s"
-
-#, fuzzy
-#~ msgid "%s (%s) is no longer %s"
-#~ msgstr "%s er tilbake."
-
-#, fuzzy
-#~ msgid "_Merge"
-#~ msgstr "Beskjed:"
-
-#, fuzzy
-#~ msgid "_Send File..."
-#~ msgstr "_Send fil"
-
-#, fuzzy
-#~ msgid "Add Buddy _Pounce..."
-#~ msgstr "Legg til kompisvarsling"
-
-#, fuzzy
-#~ msgid "Hide when offline"
-#~ msgstr "Ikke tillatt når avlogget"
-
-#, fuzzy
-#~ msgid "Show when offline"
-#~ msgstr "Ikke tillatt når avlogget"
-
-#, fuzzy
-#~ msgid "Add _Buddy..."
-#~ msgstr "Legg til kontakt"
-
-#, fuzzy
-#~ msgid "Add C_hat..."
-#~ msgstr "Legg til samtale"
-
-#, fuzzy
-#~ msgid "Persistent"
-#~ msgstr "Tillat"
-
-#, fuzzy
-#~ msgid "/Accounts/Manage"
-#~ msgstr "Kontoer"
-
-#, fuzzy
-#~ msgid "A_ccount:"
-#~ msgstr "Konto:"
-
-#, fuzzy
-#~ msgid "S_end To"
-#~ msgstr "Send som"
-
-#~ msgid "Gaim Internet Messenger"
-#~ msgstr "Gaim lynmeldingsklient"
-
-#~ msgid "Hide Disconnect Errors"
-#~ msgstr "Skjul frakoblingsfeil"
-
-#~ msgid "Hide Login Errors"
-#~ msgstr "Skjul påloggningsfeil"
-
-#, fuzzy
-#~ msgid "Hide Reconnecting Dialog"
-#~ msgstr "Skjul frakoblingsfeil"
-
-#~ msgid "When you are kicked offline, this reconnects you."
-#~ msgstr ""
-#~ "Dette tillegget vil koble deg til på nytt dersom du mister forbindelsen."
-
-#~ msgid "Use last matching buddy"
-#~ msgstr "Bruk samme kontakt som sist"
-
-#, fuzzy
-#~ msgid ""
-#~ "The buddy with the lowest score is the buddy who will have priority in "
-#~ "the contact.\n"
-#~ "The default values (offline = 4, away = 2, and idle = 1) will use what "
-#~ "used to be\n"
-#~ "the built-in order: active, idle, away, away + idle, offline."
-#~ msgstr ""
-#~ "Kompisen med den laveste verdien er den som er prioritert i kontakten.\n"
-#~ "Standardverdiene (frakoblet = 4, fraværende = 2, og ingen aktivitet = 1)\n"
-#~ "vil tilsvare det som var den innebygde rekkefølgen:\n"
-#~ "aktiv -> ingen aktivitet -> fraværende -> fraværende og ingen aktivitet -"
-#~ "> ikke pålogget."
-
-#~ msgid "Gaim"
-#~ msgstr "Gaim"
-
-#~ msgid "Gaim - Signed off"
-#~ msgstr "Gaim - Avlogget"
-
-#~ msgid "Gaim - Away"
-#~ msgstr "Gaim - Borte"
-
-#~ msgid "Join A Chat..."
-#~ msgstr "Bli med i samtalegruppe..."
-
-#~ msgid "Displays an icon for Gaim in the system tray."
-#~ msgstr "Viser et ikon for gaim i systemtray."
-
-#~ msgid ""
-#~ "Displays a system tray icon (in GNOME, KDE or Windows for example) to "
-#~ "show the current status of Gaim, allow fast access to commonly used "
-#~ "functions, and to toggle display of the buddy list or login window. Also "
-#~ "allows messages to be queued until the icon is clicked, similar to ICQ."
-#~ msgstr ""
-#~ "Bruker et beskjedvarslings-applet (f.eks. i GNOME eller KDE) for å vise "
-#~ "Gaims status, gi hurtig tilgang til ofte brukte funksjoner, og for å "
-#~ "fjerne/vise kontaktlisten og påloggingsvinduet. Muliggjør også kølegging "
-#~ "av beskjeder helt til ikonet klikkes, a la ICQ."
-
-#, fuzzy
-#~ msgid "GtkTreeView Expander Size"
-#~ msgstr "Utvider-størrelse"
-
-#~ msgid "The specified buddy was not found in the Evolution Contacts."
-#~ msgstr "Kompisen ble ikke funnet i adresseboka til Evolution"
-
-#~ msgid ""
-#~ "When a new conversation is opened this plugin will insert the last "
-#~ "conversation into the current conversation.\n"
-#~ "\n"
-#~ "The history plugin requires logging be enabled. Logging can be enabled "
-#~ "from Tools -> Preferences -> Logging. Enabling logs for instant messages "
-#~ "and/or chats will activate history for the same conversation type(s)."
-#~ msgstr ""
-#~ "Når en ny samtale er åpnet vil dette tillegget sette inn siste samtale i "
-#~ "den pågående samtalen.\n"
-#~ "\n"
-#~ "Historie tillegget krever at logging er slått på. Logging kan bli satt på "
-#~ "gjennom Verktøy -> Innstillinger -> Logging. Å slå på logger for "
-#~ "lynmeldinger og/eller prat vil aktivere historie for den samme "
-#~ "samtaletypen."
-
-#~ msgid ""
-#~ "You can get version %s from:<br><a href=\"http://gaim.sourceforge.net/"
-#~ "\">http://gaim.sourceforge.net</a>."
-#~ msgstr ""
-#~ "Du kan finne versjon %s her:<br><a href=\"http://gaim.sourceforge.net/"
-#~ "\">http://gaim.sourceforge.net</a>."
-
-#~ msgid "Delay"
-#~ msgstr "Sett inn hvert"
-
-#~ msgid "WinGaim Options"
-#~ msgstr "WinGaim Innstilinger"
-
-#~ msgid ""
-#~ "%d buddy from group %s was not removed because its account was not logged "
-#~ "in.  This buddy and the group were not removed.\n"
-#~ msgid_plural ""
-#~ "%d buddies from group %s were not removed because their accounts were not "
-#~ "logged in.  These buddies and the group were not removed.\n"
-#~ msgstr[0] ""
-#~ "%d kontakt fra gruppen %s ble ikke fjernet fordi kontaktens konto ikke "
-#~ "var innlogget. Denne kontakten (og gruppen) ble ikke fjernet.\n"
-#~ msgstr[1] ""
-#~ "%d kontakter fra gruppen %s ble ikke fjernet fordi kontoene deres ikke "
-#~ "var innlogget. Disse kontaktene (og gruppen) ble ikke fjernet.\n"
-
-#~ msgid "Group not removed"
-#~ msgstr "Gruppe ikke fjernet"
-
-#~ msgid "(+%d more)"
-#~ msgstr "(+%d flere)"
-
-#~ msgid " left the room (%s)."
-#~ msgstr " forlot rommet (%s)."
-
-#~ msgid "Screen Name:"
-#~ msgstr "Skjermnavn:"
-
-#~ msgid "Buddy icon:"
-#~ msgstr "Kontaktikon:"
-
-#~ msgid ""
-#~ "\n"
-#~ "\n"
-#~ "Do you wish to add him or her to your buddy list?"
-#~ msgstr ""
-#~ "\n"
-#~ "\n"
-#~ "Ønsker du å legge vedkommende til i din kontaktliste?"
-
-#~ msgid "_Alias Buddy..."
-#~ msgstr "_Alias for kontakt..."
-
-#
-#, fuzzy
-#~ msgid "Alias Contact..."
-#~ msgstr "Kontaktalias..."
-
-#~ msgid "/Tools/Account Ac_tions"
-#~ msgstr "/Verktøy/_Handlinger for kontoer"
-
-#~ msgid "/Tools/A_ccounts"
-#~ msgstr "/Verktøy/K_ontoer"
-
-#
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "<b>Contact Alias:</b> %s"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Kontaktalias:</b>"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "<b>Alias:</b> %s"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Alias:</b>"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "<b>Nickname:</b> %s"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Kallenavn:</b>"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "<b>Logged In:</b> %s"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Pålogget:</b> "
-
-#~ msgid ""
-#~ "\n"
-#~ "<b>Status:</b> Offline"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Status:</b> Avlogget"
-
-#~ msgid ""
-#~ "\n"
-#~ "<b>Description:</b> Spooky"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Beskrivelse:</b> Skummel"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "<b>Status:</b> Awesome"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Status:</b> Fantastisk"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "<b>Status:</b> Rockin'"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Status:</b> Rockin'"
-
-#~ msgid "/Tools/Buddy Pounce"
-#~ msgstr "/Verktøy/Kompisvarsel"
-
-#~ msgid "/Tools/Account Actions"
-#~ msgstr "/Verktøy/_Handlinger for kontoe"
-
-# Lot "me" stå, var usikker på om denne brukes "teknisk"
-# (denne meldingen kommer opp når du skriver "debug version"
-# - da byttes "me" ut med kallenavn)
-#~ msgid "me is using Gaim v%s."
-#~ msgstr "me bruker Gaim v%s."
-
-#, fuzzy
-#~ msgid "/Options/Show Buddy _Icon"
-#~ msgstr "Vis kontaktikoner"
-
-#, fuzzy
-#~ msgid "/Options/Show Buddy Icon"
-#~ msgstr "Vis kontaktikoner"
-
-#~ msgid "IM the user"
-#~ msgstr "Send beskjed til bruker"
-
-#~ msgid "Ignore the user"
-#~ msgstr "Ignorer bruker"
-
-#~ msgid "Get the user's information"
-#~ msgstr "Hent brukerinformasjon"
-
-#, fuzzy
-#~ msgid "Jabber developer"
-#~ msgstr "tidligere jabber-utvikler"
-
-#, fuzzy
-#~ msgid ""
-#~ "Gaim is a modular messaging client capable of using AIM, MSN, Yahoo!, "
-#~ "Jabber, ICQ, IRC, SILC, Novell GroupWise, Napster, Zephyr, and Gadu-Gadu "
-#~ "all at once.  It is written using GTK+ and is licensed under the GNU GPL."
-#~ "<BR><BR>"
-#~ msgstr ""
-#~ "Gaim er en modulbasert klient for direktemeldinger som kan bruke AIM, "
-#~ "MSN, Yahoo!, Jabber, ICQ, IRC, SILC, Novell GroupWise, Napster, Zephyr, "
-#~ "og Gadu-Gadu samtidig. Programmet er bygget på Gtk+ og er lisensiert "
-#~ "under GPL.<BR><BR>"
-
-#~ msgid "<FONT SIZE=\"4\">IRC:</FONT> #wingaim on irc.freenode.net<BR><BR>"
-#~ msgstr "<FONT SIZE=\"4\">IRC:</FONT> #wingaim på irc.freenode.net<BR><BR>"
-
-#~ msgid "Active Developers"
-#~ msgstr "Aktive utviklere"
-
-#~ msgid "_Keep the dialog open"
-#~ msgstr "Hold dialogen åpen"
-
-#~ msgid "Smaller font size"
-#~ msgstr "Mindre skrift"
-
-#~ msgid "Insert link"
-#~ msgstr "Sett inn lenke"
-
-#~ msgid "Insert image"
-#~ msgstr "Sett inn bilde"
-
-#, fuzzy
-#~ msgid "Conversation in %s on %s"
-#~ msgstr "Samtaler med %s"
-
-#~ msgid "<span weight=\"bold\">From:</span> %s\n"
-#~ msgstr "<span weight=\"bold\">Fra:</span> %s\n"
-
-#~ msgid "<span weight=\"bold\">Subject:</span> %s\n"
-#~ msgstr "<span weight=\"bold\">Emne:</span> %s\n"
-
-#~ msgid ""
-#~ "<span weight=\"bold\" size=\"larger\">You have mail!</span>\n"
-#~ "\n"
-#~ "%s%s%s%s"
-#~ msgstr ""
-#~ "<span weight=\"bold\" size=\"larger\">Du har e-post!</span>\n"
-#~ "\n"
-#~ "%s%s%s%s"
-
-#~ msgid "Error launching <b>%s</b>: %s"
-#~ msgstr "Feil under starting av kommando: <b>%s</b>:%s"
-
-#~ msgid "A_way"
-#~ msgstr "_Borte"
-
-#~ msgid "_Idle"
-#~ msgstr "_Inaktiv"
-
-#~ msgid "Retur_n from idle"
-#~ msgstr "Retur_ner fra inaktivitet"
-
-#~ msgid "Pounce Action"
-#~ msgstr "Varslingsmåte"
-
-#~ msgid "Bro_wse..."
-#~ msgstr "Bla _gjennom"
-
-#~ msgid "Sav_e this pounce after activation"
-#~ msgstr "Lagre denne varslingen etter aktivering"
-
-#~ msgid "Remove Buddy Pounce"
-#~ msgstr "Fjern kompisvarsling"
-
-#~ msgid "Send unknown \"_slash\" commands as messages"
-#~ msgstr "Send ukjente \"skråstreks\"-kommandoer som meldinger"
-
-#~ msgid "Show buddy _icons"
-#~ msgstr "Vis kontaktikoner"
-
-#~ msgid "Tab Options"
-#~ msgstr "Fanevalg"
-
-#~ msgid "_Sounds while away"
-#~ msgstr "Lyder når du er fraværsmarkert"
-
-#~ msgid "_Queue new messages when away"
-#~ msgstr "Når borte, legg nye beskjeder i kø"
-
-#, fuzzy
-#~ msgid "Custom status"
-#~ msgstr "Etter status"
-
-#~ msgid ""
-#~ "Unable to play sound because the 'Command' sound method has been chosen, "
-#~ "but no command has been set."
-#~ msgstr ""
-#~ "Kunne ikke spille av lyd fordi du har valgt at et eksternt program skal "
-#~ "spille av lyd, men ikke spesifisert navnet på programmet."
-
-#~ msgid ""
-#~ "Unable to play sound because the configured sound command could not be "
-#~ "launched: %s"
-#~ msgstr ""
-#~ "Kunne ikke spille av lyd fordi det konfigurerte avspillingsprogrammet "
-#~ "ikke kunne startes: %s"
-
-#~ msgid "_Warn"
-#~ msgstr "Advar"
-
-#~ msgid ""
-#~ "You can send this image as a file transfer or embed it into this message, "
-#~ "or use it as the buddy icon for this user."
-#~ msgstr ""
-#~ "Du kan sende dette bildet som filoverføring, sett det inn i denne "
-#~ "bekjeden eller bruk det som kompis ikon for denne brukeren."
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "<b>Status:</b> %s"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Status:</b> Fantastisk"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "<b>Message:</b> %s"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>%s:</b> %s"
-
-#, fuzzy
-#~ msgid "Could't open file"
-#~ msgstr "Kan ikke sende fil"
-
-#, fuzzy
-#~ msgid "Change password"
-#~ msgstr "Bytt passord"
-
-#~ msgid "<b>%s:</b> %s"
-#~ msgstr "<b>%s:</b> %s"
-
-#~ msgid "<b>%s:</b> %s<br>"
-#~ msgstr "<b>%s:</b> %s<br>"
-
-#~ msgid "Realname"
-#~ msgstr "Virkelig navn"
-
-#~ msgid "Cannot join %s:"
-#~ msgstr "Kan ikke bli med i %s:"
-
-#~ msgid ""
-#~ "Server requires TLS/SSL for login.  Select \"Use TLS if available\" in "
-#~ "account properties"
-#~ msgstr ""
-#~ "Tjeneren krever TSL/SSL for innlogging. Velg \"Bruk TLS hvis tilgjengelig "
-#~ "\" i kontoalternativer."
-
-#~ msgid "Jabber ID"
-#~ msgstr "Jabber-feil"
-
-#, fuzzy
-#~ msgid "Search for Jabber users"
-#~ msgstr "Kontaktsøk etter e-postadresse"
-
-#~ msgid "Invalid Jabber ID"
-#~ msgstr "Ugyldig jabber-ID"
-
-#~ msgid "Change Jabber Password"
-#~ msgstr "Bytt jabber-passord"
-
-#~ msgid "Jabber Protocol Plugin"
-#~ msgstr "Jabber-protokolltillegg"
-
-#~ msgid "Use TLS if available"
-#~ msgstr "Bruk TLS hvis tilgjengelig"
-
-#~ msgid "The user %s wants to add %s to his or her buddy list."
-#~ msgstr "Brukeren %s ønsker å legge til %s i kontaktlisten sin."
-
-#~ msgid "You have just sent a Nudge!"
-#~ msgstr "Du har sent en Nudge!"
-
-#~ msgid ""
-#~ "\n"
-#~ "<b>%s:</b> %s"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>%s:</b> %s"
-
-#~ msgid "Hidden"
-#~ msgstr "Usynlig"
-
-#~ msgid "<b>%s:</b> "
-#~ msgstr "<b>%s:</b> "
-
-#~ msgid "MSN Profile"
-#~ msgstr "MSN-profil"
-
-#~ msgid "Login server"
-#~ msgstr "Påloggingstjener"
-
-#~ msgid "The user %s (%s) wants to add %s to his or her buddy list."
-#~ msgstr "Brukeren %s (%s) ønsker å legge til %s i kontaktlisten sin."
-
-#~ msgid "Unable to read header from server"
-#~ msgstr "Kunne ikke lese meldingshode fra tjener"
-
-#~ msgid ""
-#~ "Unable to read message from server: %s.  Command is %hd, length is %hd."
-#~ msgstr ""
-#~ "Kunne ikke lese melding fra tjener: %s. Kommando er %hd, lengde er %hd."
-
-#~ msgid "users: %s, files: %s, size: %sGB"
-#~ msgstr "brukere: %s, filer: %s, størrelse %sGB"
-
-#~ msgid "Unable to add \"%s\" to your Napster hotlist"
-#~ msgstr "Kunne ikke legge til \"%s\" i Napster-listen din"
-
-#~ msgid "%s requested a PING"
-#~ msgstr "%s pinget deg"
-
-#~ msgid "NAPSTER Protocol Plugin"
-#~ msgstr "Napster-protokolltillegg"
-
-#
-#~ msgid "Invalid password"
-#~ msgstr "Ugyldig passord"
-
-#~ msgid "Invalid username or password"
-#~ msgstr "Ugyldig brukernavn eller passord"
-
-#~ msgid "Error processing event or response (%s)."
-#~ msgstr "Klarte ikke behandle hendelse eller svar (%s)."
-
-#~ msgid "Direct IM with %s closed"
-#~ msgstr "Direkte samtale med %s stengt"
-
-#~ msgid "Direct IM with %s failed"
-#~ msgstr "Direkte samtale med %s mislyktes"
-
-#~ msgid "Unable to open Direct IM"
-#~ msgstr "Kunne ikke åpne direkte direktesamtale"
-
-#, fuzzy
-#~ msgid "You have lost your connection to chat room %s."
-#~ msgstr "Du har blitt koblet fra samtalegruppen %s."
-
-#~ msgid "Chat is currently unavailable"
-#~ msgstr "Samtalegrupper er for tiden utilgjengelig"
-
-#~ msgid ""
-#~ "Transfer of file %s timed out.\n"
-#~ " Try enabling proxy servers for file transfers in Tools->Preferences->AIM/"
-#~ "ICQ."
-#~ msgstr ""
-#~ "Overføring av filen %s timet ut.\n"
-#~ " Forsøk å slå på proxy servere for filoverføringer i Verktøy-"
-#~ ">Innstillinger->AIM/ICQ."
-
-#, fuzzy
-#~ msgid "Unable to log into file transfer proxy."
-#~ msgstr "Kunne ikke skrive fil %s."
-
-#, fuzzy
-#~ msgid ""
-#~ "Unable to establish listener socket or no AOL proxy connection present."
-#~ msgstr "Kunne ikke etablere lytte-socket."
-
-#~ msgid ""
-#~ "The user %s requires authorization before being added to a buddy list.  "
-#~ "Do you want to send an authorization request?"
-#~ msgstr ""
-#~ "Brukeren %s krever godkjenning før vedkommende legges til i "
-#~ "kontaktlisten. Vil du sende en godkjenningsforespørsel?"
-
-#~ msgid "Request Authorization"
-#~ msgstr "Spør om godkjenning"
-
-#, fuzzy
-#~ msgid ""
-#~ "The user %u wants to add %s to their buddy list for the following "
-#~ "reason:\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Brukeren %u ønsker å legge deg til sin kontaktliste og oppgav følgende "
-#~ "grunn:\n"
-#~ "%s"
-
-#~ msgid "Authorization Request"
-#~ msgstr "Godkjenningsforespørsel"
-
-#~ msgid "<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"
-#~ msgstr "<B>UIN:</B> %s<BR><B>Status:</B> %s<HR>%s"
-
-#~ msgid "SNAC threw error: %s\n"
-#~ msgstr "SNAC-feil: %s\n"
-
-#~ msgid "User information for %s unavailable:"
-#~ msgstr "Brukerinformasjon for %s er ikke tilgjengelig:"
-
-#~ msgid "Rate limiting error."
-#~ msgstr "Feil ved hastighetsbegrensning."
-
-#~ msgid "You have been signed off for an unknown reason."
-#~ msgstr "Du har blitt logget av, årsak ukjent."
-
-#~ msgid ""
-#~ "Your screen name is currently formatted as follows:\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Skjermnavnet ditt er formatert slik:\n"
-#~ "%s"
-
-#~ msgid "Unable to set AIM away message."
-#~ msgstr "Kunne ikke sette fraværsbeskjed for AIM."
-
-#~ msgid ""
-#~ "You have probably requested to set your away message before the login "
-#~ "procedure completed.  You remain in a \"present\" state; try setting it "
-#~ "again when you are fully connected."
-#~ msgstr ""
-#~ "Du har antakeligvis prøvd å sette en fraværsbeskjed før "
-#~ "innloggingsprosedyren var ferdig. Du er fortsatt markert som til stede. "
-#~ "Prøv å gjenta operasjonen når du er ferdig pålogget."
-
-#~ msgid ""
-#~ "Could not add the buddy %s for an unknown reason.  The most common reason "
-#~ "for this is that you have the maximum number of allowed buddies in your "
-#~ "buddy list."
-#~ msgstr ""
-#~ "Kunne ikke legge til kontakten %s pga. en ukjent feil. Den vanligste "
-#~ "årsaken til dette er at du har nådd maksimalgrensen for antall kontakter "
-#~ "i kontaktlisten din."
-
-#, fuzzy
-#~ msgid ""
-#~ "The user %s wants to add %s to their buddy list for the following "
-#~ "reason:\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Brukeren %s ønsker å legge deg til i kontaktlisten sin med følgende "
-#~ "grunn:\n"
-#~ "%s"
-
-#, fuzzy
-#~ msgid "Hide IP address"
-#~ msgstr "IP-adresse"
-
-#, fuzzy
-#~ msgid "Web aware"
-#~ msgstr "Web-oppmerksom"
-
-#~ msgid "New screen name formatting:"
-#~ msgstr "Ny skjermnavn-formatering:"
-
-#~ msgid "Format Screen Name..."
-#~ msgstr "Formatere skjermnavn..."
-
-#~ msgid "Use AIM/ICQ proxy server (Slower/More Secure/Usually Works)"
-#~ msgstr "Bruk AIM/ICQ proxy server (Saktere/Mer sikkert/Fungerer vanligvis)"
-
-#~ msgid "Auth host"
-#~ msgstr "Autentiseringsadresse:"
-
-#~ msgid "Auth port"
-#~ msgstr "Autentiseringsport:"
-
-#~ msgid "Active"
-#~ msgstr "Aktiv"
-
-#~ msgid ""
-#~ "Could not add the buddy %s because every simple user has to start with "
-#~ "'sip:'."
-#~ msgstr ""
-#~ "Kunne ikke tilføye kompis %s fordi hver enkel bruker må starte med 'sip:'."
-
-#~ msgid "Thomas Butter <butter@uni-mannheim.de>"
-#~ msgstr "Thomas Butter <butter@uni-mannheim.de>"
-
-#~ msgid "EMail"
-#~ msgstr "E-post"
-
-#~ msgid "Instant Messages"
-#~ msgstr "Direktemeldinger"
-
-#~ msgid "Verify all IM message signatures"
-#~ msgstr "Bekreft alle direktemeldingssignaturer"
-
-#~ msgid "Channel Messages"
-#~ msgstr "Kanalmeldinger"
-
-#~ msgid "Digitally sign all channel messages"
-#~ msgstr "Signer alle kanalmeldinger digitalt"
-
-#~ msgid "Verify all channel message signatures"
-#~ msgstr "Bekreft alle kanalmeldingssignaturer"
-
-#, fuzzy
-#~ msgid "Reject watching by other users"
-#~ msgstr "Avvis overvåkning fra andre brukere"
-
-#~ msgid "Block invites"
-#~ msgstr "Blokker invitasjoner"
-
-#, fuzzy
-#~ msgid "Reject online status attribute requests"
-#~ msgstr "Avvis spørsmål om tilkoplingsstatus"
-
-#~ msgid "TOC has sent a PAUSE command."
-#~ msgstr "TOC har sendt en PAUSE-kommando."
-
-#~ msgid ""
-#~ "When this happens, TOC ignores any messages sent to it, and may kick you "
-#~ "off if you send a message. Gaim will prevent anything from going through. "
-#~ "This is only temporary, please be patient."
-#~ msgstr ""
-#~ "Når dette skjer, vil TOC ignorere alle beskjeder som blir sendt, og vil "
-#~ "kanskje kaste deg ut hvis du prøver å sende. Gaim vil derfor stoppe alle "
-#~ "utsendelser. Dette er bare midlertidig, vennligst vent."
-
-#~ msgid "Gaim - Save As..."
-#~ msgstr "Gaim - Lagre som..."
-
-#~ msgid "TOC host"
-#~ msgstr "TOC-adresse:"
-
-#~ msgid "TOC port"
-#~ msgstr "TOC-port:"
-
-#, fuzzy
-#~ msgid "Message (optional) :"
-#~ msgstr "Beskjedvarsling"
-
-#~ msgid ""
-#~ "The normal authentication method has failed. This means either your "
-#~ "password is incorrect, or Yahoo!'s authentication scheme has changed. "
-#~ "Gaim will now attempt to log in using Web Messenger authentication, which "
-#~ "will result in reduced functionality and features."
-#~ msgstr ""
-#~ "Den normale autentifikasjonsmekanismen har feilet, noe som enten betyr at "
-#~ "passordet ditt er feil, eller at Yahoo! sin autentifikasjonsmetode har "
-#~ "endret seg. Gaim vil nå forsøke å logge inn ved hjelp av Web Messenger "
-#~ "autentifikasjon, noe som vil føre til redusert funksjonalitet og færre "
-#~ "muligheter"
-
-#~ msgid "Unable to read"
-#~ msgstr "Kunne ikke lese"
-
-#, fuzzy
-#~ msgid "Stealth"
-#~ msgstr "Fylke/stat"
-
-#~ msgid "Pager host"
-#~ msgstr "Personsøker-adresse:"
-
-#, fuzzy
-#~ msgid "YCHT Host"
-#~ msgstr "YCHT-vert"
-
-#, fuzzy
-#~ msgid "YCHT Port"
-#~ msgstr "YCHT-Port"
-
-#~ msgid "<b>IP Address:</b> %s<br>"
-#~ msgstr "<b>IP-adresse:</b> %s <br>"
-
-#~ msgid "(%d message)"
-#~ msgid_plural "(%d messages)"
-#~ msgstr[0] "(%d beskjeder)"
-#~ msgstr[1] "(%d beskjeder)"
-
-#~ msgid "(1 message)"
-#~ msgstr "(1 beskjed)"
-
-#~ msgid "%s came back"
-#~ msgstr "%s kom tilbake"
-
-#, fuzzy
-#~ msgid "Default auto-away"
-#~ msgstr "Automatisk fraværsmarkering"
-
-#~ msgid "g003: Error opening connection.\n"
-#~ msgstr "g003: Feil ved tilkobling.\n"
-
-#, fuzzy
-#~ msgid "Show more buddy details"
-#~ msgstr "Vis brukerdetaljer"
-
-#~ msgid "Gnome Default"
-#~ msgstr "Gnome-standard"
-
-#~ msgid "Away m_essage:"
-#~ msgstr "Fraværsbeskjed:"
-
-#, fuzzy
-#~ msgid "Quit message"
-#~ msgstr "(1 beskjed)"
-
-#~ msgid "Restore Away State On Reconnect"
-#~ msgstr ""
-#~ "Fortsett som fraværende etter at forbindelsen har blitt gjennoprettet"
-
-#~ msgid "Mail Server"
-#~ msgstr "E-posttjener"
-
-#~ msgid "%s (%d new/%d total)"
-#~ msgstr "%s (%d nye/%d totalt)"
-
-#~ msgid "Check Mail"
-#~ msgstr "Sjekk e-post"
-
-#~ msgid "Check e-mail every X seconds.\n"
-#~ msgstr "Sjekk e-post hvert Xte sekund.\n"
-
-#~ msgid "Auto-login"
-#~ msgstr "Automatisk pålogging"
-
-#~ msgid "Signoff"
-#~ msgstr "Logge av"
-
-#~ msgid "_Hide new messages until tray icon is clicked"
-#~ msgstr "Skjul nye beskjeder inntil trayikon klikkes"
-
-#~ msgid "Not connected to AIM"
-#~ msgstr "Ikke tilkoblet til AIM"
-
-#~ msgid "No roomname given."
-#~ msgstr "Romnavn ikke oppgitt."
-
-#~ msgid "Invalid AIM URI"
-#~ msgstr "Ugyldig AIM URI"
-
-#~ msgid ""
-#~ "Failed to assign %s to a socket:\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Klarte ikke tilordne %s til en socket:\n"
-#~ "%s"
-
-#~ msgid "Remote Control"
-#~ msgstr "Styre Gaim fra kontrollfil"
-
-#~ msgid "Provides remote control for gaim applications."
-#~ msgstr "Muliggjør fjernstyring for Gaim-applikasjoner."
-
-#~ msgid ""
-#~ "Gives Gaim the ability to be remote-controlled through third-party "
-#~ "applications or through the gaim-remote tool."
-#~ msgstr ""
-#~ "Lar Gaim bli kontrollert fra tredjeparts-applikasjoner eller gjennom "
-#~ "verktøyet gaim-remote."
-
-#~ msgid "Docked _Buddy List is always on top"
-#~ msgstr "Dockable kontaktliste er alltid øverst"
-
-#~ msgid "Away!"
-#~ msgstr "Borte"
-
-#~ msgid "Edit This Message"
-#~ msgstr "Rediger denne meldingen"
-
-#~ msgid "I'm Back!"
-#~ msgstr "Tilbake!"
-
-#~ msgid "Remove Away Message"
-#~ msgstr "Fjern fraværsbeskjed"
-
-#~ msgid "Set All Away"
-#~ msgstr "Marker som borte på alle"
-
-#~ msgid "You cannot save an away message with a blank title"
-#~ msgstr "Du kan ikke lagre en fraværsbeskjed uten tittel"
-
-#~ msgid ""
-#~ "Please give the message a title, or choose \"Use\" to use without saving."
-#~ msgstr ""
-#~ "Vennligst gi beskjeden en tittel, eller velg \"Bruk\" for å bruke uten "
-#~ "lagring."
-
-#~ msgid "You cannot create an empty away message"
-#~ msgstr "Du kan ikke lage en tom fraværsbeskjed"
-
-#~ msgid "Away title: "
-#~ msgstr "Tittel: "
-
-#~ msgid "Buddy List Error"
-#~ msgstr "Feil i kontaktliste"
-
-#~ msgid "Size of the expander arrow"
-#~ msgstr "Størrelse på utvider-pil"
-
-#~ msgid ""
-#~ "Usage: %s command [OPTIONS] [URI]\n"
-#~ "\n"
-#~ "    COMMANDS:\n"
-#~ "       uri                      Handle AIM: URI\n"
-#~ "       away                     Popup the away dialog with the default "
-#~ "message\n"
-#~ "       back                     Remove the away dialog\n"
-#~ "       quit                     Close running copy of Gaim\n"
-#~ "\n"
-#~ "    OPTIONS:\n"
-#~ "       -h, --help [command]     Show help for command\n"
-#~ msgstr ""
-#~ "Bruksmåte: %s kommando [FLAGG] [URI]\n"
-#~ "\n"
-#~ "    KOMMANDOER:\n"
-#~ "       uri                      Håndtere AIM-URI\n"
-#~ "       away                      Sprett opp fraværsdialogen med "
-#~ "standardmeldingen\n"
-#~ "       back                     Fjern standardmeldingen\n"
-#~ "       quit                     Lukk Gaim-program som kjører\n"
-#~ "\n"
-#~ "    FLAGG:\n"
-#~ "       -h, --help [kommando]    Vis hjelp for kommando\n"
-
-#~ msgid ""
-#~ "Gaim not running (on session 0)\n"
-#~ "Is the \"Remote Control\" plugin loaded?\n"
-#~ msgstr ""
-#~ "Gaim kjører ikke (på sesjon 0)\n"
-#~ "Er fjernstyringstillegget lastet?\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Using AIM: URIs:\n"
-#~ "Sending an IM to a screen name:\n"
-#~ "\tgaim-remote uri 'aim:goim?screenname=Penguin&message=hello+world'\n"
-#~ "In this case, 'Penguin' is the screen name we wish to IM, and 'hello "
-#~ "world'\n"
-#~ "is the message to be sent.  '+' must be used in place of spaces.\n"
-#~ "Please note the quoting used above - if you run this from a shell the "
-#~ "'&'\n"
-#~ "needs to be escaped, or the command will stop at that point.\n"
-#~ "Also,the following will just open a conversation window to a screen "
-#~ "name,\n"
-#~ "with no message:\n"
-#~ "\tgaim-remote uri 'aim:goim?screenname=Penguin'\n"
-#~ "\n"
-#~ "Joining a chat:\n"
-#~ "\tgaim-remote uri 'aim:gochat?roomname=PenguinLounge'\n"
-#~ "...joins the 'PenguinLounge' chat room.\n"
-#~ "\n"
-#~ "Adding a buddy to your buddy list:\n"
-#~ "\tgaim-remote uri 'aim:addbuddy?screenname=Penguin'\n"
-#~ "...prompts you to add 'Penguin' to your buddy list.\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Bruke AIM: URIer:\n"
-#~ "Å sende en direktebeskjed til en kontakts skjermnavn:\n"
-#~ "\tgaim-remote uri 'aim:goim?screenname=Penguin&message=hello+world'\n"
-#~ "'Penguin' er skjermnavnet vi ønsker å sende direktebeskjed til, og "
-#~ "'hello\n"
-#~ "world' er beskjeden. Tegnet '+' må brukes som erstatning for mellomrom.\n"
-#~ "Merk at hvordan kommandoen over bruker anførselstegn - hvis du starter\n"
-#~ "kommandoen fra et shell, må du passe på å 'escape' tegnet &, ellers vil "
-#~ "resten\n"
-#~ "av linja ignoreres. Hvis du bare ønsker å åpne et samtalevindu til en "
-#~ "kontakt\n"
-#~ "uten å sende noen beskjed først, kan du gjøre slik:\n"
-#~ "\tgaim-remote uri aim:goim?screenname=Penguin\n"
-#~ "\n"
-#~ "For å bli med i en samtale:\n"
-#~ "\tgaim-remote uri aim:gochat?roomname=PenguinLounge\n"
-#~ "...starter en samtale i PenguinLounge-samtalerommet.\n"
-#~ "\n"
-#~ "For å legge til en kontakt i kontaktlisten:\n"
-#~ "\tgaim-remote uri aim:addbuddy?screenname=Penguin\n"
-#~ "...vil spørre deg om å legge til Penguin i kontaktlisten.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Close running copy of Gaim\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Lukk eksisterende Gaim-program\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Mark all accounts as \"away\" with the default message.\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Merk alle kontoer som \"fraværende\" med standardmeldingen.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Set all accounts as not away.\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Sett alle kontoers status til ikke fraværende.\n"
-
-#~ msgid "Show fewer options"
-#~ msgstr "Vis færre valg"
-
-#~ msgid "/Tools/_Away"
-#~ msgstr "/Verktøy/_Borte"
-
-#~ msgid "/Tools/Pl_ugin Actions"
-#~ msgstr "/Verktøy/Handlinger for tillegg"
-
-#~ msgid "Rename Group"
-#~ msgstr "Endre gruppenavn"
-
-#~ msgid "New group name"
-#~ msgstr "Nytt gruppenavn:"
-
-#~ msgid "%d%%"
-#~ msgstr "%d%%"
-
-#~ msgid ""
-#~ "\n"
-#~ "<b>Account:</b>"
-#~ msgstr ""
-#~ "\n"
-#~ "<b>Konto:</b>"
-
-#~ msgid "Warned (%d%%) "
-#~ msgstr "Advart (%d%%) "
-
-#~ msgid "/Tools/Away"
-#~ msgstr "/Verktøy/Borte"
-
-#~ msgid "Send a message to the selected buddy"
-#~ msgstr "Send beskjed til den valgte kontakten"
-
-#~ msgid "Get information on the selected buddy"
-#~ msgstr "Hent informasjon om den valgte kontakten"
-
-#~ msgid "_Chat"
-#~ msgstr "_Gruppesamtale"
-
-#~ msgid "Join a chat room"
-#~ msgstr "Bli med i samtalegruppe"
-
-#~ msgid "_Away"
-#~ msgstr "_Borte"
-
-#~ msgid "Set an away message"
-#~ msgstr "Sett en fraværsbeskjed"
-
-#~ msgid "Done."
-#~ msgstr "Ferdig."
-
-#~ msgid "Signon: "
-#~ msgstr "Pålogging: "
-
-#~ msgid "Signon"
-#~ msgstr "Pålogging"
-
-#~ msgid "Cancel All"
-#~ msgstr "A_vbryt alle"
-
-#
-#~ msgid "_Reconnect"
-#~ msgstr "Kople til på nytt"
-
-#~ msgid "Reason Unknown."
-#~ msgstr "Ukjent årsak."
-
-#
-#~ msgid "Reconnect _All"
-#~ msgstr "Kople til _alle på nytt"
-
-#~ msgid "Get Away Msg"
-#~ msgstr "Hent fraværsbeskjed"
-
-#~ msgid "/Conversation/_Warn..."
-#~ msgstr "/Samtale/A_dvar..."
-
-#~ msgid "/Conversation/A_lias..."
-#~ msgstr "/Samtale/_Alias..."
-
-#~ msgid "/Options/Show T_imestamps"
-#~ msgstr "/Brukervalg/Vis t_idsstempler"
-
-#~ msgid "/Conversation/Warn..."
-#~ msgstr "/Samtale/Advar..."
-
-#~ msgid "Warn the user"
-#~ msgstr "Advar brukeren"
-
-#~ msgid "Send a file to the user"
-#~ msgstr "Send en fil til brukeren"
-
-#~ msgid "Remove the user from your buddy list"
-#~ msgstr "Fjern brukeren fra kontaktlisten din"
-
-#~ msgid "Invite a user"
-#~ msgstr "Inviter en bruker"
-
-#~ msgid "Add the chat to your buddy list"
-#~ msgstr "Legg til samtalen i kontaktlisten din"
-
-#~ msgid "<main>/Conversation/Close"
-#~ msgstr "<main>/Samtale/Lukk"
-
-#~ msgid "former lead developer"
-#~ msgstr "tidligere hovedutvikler"
-
-#~ msgid "former maintainer"
-#~ msgstr "tidligere ansvarlig"
-
-#, fuzzy
-#~ msgid "Azerbaijani"
-#~ msgstr "Serbisk"
-
-#~ msgid "Burmese"
-#~ msgstr "Burmesisk"
-
-#~ msgid "Ukrainian"
-#~ msgstr "Ukrainsk"
-
-#
-#~ msgid "Chinese"
-#~ msgstr "Kinesisk"
-
-#~ msgid ""
-#~ "<span weight=\"bold\" size=\"larger\">Warn %s?</span>\n"
-#~ "\n"
-#~ "This will increase %s's warning level and he or she will be subject to "
-#~ "harsher rate limiting.\n"
-#~ msgstr ""
-#~ "<span weight=\"bold\" size=\"larger\">Advar %s?</span>\n"
-#~ "\n"
-#~ "Dette vil øke advarselsnivået til %s og vedkommende vil måtte tåle "
-#~ "strengere hastighetsbegrensning.\n"
-
-#~ msgid "Warn _anonymously?"
-#~ msgstr "Advar anonymt"
-
-#~ msgid "<b>Anonymous warnings are less severe.</b>"
-#~ msgstr "<b>Anonyme advarsler er mindre betydningsfulle.</b>"
-
-#~ msgid "Show transfer details"
-#~ msgstr "Vis overføringsdetaljer"
-
-#~ msgid "D_isplay remote nicknames if no alias is set"
-#~ msgstr "Vis kallenavn for personer hvis de ikke har noe alias"
-
-#~ msgid "Display"
-#~ msgstr "Vis"
-
-#~ msgid "Show _timestamp on messages"
-#~ msgstr "Vis tidsstempel på beskjeder"
-
-#~ msgid "Ignore font _faces"
-#~ msgstr "Ignorer skrifttyper"
-
-#~ msgid "_Send default formatting with outgoing messages"
-#~ msgstr "_Send standardformatering med utgående meldinger"
-
-#~ msgid "Enter _sends message"
-#~ msgstr "Enter _sender beskjeden"
-
-#~ msgid "Window Closing"
-#~ msgstr "Lukke vindu"
-
-#~ msgid "_Escape closes window"
-#~ msgstr "_ESC lukker vinduet"
-
-#~ msgid "Insertions"
-#~ msgstr "Innsettinger"
-
-#~ msgid "Control-{B/I/U} changes _formatting"
-#~ msgstr "CTRL-{b/i/u/s} endrer _formatering"
-
-#~ msgid "Control-(number) _inserts smileys"
-#~ msgstr "CTRL-(tall) setter _inn smilefjes"
-
-#~ msgid "Show _buttons as:"
-#~ msgstr "Vis knapper som:"
-
-#~ msgid "Text"
-#~ msgstr "Tekst"
-
-#~ msgid "Pictures and text"
-#~ msgstr "Bilder og tekst"
-
-#~ msgid "_Raise window on events"
-#~ msgstr "Flytt vinduet øverst ved hendelser"
-
-#~ msgid "Show _warning levels"
-#~ msgstr "Vis advarselsnivåer"
-
-#~ msgid "Enable \"_slash\" commands"
-#~ msgstr "Skru på \"_skråstreks\"-kommandoer"
-
-#~ msgid "_Raise IM window on events"
-#~ msgstr "Flytt direktemeldingsvindu øverst ved hendelser"
-
-#~ msgid "Raise chat _window on events"
-#~ msgstr "Flytt gruppesamtalevinduet øverst ved hendelser"
-
-#~ msgid "Use _multi-colored screen names in chats"
-#~ msgstr "Bruk _flerfargede brukernavn i samtalegrupper"
-
-#~ msgid "Tab p_lacement:"
-#~ msgstr "_Faneplassering:"
-
-#~ msgid "New conversation _placement:"
-#~ msgstr "Ny samtale_plassering"
-
-#~ msgid "System Logs"
-#~ msgstr "Systemlogging"
-
-#~ msgid "_Enable system log"
-#~ msgstr "Skru på _systemlogg:"
-
-#~ msgid "Log when buddies _sign on/sign off"
-#~ msgstr "Skriv til logg når kontakter logger av/på"
-
-#~ msgid "Log when buddies become _idle/un-idle"
-#~ msgstr "Skriv til logg når kontakter blir aktiv/inaktiv"
-
-#~ msgid "Log when buddies go away/come _back"
-#~ msgstr "Skriv til logg når kontakter blir borte/kommer tilbake"
-
-#~ msgid "Log your _own signons/idleness/awayness"
-#~ msgstr "Skriv egne pålogginger/inaktivitet/bortemarkeringer til logg"
-
-#~ msgid "Idle _time reporting:"
-#~ msgstr "Rapportering av inaktiv _tid:"
-
-#~ msgid "Gaim usage"
-#~ msgstr "Gaim-bruk"
-
-#~ msgid "X usage"
-#~ msgstr "X-bruk"
-
-#~ msgid "Windows usage"
-#~ msgstr "Windows-bruk"
-
-#~ msgid ""
-#~ "<span size=\"larger\">%s %s</span>\n"
-#~ "\n"
-#~ "<span weight=\"bold\">Written by:</span>  %s\n"
-#~ "<span weight=\"bold\">URL:</span>  %s\n"
-#~ "<span weight=\"bold\">File name:</span>  %s"
-#~ msgstr ""
-#~ "<span size=\"larger\">%s %s</span>\n"
-#~ "\n"
-#~ "<span weight=\"bold\">Skrevet av:</span>  %s\n"
-#~ "<span weight=\"bold\">URL:</span>  %s\n"
-#~ "<span weight=\"bold\">Filnavn:</span>  %s"
-
-#~ msgid "Summary"
-#~ msgstr "Oppsummering"
-
-#~ msgid "Details"
-#~ msgstr "Detaljer"
-
-#~ msgid "Message Text"
-#~ msgstr "Beskjeder"
-
-#~ msgid "Shortcuts"
-#~ msgstr "Hurtigtaster"
-
-#~ msgid "Away Messages"
-#~ msgstr "Fraværsbeskjeder"
-
-#~ msgid "Please create an account."
-#~ msgstr "Vennligst lag en konto."
-
-#~ msgid "<b>_Account:</b>"
-#~ msgstr "<b>_Konto:</b>"
-
-#~ msgid "A_ccounts"
-#~ msgstr "Kontoer"
-
-#, fuzzy
-#~ msgid "P_references"
-#~ msgstr "Innstillinger"
-
-#~ msgid "_Sign on"
-#~ msgstr "Logg _på"
-
-#~ msgid ""
-#~ "Gaim %s\n"
-#~ "Usage: %s [OPTION]...\n"
-#~ "\n"
-#~ "  -a, --acct          display account editor window\n"
-#~ "  -w, --away[=MESG]   make away on signon (optional argument MESG "
-#~ "specifies\n"
-#~ "                      name of away message to use)\n"
-#~ "  -l, --login[=NAME]  automatically login (optional argument NAME "
-#~ "specifies\n"
-#~ "                      account(s) to use, seperated by commas)\n"
-#~ "  -n, --loginwin      don't automatically login; show login window\n"
-#~ "  -u, --user=NAME     use account NAME\n"
-#~ "  -c, --config=DIR    use DIR for config files\n"
-#~ "  -d, --debug         print debugging messages to stdout\n"
-#~ "  -v, --version       display the current version and exit\n"
-#~ "  -h, --help          display this help and exit\n"
-#~ msgstr ""
-#~ "Gaim %s\n"
-#~ "Bruksmåte: %s [BRUKERVALG]...\n"
-#~ "\n"
-#~ "  -a, --acct          vis redigeringsvindu for kontoer\n"
-#~ "  -w, --away[=MESG]   marker som borte ved pålogging (valgfri MESG er "
-#~ "navnet\n"
-#~ "                      på bortebeskjeden du vil bruke)\n"
-#~ "  -l, --login[=NAME]  logg inn automatisk (valgfri NAME er navnet på\n"
-#~ "                      konto(er) du vil bruke, atskilt av komma)\n"
-#~ "  -n, --loginwin      ikke logg inn automatisk, men vis påloggingsvindu\n"
-#~ "  -u, --user=NAME     bruk kontoen NAME\n"
-#~ "  -f, --file=FILE     bruk filen FILE som konfigurasjonsfil\n"
-#~ "  -d, --debug         skriv avlusningsinfo til stdout\n"
-#~ "  -v, --version       vis versjonsinformasjon og avslutt\n"
-#~ "  -h, --help          vis denne hjelpeteksten og avslutt\n"
-
-#~ msgid "Unable to load preferences"
-#~ msgstr "Kunne ikke åpne innstillinger"
-
-#~ msgid ""
-#~ "Gaim was not able to load your preferences because they are stored in an "
-#~ "old format that is no longer used.  Please reconfigure your settings "
-#~ "using the Preferences window."
-#~ msgstr ""
-#~ "Gaim kunne ikke åpne dine instillinger, da de er lagret i et gammelt "
-#~ "format som ikke lenger er i bruk.  Vennligst rekonfigurer dine  "
-#~ "instillinger ved hjelp av innstillingsvinduet"
-
-#~ msgid "Slightly less boring default"
-#~ msgstr "kjedelig standardsvar"
-
-#~ msgid "Available for friends only"
-#~ msgstr "Tilgjengelig bare for venner"
-
-#~ msgid "Away for friends only"
-#~ msgstr "Borte bare for venner"
-
-#~ msgid "Invisible for friends only"
-#~ msgstr "Usynlig bare for venner"
-
-#~ msgid "Error while writing to socket."
-#~ msgstr "Feil under skriving til socket."
-
-#~ msgid "Authentication failed."
-#~ msgstr "Autentisering feilet."
-
-#~ msgid "Unknown Error Code."
-#~ msgstr "Ukjent feilkode."
-
-#~ msgid "Balancer handshake"
-#~ msgstr "Finner ledig tjener"
-
-#~ msgid "Reading server key"
-#~ msgstr "Leser tjenernøkkel"
-
-#~ msgid "Exchanging key hash"
-#~ msgstr "Utveksler nøkkel-hash"
-
-#~ msgid "Critical error in GG library\n"
-#~ msgstr "Kritisk feil i GG-biblioteket\n"
-
-#~ msgid "Unable to ping server"
-#~ msgstr "Kunne ikke pinge tjener"
-
-#~ msgid "Send as message"
-#~ msgstr "Send som beskjed"
-
-#~ msgid "Looking up GG server"
-#~ msgstr "Søker etter GG-tjener"
-
-#~ msgid "Invalid Gadu-Gadu UIN specified"
-#~ msgstr "Ugyldig Gadu-Gadu UIN oppgitt"
-
-#~ msgid "You are trying to send a message to an invalid Gadu-Gadu UIN."
-#~ msgstr "Du prøver å sende en beskjed til et ugyldig Gadu-Gadu UIN."
-
-#~ msgid "Couldn't get search results"
-#~ msgstr "Kunne ikke laste ned søkeresultater"
-
-#~ msgid "Sex"
-#~ msgstr "Kjønn"
-
-#~ msgid "Couldn't Import Buddy List from Server"
-#~ msgstr "Kunne ikke importere kontaktliste fra tjeneren"
-
-#~ msgid "Buddy List successfully transferred to Gadu-Gadu server"
-#~ msgstr "Kontaktlisten ble overført til Gadu-Gadu-tjeneren"
-
-#~ msgid "Couldn't transfer Buddy List to Gadu-Gadu server"
-#~ msgstr "Kunne ikke overføre kontaktlisten til Gadu-Gadu-tjeneren"
-
-#~ msgid "Buddy List successfully deleted from Gadu-Gadu server"
-#~ msgstr "Kontaktlisten ble slettet fra Gadu-Gadu-tjeneren"
-
-#~ msgid "Couldn't delete Buddy List from Gadu-Gadu server"
-#~ msgstr "Kunne ikke slette kontaktlisten fra Gadu-Gadu-tjeneren"
-
-#~ msgid "Password couldn't be changed"
-#~ msgstr "Passordet kunne ikke endres"
-
-#~ msgid "Error communicating with Gadu-Gadu server"
-#~ msgstr "Feil i kommunikasjonen med Gadu-Gadu-tjeneren"
-
-#~ msgid ""
-#~ "Gaim was unable to complete your request due to a problem communicating "
-#~ "with the Gadu-Gadu HTTP server.  Please try again later."
-#~ msgstr ""
-#~ "Gaim kunne ikke fullføre oppgaven på grunn av kommunikasjonsproblemer med "
-#~ "Gadu-Gadu-HTTP-tjeneren. Vennligst forsøk igjen senere."
-
-#~ msgid "Unable to import Gadu-Gadu buddy list"
-#~ msgstr "Kunne ikke importere Gadu-Gadu-kontaktliste"
-
-#~ msgid ""
-#~ "Gaim was unable to connect to the Gadu-Gadu buddy list server.  Please "
-#~ "try again later."
-#~ msgstr ""
-#~ "Gaim kunne ikke koble til kontaktliste-tjeneren for Gadu-Gadu. Vennligst "
-#~ "forsøk igjen senere."
-
-#~ msgid ""
-#~ "Gaim was unable to connect to the buddy list server.  Please try again "
-#~ "later."
-#~ msgstr ""
-#~ "Gaim kunne ikke koble til kontaktliste-tjeneren. Vennligst forsøk igjen "
-#~ "senere."
-
-#~ msgid "Unable to delete Gadu-Gadu buddy list"
-#~ msgstr "Kunne ikke slette kontaktliste for Gadu-Gadu"
-
-#~ msgid "Unable to access directory"
-#~ msgstr "Fikk ikke tilgang til katalogen"
-
-#~ msgid ""
-#~ "Gaim was unable to search the Directory because it was unable to connect "
-#~ "to the directory server.  Please try again later."
-#~ msgstr ""
-#~ "Gaim kunne ikke søke i katalogen fordi den ikke fikk kontakt med "
-#~ "katalogtjeneren. Vennligst prøv igjen senere."
-
-#~ msgid ""
-#~ "Gaim was unable to change your password due to an error connecting to the "
-#~ "Gadu-Gadu server.  Please try again later."
-#~ msgstr ""
-#~ "Gaim fikk ikke kontakt med Gadu-Gadu-tjeneren og kunne ikke endre "
-#~ "passordet ditt. Vennligst forsøk igjen senere."
-
-#~ msgid "Directory Search"
-#~ msgstr "Katalogsøk"
-
-#~ msgid "Unable to access user profile."
-#~ msgstr "Fikk ikke tilgang til brukerprofilen."
-
-#~ msgid ""
-#~ "Gaim was unable to access this user's profile due to an error connecting "
-#~ "to the directory server.  Please try again later."
-#~ msgstr ""
-#~ "Gaim kunne ikke lese brukerprofilen på grunn av tilkoblingsproblemer mot "
-#~ "katalogtjeneren. Vennligst forsøk igjen senere."
-
-#~ msgid "Gaim encountered an error communicating with the ICQ server."
-#~ msgstr "Det oppstod en feil i kommunikasjonen med ICQ-tjeneren."
-
-#~ msgid "The user %s (%s%s%s%s%s) wants you to authorize them."
-#~ msgstr "Brukeren %s (%s%s%s%s%s) ønsker å bli godkjent av deg."
-
-#~ msgid "Send message through server"
-#~ msgstr "Send beskjed gjennom tjener"
-
-#~ msgid "Nick:"
-#~ msgstr "Kallenavn:"
-
-#~ msgid "Gaim User"
-#~ msgstr "Gaim-bruker"
-
-#~ msgid "File Transfer Aborted"
-#~ msgstr "Filoverføring avbrutt"
-
-#~ msgid "Buddy Information for %s"
-#~ msgstr "Kontaktinformasjon for %s"
-
-#~ msgid "Invalid nickname '%s'"
-#~ msgstr "Ugyldig brukernavn '%s'"
-
-#~ msgid "Jabber Profile"
-#~ msgstr "Jabber-profil"
-
-#
-#~ msgid "Roomlist Error"
-#~ msgstr "Feil ved liste over rom"
-
-#~ msgid "The user %s wants to add you to their buddy list."
-#~ msgstr "Brukeren %s vil legge deg til i sin kontaktliste."
-
-#~ msgid "Display conversation closed notices"
-#~ msgstr "Vis advasler om at samtalen har blitt lukket"
-
-#~ msgid "The conversation has become inactive and timed out."
-#~ msgstr "Samtalen har blitt avsluttet pga. inaktivitet."
-
-#~ msgid ""
-#~ "You were disconnected from the server, because you logged on from a "
-#~ "different location"
-#~ msgstr "Du ble logget av fordi du har logget på et annet sted."
-
-#, fuzzy
-#~ msgid "User Properties"
-#~ msgstr "Brukervalg"
-
-#, fuzzy
-#~ msgid "Transfer of file %s timed out."
-#~ msgstr "Overføring av filen %s er ferdig."
-
-#~ msgid ""
-#~ "You have been disconnected because you have signed on with this screen "
-#~ "name at another location."
-#~ msgstr ""
-#~ "Du ble logget av fordi du har logget på med dette skjermnavnet et annet "
-#~ "sted."
-
-# Gammel "uventet", kansje bedre?
-#, fuzzy
-#~ msgid "Not specified"
-#~ msgstr "Ikke spesifisert"
-
-#~ msgid "ICQ Info for %s"
-#~ msgstr "ICQ-info for %s"
-
-#~ msgid ""
-#~ "Error 0x%04x: Unable to format screen name because the requested screen "
-#~ "name ends in a space."
-#~ msgstr ""
-#~ "Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte "
-#~ "skjermnavnet slutter med et mellomrom."
-
-#~ msgid "I'm doing work and hoping for a distraction--IM me!"
-#~ msgstr "Jeg jobber og håper at noen skal forstyrre - send meg en beskjed!"
-
-#~ msgid "Set Available Message..."
-#~ msgstr "Sett tilstedebeskjed..."
-
-#~ msgid "Failed to leave channel"
-#~ msgstr "Kunne ikke forlate kanalen"
-
-#~ msgid "Basic Profile"
-#~ msgstr "Grunnleggende profil"
-
-#~ msgid "AIM"
-#~ msgstr "AIM"
-
-#~ msgid "ICQ UIN"
-#~ msgstr "ICQ UIN"
-
-#~ msgid "MSN"
-#~ msgstr "MSN"
-
-#~ msgid "Yahoo"
-#~ msgstr "Yahoo"
-
-#~ msgid "I'm From"
-#~ msgstr "Jeg er fra"
-
-#~ msgid "Set your Trepia profile data."
-#~ msgstr "Skriv inn data i din Trepia-profil."
-
-#~ msgid "Visit Homepage"
-#~ msgstr "Besøk hjemmeside"
-
-#~ msgid "Local Users"
-#~ msgstr "Lokale brukere"
-
-#~ msgid "Trepia Protocol Plugin"
-#~ msgstr "Trepia-protokolltillegg"
-
-#~ msgid ""
-#~ "You have been logged off as you have logged in on a different machine or "
-#~ "device."
-#~ msgstr "Du har blitt logget av, da du har logget inn et annet sted"
-
-#~ msgid "Please enter your password"
-#~ msgstr "Skriv inn passord"
-
-#~ msgid "%s logged in."
-#~ msgstr "%s logget inn."
-
-#~ msgid "%s logged out."
-#~ msgstr "%s logget ut."
-
-#~ msgid ""
-#~ "%s has just been warned by %s.\n"
-#~ "Your new warning level is %d%%"
-#~ msgstr ""
-#~ "%s har blitt advart av %s.\n"
-#~ "Ditt nye advarselsnivå er %d%%"
-
-#~ msgid "an anonymous person"
-#~ msgstr "en anonym person"
-
-#~ msgid ""
-#~ "%s has invited %s to the chat room %s:\n"
-#~ "<b>%s</b>"
-#~ msgstr ""
-#~ "Brukeren '%s' inviterer %s til samtalerom: '%s'\n"
-#~ "<b>%s</b>"
-
-#~ msgid "Sorry, I ran out for a bit!"
-#~ msgstr "Borte litt, tilbake om en stund!"
-
-#~ msgid ""
-#~ "Unable to guess the image type based on the file extension supplied.  "
-#~ "Defaulting to PNG."
-#~ msgstr ""
-#~ "Gaim kunne ikke gjette bildetypen ut fra filtypen (siste del av "
-#~ "filnavnet). Antar PNG-format."
-
-#~ msgid "SILC Public Key"
-#~ msgstr "SILC offentlig nøkkel"
-
-#~ msgid "SILC Private Key"
-#~ msgstr "SILC privat nøkkel"
+msgstr "Dette tillegget er kjekt å ha for debugging av XMPP servere og klienter."
+
--- a/po/stats.pl	Sun Jan 13 00:29:56 2008 +0000
+++ b/po/stats.pl	Wed Feb 06 03:35:04 2008 +0000
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 
 # Copyright 2003-2005 Nathan Walp <faceprint@faceprint.com>
 #